我的YUY2输出不适用于Video Renderer滤镜

时间:2015-01-21 03:45:31

标签: directshow

我有一个基本的avstream驱动程序(基于avshws示例)。

测试YUY2输出时,根据我使用的渲染器得到不同的结果:

  • 视频渲染器:空白图片
  • VMR-7:加扰图像(由于渲染器使用的是具有较大步幅的缓冲区)
  • VMR-9:完美呈现

我不知道为什么基本的视频渲染器(由amcap使用)不起作用。我已经检查了输出相同格式的网络摄像头的图表,除了渲染器输出之外我看不出任何差异。

2 个答案:

答案 0 :(得分:1)

我假设您正在根据avshws编写自己的过滤器。我不熟悉这个特定的样本,但通常你需要确保两件事:

  • 确保您的过滤器检查建议的任何媒体类型是否可接受。在DirectShow基类中,视频渲染器调用输出引脚IPin::QueryAccept,该引脚调用您正在使用的任何基类成员,例如CBasePin.CheckMediaTypeCTransformFilter.CheckTransform
  • 请务必在每个输出样本上致电IMediaSample::GetMediaType并做出适当回应,例如调用CTransformFilter.SetMediaType 并更改输出的格式/步幅。现在谈判还为时已晚 - 您已经接受了更改,如果您真的无法继续,则必须中止流式传输,返回错误HRESULT和notify EC_ERRORABORT或EC_ERRORABORTEX。除非有问题,否则下游过滤器应调用输出引脚的QueryAccept并在发送附加了媒体类型更改的样本之前接收到S_OK(我已经看到偶尔会在第一个样本中添加重复媒体类型的过滤器而不会询问)。

请参阅Handling Format Changes from the Video Renderer

答案 1 :(得分:0)

我已经找到了问题所在。我缺少一行来更新流指针结构中的剩余字节:

Leading-> OffsetOut.Remaining = 0;

这导致某些过滤器丢弃我的样本(AVI / MJPEG Decompressor,Dump),这意味着某些图形配置根本不会呈现任何内容。