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

Современные видеокарты имеют аппаратные средства масштабирования видео, например, в составе AMD Avivo, NVIDIA PureVideo или Intel ClearVideo. Например, в официальном документе AMD Avivo говорится:

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

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

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

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

РЕДАКТИРОВАТЬ: Баунти начал. Пожалуйста, предоставьте пример любого способа использования аппаратного средства масштабирования видео в видеокарте (это может зависеть от поставщика или использовать любую версию DirectX/DirectShow/Media Foundation API).

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Если вы используете MFT, фильтр видеопроцессора также должен быть столь же эффективным. Как указано в документации: " Видеопроцессор поддерживает обработку видео с GPU-ускорением, используя Microsoft Direct3D 11. Для получения дополнительной информации см. MF_SA_D3D11_AWARE ".

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

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

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

Другие вопросы по тегам