Compartilhar via


Sobre exemplos de mídia e alocadores

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo 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 Captura de Áudio/Vídeo 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.]

Os filtros fornecem dados entre conexões de pin. Os dados são movidos do pino de saída de um filtro para o pino de entrada de outro filtro. A maneira mais comum para o pino de saída entregar os dados é chamando o método IMemInputPin::Receive na entrada, embora também existam alguns outros mecanismos.

Dependendo do filtro, a memória dos dados de mídia pode ser alocada de várias maneiras: no heap, em uma superfície DirectDraw, usando memória GDI compartilhada ou usando algum outro mecanismo de alocação. O objeto responsável por alocar a memória é chamado de alocador, que é um objeto COM que expõe a interface IMemAllocator .

Quando dois pinos se conectam, um dos pinos deve fornecer um alocador. O DirectShow define uma sequência de chamadas de método usadas para estabelecer qual pin fornece o alocador. Os pinos também concordam com o número de buffers que o alocador criará e o tamanho dos buffers.

Antes do streaming começar, o alocador cria um pool de buffers. Durante o streaming, o filtro upstream preenche buffers com dados e os entrega ao filtro downstream. Mas o filtro upstream não fornece os ponteiros brutos do filtro downstream para os buffers. Em vez disso, ele usa objetos COM chamados exemplos de mídia, que o alocador cria para gerenciar os buffers. Exemplos de mídia expõem a interface IMediaSample . Um exemplo de mídia contém:

  • um ponteiro para o buffer subjacente
  • um carimbo de data/hora
  • vários sinalizadores
  • opcionalmente, um tipo de mídia

O carimbo de data/hora define a hora da apresentação, que o filtro do renderizador usa para agendar a renderização. Os sinalizadores indicam coisas como se houve uma quebra nos dados desde o exemplo anterior. O tipo de mídia fornece uma maneira de os filtros alterarem os formatos no meio do fluxo. Normalmente, o exemplo não tem nenhum tipo de mídia, o que indica que o formato não foi alterado desde o exemplo anterior.

Enquanto um filtro estiver usando um buffer, ele mantém a contagem de referência no exemplo. O alocador usa a contagem de referência para determinar quando ele pode reutilizar o buffer. Isso impede que um filtro substitua um buffer que outro filtro ainda está usando. Um exemplo não retorna ao pool de amostras disponíveis do alocador até que cada filtro o libere.

Para obter mais informações, consulte estes tópicos:

Os tópicos a seguir destinam-se a desenvolvedores que estão escrevendo seus próprios filtros personalizados:

O grafo de filtro e seus componentes