自定义DirectShow捕获过滤器 - 输出YUV

时间:2011-10-06 14:58:06

标签: c++ directshow

我编写了一个自定义directshow过滤器,用于读取图像并将其输出为RGB。目前工作正常。

我想在YUV中添加输出选项。 我在谈判阶段仍然遇到一些问题。 IMO对DirectShow特定功能的解释非常糟糕,特别是对于源过滤器。

根据我的理解,我建议使用GetMediaType()支持哪些媒体类型。 之后,当选择特定类型时,CheckMediaType()将验证协商的媒体类型。

通过这个逻辑,我更新了GetMediaType()以返回YUV媒体类型。 我找不到如何创建yuv媒体类型的示例,最后使用pushsource RGB示例进行了一些更改。

HRESULT CreateYUVVideoType(CMediaType *pMediaType, long Width, long Height, double Fps)
{

if (Width < 0)
{
    return E_INVALIDARG;
}

FreeMediaType(*pMediaType);

VIDEOINFO *pvi = (VIDEOINFO*)pMediaType->AllocFormatBuffer(sizeof(VIDEOINFO));
if (pvi == 0) 
{
    return(E_OUTOFMEMORY);
}
ZeroMemory(pvi, sizeof(VIDEOINFO));

pvi->AvgTimePerFrame = Fps2FrameLength(Fps);

BITMAPINFOHEADER *pBmi = &(pvi->bmiHeader);
pBmi->biSize = sizeof(BITMAPINFOHEADER);
pBmi->biWidth = Width;
pBmi->biHeight = Height;
pBmi->biPlanes = 1;

pBmi->biBitCount = 16;
pBmi->biCompression = MAKEFOURCC('Y','U','Y','2');
pMediaType->SetSubtype(&MEDIASUBTYPE_YUY2);

pvi->bmiHeader.biSizeImage = DIBSIZE(pvi->bmiHeader);

pMediaType->SetType(&MEDIATYPE_Video);
pMediaType->SetFormatType(&FORMAT_VideoInfo);

pMediaType->SetTemporalCompression(FALSE);
pMediaType->SetSampleSize(pvi->bmiHeader.biSizeImage);

return S_OK;
}

1)这是创建YUV(4:2:2)媒体类型的正确方法吗? 2)另外,当我渲染引脚时,它将VMR与之间的AVI解压缩器连接起来?为什么? 3)我是否需要覆盖GetMediaTypeCheckMediaType以外的任何其他功能以支持多种输出媒体类型?

由于

1 个答案:

答案 0 :(得分:-1)

也在GetStreamCaps函数中进行设置