Arbeiten mit Direct3D-Renderzielen

Mehrere Medienuntertypen für Direct3D-Renderziele sind für die Verwendung mit VMR-7 und VMR-9 definiert. Wenn ein Upstreamfilter 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 ist dies ein DirectX 9 Direct3D-Renderziel. Wenn sich die VMR im Gemischtmodus befindet, ist die Oberfläche auch eine Direct3D-Texturoberfläche. Wenn sich die VMR nicht im Gemischtmodus befindet, ist die Oberfläche eine reguläre Direct3D-Oberfläche. Die ARGB-Pixelformate werden nur unterstützt, wenn sich die VMR im Gemischtmodus 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 Medientypen MEDIASUBTYPE _ RGB32 sind ein RGBx888-Format, und MEDIASUBTYPE _ RGB16-Medientypen sind ein RGB565-Format. Weitere Informationen zu diesen Pixelformaten finden Sie in der DirectX-Grafikdokumentation.

Anfordern einer entsperrten Oberfläche

Das Sperren und Entsperren von DirectDraw-Oberflächen sind rechenintensive Vorgänge. Bei Verwendung der Direct3D-Renderzielmedienuntertypen muss der Upstreamfilter die Oberflächen entsperren, damit sie mit der Grafikhardware ausgeführt werden können. Um einen unnötigen Sperrungsentsperrungsvorgang 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 Upstreamfilter ü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 Upstreamfilter sicherstellen, dass die Oberfläche nicht gesperrt ist, wenn das Beispiel wieder in die Freie Liste freigegeben wird.