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


Direct3D-Aware MFT

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

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

В этом разделе описаны шаги, необходимые для обеспечения поддержки MFT Direct3D. Этот раздел не охватывает механику декодирования DXVA. Сведения о DXVA см. в разделе Ускорение видео DirectX 2.0.

Важный

Начиная с Windows 8, IMFDXGIDeviceManager можно использовать вместо IDirect3DeviceManager9. Для приложений Магазина Windows необходимо использовать IMFDXGIDeviceManager и Microsoft Direct3D 11. Дополнительные сведения см. в API Видео Direct3D 11.

 

  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 является указателем на интерфейс IDirect3DeviceManager 9. Начиная с Windows 8, можно использовать IMFDXGIDeviceManager вместо IDirect3DeviceManager9. Клиенту не требуется отправлять это сообщение.
  4. MFT вызывает IDirect3DDeviceManager9::GetVideoService запрашивать необходимую службу DXVA. Начиная с Windows 8, если IMFDXGIDeviceManager использовались вызовы MFT IMFDXGIDeviceManager::GetVideoService. Обычно декодатор запрашивает IDirectXVideoDecoderService, а обработчик видео будет запрашивать IDirectXVideoProcessorService.
  5. Если предыдущий шаг выполнен успешно, методы IMFTransform::GetInputAvailableType и МВФTransform::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 должен освободить указатель IDirect3DeviceManager9 (указатель IMFDXGIDeviceManager, если использовался МВФDXGIDeviceManager) и любые другие интерфейсы DXVA и вернуться к обработке программного обеспечения. На этом этапе MFT не должен использовать обработку DXVA.

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

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

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

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

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

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

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