I'm writing an application (using VB2008 and DirectShowLib dll) that uses a StreamBufferSink filter to stream a live signal captured by a capture card (it may be both only video or audio and video) encoded to DV.
There is also a "consumer" application that uses a StreamBufferSource filter to render the captured signal streamed by the first application.
The first problem is that DV uses only the "Bottom Field First" scheme, but I'm working on a PAL signal so I need of a "Top Field First" stream.
When I render the stream by my renderer card (now I'm using a Blackmagic Decklink card) I've got a nasty video, due to the BFF instead of the TFF.
Is there a way to change the signal? Is there a filter that does that?
Any suggestion is welcome.
The second problem I'm encountering is that I can't move frame by frame in my renderer application. Let me explain you that.
The consumer application can pause, seek, change speed of the playing video, and it seems to work in a good way, but if I try to move frame by frame I'm having a strange behavior...
If I call the "move" function, the graph is paused, and the the clip is moved a frame forward (
by the SetPosition method of the
IStreamBufferMediaSeeking interface), and this is the desired behavior.
If I continue to call this function I obtain a movement of my clip, frame by frame, but at the 8th time I call the function, the output is still freezed to the last displayed frame. I need to call 5/6 times again to move the clip to the next frame.
Just to be more understandable, let's assume that my graph is paused and I'm showing a frame, that I'll call as Frame0
If I call the "Move" function, the Frame1 is displayed. If I recall the "Move" function, the Frame2 is displayed, and so on till the 8th call of the function, when I have the Frame7 displayed.
If I recall the function, the Frame7 is still displayed (instead of the Frame8) and I have to recall the function 4 times again to have the Frame8 displayed. Now, again 8 times it works and then 5/6 donesn't.. and so on.
I can't use the IVideoFrameStep.Step method because it isn't implemeted by my renderer card.