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.
- Реализуйте метод IMFTransform::GetAttributes . Этот метод возвращает указатель на хранилище атрибутов.
- MFT должен задать для атрибута MF_SA_D3D_AWARE значение TRUE в собственном хранилище атрибутов. Начиная с Windows 8, при использовании Direct3D 11 используйте MF_SA_D3D11_AWARE.
- Если во время согласования формата атрибут MF_SA_D3D_AWARE (или MF_SA_D3D11_AWARE при использовании Direct3D 11) имеет значение TRUE, клиент может отправить сообщение MFT_MESSAGE_SET_D3D_MANAGER в MFT. Параметр события ulParam является указателем на интерфейс IDirect3DDeviceManager9 . Начиная с Windows 8, вместо IDirect3DDeviceManager9 можно использовать IMFDXGIDeviceManager. Клиенту не требуется отправлять это сообщение.
- MFT вызывает IDirect3DDeviceManager9::GetVideoService для запроса необходимой службы DXVA. Начиная с Windows 8, если использовался IMFDXGIDeviceManager, MFT вызывает IMFDXGIDeviceManager::GetVideoService. Обычно декодер запрашивает IDirectXVideoDecoderService, а видеопроцессор запрашивает IDirectXVideoProcessorService.
- Если предыдущий шаг выполнен успешно, методы IMFTransform::GetInputAvailableType и IMFTransform::GetOutputAvailableType должны возвращать форматы, совместимые с DXVA.
- Клиент настраивает типы носителей в MFT. Если тип носителя несовместим с DXVA, MFT должен вернуть код ошибки MF_E_UNSUPPORTED_D3D_TYPE.
- На этом этапе существует два варианта в зависимости от того, найдет ли клиент подходящий формат 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, должен выделять собственные выходные образцы следующим образом:
- В методе IMFTransform::GetOutputStreamInfo задайте флаг MFT_OUTPUT_STREAM_PROVIDES_SAMPLES .
- Создайте пул поверхностей DXVA, как описано в спецификации DXVA.
- Создайте примеры мультимедиа, вызвав MFCreateVideoSampleFromSurface.
MFT всегда должен поддерживать обработку программного обеспечения в качестве резервной, так как обработка DXVA может быть недоступна по нескольким причинам:
- GPU может не поддерживать DXVA.
- Клиент может не использовать Direct3D.
- Профили DXVA не определены для каждого формата видео.
MFT с поддержкой Direct3D должен иметь один поток вывода. Он не может иметь несколько выходных данных.
Связанные темы