Etapa 1. Escolher uma classe base
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 in 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.]
Esta é a etapa 1 do tutorial Escrevendo filtros de transformação.
Supondo que você decida escrever um filtro e não um DMO, a primeira etapa é escolher qual classe base usar. As seguintes classes são apropriadas para filtros de transformação:
O CTransformFilter foi projetado para transformar filtros que usam buffers de entrada e saída separados. Esse tipo de filtro às vezes é chamado de filtro de transformação de cópia. Quando um filtro de transformação de cópia recebe um exemplo de entrada, ele grava novos dados em um exemplo de saída e entrega o exemplo de saída para o próximo filtro.
CTransInPlaceFilter foi projetado para filtros que modificam dados no buffer original, também chamados de filtros trans-in-loco. Quando um filtro trans-in-loco recebe um exemplo, ele altera os dados dentro desse exemplo e fornece o mesmo exemplo downstream. O pino de entrada e o pino de saída do filtro sempre se conectam com tipos de mídia correspondentes.
CVideoTransformFilter foi projetado principalmente para decodificadores de vídeo. Ele deriva de CTransformFilter, mas inclui funcionalidade para soltar quadros se o renderizador downstream ficar para trás.
CBaseFilter é uma classe de filtro genérica. As outras classes nessa lista derivam de CBaseFilter. Se nenhum deles for adequado, você poderá voltar para essa classe. No entanto, essa classe também requer mais trabalho de sua parte.
! [Importante]
As transformações de vídeo in-loco podem ter um impacto sério no desempenho de renderização. As transformações in-loco exigem operações de leitura-modificação-gravação no buffer. Se a memória residir em um gráfico cartão, as operações de leitura serão significativamente mais lentas. Além disso, até mesmo uma transformação de cópia poderá causar operações de leitura não intencionais se você não implementá-la com cuidado. Portanto, você sempre deverá fazer testes de desempenho se escrever uma transformação de vídeo.
Para o codificador RLE de exemplo, a melhor opção é CTransformFilter ou CVideoTransformFilter. Na verdade, as diferenças entre eles são em grande parte internas, portanto, é fácil converter de um para o outro. Como os tipos de mídia devem ser diferentes nos dois pinos, a classe CTransInPlaceFilter não é apropriada para esse filtro. Este exemplo usará CTransformFilter.
Próximo: Etapa 2. Declare a classe filter.
Tópicos relacionados