gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:20:45 33 4
gpt4 key购买 nike

我编写了一个自定义的 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) 另外,当我渲染 pin 时,它会将 VMR 与 AVI 解压缩器连接起来?为什么?
3) 除了 GetMediaTypeCheckMediaType 之外,我是否需要覆盖任何其他函数以支持多种输出媒体类型?

谢谢

最佳答案

同样在GetStreamCaps函数中设置

关于c++ - 自定义 DirectShow 捕获过滤器 - 输出 YUV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676246/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com