내 DirectShow 필터 그래프에서 ColorConverterDMO를 사용하여 UYVY에서 RGB32로 변환하려고하지만 입력 핀에 연결하는 데 특히 비협조적입니다.DirectShow ColorConverterDMO 필터는 광고하는 입력 형식을 허용하지 않습니까?
예를 들어 입력 핀의 미디어 유형을 나열한 다음 각 미디어 유형에 대해 해당 미디어 유형의 핀 QueryAccept()을 호출하면 S_FALSE를 반환합니다. 무슨 일 이니? 입력 핀을 소스 필터의 출력 핀에 연결할 수 있도록 필터를 얻으려면 어떻게해야합니까?
다음은 필터를 만드는 예제이며 광고하는 미디어 유형을 받아들이지 않는 예제 코드입니다. 이 코드에서 QueryAccept 호출은 항상 S_FALSE를 반환합니다.
도움이 될 것입니다. 감사합니다.
// create filter and put it in the graph
CComPtr<IBaseFilter> colorConvert;
CComPtr<IPin> colorOut, colorIn;
CComPtr<IDMOWrapperFilter> colorConvertIface;
if(FAILED(hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&colorConvert)))
return hr;
if(FAILED(hr = colorConvert->QueryInterface(IID_IDMOWrapperFilter, (void **)&colorConvertIface)))
return hr;
if(FAILED(hr = colorConvertIface->Init(CLSID_CColorConvertDMO, DMOCATEGORY_VIDEO_EFFECT)))
return hr;
if(FAILED(hr = g_pGB->AddFilter(colorConvert, _T("Converter"))))
return hr;
if(FAILED(hr = colorConvert->FindPin(L"in0", &colorIn)))
return hr;
if(FAILED(hr = colorConvert->FindPin(L"out0", &colorOut)))
return hr;
// try to get a little info about the frame input source's output pin offering...
CComPtr<IEnumMediaTypes> pMediaTypeEnum;
AM_MEDIA_TYPE *pMediaType;
hr = colorIn->EnumMediaTypes(&pMediaTypeEnum);
int cnt = 1;
while (pMediaTypeEnum->Next(1, &pMediaType, &fetched) == S_OK)
{
TCHAR str[100];
_stprintf(str, _T("Input Media Type [%d]:"), cnt++);
DisplayType(str, pMediaType);
hr = colorIn->QueryAccept(pMediaType);
if (hr == S_FALSE)
{
//WHY?? You just told me you accepted this type!?!
}
DeleteMediaType(pMediaType);
}
pMediaTypeEnum.Release();