다음을 통해 공유


VMR-9에 대한 사용자 지정 Allocator-Presenter 제공

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

VMR-9(Video Mixing Renderer 9) 필터와 함께 사용자 지정 할당자-발표자를 사용하려면 다음 단계를 수행합니다.

  1. IVMRSurfaceAllocator9IVMRImagePresenter9 인터페이스를 지원하는 클래스를 구현합니다.

  2. IVMRFilterConfig9 인터페이스에 대한 VMR-9 필터에서 QueryInterface를 호출합니다.

  3. IVMRFilterConfig9::SetRenderingMode 메서드를 호출하고 VMR9Mode_Renderless 플래그를 전달합니다.

  4. IVMRSurfaceAllocatorNotify9 인터페이스에 대한 VMR-9 필터의 QueryInterface입니다.

  5. IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator 메서드를 호출하고 할당자-발표자의 IVMRSurfaceAllocator9 메서드에 대한 포인터를 전달합니다.

  6. allocator-presenter의 IVMRSurfaceAllocator9::AdviseNotify 메서드를 호출하고 VMR-9 필터의 IVMRSurfaceAllocatorNotify9 인터페이스에 대한 포인터를 전달합니다.

  7. IVMRSurfaceAllocator9::AdviseNotify 구현에서 Direct3D 디바이스에 대한 포인터와 비디오가 표시되는 모니터에 대한 핸들에서 IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass를 호출합니다.

  8. IVMRSurfaceAllocator9::InitializeDevice 메서드 구현에서 InitializeDevice 메서드에 지정된 매개 변수와 일치하는 Direct3D 표면을 만듭니다. 필요에 따라 VMR-9 필터의 IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper 메서드를 사용하여 이러한 표면을 할당할 수 있습니다. 배열에 표면 포인터를 저장합니다.

    참고

    VMR-9에서 비디오 프레임을 텍스처 화면에 그리려면 VMR9AllocationInfo 구조에 VMR9AllocFlag_TextureSurface 플래그를 추가합니다. 디바이스가 네이티브 비디오 형식의 텍스처를 지원하지 않는 경우 별도의 텍스처 표면을 만든 다음 비디오 화면에서 텍스처로 비디오 프레임을 복사해야 할 수 있습니다.

     

  9. 스트리밍하는 동안 VMR-9는 IVMRSurfaceAllocator9::GetSurface 메서드를 호출하여 할당자-발표자로부터 표면을 가져옵니다. VMR-9는 표면 배열 내의 인덱스로 표면을 지정합니다(8단계).

  10. VMR-9가 IVMRImagePresenter9::P resentImage 메서드를 호출할 때 이미지를 표시합니다. 매개 변수에는 비디오 이미지가 포함된 Direct3D 표면에 대한 포인터가 포함됩니다.

  11. Direct3D 디바이스가 언제든지 손실되면 할당자-발표자는 디바이스를 복원하고 표면을 다시 만들어야 합니다. 예를 들어 디스플레이 모드가 변경되거나 사용자가 창을 다른 모니터로 이동하면 디바이스가 손실될 수 있습니다. Direct3D 디바이스가 변경되면 VMR-9 필터의 IVMRSurfaceAllocatorNotify9::ChangeD3DDevice 메서드를 호출합니다.

  12. 스트리밍이 중지되면 VMR-9는 IVMRSurfaceAllocator9::TerminateDevice 메서드를 호출합니다. 할당자-발표자는 모든 Direct3D 리소스를 해제해야 합니다.

사용자 지정 할당자-발표자를 관리하는 방식에서 VMR-7과 VMR-9 간에는 몇 가지 차이점이 있습니다.

  • VMR-9 필터의 AllocateSurfaceHelper 메서드는 할당자-발표자가 표면을 할당할 때 사용할 수 있습니다. 이 메서드를 사용하면 사용자 지정 할당자-발표자가 기본 할당자-발표자에 대한 호출을 전달할 필요가 없습니다. 이러한 이유로 VMR-9 필터의 기본 할당자-발표자의 CLSID는 게시되지 않습니다.
  • VMR-7과 달리 VMR-9는 특별한 DirectDraw 전용 모드 할당자-발표자를 제공하지 않습니다. IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper 메서드는 이 개체를 불필요하게 만듭니다.
  • 인터레이스된 비디오의 경우 VMR-9는 이미지를 표시하기 전에 항상 비디오를 인터레이스 해제합니다. 할당자-발표자는 이미지를 표시하기 전에 더 이상 이미지의 인터레이스 해제를 담당하지 않습니다.

VMR 렌더링리스 재생 모드(사용자 지정 할당자-발표자)