2011-11-17 107 views
0

我有一个Custom DirectShow Video Renderer Filter它有一些扩展功能,比覆盖图像Microsoft's Video Renderer Filter。我知道我可以用Transform Filter做同样的事情,但我选择了这种方式。我也相信,我会面对同样的问题,我将在下面描述一个Transform Filter自定义DirectShow视频渲染器过滤器 - 动态分辨率更改

当我使用Microsoft's Video Renderer Filter时,它能够在流启动/更改时自动调整窗口大小和缓冲区大小。我的过滤器能够做同样的事情,但除了流式启动后我无法接收事件。我相信我可以以某种方式查询,但我不知道如何。

当前事件管道如下所示。

On Pin Connect 
-------------- 
CreateInstance 
Video Renderer Class Constructor 
CheckMediaType 
SetMediaType  
-> Width: 100, Height: 100 
CheckMediaType 
CheckMediaType 
CheckMediaType 
SetMediaType 
-> Width: 100, Height: 100 

On Play 
------- 
StartStreaming 
DoRenderSample 
... 
... 
... 
DoRenderSample 

On Stop 
------- 
Video Renderer Class Destructor 

我的源过滤器设置的默认窗口大小为100x100。我可以通过引脚连接两次。但在StartStreaming之后,我无法再获取CheckMediaTypeSetMediaType事件。我可以尝试从源代码筛选器(它也是我的代码)触发它们,但由于Microsoft's Video Renderer能够自动调整StartStreaming的大小,因此我希望具有相同的功能。

问题:

  1. 我应该如何触发流开始后CheckMediaType/SetMediaType电话?其实SetMediaType对我来说是重要的。或者有另一种方式来查询当前的流分辨率?
  2. 我是否需要在DoRenderSample中连续检查可能的视频尺寸变化?

回答

1

CheckMediaTypeSetMediaType并不完全是“事件”,它们不是自己动手,所以你不能触发它们。你打算改变决议吗?你自己像VMR那样延伸步伐吗?或者接受上游过滤器更改分辨率?

本MSDN部分涵盖了详细信息:Dynamic Format Changes

+0

是的,我们想要的只是改变分辨率,而不是像YUV-> RGB等其他媒体类型的改变。我们想要完全像VMR那样做。顺便说一下,我们的类是从CBaseVideoRenderer扩展而来的,它是从使用CRendererInputPin作为朋友类的CBaseRenderer扩展而来的。我是否应该使用自定义Pin来重写QueryAccept并获取这些分辨率更改? –

+0

那你到底想要支持什么?像VMR那样扩展步幅,或者像VMR那样处理上游过滤器所要求的格式变化呢? –

+0

我正在尝试处理格式更改。 –