Usando DMOs no DirectShow

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Aplicativos baseados no DirectShow podem usar DMOs em um grafo de filtro por meio do filtro Wrapper de DMO . Esse filtro agrega um DMO e manipula todos os detalhes do uso do DMO, como passar dados de e para o DMO, alocar objetos IMediaBuffer e assim por diante.

Como o DMO é agregado pelo filtro, o aplicativo pode consultar o filtro para quaisquer interfaces COM expostas pelo DMO. No entanto, o aplicativo deve permitir que o filtro manipule todas as operações de streaming no DMO. Por exemplo, não defina tipos de mídia, processe buffers, libere o DMO, bloqueie o DMO, habilite ou desabilite o controle de qualidade ou defina otimizações de vídeo.

Se você souber o CLSID (identificador de classe) de um DMO específico que deseja usar, poderá inicializar o filtro Wrapper de DMO com esse DMO, da seguinte maneira:

  1. Chame CoCreateInstance para criar o filtro Wrapper de DMO.
  2. Consulte o filtro Wrapper de DMO para a interface IDMOWrapperFilter .
  3. Chame o método IDMOWrapperFilter::Init . Especifique o CLSID do DMO e o GUID da categoria do DMO. Para obter uma lista de categorias de DMO, consulte GUIDs de DMO.

O código a seguir mostra essas etapas:

// 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();
}

A função DMOEnum enumera DMOs no registro. Essa função usa um conjunto diferente de GUIDs de categoria dos usados para filtros DirectShow.

Usando o Enumerador de Dispositivo do Sistema com DMOs

Em vez de criar um DMO diretamente, você pode usar o Enumerador de Dispositivo do Sistema, que pode enumerar qualquer categoria DMO compatível com o método DMOEnum . O Enumerador de Dispositivo do Sistema também inclui DMOs quando enumera determinadas categorias de filtro DirectShow. A tabela a seguir mostra o mapeamento entre categorias de DMO e categorias do DirectShow.

Rótulo Valor
Categoria DMO Equivalente do DirectShow
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

O Enumerador de Dispositivo do Sistema retorna uma lista de objetos moniker. Se o moniker representar um DMO, o método IMoniker::BindToObject criará automaticamente o filtro Wrapper de DMO e o inicializará com esse DMO. Portanto, o fato de um DMO estar envolvido é transparente para o aplicativo. Para obter mais informações sobre como usar o Enumerador de Dispositivo do Sistema, consulte Usando o Enumerador de Dispositivo do Sistema.

Limitações

Há algumas limitações ao usar DMOs no DirectShow:

  • O filtro Wrapper de DMO não dá suporte a DMOs com zero entradas, várias entradas ou saídas zero.
  • Todas as conexões de fixação no Filtro de Wrapper de DMO usam a interface IMemInputPin .
  • Os Serviços de Edição do DirectShow não dão suporte a efeitos ou transições baseados em DMO.

Usando DMOs