Поделиться через


Работа с рендер-целями Direct3D

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

Для использования с VMR-7 и VMR-9 определены несколько подтипов мультимедиа для целевых объектов отрисовки Direct3D. Когда вышестоящий фильтр предлагает соединение с одним из этих подтипов, он указывает виртуальной машине, что отрисовка должна выполняться в целевом объекте отрисовки Direct3D. Для VMR-7 это будет целевой объект отрисовки DirectX 7 Direct3D, а для VMR-9 это будет целевой объект отрисовки DirectX 9 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. Очевидно, что вышестоящий фильтр должен убедиться, что поверхность не заблокирована при возвращении образца обратно в свободный список.