Как использовать аппаратные видеосканеры?

Современные видеокарты имеют аппаратные видеоадаптеры, например, в составе AMD Avivo, NVIDIA PureVideo или Intel ClearVideo. Например, AMD Avivo whitepaper говорит:

"Масштабируемые изображения поддерживают до 6 вертикальных отводов фильтра и вверх до 10 горизонтальных фильтров. Эти масштабирующие устройства являются высокоточными многофазные масштабирующие устройства, которые очень программируемы; они подходят для масштабирование практически любым отношением или уменьшением масштаба до 4: 1.

Вопрос: Как можно использовать оборудование для масштабирования видео в программе Windows?

Предположим, что уже существует декодированный видеокадр, например, в IDirect3DSurface9, и цель состоит в том, чтобы отобразить этот видеокадр на экране с помощью аппаратного масштабирования. Я хотел бы использовать Windows API, например, Media Foundation или DirectShow, а не API-интерфейсы для поставщиков, если это возможно. Меня в основном интересует масштабирование с довольно большим коэффициентом около 1.5-3x.

Второй вопрос заключается в том, как управлять аппаратными параметрами видеосканера? (Например, коэффициенты фильтра в многофазных фильтрах, упомянутых выше)

ИЗМЕНИТЬ: Началась баунти. Просьба привести пример любого способа использования оборудования для видеообслуживания на видеокарте (это может быть специфичным для поставщика или использовать любую версию DirectX/DirectShow/Media Foundation API).

РЕДАКТИРОВАТЬ:. Обновление. Некоторые примеры программ, которые используют оборудование для масштабирования видео: WinDVD, PowerDVD, madVR. Я хочу знать, как выполнить то, что они делают, а именно использовать встроенный видеоусилитель GPU, а не скалер, реализованный с использованием шейдеров D3D и сэмплеров текстур.

Ответ 1

Некоторые из возможных подходов:

  • Используйте MFCreateVideoRenderer, чтобы создать медиа-приемник EVR, и вызовите IMFVideoDisplayControl:: SetRenderingPrefs с установленным флагом MFVideoRenderPrefs_AllowScaling (или используйте IMFAttributes и установите атрибут EVRConfig_AllowScaling), а затем вызовите IMFVideoDisplayControl:: SetVideoPosition, чтобы определить, как масштабируется результат. Это часть расширенного видеореклавера (EVR).

  • Используйте IDirectXVideoProcessor:: VideoProcessBlt и установите DXVA2_VideoProcessBltParams::ConstrictionSize, чтобы определить, как масштабируется результат. Это также основано на EVR/DXVA.

  • (предлагается ananthonline) Используйте Video Resizer DSP и используйте IWMResizerProps::SetFullCropRegion (или MFPKEY_RESIZE_DST_WIDTH и MFPKEY_RESIZE_DST_HEIGHT) для масштабируйте результат. Это как объект DirectX Media (DMO), так и Media Foundation Transform (MFT). Примечание. Видеоролик MFT имеет атрибут MF_SA_D3D_AWARE, который может использоваться для запроса, поддерживает ли он аппаратное ускорение DirectX 3D, и это можно активировать, отправив его сообщение MFT_MESSAGE_SET_D3D_MANAGER.

  • Используйте Видеопроцессор MFT и установите IMFVideoProcessorControl::SetConstrictionSize для масштабирования результата. Это MFT.

  • Используйте устройство DirectX 3D и вызовите StretchRect для масштабирования поверхности. Примечание. Это довольно очевидно не использует аппаратное обеспечение масштабирования видео, оно использует аппаратное обеспечение сэмплирования текстур. Текстура может отображаться на квадроцикле с аналогичным эффектом.

Я до сих пор не уверен, какие из этих подходов используют, если таковые имеются, оборудование видео-сканера. Вполне вероятно, что, по крайней мере, подходы 1 и 2 будут, потому что они привязаны непосредственно к EVR/DXVA; подходы 3 и 4 также могут быть, если они ускоряются DXVA. Окончательный ответ по-прежнему необходим, в идеале, с ссылкой на документацию и/или образец кода.

Ответ 2

Чтобы просто получить доступ к оборудованию - Direct2D (Direct3D, вероятно, лучший выбор) в порядке. Но чтобы получить доступ к видеоскалеру, вам нужно будет использовать DirectShow или Windows Media Foundation (я не очень часто использовал это).

AFAIK - фильтр "Resizer DMO" получит доступ к правильному оборудованию и выполнит изменение размера видео для вас. Здесь - это образец кода, который использует этот фильтр.

EDIT: Если вы используете MFT, Video Processor Filter также должен быть таким же эффективным. Как указано в документации: "Видеопроцессор поддерживает обработку видео с ускорением GPU с использованием Microsoft Direct3D 11. Для получения дополнительной информации см. MF_SA_D3D11_AWARE.

Также см. этот раздел об аппаратных атрибутах MFT, особенно MFT_ENUM_HARDWARE_URL_Attribute, что позволяет проверить, реализован ли этот MFT на аппаратном уровне или нет. Обратите внимание, что DXVA интегрируется с Media Foundation и раскрывает его функциональность как MFT. Таким образом, MFT, реализованный в аппаратных средствах, скорее всего, использует базовое оборудование и является методом, используемым самой Windows.

Надеюсь, это поможет!

Ответ 3

Direct2D - это способ Microsoft получить доступ к графическому оборудованию, хотя и косвенно. Direct2D Transform делает масштабирование. У вас не будет прямого контроля над масштабируемым видео, но он должен доверять драйверу, чтобы выбрать нужные вам настройки.