Fornecendo uma Allocator-Presenter personalizada para VMR-9

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

Para usar um alocador-apresentador personalizado com o filtro renderizador de combinação de vídeo 9 (VMR-9), execute as seguintes etapas:

  1. Implemente uma classe que dê suporte às interfaces IVMRSurfaceAllocator9 e IVMRImagePresenter9 .

  2. Chame QueryInterface no filtro VMR-9 para a interface IVMRFilterConfig9 .

  3. Chame o método IVMRFilterConfig9::SetRenderingMode e passe o sinalizador VMR9Mode_Renderless .

  4. QueryInterface no filtro VMR-9 para a interface IVMRSurfaceAllocatorNotify9 .

  5. Chame o método IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator e passe um ponteiro para o método IVMRSurfaceAllocator9 do alocador-apresentador .

  6. Chame o método IVMRSurfaceAllocator9::AdviseNotify do seu apresentador-alocador e passe um ponteiro para a interface IVMRSurfaceAllocatorNotify9 do filtro VMR-9 .

  7. Na implementação de IVMRSurfaceAllocator9::AdviseNotify, chame IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass em um ponteiro para o dispositivo Direct3D e um identificador para o monitor onde o vídeo será exibido.

  8. Na implementação do método IVMRSurfaceAllocator9::InitializeDevice , crie superfícies Direct3D que correspondam aos parâmetros fornecidos no método InitializeDevice . Opcionalmente, você pode usar o método IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper do filtro VMR-9 para alocar essas superfícies. Armazene os ponteiros de superfície em uma matriz.

    Observação

    Se você quiser que a VMR-9 desenhe os quadros de vídeo em uma superfície de textura, adicione o sinalizador VMR9AllocFlag_TextureSurface à estrutura VMR9AllocationInfo . Se o dispositivo não der suporte a texturas no formato de vídeo nativo, talvez seja necessário criar uma superfície de textura separada e copiar os quadros de vídeo da superfície de vídeo para a textura.

     

  9. Durante o streaming, a VMR-9 obtém superfícies do alocador-apresentador chamando o método IVMRSurfaceAllocator9::GetSurface . A VMR-9 especifica a superfície por seu índice dentro da matriz de superfície (etapa 8).

  10. Apresente a imagem quando a VMR-9 chamar o método IVMRImagePresenter9::P resentImage . Os parâmetros incluem um ponteiro para a superfície direct3D que contém a imagem de vídeo.

  11. Se o dispositivo Direct3D for perdido a qualquer momento, o alocador-apresentador deverá restaurar o dispositivo e recriar as superfícies. Por exemplo, o dispositivo pode ser perdido se o modo de exibição for alterado ou o usuário mover a janela para outro monitor. Se o dispositivo Direct3D for alterado, chame o método IVMRSurfaceAllocatorNotify9::ChangeD3DDevice do filtro VMR-9 .

  12. Quando o streaming é interrompido, a VMR-9 chama o método IVMRSurfaceAllocator9::TerminateDevice . O alocador-apresentador deve liberar todos os seus recursos do Direct3D.

Há algumas diferenças entre a VMR-7 e a VMR-9 na maneira como os alocadores-apresentadores personalizados são gerenciados:

  • O método AllocateSurfaceHelper do filtro VMR-9 está disponível para o alocador-apresentador usar ao alocar superfícies. Esse método torna desnecessário que um alocador-apresentador personalizado encaminhe todas as chamadas para o alocador-apresentador padrão. Por esse motivo, o CLSID do alocador-apresentador padrão do filtro VMR-9 não é publicado.
  • Ao contrário da VMR-7, a VMR-9 não fornece um alocador-apresentador especial do Modo Exclusivo DirectDraw. O método IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper torna esse objeto desnecessário.
  • Para vídeo entrelaçado, a VMR-9 sempre descalça o vídeo antes de apresentar a imagem. O alocador-apresentador não é mais responsável por desassociá-la antes de exibi-la.

Modo de reprodução sem renderização VMR (Alocadores-Apresentadores Personalizados)