无法获得DirectShow MPEG-2解码器以逐行输出YV12 / NV12

时间:2019-03-19 09:19:36

标签: h.264 directshow decoding samplegrabber

我正在尝试获取MPEG-2解码器(又名DTV-DVD视频解码器),以便为我提供渐进的YV12或NV12帧,这些帧可以上传到OpenGL进行渲染。但是我所看到的渲染看起来像某种形式的未压缩自适应运动隔行扫描,或者仅仅是B帧或P帧无法提供完整图像。 (在OpenGL中渲染YV12 / NV12的代码可与其他来源很好地兼容,所以这不是问题。)

not how it's supposed to look ;-)

一个重要的线索:当电影开始以及每当它循环回到开始时,我都会看到一个完美渲染的帧。这告诉我这是我唯一一次获得一整帧有效的YV12 / NV12数据。

可能有最简短的描述:

1)创建了一个自定义的Sample Grabber(基于CTransInPlaceFilter),以便我可以获取具有VIDEOINFOHEADER2的示例。这可以按预期工作,并且在我正在播放的分辨率下,样本大小符合YV12 / NV12的期望。 (滚动自己的Sample Graabber here的有用示例。)

2)为确保仅获得渐进帧,如果VIDEOINFOHEADER2的dwInterlaceFlags字段设置了AMINTERLACE_IsInterlaced标志,则我的Sample Grabber的CheckInputType()方法将返回E_FAIL。

3)我正在使用ICODEcAPI接口和CODECAPI_AVDecVideoSoftwareDeinterlaceMode在解码器上设置eAVDecVideoSoftwareDeinterlaceMode_ProgressiveDeinterlacing标志。 (如果我不这样做,则解码器将无法连接到我的Sample Grabber,因为它不接受隔行扫描的帧。)

4)为了调试此问题,我使用IMediaSample2接口在Sample Grabber中获取传入媒体样本的属性。 AM_SAMPLE2_PROPERTIES结构的dwTypeSpecificFlags成员告诉我,这些帧是AM_VIDEO_FLAG_INTERLEAVED_FRAME,我认为这表示我得到的是完整帧而不是单个字段。对于所有帧,还将AM_VIDEO_FLAG_I_SAMPLE位置1,表示我正在获得完整的“ I”帧,而不是“ B”或“ P”帧。

5)假定所有帧均为“ I”帧,则希望看到我的图像,而不是上面显示的gobbledygook。如上所述,当电影循环回到第一帧时,我只有一次看到有效的图像。

6)最后一件事:我确实看到我的样本设置了AM_VIDEO_FLAG_WEAVE。这是图像的“编织”问题吗?

谢谢, 标记

0 个答案:

没有答案