Поделиться через


Включение ускорения видео 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 для аппаратного ускорения операций декодирования 2-D. Он позволяет декодировщикам программного обеспечения выгрузить определенные операции с большим объемом ЦП на графические карты для обработки. Для конечных пользователей это делает возможным высокоскоростное видео, например полноэкранное воспроизведение DVD-диска на старых компьютерах, оснащенных графическими картами, совместимыми с DirectX VA.

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

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

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

сжатые образцы фильтра источника 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 и обработчиком наложения или отрисовщиком смешивания видео. Эти интерфейсы описаны в следующей таблице.

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

 

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

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

  • Сторонний проигрыватель мультимедиа, называемый проигрывателем.
  • Настраиваемый исходный фильтр, созданный проигрывателем, который использует пакет SDK для формата Windows Media для распаковки содержимого на основе Windows Media.
  • Выходной контакт видеофильтра источника проигрывателя, называемый выходным контактом.
  • Граф фильтров воспроизведения видео DirectShow обозначается как "граф".
  • Видеомикшерный рендер, называемый VMR.
  • Объект асинхронного средства чтения формата 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 из метода IWMReaderAccelerator::GetCodecInterface. Если кодек не поддерживает DirectX VA, вызов GetCodecInterface может завершиться ошибкой. В этом случае переговоры продолжаются как обычно, без поддержки DirectX VA.

  2. Исходный фильтр передает указатель IAMVideoAccelerator от пина, переданного в функцию Connect, к декодеру 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 на третьем шаге. Если рассматривается подтип VA DirectX, предпринимается попытка согласования VA DirectX. Выходной порт вызывает IWMCodecAMVideoAccelerator::NegotiateConnection, передавая ему текущий выходной медиа-тип.

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

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

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

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

  9. Когда происходит IPin::Disconnect, исходный фильтр вызывает IWMCodecAMVideoAccelerator::SetAcceleratorInterface с NULL. Это разрывает соединение DirectX VA между кодеком и рендерером.

чтение файлов ASF