Share via


Direct3D-Aware MFT

本主題描述如何針對影片實作 Direct3D 感知 媒體基礎轉換 (MFT) 。

如果影片 MFT 可以處理包含 Direct3D 表面的樣本,則會被視為 Direct3D 感知 。 在視訊 MFT 中支援 Direct3D 的一般原因是使用 DirectX 影片加速 (DXVA) 來啟用硬體加速解碼。

本主題描述讓您的 MFT Direct3D 感知所需的步驟。 本主題未涵蓋 DXVA 解碼的機制。 如需 DXVA 的相關資訊,請參閱 DirectX 影片加速 2.0

重要

從Windows 8開始,可以使用IMFDXGIDeviceManager,而不是IDirect3DDeviceManager9。 針對 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. 在格式交涉期間,如果使用 Direct3D 11) 屬性時,如果MF_SA_D3D_AWARE (或MF_SA_D3D11_AWARE,用戶端可能會將MFT_MESSAGE_SET_D3D_MANAGER訊息傳送至 MFT。 ulParam事件參數是IDirect3DDeviceManager9介面的指標。 從Windows 8開始,您可以使用IMFDXGIDeviceManager,而不是IDirect3DDeviceManager9。 用戶端不需要傳送此訊息。
  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 格式而定,有兩個選項。

必須準備好 Direct3D 感知 MFT 來處理包含 Direct3D 表面的樣本。 此範例只會包含一個媒體緩衝區。 若要從緩衝區取得 Direct3D 介面,請呼叫 MFGetService 函式並指定 MR_BUFFER_SERVICE 服務。 如需詳細資訊,請參閱 DirectX Surface Buffer

使用 DXVA 的 MFT 必須配置自己的輸出範例,如下所示:

  1. IMFTransform::GetOutputStreamInfo 方法中,設定 MFT_OUTPUT_STREAM_PROVIDES_SAMPLES 旗標。
  2. 建立 DXVA 介面集區,如 DXVA 規格中所述。
  3. 呼叫 MFCreateVideoSampleFromSurface來建立媒體範例。

MFT 應該一律支援軟體處理作為後援,因為 DXVA 處理可能無法使用,原因如下:

  • GPU 可能不支援 DXVA。
  • 用戶端可能不會使用 Direct3D。
  • DXVA 設定檔未針對每個視訊格式定義。

Direct3D 感知 MFT 必須具有單一輸出資料流程。 它不能有多個輸出。

撰寫自訂 MFT