How to make a constant frame rate video stream from variable frame rate stream, and rescale it

From a conversation:

I have a video stream with variable frame rate, I want to make this in to a constant  frame rate. Do you know of any filters that could help me with this?

Such filter is actually quite easy. You only need to update time stamps of the media samples that are going through. I am not aware of  an “out of the box” ready filter, but you can even do it without special filter: if you build your graph with Sample Grabber Filter in it in  the place of interest, and initialize it to have a callback for each sample, then in SampleCB method you will be able to update time stamps using methods of IMediaSample interface. This is sufficient to redistribute the frames on the timeline, so that they go at constant frame rate.

In your opinion what is the best way to scale the video?

The best depends on what is the criteria (speed, quality etc). The simplest for me while very efficient – and I did this a number of times – is to use a custom filter which inside it uses StretchBlt function on a per frame basis to scale input RGB video into output RGB video of a different resolution.

Leave a Reply