Freigeben über


Bereitstellen einer benutzerdefinierten Allocator-Presenter für VMR-7

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Der Zuweisungs-Presenter ist für die Zuweisung von DirectDraw-Oberflächen und die Darstellung der Videoframes für das Rendern verantwortlich. In den meisten Szenarien ist die Funktionalität des Standardzuweisungs-Presenters für die Anforderungen einer Anwendung mehr als ausreichend. Durch das Einstecken eines benutzerdefinierten Zuweisungs-Presenters kann eine Anwendung jedoch direkten Zugriff auf die Video-Bits erhalten und den Renderingprozess vollständig steuern. Der Nachteil für diese erhöhte Leistung besteht darin, dass die Anwendung die zusätzliche Komplexität der DirectDraw-Oberflächenverwaltung bewältigen muss.

Verwenden eines benutzerdefinierten Zuweisungs-Presenters

Die vorherige Abbildung zeigt die Kommunikationsschnittstellen, die von der VMR und dem Zuweisungs-Presenter verwendet werden. Ein benutzerdefinierter Zuweisungs-Presenter, der alle Standardzuordnungs- und Präsentationsfunktionen außer Kraft setzt, muss die Schnittstellen IVMRImagePresenter und IVMRSurfaceAllocator sowie optional IVMRWindowlessControl implementieren.

Um den Standardzuweisungs-Presenter zu ersetzen, ruft eine Anwendung die IVMRSurfaceAllocatorNotify::AdviseSurfaceAllocator-Methode auf und übergibt einen Zeiger auf den neuen Zuweisungs-Presenter. Als Reaktion auf diesen Aufruf ruft die VMR die IVMRSurfaceAllocator::AdviseNotify-Methode des Allocator-Presenters auf, um den Zeiger auf die IVMRSurfaceAllocatorNotify-Schnittstelle der VMR bereitzustellen. Der allocator-presenter verwendet diesen Schnittstellenzeiger, wenn Ereignisse mit der IVMRSurfaceAllocatorNotify::NotifyEvent-Methode an die VMR übergeben werden.

Als alternative Lösung kann eine Anwendung sowohl einen eigenen Allocator-Presenter als auch den Standard-Allocator-Presenter verwenden. In diesem Szenario verarbeitet der benutzerdefinierte Zuweisungs-Presenter nur die Aufrufe, bei denen benutzerdefinierte Funktionen erforderlich sind, und übergibt den Rest der Aufrufe von der VMR an den Standardzuweisungs-Presenter. In vielen Fällen ist es nur erforderlich, die IVMRImagePresenter-Schnittstelle zu überschreiben.

Verwenden von zwei Zuweisungs-Referenten

Um sowohl einen benutzerdefinierten Allocator-Presenter als auch den Standard allocator-presenter zu verwenden, ruft eine Anwendung zuerst IVMRSurfaceAllocatorNotify::AdviseSurfaceAllocator auf, um einen Zeiger auf den neuen Allocator-presenter bereitzustellen. Dies führt dazu, dass der Standardzuweisungs-Presenter zerstört wird, sodass die Anwendung eine weitere instance erstellen muss, indem QueryInterface auf der VMR aufgerufen und die IVMRSurfaceAllocator-Schnittstelle angefordert wird. Wie in der vorherigen Abbildung gezeigt, überschreibt der benutzerdefinierte Allocator-Presenter die IVMRImagePresenter-Schnittstellenmethoden und übergibt einfach alle Aufrufe an die IVMRSurfaceAllocator-Schnittstelle an die Standardimplementierung. Die Abbildung zeigt auch, dass die IVMRWindowlessControl-Schnittstelle auf dem allocator-presenter implementiert wird.

Bereitstellen einer benutzerdefinierten Allocator-Presenter für VMR-9

Renderloser VMR-Wiedergabemodus (benutzerdefinierte Zuweisungs-Referenten)