Tipos de mídia 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.]

Um tipo de mídia descreve o formato associado a um fluxo de dados de mídia. Este artigo descreve como os DMOs lidam com tipos de mídia. Ele destina-se principalmente a desenvolvedores que estão escrevendo seus próprios DMOs personalizados.

Os tipos de mídia são definidos usando a estrutura DMO_MEDIA_TYPE . Essa estrutura inclui as seguintes informações:

  • O tipo principal é um GUID (identificador global exclusivo) que define uma categoria ampla, como áudio ou vídeo.
  • O subtipo é um GUID que define aspectos mais específicos do tipo. Por exemplo, em vídeo, os subtipos incluem RGB de 16 bits, RGB de 24 bits, UYVY, vídeo codificado em DV e assim por diante.
  • O bloco de formato é uma estrutura secundária que especifica totalmente o formato. O layout do bloco de formato depende do tipo de dados. Por exemplo, o áudio PCM usa a estrutura WAVEFORMATEX . O vídeo usa várias outras estruturas, incluindo VIDEOINFOHEADER e VIDEOINFOHEADER2. O layout do bloco de formato é identificado por um GUID de tipo de formato. Por exemplo, FORMAT_WaveFormatEx especifica uma estrutura WAVEFORMATEX .

Quando um DMO é criado pela primeira vez, os fluxos não têm um tipo de mídia. Antes que o DMO possa processar qualquer dado, o cliente deve definir um tipo de mídia para cada fluxo. Esse processo é descrito da perspectiva do cliente em Configurando tipos de mídia em um DMO.

Tipos de mídia no Registro

Um DMO pode adicionar uma lista de tipos de mídia compatíveis com o Registro, chamando a função DMORegister . Um aplicativo pode usar essas informações para pesquisar DMOs que correspondam a um formato específico. As informações no registro não devem ser abrangentes. Normalmente, você incluiria apenas os tipos de main aos quais o DMO dá suporte. A entrada do Registro tem chaves separadas para tipos de entrada e saída, mas não faz distinção entre fluxos individuais.

A função DMORegister usa a estrutura DMO_PARTIAL_MEDIATYPE para descrever tipos de mídia. Essa estrutura contém um subconjunto das informações encontradas na estrutura DMO_MEDIA_TYPE , ou seja, o tipo principal e o subtipo. Ele não inclui um bloco de formato, pois o bloco de formato normalmente contém informações que são muito granulares para serem incluídas no registro, como a altura e a largura de uma imagem de vídeo.

Tipos de mídia preferenciais

Depois que o aplicativo tiver criado um DMO, ele poderá consultar o DMO para os tipos de mídia aos quais ele dá suporte. Para cada fluxo, o DMO cria uma lista de tipos de mídia (possivelmente vazios), classificados em ordem de preferência. Os métodos IMediaObject::GetInputType e IMediaObject::GetOutputType enumeram os tipos preferenciais. Os tipos preferenciais de um fluxo podem ser alterados dinamicamente quando o aplicativo define tipos de mídia em outros fluxos. Por exemplo, a lista de tipos de saída preferenciais pode ser alterada depois que o tipo de entrada é definido ou vice-versa. No entanto, o DMO não é necessário para atualizar seus tipos preferenciais dinamicamente. O aplicativo não pode assumir que todos os tipos recebidos são válidos. Por esse motivo, os métodos IMediaObject::SetInputType e IMediaObject::SetOutputType dão suporte a um sinalizador para testar um tipo específico.

Os métodos GetInputType e GetOutputType retornam uma estrutura DMO_MEDIA_TYPE . O DMO pode deixar algumas das informações nessa estrutura em branco, para indicar um intervalo de tipos. O tipo ou subtipo principal pode ser GUID_NULL e o bloco de formato pode estar vazio (zero bytes). Se o bloco de formato estiver vazio, o tipo de formato deverá ser GUID_NULL.

Depois que o aplicativo define todos os tipos de entrada de um DMO, o DMO geralmente deve retornar pelo menos um tipo completo para cada fluxo de saída. Um tipo de saída completo facilita o teste e os aplicativos podem usá-lo como um padrão razoável. O aplicativo de teste DMO depende desse comportamento. (Consulte Usando o aplicativo DMOTest.)

Definindo os tipos de mídia

Os aplicativos usam os métodos SetInputType e SetOutputType para testar, definir ou limpar tipos em um fluxo especificado. O aplicativo deve especificar totalmente o tipo. O DMO verifica se ele pode aceitar o tipo proposto. A resposta pode depender de quais tipos foram definidos em outros fluxos. O sinalizador DMO_SET_TYPEF_CLEAR limpa o tipo de um fluxo, para que o aplicativo possa "recuar" e tentar outra combinação.

Cenários de exemplo

Os exemplos a seguir descrevem alguns cenários típicos, para ilustrar os pontos feitos nas seções anteriores.

  • Decodificadores de vídeo. Em um decodificador de vídeo típico, o tipo de entrada determina parcialmente o tipo de saída. Por exemplo, geralmente ambos os fluxos devem ter a mesma taxa de quadros e dimensões de imagem. Uma opção é não definir nenhum tipo de saída preferencial até que o tipo de entrada seja definido. Outra opção é enumerar um conjunto de tipos incompletos, omitindo o bloco de formato. Use o subtipo para indicar os tipos descompactados com suporte, como RGB de 16 bits, RGB de 24 bits e assim por diante. Além disso, os decodificadores de vídeo geralmente não dão suporte à configuração do tipo de saída antes do tipo de entrada. O cenário usual é decodificar de um formato de entrada conhecido, portanto, essa limitação é razoável.
  • Decodificadores de áudio. Um decodificador de áudio pode dar suporte a um conjunto limitado e fixo de formatos de saída. Nesse caso, pode ser capaz de criar uma lista de formatos de saída preferenciais antes que o formato de entrada seja conhecido.
  • Compressores. Na maioria dos casos, um compressor de vídeo não pode especificar totalmente seus formatos de saída preferenciais até que o aplicativo defina o formato de entrada e vice-versa. Em vez disso, o DMO deve retornar um tipo incompleto sem bloco de formato. Para compactação de áudio e vídeo, o aplicativo geralmente precisa definir vários parâmetros de saída, como a taxa de bits. No entanto, depois que o tipo de entrada é definido, o compressor deve retornar pelo menos um tipo de saída completo, pelos motivos mencionados anteriormente.

Escrevendo um DMO