在DirectShow中处理动态格式更改

问题描述

|| 我只有一个简单的图形:
SourceFilter ---> CustomTransformFilter --> VideoRendererFilter
在我的CustomTranformFilter中,我动态地更改视频属性:即,我将视频重新缩放为新尺寸。
Input Video[1024,720]-->|CustomTransformFilter|--->Output Video[640,480] 
但是我的渲染器看到的视频仍然是原始大小([1024,720]尚未缩放[640,480]) 而且我在视频渲染器上收到损坏的图像:由于渲染器尝试根据旧尺寸绘制新图像... 我该如何解决? 最好的祝愿 更新: 据我了解,戴维斯回答:
Given: The graph is active,but the filters in question do not support dynamic 
pin reconnections
Possible mechanisms for changing the format: (MSDN DirectShow Doc)
a. QueryAccept (Downstream)
b. QueryAccept (Upstream) 
c. ReceiveConnection 
戴维斯建议使用ReceiveConnection。 ReceiveConnection:在输出引脚建议将格式更改为时使用 下游对等体,新格式需要更大的缓冲区。 (MSDN DirectShow文件)。 gmfbridge的示例是“太复杂”,我无法确定如何使用“ ReceiveConnection”。 我是DirectShow的新手。 有没有一个简单的代码示例使用ReceiveConnection机制来响应动态格式更改?     

解决方法

在DirectShow中进行动态类型更改的通常方法是将媒体类型附加到您提供的样本上。这不适用于视频渲染器,因为它正在分配样本。您需要请求类型更改,然后才能从分配器获取示例。 您可以使用ReceiveConnection进行此操作。您必须确保在该分配器上没有未完成的缓冲区,然后可以调用IPin :: ReceiveConnection(无需先断开连接)。 www.gdcl.co.uk/gmfbridge的gmfbridge代码中的BridgeSourceOutput :: SwitchTo()中有一个示例。 G