处理DirectShow中的动态格式更改

时间:2011-05-25 12:41:53

标签: directshow directshow.net

我只是简单的图表:

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 

Davies建议ReceiveConnection。 ReceiveConnection:在输出引脚建议格式更改时使用 它的下游对等体,新格式需要更大的缓冲区。 (MSDN DirectShow Doc)。

gmfbridge示例“太复杂”,让我无法弄清楚如何使用“ReceiveConnection”。 我是DirectShow的新手。

是否有任何人使用ReceiveConnection机制来响应动态格式更改的简单代码示例?

1 个答案:

答案 0 :(得分:4)

在DirectShow中执行动态类型更改的常规方法是将媒体类型附加到您提供的示例。这不适用于视频渲染器,因为它正在分配样本。在从分配器获取样本之前,您需要请求更改类型。

您可以使用ReceiveConnection执行此操作。您必须确保该分配器上没有未完成的缓冲区,然后您可以调用IPin :: ReceiveConnection(不先断开连接)。在www.gdcl.co.uk/gmfbridge的gmfbridge代码中有一个例子,在BridgeSourceOutput :: SwitchTo()中。