Partilhar via


Filtro wrapper DMO

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Audio/Video Capture in 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.]

O filtro Wrapper DMO permite que um aplicativo DirectShow use um DMO ( Objeto de Mídia) DirectX em um grafo de filtro. O filtro encapsula o DMO e manipula todos os detalhes do uso do DMO, como passar dados de e para o DMO. Além disso, o filtro agrega o DMO, para que o aplicativo possa consultar o filtro para quaisquer interfaces COM expostas pelo DMO.

Rótulo Valor
Interfaces de filtro IBaseFilter, IDMOWrapperFilter, IPersistStream
Tipos de mídia de pino de entrada Ver Comentários
Interfaces de pino de entrada IMemInputPin, IPin, IQualityControl
Tipos de mídia de pino de saída Ver Comentários
Interfaces de pino de saída IAMStreamConfig, IAMVideoCompression, IMediaPosition, IMediaSeeking, IPin, IQualityControl
Filtrar CLSID CLSID_DMOWrapperFilter
CLSID da página de propriedades Nenhuma página de propriedades
Executável Qasf.dll
Mérito Ver Comentários
Categoria de Filtro Ver Comentários

 

Comentários

Limitações

O Wrapper de DMO tem as seguintes limitações:

  • Ele não dá suporte a DMOs com zero entradas, várias entradas ou nenhuma saída. (Ele dá suporte a DMOs com uma entrada e várias saídas.)
  • Ele não dá suporte a transportes personalizados. Todo o transporte de dados é feito por meio da interface IMemInputPin .
  • Ele não usa a interface IMediaObjectInPlace ; todo o processamento é feito usando métodos IMediaObject .

Pins

Para cada fluxo de entrada no DMO, o filtro cria um pino de entrada correspondente. Para cada fluxo de saída, ele cria um pino de saída correspondente. Os tipos de mídia aos quais cada pino dá suporte dependem do DMO

Interfaces do codificador

Se o DMO for um codificador de vídeo ou um codificador de áudio, o pino de saída exporá a interface IAMStreamConfig . Se o DMO for um codificador de vídeo, o pino de saída também exporá a interface IAMVideoCompression . Em ambos os casos, se o DMO der suporte à interface , o fixar delega ao DMO. Caso contrário, o pin fornecerá sua própria implementação.

Streaming

O filtro usa a interface IMemInputPin para manipular todo o streaming. Ele não dá suporte a conexões IAsyncReader . O filtro chama IMediaObject::P rocessOutput no DMO somente quando recebe dados de upstream (incluindo notificações de fim de fluxo). Portanto, ele não dá suporte a DMOs sem fluxos de entrada.

Procurando

Todas as solicitações de busca são passadas para o filtro upstream, por meio do primeiro pino de entrada no Wrapper de DMO. Para DMOs de várias saídas, isso significa que o filtro de upstream pode receber várias solicitações de busca quando o aplicativo busca o grafo.

Mérito

O DirectShow atribui a todos os DMOs um valor de mérito padrão de MERIT_NORMAL + 0x800. Esse valor fica entre MERIT_NORMAL e MERIT_PREFERRED. Os filtros de decodificador geralmente têm um valor de mérito de MERIT_NORMAL. Portanto, o gerenciador de grafo de filtro geralmente selecionará um decodificador DMO em um filtro de decodificador. Para substituir o valor de mérito padrão, adicione uma entrada do Registro à chave do Registro do DMO em HKEY_CLASSES_ROOT\CLSID. Inclua um valor DWORD chamado "Merit" cujo valor especifica o mérito.

Categoria

O filtro Wrapper de DMO não aparece sozinho em nenhuma categoria. Quando encapsula um DMO, ele aparece na categoria DirectShow que corresponde à categoria do DMO, sob o nome do DMO.

Buffers

O filtro Wrapper de DMO passa buffers de mídia para o DMO que expõe a interface IMediaBuffer .

No Windows Vista ou posterior, os buffers de mídia também expõem a interface IServiceProvider. O DMO pode usar essa interface para obter um ponteiro para o exemplo de mídia associado ao buffer. Use o identificador de serviço IID_IMediaSample. Um DMO de vídeo pode usar a interface IMediaSample2 do exemplo de mídia para definir sinalizadores de entrelaçamento no exemplo. O código a seguir mostra como obter o ponteiro para o exemplo de mídia:

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

Para obter mais informações sobre sinalizadores de entrelaçamento por exemplo, consulte Estrutura AM_SAMPLE2_PROPERTIES.

Controle de qualidade

Se o DMO expõe a interface IDMOQualityControl , o filtro converte chamadas IQualityControl::Notify em seu pin de saída em chamadas IDMOQualityControl::SetNow no DMO. O parâmetro rtNow de SetNow é calculado como a soma dos membros TimeStamp e Late da estrutura Quality .

Usando o Fiter no GraphEdit

No GraphEdit, o filtro Wrapper de DMO não aparece com seu próprio nome. Em vez disso, cada DMO registrado é listado na categoria de filtro apropriada. Quando você adiciona um DMO por meio da caixa de diálogo Inserir Filtros , o GraphEdit cria o filtro wrapper DMO e o configura para usar esse DMO.

Filtros do DirectShow

Objetos de mídia DirectX