共用方式為


硬體 MFT

注意

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

 

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

重要

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

 

本主題包含下列各節:

介紹

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

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

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

硬體 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」 的數據流會使用系統記憶體。

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

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

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

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

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

    圖表,其中每個 Mft 指向其數據流、每個指向其存放區的數據流,以及輸入存放區,並以虛線指向輸出存放區

    注意

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

     

  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 都應該提供自定義媒體類型。 若要建立自訂媒體類型:

  • 視需要將 MF_MT_MAJOR_TYPE 屬性設定為 MFMediaType_AudioMFMediaType_Video
  • MF_MT_SUBTYPE 屬性設定為自定義 GUID 值。

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

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

注意

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

 

撰寫自定義 MFT

實作編解碼器 MFT

媒體基礎轉換