Compartilhar via


Processamento de In-Place

[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.]

Determinadas transformações de dados podem ser realizadas modificando diretamente os dados. Isso é chamado de processamento in-loco . Muitos efeitos de áudio e vídeo podem ser feitos dessa maneira. Se um DMO der suporte ao processamento in-loco, ele exporá a interface IMediaObjectInPlace . O processamento in-loco geralmente é mais eficiente do que usar buffers separados para a saída. (Uma exceção importante é quando o buffer reside na memória de vídeo. Nessa situação, as operações de leitura são muito mais lentas do que as operações de gravação, portanto, o processamento in-loco não é recomendado.)

Para processar dados em vigor, o cliente faz uma única chamada para o método IMediaObjectInPlace::P rocess , em vez de chamadas separadas para ProcessInput e ProcessOutput. O método Process é síncrono; todo o processamento ocorre dentro da chamada. Além disso, o processamento in-loco não usa objetos IMediaBuffer . O método Process usa um ponteiro diretamente para o buffer de memória.

Um DMO que dá suporte ao processamento in-loco ainda deve implementar a interface IMediaObject , incluindo os métodos ProcessInput e ProcessOutput . O cliente pode escolher se deseja usar o processamento in-loco ou usar buffers separados. No entanto, não misture os dois tipos de processamento. Se você chamar Process, não chame ProcessInput ou ProcessOutput e vice-versa.

Caudas de efeito

Um DMO in-loco pode criar alguma saída adicional depois que a entrada for interrompida. Isso é chamado de cauda de efeito. Por exemplo, um efeito reverb continua depois que a entrada atinge o silêncio. Se houver uma parte final do efeito, o método Process retornará S_FALSE. Depois que o aplicativo tiver processado todos os seus dados, ele poderá gerar a parte final do efeito enviando buffers vazios para o método Process .

Hospedar diretamente um DMO