c++windowsdirectshowsamplegrabber

What's the best way to fix Pixel Aspect Ratio (PAR) issues on DirectShow?


I am using a DirectShow filtergraph to grab frames from videos. The current implementation follows this graph:

SourceFilter->SampleGrabber->NullRenderer

This works most of the time to extract images frame by frame for further processing. However I encountered issues with some videos that do not have a PAR of 1:1. These images occur stretched in my processing steps.

The only way to fix this I have found for now is to use a VMR9 renderer in windowless mode that uses GetCurrentImage() to extract a bitmap with the correct aspect ratio. But this method is not very useful for continuous grabbing of thousands of frames.

My question now is: what is the best way to fix this problem? Has anyone run into this issue as well?


Solution

  • Sample Grabber gets you frames with original pixels. It is not exactly a problem if there is aspect ratio attached and the pixels are not "square pixels". To convert to square pixels you simply need to stretch the image respectively. It would be easier for you to do this scale step outside of DirectShow pipeline, and you have all data you need: pixels and original media type. You can calculate the corresponding resolution with square pixels and resample the picture.