DirectShow ColorConverterDMO过滤器不接受它宣传的输入格式?

时间:2012-10-23 18:53:07

标签: visual-c++ filter directshow color-space

我正在尝试使用DirectShow过滤器图形中的ColorConverterDMO将UYVY转换为RGB32,但在允许连接到输入引脚时尤其不合作。

例如,如果我枚举输入引脚的媒体类型,然后,对于每种媒体类型,使用该媒体类型调用引脚的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();

1 个答案:

答案 0 :(得分:0)

Color Converter DMO/DSP不是DirectShow组件。它属于Windows Media,虽然它可以(可能)通过DMO Wrapper Filter插入到DirectShow管道中,但我怀疑它从未经过任何测试的预期场景。

我有另一个DMO的示例代码,并且在DirectShow中有一定的努力:Using Vista Video Resizer DSP in DirectShow, via DMO Wrapper Filter。我的印象是,我曾经读过有人设法以类似的方式运行Color Converter DMO,在这种情况下,代码段可能会有所帮助。