Udostępnij przez


Praca z obiektami docelowymi renderowania Direct3D

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w ramach Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Kilka podtypów multimediów dla obiektów docelowych renderowania Direct3D jest zdefiniowanych do użycia z maszynami VMR-7 i VMR-9. Gdy filtr nadrzędny proponuje połączenie z jednym z tych podtypów, wskazuje VMR, że renderowanie ma być wykonywane na docelowym obiekcie renderowania Direct3D. Dla VMR-7 będzie to obiekt docelowy renderowania DirectX 7 Direct3D, a dla VMR-9 obiekt docelowy renderowania DirectX 9 Direct3D. Jeśli VMR jest w trybie mieszania, powierzchnia będzie również powierzchnią tekstury Direct3D. Jeśli VMR nie jest w trybie miksowania, powierzchnia będzie zwykłą powierzchnią Direct3D. Format pikseli ARGB są obsługiwane tylko wtedy, gdy VMR jest w trybie mieszania. Podtypy obiektów docelowych renderowania to:

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

 

Te typy są definiowane w pliku nagłówka uuids.h. Typy multimediów MEDIASUBTYPE_RGB32 są formatem RGBx888, a typy MEDIASUBTYPE_RGB16 nośnika to format RGB565. Aby uzyskać więcej informacji na temat tych formatów pikseli, zobacz dokumentację grafiki DirectX.

zażądanie odblokowanej Surface

Blokowanie i odblokowywanie powierzchni DirectDraw to operacje kosztowne pod względem obliczeniowym. W przypadku używania podtypów nośnika docelowego renderowania Direct3D filtr nadrzędny wymaga odblokowania powierzchni, aby mogły działać na nich ze sprzętem graficznym. Aby uniknąć niepotrzebnej operacji blokowania i odblokowywania, VMR obsługuje nową flagę w metodzie IMemAllocator::GetBuffer, AM_GBF_NODDSURFACELOCK, która nakazuje VMR nie blokować powierzchni DirectDraw przed przekazaniem próbki do filtru nadrzędnego. Gdy ta flaga jest używana, wywołania IMediaSample::GetPointer zakończą się niepowodzeniem, ponieważ nie ma zablokowanego wskaźnika. Aby uzyskać dostęp do powierzchni DirectDraw, filtr musi wywołać na zwróconym obiekcie IMediaSample metodę QueryInterface i zażądać interfejsu IVMRSurface. Oczywiście filtr nadrzędny musi upewnić się, że powierzchnia nie jest zablokowana, gdy zwalnia próbkę z powrotem do bezpłatnej listy.