Compartir a través de


Uso de DPO en DirectShow

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Las aplicaciones basadas en DirectShow pueden usar DPO en un gráfico de filtros a través del filtro contenedor DMO . Este filtro agrega un DMO y controla todos los detalles del uso de DMO, como pasar datos hacia y desde DMO, asignar objetos IMediaBuffer , etc.

Dado que el filtro agrega el DMO, la aplicación puede consultar el filtro de las interfaces COM que expone DMO. Sin embargo, la aplicación debe permitir que el filtro controle todas las operaciones de streaming en DMO. Por ejemplo, no establezca tipos de medios, procese ningún búfer, vacíe el DMO, bloquee el DMO, habilite o deshabilite el control de calidad o establezca optimizaciones de vídeo.

Si conoce el identificador de clase (CLSID) de un DMO específico que desea usar, puede inicializar el filtro contenedor DMO con ese DMO, como se indica a continuación:

  1. Llame a CoCreateInstance para crear el filtro contenedor DMO.
  2. Consulte el filtro contenedor DMO para la interfaz IDMOWrapperFilter .
  3. Llame al método IDMOWrapperFilter::Init . Especifique el CLSID del DMO y el GUID de la categoría de DMO. Para obtener una lista de categorías de DMO, consulte GUID de DMO.

El siguiente código muestra estos pasos:

// Create the DMO Wrapper filter.
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
    reinterpret_cast<void**>(&pFilter));

if (SUCCEEDED(hr)) 
{
    // Query for IDMOWrapperFilter.
    IDMOWrapperFilter *pDmoWrapper;
    hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, 
        reinterpret_cast<void**>(&pDmoWrapper));

    if (SUCCEEDED(hr)) 
    {     
        // Initialize the filter.
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); 
        pDmoWrapper->Release();

        if (SUCCEEDED(hr)) 
        {
            // Add the filter to the graph.
            hr = pGraph->AddFilter(pFilter, L"My DMO");
        }
    }
    pFilter->Release();
}

La función DMOEnum enumera las DMOEnum en el Registro. Esta función usa un conjunto diferente de GUID de categoría de los que se usan para los filtros DirectShow.

Uso del enumerador de dispositivos del sistema con DPO

En lugar de crear un DMO directamente, puede usar el enumerador de dispositivos del sistema, que puede enumerar cualquier categoría de DMO compatible con el método DMOEnum . El enumerador de dispositivos del sistema también incluye DPO cuando enumera determinadas categorías de filtro DirectShow. En la tabla siguiente se muestra la asignación entre categorías de DMO y categorías directShow.

Etiqueta Value
Categoría DMO DirectShow Equivalente
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

El enumerador de dispositivos del sistema devuelve una lista de objetos de moniker. Si el moniker representa un DMO, el método IMoniker::BindToObject crea automáticamente el filtro contenedor DMO y lo inicializa con ese DMO. Por lo tanto, el hecho de que un DMO esté implicado es transparente para la aplicación. Para obtener más información sobre el uso del enumerador de dispositivos del sistema, vea Usar el enumerador de dispositivos del sistema.

Limitaciones

Hay algunas limitaciones al usar DPO en DirectShow:

  • El filtro contenedor DMO no admite DMO con cero entradas, varias entradas o cero salidas.
  • Todas las conexiones pin del filtro contenedor DMO usan la interfaz IMemInputPin .
  • DirectShow Editing Services no admite efectos o transiciones basados en DMO.

Uso de DPO