Providing a Custom Video Resizer
Microsoft DirectShow 9.0 |
Providing a Custom Video Resizer
- Note This feature requires DirectX 9.0 or later.
When DirectShow Editing Services (DES) resizes a video source clip, the default behavior is a StretchBlt, which is fast but not anti-aliased. You can change the resizing behavior by implementing a custom resizer as a DirectShow transform filter. The filter must expose the IResize interface, which enables DES to specify the input and output video size. For information about writing a transform filter, see Writing Transform Filters. The CTransformFilter base class is recommended as the starting point. When you implement the filter, note the following:
- Support the IResize interface on the filter (not the pins).
- The filter should accept only VIDEOINFOHEADER formats (FORMAT_VideoInfo). Reject other format types.
- The video format from DES may be any uncompressed RGB type, including 32-bit RGB with alpha (MEDIASUBTYPE_ARGB32). Your filter can safely reject formats with biHeight < 0.
- Before the Render Engine connects the filter's output pin, it calls IResize::put_MediaType to set the output type. It may also call IResize::put_Size to adjust the output size. It can call these two methods in any order, any number of times, before it connects the output pin.
- After the Render Engine connects the output pin, it might call put_Size again. The resizer filter should reconnect its output pin with the new size.
- Inside the filter's CTransformFilter::Transform method, stretch the input video to the output size.
- Your filter should never set the discontinuity flag on the output sample, or attach a media type to the output sample.
- To save the filter's state in a GraphEdit (.grf) file, implement the IPersistStream interface. (This is optional, but useful for testing.)
To use the resizer filter, the filter must be registered as a COM object on the user's system. Before the application renders the video project, query the Render Engine for the IRenderEngine2 interface and call IRenderEngine2::SetResizerGUID with the CLSID of the resizer filter.