Bereitstellen eines benutzerdefinierten Allocator-Presenter für VMR-9
Führen Sie die folgenden Schritte aus, um einen benutzerdefinierten Allocator-Presenter mit dem Filter Video Mixing Renderer 9 (VMR-9) zu verwenden:
Implementieren Sie eine Klasse, die die Schnittstellen IVMRSurfaceAllocator9 und IVMRImagePresenter9 unterstützt.
Rufen Sie QueryInterface für den VMR-9-Filter für die IVMRFilterConfig9-Schnittstelle auf.
Rufen Sie die IVMRFilterConfig9::SetRenderingMode-Methode auf, und übergeben Sie das FLAG VMR9Mode _ Renderless.
QueryInterface für den VMR-9-Filter für die IVMRSurfaceAllocatorNotify9-Schnittstelle.
Rufen Sie die IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator-Methode auf, und übergeben Sie einen Zeiger auf die IVMRSurfaceAllocator9-Methode Ihres Allocator-Presenters.
Rufen Sie die IVMRSurfaceAllocator9::AdviseNotify-Methode Ihres Allocator-Presenters auf, und übergeben Sie einen Zeiger auf die IVMRSurfaceAllocatorNotify9-Schnittstelle des VMR-9-Filters.
Rufen Sie in Ihrer Implementierung von IVMRSurfaceAllocator9::AdviseNotify IVMRSurfaceAllocatorNotify9::SetD3DDevice einen Zeiger auf das Direct3D-Gerät und ein Handle für den Monitor an, auf dem das Video angezeigt wird.
Erstellen Sie in ihrer Implementierung der IVMRSurfaceAllocator9::InitializeDevice-Methode Direct3D-Oberflächen, die den in der InitializeDevice-Methode angegebenen Parametern entsprechen. Optional können Sie die IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper-Methode des VMR-9-Filters verwenden, um diese Oberflächen zuzuordnen. Store die Oberflächenzeiger in einem Array.
Hinweis
Wenn die Videoframes von VMR-9 auf eine Texturoberfläche gezeichnet werden sollen, fügen Sie der VMR9AllocationInfo-Struktur das Flag VMR9AllocFlag _ TextureSurface hinzu. Wenn das Gerät keine Texturen im nativen Videoformat unterstützt, müssen Sie möglicherweise eine separate Texturoberfläche erstellen und dann die Videoframes von der Videooberfläche in die Textur kopieren.
Während des Streamings ruft vmR-9 Oberflächen vom allocator-presenter ab, indem die IVMRSurfaceAllocator9::GetSurface-Methode aufgerufen wird. DIE VMR-9 gibt die Oberfläche nach ihrem Index im Surface-Array an (Schritt 8).
Zeigen Sie das Image an, wenn VMR-9 die IVMRImagePresenter9::P resentImage-Methode aufruft. Die Parameter enthalten einen Zeiger auf die Direct3D-Oberfläche, die das Videobild enthält.
Wenn das Direct3D-Gerät zu einem beliebigen Zeitpunkt verloren geht, muss der Allocator-Presenter das Gerät wiederherstellen und die Oberflächen neu erstellen. Beispielsweise kann das Gerät verlorengehen, wenn sich der Anzeigemodus ändert oder der Benutzer das Fenster auf einen anderen Monitor verschiebt. Wenn sich das Direct3D-Gerät ändert, rufen Sie die IVMRSurfaceAllocatorNotify9::ChangeD3DDevice-Methode des VMR-9-Filters auf.
Wenn das Streaming beendet wird, ruft VMR-9 die IVMRSurfaceAllocator9::TerminateDevice-Methode auf. Der Allocator-Presenter sollte alle Direct3D-Ressourcen freigeben.
Es gibt einige Unterschiede zwischen VMR-7 und VMR-9 in der Art und Weise, wie benutzerdefinierte Allocator-Presenter verwaltet werden:
- Die AllocateSurfaceHelper-Methode des VMR-9-Filters ist für den Allocator-Presenter verfügbar, der beim Zuordnen von Oberflächen verwendet werden kann. Diese Methode macht es für einen benutzerdefinierten Allocator-Presenter überflüssig, Aufrufe an die Standardzuweisungs-Presenter-Methode weiterzuleiten. Aus diesem Grund wird die CLSID des Standardzuweisungs-Presenters des VMR-9-Filters nicht veröffentlicht.
- Im Gegensatz zu VMR-7 bietet VMR-9 keine spezielle Zuweisung im exklusiven DirectDraw-Modus allocator-presenter. Die IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper-Methode macht dieses Objekt überflüssig.
- Bei Interlacingvideos wird das Video von VMR-9 immer getrennt, bevor es das Image präsentiert. Der Allocator-Presenter ist nicht mehr für das De-Interlacing des Bilds verantwortlich, bevor es angezeigt wird.