Работа с целевыми объектами отрисовки Direct3D

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Несколько подтипов мультимедиа для целевых объектов рендеринга Direct3D определены для использования с VMR-7 и VMR-9. Когда фильтр вышестоящий предлагает соединение с одним из этих подтипов, он указывает VMR, что отрисовка должна выполняться в целевом объекте отрисовки Direct3D. Для VMR-7 это будет целевой объект отрисовки DirectX 7 Direct3D, а для VMR-9 — целевой объект отрисовки Direct3D Direct3D. Если VMR находится в режиме смешивания, поверхность также будет поверхностью текстур Direct3D. Если VMR не находится в режиме смешивания, поверхность будет обычной поверхностью Direct3D. Форматы пикселей ARGB поддерживаются только в том случае, если VMR находится в режиме микширования. Целевые подтипы отрисовки:

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

 

Эти типы определяются в файле заголовка uuids.h. Типы мультимедиа MEDIASUBTYPE_RGB32 имеют формат RGBx888, а MEDIASUBTYPE_RGB16 — формат RGB565. Дополнительные сведения об этих форматах пикселей см. в документации по графике DirectX.

Запрос разблокированного устройства Surface

Блокировка и разблокировка поверхностей DirectDraw — это ресурсоемкие операции. При использовании подтипов целевых носителей direct3D фильтру вышестоящий требуется разблокировать поверхности, чтобы с ними можно было работать с графическим оборудованием. Чтобы избежать ненужных операций блокировки и разблокировки, VMR поддерживает новый флаг метода IMemAllocator::GetBuffer AM_GBF_NODDSURFACELOCK, который предписывает VMR не блокировать поверхность DirectDraw перед передачей образца в фильтр вышестоящий. При использовании этого флага вызовы IMediaSample::GetPointer завершаются ошибкой , так как нет заблокированного указателя. Чтобы получить доступ к поверхности DirectDraw, фильтр должен вызвать QueryInterface для возвращенного объекта IMediaSample и запросить интерфейс IVMRSurface . Очевидно, что фильтр вышестоящий должен гарантировать, что поверхность не будет заблокирована при выпуске образца обратно в свободный список.