Arbeiten mit Direct3D-Renderzielen

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

Mehrere Medienuntertypen für Direct3D-Renderziele sind für die Verwendung mit VMR-7 und VMR-9 definiert. Wenn ein Upstream Filter eine Verbindung mit einem dieser Untertypen vorschlägt, gibt er der VMR an, dass das Rendering auf einem Direct3D-Renderziel ausgeführt werden soll. Für VMR-7 ist dies ein DirectX 7 Direct3D-Renderziel und für VMR-9 ein DirectX 9 Direct3D-Renderziel. Wenn sich die VMR im Mischmodus befindet, ist die Oberfläche auch eine Direct3D-Texturoberfläche. Wenn sich die VMR nicht im Mischmodus befindet, handelt es sich bei der Oberfläche um eine normale Direct3D-Oberfläche. Die ARGB-Pixelformate werden nur unterstützt, wenn sich die VMR im Mischmodus befindet. Die Renderzieluntertypen sind:

VMR-7 VMR-9
MEDIASUBTYPE_RGB32_D3D_DX7_RT MEDIASUBTYPE_RGB32_D3D_DX9_RT
MEDIASUBTYPE_RGB16_D3D_DX7_RT MEDIASUBTYPE_RGB16_D3D_DX9_RT
MEDIASUBTYPE_ARGB32_D3D_DX7_RT MEDIASUBTYPE_ARGB32_D3D_DX9_RT
MEDIASUBTYPE_ARGB4444_D3D_DX7_RT MEDIASUBTYPE_ARGB4444_D3D_DX9_RT
MEDIASUBTYPE_ARGB1555_D3D_DX7_RT MEDIASUBTYPE_ARGB1555_D3D_DX9_RT

 

Diese Typen werden in der Headerdatei uuids.h definiert. Die MEDIASUBTYPE_RGB32 Medientypen sind ein RGBx888-Format, und MEDIASUBTYPE_RGB16 Medientypen sind ein RGB565-Format. Weitere Informationen zu diesen Pixelformaten finden Sie in der Dokumentation zu DirectX-Grafiken.

Anfordern eines entsperrten Surface

Das Sperren und Entsperren von DirectDraw-Oberflächen sind rechenintensive Vorgänge. Bei Verwendung der Direct3D-Zielmedienuntertypen muss der Upstream Filter die Oberflächen entsperren, damit er mit der Grafikhardware darauf arbeiten kann. Um einen unnötigen Sperrungs-Entsperrungsvorgang zu vermeiden, unterstützt die VMR ein neues Flag für die IMemAllocator::GetBuffer-Methode AM_GBF_NODDSURFACELOCK, das die VMR anweist, die DirectDraw-Oberfläche nicht zu sperren, bevor ein Beispiel an den Upstream Filter übergeben wird. Wenn dieses Flag verwendet wird, schlagen Aufrufe von IMediaSample::GetPointer fehl, da kein gesperrter Zeiger vorhanden ist. Um Zugriff auf die DirectDraw-Oberfläche zu erhalten, muss der Filter QueryInterface für das zurückgegebene IMediaSample-Objekt aufrufen und die IVMRSurface-Schnittstelle anfordern. Natürlich muss der Upstream Filter sicherstellen, dass die Oberfläche nicht gesperrt ist, wenn sie das Beispiel wieder in die Free-Liste zurückgibt.