硬體 MFT

注意

本主題適用于 Windows 7 或更新版本。

 

本主題描述如何撰寫媒體基礎轉換 (MFT) ,做為硬體編碼器、解碼器或數位訊號處理器的 Proxy (DSP) 。

重要

如果硬體編解碼器使用 AVStream 多媒體類別驅動程式,則不需要自訂 MFT。 媒體基礎會針對此目的提供 AVStream Proxy。 本主題中的資訊僅適用于硬體編解碼器不使用 AVStream 的特殊案例。 如需詳細資訊,請參閱 AVStream 中的硬體編解碼器支援

 

本主題包含下列幾節:

簡介

任何不是以 AVStream 為基礎的硬體編解碼器都必須提供自己的 MFT,以作為驅動程式的 Proxy。 硬體編解碼器可能包含數個不同的功能區塊:

  • 編碼器
  • 解碼器
  • 畫面格縮放/格式轉換

每個函式都應該由個別的 MFT 管理。 硬體 MFT 絕對不應該做為多用途的「轉碼器」。相反地,將編碼函式放入編碼器 MFT,並將函式解碼器 MFT 解碼。 如果硬體提供畫面調整和格式轉換,請將這些函式放在個別的視訊處理器中,註冊在 MFT_CATEGORY_VIDEO_PROCESSOR 類別中。 如果硬體不支援畫面縮放或格式轉換,Media Foundation 會提供軟體視訊處理器。

硬體 MFT 具有下列一般需求:

  • 硬體 MFT 必須使用新的非同步處理模型,如 非同步 MFT中所述。
  • 硬體 MFT 必須支援動態格式變更,如 動態格式變更中所述。

硬體 MFT 屬性

硬體 MFT 必須實作下列與屬性相關的方法:

第一次建立 MFT 時,它必須在自己的全域屬性存放區上設定下列屬性 (,也就是 GetAttributes 傳回的屬性存放區) :

屬性 描述
MF_TRANSFORM_ASYNC 必須設定為 TRUE。 表示 MFT 會執行非同步處理。
MFT_ENUM_HARDWARE_URL_Attribute 包含硬體裝置的符號連結。
拓撲載入器會使用這個屬性的存在來測試 MFT 是否代表硬體裝置。
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE 必須設定為 TRUE。 表示 MFT 支援動態格式變更。

 

硬體交握順序

如果兩個 MFT 代表相同的實體裝置,他們可以在硬體內交換資料,例如,透過硬體匯流排交換資料。 不需要將資料複製到系統記憶體,然後回到裝置。

在下圖中,標示為 「A」 和 「B」 的 MFT 代表相同硬體內的功能區塊。 例如,在轉碼案例中,「A」 可能代表硬體解碼器,而 「B」 可能代表硬體編碼器。 「A」 和 「B」 之間的資料流程會在硬體內發生。 標示為 「C」 的 MFT 是軟體 MFT。 從 「B」 到 「C」 的資料流程會使用系統記憶體。

圖表顯示標示為 c 的方塊,以及硬體編解碼器:指向 b 和編解碼器、編解碼器指向 b,而 b 指向 c

若要建立硬體連線,兩個硬體 MFT 必須使用私人通道。 此連線會在格式交涉期間建立,在設定媒體類型之前,以及在第一次呼叫 ProcessInput之前建立。 連線程式的運作方式如下:

  1. 拓撲載入器會檢查兩個 MFT 是否有 MFT_ENUM_HARDWARE_URL_Attribute 屬性。 請注意,它不會檢查這個屬性的值。

  2. 如果 兩個 MFT 上都有MFT_ENUM_HARDWARE_URL_Attribute,拓撲載入器會執行下列動作:

    1. 拓撲載入器會在上游 MFT (A) 上呼叫 IMFTransform::GetOutputStreamAttributes 。 這個方法會傳回 IMFAttributes 指標。 讓這個指標表示 pUpstream
    2. 拓撲載入器會在下游 MFT (B) 上呼叫 IMFTransform::GetInputStreamAttributes 。 此呼叫也會傳回 IMFAttributes 指標。 讓這個指標表示 pDownstream
    3. 拓撲載入器會呼叫IMFAttributes::SetUnknown,在pDownstream上設定MFT_CONNECTED_STREAM_ATTRIBUTE屬性。 屬性的值是 pUpstream 指標。
    4. 拓撲載入器會將pDownstreampUpstream上的MFT_CONNECTED_TO_HW_STREAM屬性設定為TRUE
  3. 此時,下游 MFT 具有上游 MFT 屬性存放區的指標,如下圖所示。

    圖表,每個 mfts 指向其資料流程、每個指向其存放區的資料流程,以及輸入存放區,其中含有虛線到輸出存放區

    注意

    為了清楚起見,此圖表會將資料流程和屬性儲存為不同的物件,但實作不需要。

     

  4. 下游 MFT 會使用 IMFAttributes 指標來建立與上游 MFT 的私人通道。 因為通道是私用的,所以實作會定義確切的機制。 例如,MFT 可能會查詢私人 COM 介面。

在步驟 4 期間,下游 MFT 必須確認這兩個 MFT 是否共用相同的實體裝置。 否則,它們必須回復為使用系統記憶體進行資料傳輸。 這可讓 MFT 與軟體 MFT 和其他硬體裝置正確運作。

如果交握成功,且兩個 MFT 共用私人資料通道,則不會使用下一節中所述的標準資料處理模型 () 連接點。 具體而言,下游 MFT 不會傳送 METransformNeedInput 事件;如需詳細資訊,請參閱本主題中的下一節。

資料處理

當硬體 MFT 使用系統記憶體進行資料傳輸時,此程式的運作方式如下:

  1. 若要要求更多輸入,MFT 會傳送 METransformNeedInput 事件。
  2. METransformNeedInput事件會導致管線呼叫IMFTransform::P rocessInput
  3. 當 MFT 具有輸出資料時,MFT 會傳送 METransformHaveOutput 事件。
  4. METransformHaveOutput事件會導致管線呼叫IMFTransform::P rocessOutput

如需詳細資訊,請參閱 非同步 MFT

不過,如果 MFT 使用硬體通道,它不會在硬體連接點傳送這些事件,因為所有資料傳輸都會在硬體內部進行。 因此,管線不會在連接點呼叫 ProcessInputProcessOutput

例如,請考慮本主題中的第一個圖表。 假設此設定,資料處理會如下所示:

  1. 「A」 會傳送 METransformNeedInput 來要求資料。
  2. 管線會在 「A」 上呼叫 ProcessInput
  3. 「A」 和 「B」 會處理硬體中的資料。
  4. 處理完成時,「B」 會傳送 METransformHaveOutput 事件。
  5. 管線會在 「B」 上呼叫 ProcessOutput

配對解碼器/編碼器

如果解碼器和編碼器位於相同的硬體晶片上,轉碼時最好將它們一起使用。 也就是說,選取其中一個應該會導致在轉碼管線中選取另一個 。 為了確保已選擇相符的硬體編解碼器,這兩個編解碼器 MFT 都應該提供自訂媒體類型。 若要建立自訂媒體類型:

其他類型屬性是選擇性的。 解碼器會從 其 IMFTransform::GetOutputAvailableType傳回自訂類型,而編碼器會從 其 IMFTransform::GetInputAvailableType 方法傳回自訂類型。 在這兩種情況下,自訂類型必須是清單中的第一個專案, (dwTypeIndex = 0) 。

若要使用軟體編解碼器,編解碼器也應該至少傳回一個標準格式,例如 NV12 進行視訊。 標準格式應該會出現在自訂類型之後, (dwTypeIndex> 0) 。 如果兩個編解碼器必須一律配對且無法與軟體編解碼器交互操作,MFT 應該只傳回自訂格式,而不會傳回任何標準格式。

注意

如果解碼器未傳回任何標準格式,則無法用於使用 增強式視訊轉譯器播放。 在此情況下,它應該註冊為僅限轉碼解碼器。 請參閱 僅限轉碼解碼器

 

撰寫自訂 MFT

實作編解碼器 MFT

媒體基礎轉換