Direct3D-Aware MFT

В этом разделе описывается реализация преобразования Media Foundation (MFT) с поддержкой Direct3D для видео.

Видео MFT считается с поддержкой Direct3D , если он может обрабатывать образцы, содержащие поверхности Direct3D. Типичной причиной поддержки Direct3D в видео MFT является включение аппаратного ускорения декодирования с помощью DirectX Video Acceleration (DXVA).

В этом разделе описываются действия, необходимые для поддержки MFT Direct3D. В этом разделе не рассматривается механизм декодирования DXVA. Сведения о DXVA см. в разделе DirectX Video Acceleration 2.0.

Важно!

Начиная с Windows 8, вместо IDirect3DDeviceManager9 можно использовать IMFDXGIDeviceManager9. Для приложений Магазина Windows необходимо использовать IMFDXGIDeviceManager и Microsoft Direct3D 11. Дополнительные сведения см. в api-интерфейсах Direct3D 11 Video.

 

  1. Реализуйте метод IMFTransform::GetAttributes . Этот метод возвращает указатель на хранилище атрибутов.
  2. MFT должен задать для атрибута MF_SA_D3D_AWARE значение TRUE в собственном хранилище атрибутов. Начиная с Windows 8, при использовании Direct3D 11 используйте MF_SA_D3D11_AWARE.
  3. Если во время согласования формата атрибут MF_SA_D3D_AWARE (или MF_SA_D3D11_AWARE при использовании Direct3D 11) имеет значение TRUE, клиент может отправить сообщение MFT_MESSAGE_SET_D3D_MANAGER в MFT. Параметр события ulParam является указателем на интерфейс IDirect3DDeviceManager9 . Начиная с Windows 8, вместо IDirect3DDeviceManager9 можно использовать IMFDXGIDeviceManager. Клиенту не требуется отправлять это сообщение.
  4. MFT вызывает IDirect3DDeviceManager9::GetVideoService для запроса необходимой службы DXVA. Начиная с Windows 8, если использовался IMFDXGIDeviceManager, MFT вызывает IMFDXGIDeviceManager::GetVideoService. Обычно декодер запрашивает IDirectXVideoDecoderService, а видеопроцессор запрашивает IDirectXVideoProcessorService.
  5. Если предыдущий шаг выполнен успешно, методы IMFTransform::GetInputAvailableType и IMFTransform::GetOutputAvailableType должны возвращать форматы, совместимые с DXVA.
  6. Клиент настраивает типы носителей в MFT. Если тип носителя несовместим с DXVA, MFT должен вернуть код ошибки MF_E_UNSUPPORTED_D3D_TYPE.
  7. На этом этапе существует два варианта в зависимости от того, найдет ли клиент подходящий формат DXVA.
    • Если клиент успешно настроит формат DXVA, он может начать обработку. На этом этапе MFT может использовать DXVA для обработки или вернуться к программной обработке.
    • Кроме того, если клиент не находит приемлемый формат DXVA, клиент может отправить другое сообщение MFT_MESSAGE_SET_D3D_MANAGER , на этот раз задав ulParamзначение NULL. MFT должен освободить указатель IDirect3DDeviceManager9 (указатель IMFDXGIDeviceManager, если использовался IMFDXGIDeviceManager) и любые другие интерфейсы DXVA, а также отменить изменения к обработке программного обеспечения. На этом этапе MFT не должен использовать обработку DXVA.

MFT с поддержкой Direct3D необходимо подготовить для обработки примеров, содержащих поверхность Direct3D. Пример будет содержать ровно один буфер мультимедиа. Чтобы получить поверхность Direct3D из буфера, вызовите функцию MFGetService и укажите службу MR_BUFFER_SERVICE . Дополнительные сведения см. в разделе DirectX Surface Buffer.

MFT, использующий DXVA, должен выделять собственные выходные образцы следующим образом:

  1. В методе IMFTransform::GetOutputStreamInfo задайте флаг MFT_OUTPUT_STREAM_PROVIDES_SAMPLES .
  2. Создайте пул поверхностей DXVA, как описано в спецификации DXVA.
  3. Создайте примеры мультимедиа, вызвав MFCreateVideoSampleFromSurface.

MFT всегда должен поддерживать обработку программного обеспечения в качестве резервной, так как обработка DXVA может быть недоступна по нескольким причинам:

  • GPU может не поддерживать DXVA.
  • Клиент может не использовать Direct3D.
  • Профили DXVA не определены для каждого формата видео.

MFT с поддержкой Direct3D должен иметь один поток вывода. Он не может иметь несколько выходных данных.

Написание пользовательского MFT