我有一个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
之后,我无法再获取CheckMediaType
和SetMediaType
事件。我可以尝试从源代码筛选器(它也是我的代码)触发它们,但由于Microsoft's Video Renderer
能够自动调整StartStreaming
的大小,因此我希望具有相同的功能。
问题:
- 我应该如何触发流开始后
CheckMediaType
/SetMediaType
电话?其实SetMediaType
对我来说是重要的。或者有另一种方式来查询当前的流分辨率? - 我是否需要在
DoRenderSample
中连续检查可能的视频尺寸变化?
是的,我们想要的只是改变分辨率,而不是像YUV-> RGB等其他媒体类型的改变。我们想要完全像VMR那样做。顺便说一下,我们的类是从CBaseVideoRenderer扩展而来的,它是从使用CRendererInputPin作为朋友类的CBaseRenderer扩展而来的。我是否应该使用自定义Pin来重写QueryAccept并获取这些分辨率更改? –
那你到底想要支持什么?像VMR那样扩展步幅,或者像VMR那样处理上游过滤器所要求的格式变化呢? –
我正在尝试处理格式更改。 –