Sobre MFTs
As transformações do Media Foundation (MFTs) fornecem um modelo genérico para o processamento de dados de mídia. MFTs são usados para decodificadores, codificadores e processadores de sinal digital (DSPs). Em suma, qualquer coisa que esteja no caminho de mediação entre a fonte de mídia e o recetor de mídia é um MFT.
Para a maioria dos aplicativos, os detalhes do processamento de dados MFT são ocultos por camadas superiores da arquitetura do Media Foundation. Muitas aplicações do Media Foundation nunca farão uma ligação direta para um MFT. No entanto, é certamente possível hospedar um MFT diretamente em seu aplicativo.
MFTs são uma evolução do modelo de transformação introduzido pela primeira vez com DirectX Media Objects (DMOs). Na verdade, é relativamente fácil criar uma transformação que suporte ambos os modelos. Em comparação com DMOs, os comportamentos necessários de MFTs são mais claramente especificados, o que torna mais fácil escrever uma implementação correta. Além disso, as MFTs podem suportar processamento de vídeo acelerado por hardware.
Este tópico fornece uma breve visão geral do modelo de processamento MFT, concentrando-se 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 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 interfaceIMFTransformusam identificadores de fluxo como parâmetros de entrada.
Algumas MFTs têm um número fixo de fluxos. Por exemplo, os descodificadores e codificadores normalmente têm exatamente uma entrada e uma saída. Outras MFTs têm um número dinâmico de fluxos. Se um MFT suporta fluxos dinâmicos, o cliente pode 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, os multiplexadores normalmente permitem que o cliente adicione fluxos de entrada e tenha uma saída para o fluxo multiplexado. Os desmultiplexadores 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 multiplexador e desmultiplexador.
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 descodificador, o formato de entrada é o formato de compressão utilizado no ficheiro de origem original e o formato de saída é um formato não comprimido, 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.
Processamento de dados
Depois que o cliente define os tipos de mídia nos fluxos, o MFT está pronto para processar dados. Para que isso aconteça, o cliente alterna entre fornecer dados de entrada para o MFT e obter dados de saída do MFT:
- Para fornecer dados de entrada para o MFT, chame IMFTransform::ProcessInput.
- Para extrair dados de saída do MFT, chame IMFTransform::ProcessOutput.
O método ProcessInput recebe um ponteiro para uma amostra de mídia alocada pelo cliente. O exemplo de mídia contém um ou mais buffers, e cada buffer possui dados de entrada para serem processados pelo MFT.
O método ProcessOutput suporta dois modelos de alocação diferentes: MFT aloca os buffers de saída ou o cliente aloca os buffers de saída. Algumas MFTs suportam ambos os modelos de alocação, mas não é necessário que uma MFT suporte ambos. Por exemplo, uma 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 suporta.
MFTs são projetados para armazenar o mínimo de dados possível, 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 chama 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 mistura 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 é um quadro delta (mostrado no diagrama a seguir como 'P' para o quadro previsto). O descodificador retém este fotograma, mas não pode produzir nenhum resultado até obter o próximo fotograma-chave.
O cliente continua a chamar ProcessInput e, eventualmente, alcança o próximo quadro-chave (é mostrado no diagrama seguinte como 'I' para quadro intra-codificado). Agora o decodificador tem quadros suficientes para começar a decodificar. Neste ponto, ele para de aceitar entrada, e o cliente deve chamar ProcessOutput para obter os quadros decodificados.
A abordagem mais simples para o cliente é simplesmente alternar chamadas para ProcessInput e ProcessOutput. Um algoritmo mais sofisticado é descrito no tópico Basic MFT Processing Model.
Tópicos relacionados