DMO Wrapper Filter

 
Microsoft DirectShow 9.0

DMO Wrapper Filter

The DMO Wrapper filter enables a Microsoft® DirectShow® application to use a DirectX Media Object (DMO) within a filter graph. The filter wraps the DMO and handles all the details of using the DMO, such as passing data to and from the DMO. Also, the filter aggregates the DMO, so the application can query the filter for any COM interfaces that the DMO exposes.

Limitations

The current implementation of the DMO Wrapper has the following limitations:

  • It does not support DMOs with zero inputs, multiple inputs, or zero outputs. (It does support DMOs with one input and multiple outputs.)
  • It does not support custom transports . All data transport is done through the IMemInputPin interface.
  • It does not use the IMediaObjectInPlace interface; all processing is done using IMediaObject methods.
Filter Interfaces IBaseFilter, IDMOWrapperFilter, IPersistStream
Input Pin Media Types See Remarks
Input Pin Interfaces IMemInputPin, IPin, IQualityControl
Output Pin Media Types See Remarks
Output Pin Interfaces IAMStreamConfig, IAMVideoCompression, IMediaPosition, IMediaSeeking, IPin, IQualityControl
Filter CLSID CLSID_DMOWrapperFilter
Property Page CLSID No property page
Executable Qasf.dll
Merit See Remarks
Filter Category See Remarks

Remarks

Pins: For each input stream on the DMO, the filter creates a corresponding input pin. For each output stream, it creates a corresponding output pin. The media types that each pin supports depends on the DMO.

Encoder Interfaces: If the DMO is a video encoder or an audio encoder, the output pin exposes the IAMStreamConfig interface. If the DMO is a video encoder, the output pin also exposes the IAMVideoCompression interface. In both cases, if the DMO supports the interface, the pin delegates to the DMO. Otherwise, the pin provides its own implementation.

Streaming: The filter uses the IMemInputPin interface to handle all streaming. It does not support IAsyncReader connections. The filter calls IMediaObject::ProcessOutput on the DMO only when it receives data from upstream (including end-of-stream notifications). Therefore, it does not support DMOs with zero input streams.

Seeking: All seek requests are passed to the upstream filter, through the first input pin on the DMO Wrapper. For multiple-output DMOs, this means that the upstream filter might receive multiple seek requests when the application seeks the graph.

Merit: DirectShow assigns all DMOs a default merit value of MERIT_NORMAL + 0x800. This value falls between MERIT_NORMAL and MERIT_PREFERRED. Decoder filters generally have a merit value of MERIT_NORMAL. Therefore, the filter graph manager will usually select a DMO decoder over a decoder filter. To override the default merit value, add a registry entry to the DMO's registry key in HKEY_CLASSES_ROOT\CLSID. Include a DWORD value named Merit whose value specifies the merit.

Category: The DMO Wrapper filter does not appear by itself in any category. When it wraps a DMO, it appears in the DirectShow category that corresponds to the DMO's category, under the name of the DMO.

GraphEdit: In GraphEdit, the DMO Wrapper filter does not appear under its own name. Instead, each registered DMO is listed under the appropriate filter category. When you add a DMO through the Insert Filters dialog, GraphEdit creates the DMO Wrapper filter and configures it to use that DMO.

Buffers: The DMO Wrapper filter passes media buffers to the DMO which expose the IMediaBuffer interface.

Windows Vista or later: The media buffers also expose the IServiceProvider interface. The DMO can use this interface to get a pointer to the media sample that is associated with the buffer. Use the service identifier IID_IMediaSample. A video DMO can use the media sample's IMediaSample2 interface to set interlace flags on the sample. The following code shows how to get the pointer to the media sample:

IServiceProvider *pSp = NULL;
IMediaSample2 *pSample2 = NULL;
HRESULT hr = S_OK;

hr = pBuffer->QueryInterface(IID_IServiceProvider, (void**)&pSp);
if (SUCCEEDED(hr))
{
    hr = pSp->QueryService(
        IID_IMediaSample,  // Service identifier.
        IID_IMediaSample2, // Interface identifier.
        (void**)&pSample2
        );
    if (SUCCEEDED(hr))
    {
        // Set flags (not shown).
        pSample2->Release();
    }
    pSp->Release();
}

For more information about per-sample interlace flags, see AM_SAMPLE2_PROPERTIES Structure.

Quality Control: If the DMO exposes the IDMOQualityControl interface, the filter translates IQualityControl::Notify calls on its output pin into IDMOQualityControl::SetNow calls on the DMO. The rtNow parameter to SetNow is calculated as the sum of the TimeStamp and Late members of the Quality structure.

See Also