Как использовать аппаратные видео скейлеры?
Современные видеокарты имеют аппаратные средства масштабирования видео, например, в составе 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 ответа
Некоторые из возможных подходов:
использование
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 (DMO), и мультимедийное базовое преобразование (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. Окончательный ответ все еще необходим, в идеале со ссылкой на документацию и / или пример кода.
Просто получить доступ к оборудованию - 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 выполняет масштабирование. У вас не будет никакого прямого контроля над видео масштабатором, но вы должны доверять драйверу, чтобы выбрать правильные настройки для вас.