我编写了一个自定义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)我是否需要覆盖GetMediaType
和CheckMediaType
以外的任何其他功能以支持多种输出媒体类型?
由于
答案 0 :(得分:-1)
也在GetStreamCaps函数中进行设置