问题描述:

I just have simple graph:

SourceFilter ---> CustomTransformFilter --> VideoRendererFilter

In my CustomTranformFilter i change video properties dynamically:i.e i rescale video into new dimensions.

Input Video[1024,720]-->|CustomTransformFilter|--->Output Video[640,480]

But my renderer see the video as still in its original size ( [1024,720] not rescaled [640,480] )

And i get corrupted images at video renderer:Since renderer try to draw new image based on old dimensions...

How can i fix it?

Best Wishes

Update:

As i understand from Davies answer :

Given: The graph is active, but the filters in question do not support dynamic

pin reconnections

And

Possible mechanisms for changing the format: (MSDN DirectShow Doc)

a. QueryAccept (Downstream)

b. QueryAccept (Upstream)

c. ReceiveConnection

Davies suggest ReceiveConnection.

ReceiveConnection:is used when an output pin proposes a format change to

its downstream peer, and the new format requires a larger buffer. ( MSDN DirectShow Doc).

The gmfbridge example is "too complex" for me to figure out how to use "ReceiveConnection".

I am novice at DirectShow.

Any one has simple code example that use ReceiveConnection mechanism to respond dynamic format change?

网友答案:

The normal way to do a dynamic type change in DirectShow is to attach a Media Type to the sample that you deliver. This won't work with the video renderer, since it is allocating the samples. You need to request a change in type before you get the sample from the allocator.

You do this using ReceiveConnection. You must make sure that there are no buffers outstanding on that allocator, and then you can call IPin::ReceiveConnection (without disconnecting first). There is an example of this in the gmfbridge code at www.gdcl.co.uk/gmfbridge, in BridgeSourceOutput::SwitchTo().

G

相关阅读:
Top