Share via


MFT Direct3D-Aware

이 항목에서는 비디오에 대한 Direct3D 인식 MFT(Media Foundation 변환)를 구현하는 방법에 대해 설명합니다.

비디오 MFT는 Direct3D 표면이 포함된 샘플을 처리할 수 있는 경우 Direct3D 인식으로 간주됩니다. 비디오 MFT에서 Direct3D를 지원하는 일반적인 이유는 DXVA(DirectX Video Acceleration)를 사용하여 하드웨어 가속 디코딩을 사용하도록 설정하기 위해서입니다.

이 항목에서는 MFT Direct3D를 인식하는 데 필요한 단계에 대해 설명합니다. 이 항목에서는 DXVA 디코딩의 메커니즘을 다루지 않습니다. DXVA에 대한 자세한 내용은 DirectX 비디오 가속 2.0을 참조하세요.

중요

Windows 8 시작하여 IDirect3DDeviceManager9 대신 IMFDXGIDeviceManager를 사용할 수 있습니다. Windows 스토어 앱의 경우 IMFDXGIDeviceManager 및 Microsoft Direct3D 11을 사용해야 합니다. 자세한 내용은 Direct3D 11 비디오 API를 참조하세요.

 

  1. IMFTransform::GetAttributes 메서드를 구현합니다. 이 메서드는 특성 저장소에 대한 포인터를 반환합니다.
  2. MFT는 자체 특성 저장소에서 MF_SA_D3D_AWARE 특성의 값을 TRUE 로 설정해야 합니다. Windows 8 Direct3D 11을 사용하는 경우 MF_SA_D3D11_AWARE 사용합니다.
  3. 형식 협상 중에 MF_SA_D3D_AWARE (또는 Direct3D 11을 사용하는 경우 MF_SA_D3D11_AWARE ) 특성이 TRUE이면 클라이언트는 MFT에 MFT_MESSAGE_SET_D3D_MANAGER 메시지를 보낼 수 있습니다. ulParam 이벤트 매개 변수는 IDirect3DDeviceManager9 인터페이스에 대한 포인터입니다. Windows 8 IDirect3DDeviceManager9 대신 IMFDXGIDeviceManager를 사용할 수 있습니다. 클라이언트는 이 메시지를 보낼 필요가 없습니다.
  4. MFT는 IDirect3DDeviceManager9::GetVideoService 를 호출하여 필요한 DXVA 서비스를 쿼리합니다. Windows 8 시작하여 IMFDXGIDeviceManager가 사용된 경우 MFT 호출 IMFDXGIDeviceManager::GetVideoService. 일반적으로 디코더는 IDirectXVideoDecoderService를 쿼리하고 비디오 프로세서는 IDirectXVideoProcessorService를 쿼리합니다.
  5. 이전 단계가 성공하면 IMFTransform::GetInputAvailableTypeIMFTransform::GetOutputAvailableType 메서드는 DXVA 호환 형식을 반환해야 합니다.
  6. 클라이언트는 MFT에서 미디어 형식을 구성합니다. 미디어 형식이 DXVA와 호환되지 않는 경우 MFT는 MF_E_UNSUPPORTED_D3D_TYPE 오류 코드를 반환해야 합니다.
  7. 이 시점에서 클라이언트가 적절한 DXVA 형식을 찾는지 여부에 따라 두 가지 옵션이 있습니다.
    • 클라이언트가 DXVA 형식을 성공적으로 구성하면 처리를 시작할 수 있습니다. 이 시점에서 MFT는 처리를 위해 DXVA를 사용하거나 소프트웨어 처리로 되돌릴 수 있습니다.
    • 또는 클라이언트가 허용되는 DXVA 형식을 찾지 못하면 클라이언트가 다른 MFT_MESSAGE_SET_D3D_MANAGER 메시지를 보낼 수 있습니다. 이번에는 ulParamNULL로 설정합니다. MFT는 IDirect3DDeviceManager9 포인터(IMFDXGIDeviceManager를 사용한 경우 IMFDXGIDeviceManager 포인터) 및 기타 DXVA 인터페이스를 해제하고 소프트웨어 처리에 되돌리기 합니다. 이 시점에서 MFT는 DXVA 처리를 사용하지 않아야 합니다.

Direct3D 인식 MFT는 Direct3D 표면이 포함된 샘플을 처리할 수 있도록 준비해야 합니다. 샘플에는 정확히 하나의 미디어 버퍼가 포함됩니다. 버퍼에서 Direct3D 표면을 얻으려면 MFGetService 함수를 호출하고 MR_BUFFER_SERVICE 서비스를 지정합니다. 자세한 내용은 DirectX Surface 버퍼를 참조하세요.

DXVA를 사용하는 MFT는 다음과 같이 자체 출력 샘플을 할당해야 합니다.

  1. IMFTransform::GetOutputStreamInfo 메서드에서 MFT_OUTPUT_STREAM_PROVIDES_SAMPLES 플래그를 설정합니다.
  2. DXVA 사양에 설명된 대로 DXVA 표면 풀을 만듭니다.
  3. MFCreateVideoSampleFromSurface를 호출하여 미디어 샘플을 만듭니다.

다음과 같은 여러 가지 이유로 DXVA 처리를 사용할 수 없으므로 MFT는 항상 소프트웨어 처리를 대체로 지원해야 합니다.

  • GPU는 DXVA를 지원하지 않을 수 있습니다.
  • 클라이언트에서 Direct3D를 사용하지 않을 수 있습니다.
  • DXVA 프로필은 모든 비디오 형식에 대해 정의되지 않습니다.

Direct3D 인식 MFT에는 단일 출력 스트림이 있어야 합니다. 여러 출력을 가질 수 없습니다.

사용자 지정 MFT 작성