Partilhar via


Trabalhando com buffers e amostras de mídia MFT

Codec MFTs transferem dados de mídia entre si usando buffers de mídia e amostras.

Um buffer de mídia é um objeto COM que gerencia um bloco de memória, normalmente para armazenar dados de mídia. Quando os dados são passados de ou para uma MFT, eles são sempre passados na forma de um buffer de mídia.

Todos os buffers de mídia expõem a interface IMFMediaBuffer. Esta interface é projetada para qualquer tipo de dados. Buffers que contêm dados de vídeo muitas vezes também expõem IMF2DBuffer.

Um buffer de mídia tem um tamanho máximo, que é a quantidade de memória alocada para o buffer. Para encontrar o tamanho máximo, chame IMFMediaBuffer::GetMaxLength. Em qualquer momento, um buffer de mídia também tem um comprimento atual, que é a quantidade de dados válidos no buffer, variando de zero bytes até o tamanho máximo. Para obter o comprimento atual, chame IMFMediaBuffer::GetCurrentLength. Quando o buffer é criado, o comprimento atual é zero. Se você gravar dados no buffer, chame IMFMediaBuffer::SetCurrentLength para atualizar o comprimento atual.

Para acessar a memória no buffer, chame IMFMediaBuffer::Lock. Esse método retorna um ponteiro para o início do bloco de memória. Quando terminar de usar o ponteiro, chame IMFMediaBuffer::Unlock. O método Lock não é um mecanismo de sincronização de threads; ele não garante que outros threads não possam acessar o buffer. O método Lock é usado para garantir que a memória acessada permanecerá válida até que você chame o método Unlock.

Um objeto de exemplo de mídia (no contexto do Media Foundation SDK) é um objeto que contém uma lista ordenada de zero ou mais buffers. Amostras de mídia expõem a interface IMFSample.

Para criar um novo exemplo, chame a função MFCreateSample. Inicialmente, a lista de buffer do exemplo está vazia. Para adicionar um buffer ao final da lista, chame IMFSample::AddBuffer.

Trabalhando com DMOs Codec

Trabalhando com MFTs Codec