我正在尝试在我的 DirectShow 过滤器图中使用 ColorConverterDMO 从 UYVY 转换为 RGB32,但它在允许连接到它的输入引脚方面特别不合作。
例如,如果我枚举输入 pin 的媒体类型,然后,对于每个媒体类型,使用该媒体类型调用 pin 的 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();