Partilhar via


Sobre MFTs

As MFTs (transformações do Media Foundation) fornecem um modelo genérico para processar dados de mídia. Os MFTs são usados para decodificadores, codificadores e DSPs (processadores de sinal digital). Em suma, qualquer coisa que esteja no pipeline de mídia entre a fonte de mídia e o coletor de mídia é um MFT.

Para a maioria dos aplicativos, os detalhes do processamento de dados MFT são ocultos por camadas mais altas da arquitetura do Media Foundation. Muitos aplicativos do Media Foundation nunca farão uma chamada direta para um MFT. No entanto, é certamente possível hospedar um MFT diretamente em seu aplicativo.

Os MFTs são uma evolução do modelo de transformação introduzido pela primeira vez com DMOs (Objetos de Mídia) do DirectX. Na verdade, é relativamente fácil criar uma transformação que dê suporte a ambos os modelos. Em comparação com os DMOs, os comportamentos necessários dos MFTs são especificados com mais clareza, o que facilita a gravação de uma implementação correta. Além disso, os MFTs podem dar suporte ao processamento de vídeo acelerado por hardware.

Este tópico fornece uma breve visão geral do modelo de processamento MFT, focando no design geral em vez de chamadas de método específicas. Para obter uma descrição passo a passo mais detalhada, consulte Modelo básico de processamento de MFT.

Fluxos

Um MFT tem fluxos de entrada e fluxos de saída. Os fluxos de entrada recebem dados e os fluxos de saída produzem dados. Por exemplo, um decodificador tem um fluxo de entrada, que recebe os dados codificados e um fluxo de saída, que produz os dados decodificados.

Os fluxos em um MFT não são representados como objetos COM distintos. Em vez disso, cada fluxo tem um identificador de fluxo designado e os métodos na interface IMFTransform levam identificadores de fluxo como parâmetros de entrada.

Alguns MFTs têm um número fixo de fluxos. Por exemplo, decodificadores e codificadores normalmente têm exatamente uma entrada e uma saída. Outros MFTs têm um número dinâmico de fluxos. Se um MFT der suporte a fluxos dinâmicos, o cliente poderá adicionar novos fluxos de entrada. O cliente não pode adicionar fluxos de saída, mas o MFT pode adicionar ou remover fluxos de saída durante o processamento. Por exemplo, multiplexadores normalmente permitem que o cliente adicione fluxos de entrada e tenha uma saída para o fluxo multiplexado. Demultiplexers são o inverso, com uma entrada, mas um número dinâmico de fluxos de saída, dependendo do conteúdo do fluxo de entrada. A ilustração a seguir mostra a diferença entre multiplexer e demultiplexer.

diagrama mostrando um codificador/decodificador (1 entrada, 1 saída), um multiplexer (2 entradas, 1 saída) e um demultiplexer (1 entrada, 2 saídas)

Tipos de mídia

Quando um MFT é criado pela primeira vez, nenhum dos fluxos tem um formato estabelecido. Antes que o MFT possa processar dados, o cliente deve definir os formatos para os fluxos. Por exemplo, com um decodificador, o formato de entrada é o formato de compactação usado no arquivo de origem original e o formato de saída é um formato descompactado, como áudio PCM ou vídeo RGB. Os formatos de fluxo são descritos usando tipos de mídia.

Dependendo do estado interno do MFT, ele pode fornecer uma lista de possíveis tipos de mídia para cada fluxo. Você pode usar essa lista como uma dica ao definir os tipos de mídia. Definir o tipo de mídia em um fluxo pode alterar a lista de tipos possíveis para outro fluxo. Por exemplo, um decodificador normalmente não pode fornecer nenhum tipo de saída até que o cliente defina o tipo de entrada. O tipo de entrada contém as informações de que o decodificador precisa para retornar uma lista de possíveis tipos de saída.

Para definir o tipo de mídia em um fluxo, chame IMFTransform::SetInputType ou IMFTransform::SetOutputType. Para obter a lista de tipos de mídia possíveis para um fluxo, chame IMFTransform::GetInputAvailableType ou IMFTransform::GetOutputAvailableType.

Processando dados

Depois que o cliente define os tipos de mídia nos fluxos, o MFT está pronto para processar dados. Para fazer isso acontecer, o cliente alterna entre fornecer dados de entrada para o MFT e obter dados de saída do MFT:

O método ProcessInput usa um ponteiro para um exemplo de mídia alocado pelo cliente. O exemplo de mídia contém um ou mais buffers e cada buffer contém dados de entrada para o MFT processar.

O método ProcessOutput dá suporte a dois modelos de alocação diferentes: o MFT aloca os buffers de saída ou o cliente aloca os buffers de saída. Alguns MFTs dão suporte a ambos os modelos de alocação, mas não é necessário que um MFT dê suporte a ambos. Por exemplo, um MFT pode exigir que o cliente aloque os buffers de saída. O método IMFTransform::GetOutputStreamInfo retorna informações sobre um fluxo de saída, incluindo qual modelo de alocação o MFT dá suporte.

Os MFTs foram projetados para armazenar o mínimo de dados possível em buffer, a fim de minimizar a latência no pipeline. Portanto, a qualquer momento, o MFT pode sinalizar uma das seguintes condições:

  • O MFT requer mais dados de entrada. Nesse estado, o MFT não pode produzir saída até que o cliente chame ProcessInput pelo menos uma vez.
  • O MFT não aceitará mais nenhuma entrada até que o cliente chame ProcessOutput pelo menos uma vez.

Por exemplo, suponha que você esteja usando um decodificador de vídeo para decodificar um fluxo de vídeo que contém uma combinação de quadros-chave e quadros delta. Inicialmente, o MFT requer alguma entrada antes de poder decodificar qualquer quadro. O cliente chama ProcessInput para entregar o primeiro quadro. Suponha que o primeiro quadro seja um quadro delta (mostrado no diagrama a seguir como 'P' para o quadro previsto). O decodificador mantém esse quadro, mas não pode produzir nenhuma saída até obter o próximo quadro-chave.

diagrama mostrando o mft que precisa de entrada, apontando para um quadro previsto

O cliente continua a chamar ProcessInput e, eventualmente, atinge o próximo quadro-chave (mostrado no próximo diagrama como 'I' para quadro intra-codificado). Agora, o decodificador tem quadros suficientes para iniciar a decodificação. Neste ponto, ele para de aceitar a entrada e o cliente deve chamar ProcessOutput para obter os quadros decodificados.

diagrama mostrando um mft que não está aceitando entrada, apontando para um quadro intracódigo e três quadros previstos

A abordagem mais simples para o cliente é simplesmente alternar chamadas para ProcessInput e ProcessOutput. Um algoritmo mais sofisticado é descrito no tópico Modelo de Processamento MFT Básico.

Transformações do Media Foundation