Compartir a través de


Proporcionar un Allocator-Presenter personalizado para VMR-9

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Para usar un asignador-moderador personalizado con el filtro Representador de mezcla de vídeos 9 (VMR-9), realice los pasos siguientes:

  1. Implemente una clase que admita las interfaces IVMRSurfaceAllocator9 e IVMRImagePresenter9 .

  2. Llame a QueryInterface en el filtro VMR-9 para la interfaz IVMRFilterConfig9 .

  3. Llame al método IVMRFilterConfig9::SetRenderingMode y pase la marca VMR9Mode_Renderless .

  4. QueryInterface en el filtro VMR-9 para la interfaz IVMRSurfaceAllocatorNotify9 .

  5. Llame al método IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator y pase un puntero al método IVMRSurfaceAllocator9 del moderador asignador.

  6. Llame al método IVMRSurfaceAllocator9::AdviseNotify del moderador y pase un puntero a la interfaz IVMRSurfaceAllocatorNotify9 del filtro VMR-9.

  7. En la implementación de IVMRSurfaceAllocator9::AdviseNotify, llame a IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass in a pointer to the Direct3D device and a handle to the monitor where the video will appear.

  8. En la implementación del método IVMRSurfaceAllocator9::InitializeDevice , cree superficies de Direct3D que coincidan con los parámetros proporcionados en el método InitializeDevice . Opcionalmente, puede usar el método IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper del filtro VMR-9 para asignar estas superficies. Almacene los punteros de superficie en una matriz.

    Nota:

    Si desea que VMR-9 dibuje los fotogramas de vídeo en una superficie de textura, agregue la marca VMR9AllocFlag_TextureSurface a la estructura VMR9AllocationInfo . Si el dispositivo no admite texturas en el formato de vídeo nativo, es posible que tenga que crear una superficie de textura independiente y, a continuación, copiar los fotogramas de vídeo de la superficie de vídeo a la textura.

     

  9. Durante el streaming, VMR-9 obtiene superficies del asignador-moderador llamando al método IVMRSurfaceAllocator9::GetSurface . VMR-9 especifica la superficie por su índice dentro de la matriz de superficies (paso 8).

  10. Presente la imagen cuando VMR-9 llame al método IVMRImagePresenter9::P resentImage . Los parámetros incluyen un puntero a la superficie de Direct3D que contiene la imagen de vídeo.

  11. Si el dispositivo Direct3D se pierde en cualquier momento, el asignador-moderador debe restaurar el dispositivo y volver a crear las superficies. Por ejemplo, el dispositivo se puede perder si el modo de visualización cambia o el usuario mueve la ventana a otro monitor. Si cambia el dispositivo Direct3D, llame al método IVMRSurfaceAllocatorNotify9::ChangeD3DDevice del filtro VMR-9.

  12. Cuando se detiene el streaming, VMR-9 llama al método IVMRSurfaceAllocator9::TerminateDevice . El asignador-moderador debe liberar todos sus recursos de Direct3D.

Hay algunas diferencias entre VMR-7 y VMR-9 de la manera en que se administran los presentadores de asignadores personalizados:

  • El método AllocateSurfaceHelper del filtro VMR-9 está disponible para que el asignador-moderador use al asignar superficies. Este método hace que sea innecesario que un asignador-moderador personalizado reenvíe las llamadas al asignador-moderador predeterminado. Por este motivo, el CLSID del filtro VMR-9 predeterminado del asignador-moderador no se publica.
  • A diferencia de VMR-7, VMR-9 no proporciona un asignador-moderador de modo exclusivo de DirectDraw especial. El método IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper hace que este objeto no sea necesario.
  • En el caso del vídeo entrelazado, VMR-9 siempre deslalaza el vídeo antes de presentar la imagen. El asignador-moderador ya no es responsable de desenlazar la imagen antes de mostrarla.

Modo de reproducción sin representación de VMR (presentadores de asignadores personalizados)