Использование записи WDDM в DirectShow
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
Этот раздел относится к Windows Vista и более поздних версий.
Некоторые видеоадаптеры имеют встроенные функции захвата видео. На этих картах захваченные видеокадры помещаются в видеопамяти (VRAM). До Windows Vista не существовал стандартного механизма обработки кадров, пока они оставались в виртуальной памяти. Вместо этого данные должны были быть скопированы в системную память, обработаны, а затем скопированы обратно в VRAM для отображения. В Windows Vista DirectShow теперь поддерживает механизм сохранения видеокадров в виртуальной памяти на протяжении всего конвейера обработки, от захвата до отображения.
Фильтр KsProxy определяет, поддерживает ли драйвер захват поверхности виртуальной памяти, запрашивая у драйвера свойство KSPROPERTY_PREFERRED_CAPTURE_SURFACE. (Это свойство задокументировано в документации по комплекту драйверов Windows.) Если драйвер поддерживает захват поверхности виртуальной памяти, KsProxy выделяет специальный тип примера мультимедиа, который содержит указатель на поверхность Direct3D.
Далее KsProxy определяет, поддерживает ли подчиненный фильтр Ускорение видео DirectX (DXVA) 2.0 следующим образом:
- KsProxy запрашивает подчиненный входной контакт для интерфейса IMFGetService .
- Если контакт предоставляет функцию IMFGetService, KsProxy вызывает IMFGetService::GetService для интерфейса IDirect3DeviceManager . Идентификатор службы MR_VIDEO_ACCELERATION_SERVICE.
Оба этих интерфейса описаны в документации по пакету SDK для Media Foundation.
Если подчиненный фильтр не поддерживает DXVA 2.0, KsProxy выделяет дополнительный буфер системной памяти. Он использует этот буфер для копирования видеокадров из VRAM в системную память. Метод IMediaSample::GetPointer примера мультимедиа возвращает указатель на этот системный буфер памяти.
Однако если подчиненный фильтр поддерживает DXVA 2.0, KsProxy не выделяет системный буфер памяти. В этом случае метод GetPointer возвращает E_NOTIMPL. Вместо этого подчиненный фильтр, как ожидается, будет напрямую обращаться к поверхности Direct3D примера. Нижестоящий фильтр может получить указатель на поверхность двумя способами, оба из которых эквивалентны:
- Запросите пример для интерфейса IMFGetService и вызовите GetService для интерфейса IDirect3DSurface9 . Идентификатор службы — MR_BUFFER_SERVICE.
- Запросите пример для интерфейса IMediaSample2Config и вызовите IMediaSample2Config::GetSurface.
Связанные темы