Включение ускорения видео DirectX

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен средством чтения исходного кода и модуля записи приемника. Средство чтения исходного кода и модуль записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал средство чтения исходного кода и модуль записи приемника вместо пакета SDK для Windows Media Format 11. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

В этом разделе описывается включение ускорения видео Microsoft® DirectX® при воспроизведении потокового содержимого в пользовательском проигрывателе.

Историческая справка

DirectX Video Acceleration (DirectX VA) — это спецификация API для аппаратного ускорения операций двухмерного декодирования. Это позволяет декодедерам программного обеспечения разгружать некоторые операции с интенсивным использованием ЦП на графические карта для обработки. Для конечных пользователей это делает возможным видео с высокой скоростью, например полноэкранное воспроизведение DVD-дисков на старых компьютерах, оснащенных графическими картами, совместимыми с DirectX VA.

Начиная с пакета SDK для формата Windows Media 9 серии фильтр оболочки DMO поддерживает DirectX VA. Это означает, что для локального воспроизведения приложения могут использовать фильтр читателя WM ASF для воспроизведения содержимого на основе Windows Media, а аппаратное ускорение DirectX VA будет вызываться автоматически, если графические карта его поддерживает. Однако фильтр читателя WM ASF не поддерживает воспроизведение потокового содержимого. Поэтому, если вы хотите поддерживать DirectX VA при воспроизведении потокового содержимого в пользовательском проигрывателе, необходимо использовать альтернативный механизм, который используется Медиаплеер Windows, начиная с Windows Media 9 Series.

Так как Медиаплеер Windows была разработана до разработки фильтров QASF, Медиаплеер Windows имеет собственный исходный фильтр на основе пакета SDK для формата Windows Media для воспроизведения содержимого на основе Windows Media. Фильтр источника windows Media WMP доставляет распакованные данные непосредственно в отрисовщики звука и видео. В отличие от этого, средство чтения ASF WM доставляет сжатое содержимое ниже в объекты directX для декодера Windows Media, которые размещаются в оболочке DMO. На следующих схемах показаны различия между средством чтения WM ASF и фильтром источника Windows Media WMP.

Пользовательский фильтр источника выводит несжатые примеры

Фильтр источника qasf выводит сжатые примеры

Чтобы включить DirectX VA для потокового содержимого, необходимо создать пользовательский фильтр источника, подобный фильтру на верхней схеме. По сути, этот фильтр будет использовать пакет SDK для формата Windows Media для создания экземпляра объекта WM Reader, распаковки примеров и отправки их вниз по выходным контактам. В этом обсуждении предполагается, что вы уже создали исходный фильтр и теперь готовы к реализации поддержки DirectX VA.

Чтобы включить DirectX VA, основная задача исходного фильтра — предоставить видеообрисовщику и DMO декодера WMV интерфейсы, необходимые для согласования подключения DirectX VA. Исходный фильтр не участвует в этих согласованиях. После запуска потоковой передачи единственная задача, связанная с DirectX VA, которую может выполнить исходный фильтр, — это изменение меток времени в примерах видео до того, как декодер WMV доставляет их в отрисовщик видео. Основной причиной этого является предоставление пользовательского управления временная шкала помимо того, что позволяют стандартные интерфейсы DirectShow®.

Определены три интерфейса для обеспечения необходимого взаимодействия между пакетом SDK для формата Windows Media, фильтром источника проигрывателя, DMO декодером Видео Windows Media и отрисовщиком overlay Mixer или Video Mixing. Эти интерфейсы описаны в следующей таблице.

Интерфейс Описание
IWMCodecAMVideoAccelerator Предоставляется DMO декодера Windows Media и вызывается фильтром источника проигрывателя мультимедиа для настройки различных подключений, необходимых для включения DirectX VA для декодирования содержимого Windows Media Video.
IWMPlayerTimestampHook Реализовано в исходном фильтре игрока. Он позволяет фильтру изменять метки времени в примерах видео перед их доставкой ниже.
IWMReaderAccelerator Реализуется в объекте средства чтения WM. Он вызывается фильтром источника проигрывателя для получения интерфейсов из DMO декодера.

 

Порядок операций при воспроизведении DirectX с поддержкой va

В этом разделе описывается общий порядок операций во время выполнения для проигрывателя с поддержкой DirectX VA и его исходного фильтра. В этом разделе рассматриваются следующие компоненты:

  • Сторонний проигрыватель мультимедиа, называемый проигрывателем.
  • Пользовательский фильтр источника, созданный проигрывателем, который использует пакет SDK для формата Windows Media для распаковки содержимого на основе Windows Media.
  • Вывод видеопотока исходного фильтра проигрывателя, называемый выходным закреплением.
  • Граф фильтра воспроизведения видео DirectShow, называемый графом.
  • Отрисовщик для микширования видео, называемый VMR.
  • Объект асинхронного средства чтения пакета SDK для формата Windows Media, называемый средством чтения.
  • Объект мультимедиа DirectX для декодера видео Windows Media, называемый декодером DMO.

Порядок операций выглядит следующим образом:

  1. Проигрыватель создает экземпляр своего исходного фильтра и объекта чтения. Средство чтения создает видеодекодер DMO и задает для него тип входных данных (сжатый). Это должно произойти до того, как проигрыватель попытается настроить свой граф воспроизведения видео, так как пакет SDK и декодер DMO должны участвовать в процессе согласования с графом, а DMO должен знать формат входных данных на шаге 9.
  2. Проигрыватель вызывает IGraphBuilder::Render, предоставляя ему выходной контакт фильтра источника видео. На этом этапе диспетчер графов фильтров DirectShow пытается подключить VMR к фильтру источника видео проигрывателя.
  3. Диспетчер графов фильтров вызывает IPin::Connect на выходном контакте фильтра источника видео проигрывателя.

Шаги 4–10 выполняются внутри IPin::Connect.

  1. Исходный фильтр получает интерфейс IWMCodecAMVideoAccelerator из метода IWMReaderAtor::GetCodecInterface . Если кодек не поддерживает DirectX VA, вызов GetCodecInterface может завершиться ошибкой. В этом случае согласование выполняется в обычном режиме без поддержки DirectX VA.

  2. Фильтр источника передает указатель IAMVideoAccelerator из контакта, переданного в connect to the decoder DMO через IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Затем исходный фильтр делегирует оставшуюся часть операции IPin::Connect методу CBaseOutputPin::Connect . Перечисление формата с помощью пакета SDK продолжается, как и сегодня. Если кодек поддерживает DirectX VA для подключаемого содержимого, DMO кодека сначала представляет эти подтипы DirectX VA до поддерживаемых типов YUV и RGB. Если доступна поддержка DirectX VA, шаги 7–11 выполняются в контексте подтипа DirectX VA. В следующем фрагменте кода показано, как определить подтип мультимедиа DirectX VA.

    bool IsDXVASubtype( AM_MEDIA_TYPE * pmt )
    {
        // All DXVA types have the same last 3 DWORDs.
        // guidDXVA is the base GUID for all DXVA subtypes.
    
        GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } };
    
        unsigned long const * plguid;
        unsigned long const * plguidDXVA;
        plguid = (unsigned long const *)&pmt->subtype;
        plguidDXVA = (unsigned long *)&guidDXVA;
    
        if( ( plguid[1] == plguidDXVA[1] ) &&
            ( plguid[2] == plguidDXVA[2] ) &&
            ( plguid[3] == plguidDXVA[3] ) )
        {
            return true;
        }
    
        return false;
    }
    
    
  4. Реализация CBaseOutputPin::Connect вызывает IPin::CompleteConnect на шаге 3. Если рассматривается подтип Va DirectX, предпринимается попытка согласования с DirectX VA. Выходной контакт вызывает IWMCodecAMVideoAccelerator::NegotiateConnection, передавая ему текущий тип выходного носителя.

  5. Декодер DMO выполняет требуемое согласование с VMR через интерфейс IAMVideoAccelerator и возвращает GUID подтипа видео, который они согласовали. Выходной контакт делегирует все вызовы IAMVideoAcceleratorNotify , полученные в ходе этого процесса, в интерфейс IAMVideoAcceleratorNotify декодера DMO, который также можно получить с помощью метода IWMReaderAccelerator::GetCodecInterface .

  6. Если NegotiateConnection завершается успешно, выходной пин-код вызывает IWMCodecAMVideoAccelerator::SetPlayerNotify с интерфейсом IWMPlayerTimestampHook . Этот перехватчик позволяет фильтру источника обновлять метки времени в примерах перед их отправкой в отрисовщик.

  7. Фильтр источника вызывает IWMReaderAccelerator::Notify с согласованным типом мультимедиа. Это позволяет читателю обновить свои внутренние переменные и зафиксировать его в DirectX VA. Это последний сбой кодека или средства чтения. Если какой-либо из описанных выше шагов завершается ошибкой, фильтр источника должен вернуться к шагу 3 и попробовать следующий тип, перечисляемый средством чтения.

  8. Начнется воспроизведение. Средство чтения игнорирует буферы вывода из DMO декодера, если тип выходных данных подключения — DirectX VA.

  9. При возникновении IPin::D isconnect фильтр источника вызывает IWMCodecAMVideoAccelerator::SetAcceleratorInterface с значением NULL. Это нарушает подключение DirectX VA между кодеком и отрисовщиком.

Чтение ФАЙЛОВ ASF