Compartilhar via


Tipos de mídia DMO

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

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 de 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 configuração de tipos de mídia em umde 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 procurar DMOs que correspondam a um formato específico. As informações no registro não devem ser abrangentes. Normalmente, você incluiria apenas os principais tipos aos quais o DMO dá suporte. A entrada do Registro tem chaves separadas para tipos de entrada e saída, mas não distingue 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 incluir 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 compatíveis. 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 após o tipo de entrada ser 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 principal ou subtipo 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 de 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 não compactados 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 à definiçã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 de DMO