處理資料流程變更
本主題說明媒體基礎轉換 (MFT) 應該如何處理串流期間的格式變更。
重要
本主題不適用於編碼器。 編碼器不應傳播格式變更,如本主題中所述。 編碼器應該只接受符合目前設定之輸出類型的輸入類型。
格式變更總覽
一般來說,在串流處理期間可能會變更格式的兩個原因。
- 用戶端可能會切換至具有新格式的資料流程。 例如,在數位電視中,這可能是因為通道變更所造成。
- 在某些影片格式(例如 h.264)中,位流可以指示格式變更。 這類變更可能包括欄位支配、視頻解析度或圖元外觀比例的變更。
如果編碼類型變更,用戶端可能需要從管線中移除 MFT,並將它取代為另一個 MFT。 (例如,用戶端可能需要換成新的解碼器。 ) 本主題未涵蓋這種情況。 本主題僅涵蓋目前的 MFT 可以處理新格式的情況。
如果格式有所變更,則 MFT 可能需要新的輸入類型、新的輸出類型或兩者。
- 輸入類型的變更是由用戶端所起始。 MFT 絕不會變更自己的輸入類型。
- 對輸出類型所做的變更是由 MFT 所起始。 MFT 表示它需要新的輸出類型,而且用戶端會以 MFT 協商新的輸出類型。
因此,可能有三種不同的案例:
- 用戶端會設定新的輸入類型。 MFT 會取用新的格式,而不會變更其輸出類型。
- 用戶端會設定新的輸入型別,而這會觸發輸出型別中的變更。
- 輸入類型不會變更,但 MFT 會偵測到位流中的格式變更,這需要新的輸出類型。
執行格式變更
本主題的其餘部分將說明用戶端應該如何處理格式變更,以及如何在 MFT 中執行格式變更。
輸出類型
任何 MFT 都可以起始其輸出類型的變更,如下所示:
- 用戶端會呼叫 IMFTransform::P rocessoutput。 MFT 會以下列方式回應:
- MFT 不會在 ProcessOutput中產生輸出範例。
- MFT 會在 mft _ 輸出 _ 資料 _ 緩衝區結構的 dwStatus 成員中設定 mft _ 輸出 _ 資料 _ 緩衝區 _ 格式 _ 變更 旗標。
- ProcessOutput方法會傳回錯誤碼 MF _ E _ 轉換 _ 資料流程 _ 變更。
- 用戶端會呼叫 IMFTransform:: GetOutputAvailableType。 這個方法會傳回一組更新的輸出類型。
- 用戶端會呼叫 SetOutputType 來設定新的輸出類型。
- 用戶端會繼續呼叫 ProcessInput / ProcessOutput。
輸入類型
輸入類型的變更是由用戶端所起始,而不是由 MFT 所起始。 如果輸入類型變更,它可能會觸發輸出類型的變更。
確切的事件順序取決於 MFT _ 支援 _ 動態 _ 格式 _ 變更 屬性的值。
值 | 描述 |
---|---|
FALSE | 在用戶端設定新的輸入類型之前,必須先清空 MFT。 |
TRUE | 用戶端可以設定新的輸入類型,而不需要清空 MFT。 |
MFT 會透過其 IMFTransform:: GetAttributes 方法來公開這個屬性。 這個屬性的預設值為 FALSE;如果 MFT 未設定此屬性,請將值視為 FALSE。
MFT _ 支援 _ 動態 _ 格式 _ 變更為 FALSE
- 用戶端傳送 MFT _ 訊息 _ 命令 _ 清空 訊息。
- 用戶端會藉由呼叫 IMFTransform::P rocessoutput 來清空 MFT,直到 ProcessOutput 傳回 MF _ E _ 轉換 _ 需要 _ 更多 _ 輸入。
- 用戶端會呼叫 IMFTransform:: SetInputType 來設定新的輸入類型。
- MFT 會驗證輸入類型。 如果類型無效, SetInputType 會傳回 MF _ E _ INVALIDMEDIATYPE 或其他錯誤碼。 否則, SetInputType 會傳回 S _ OK。
- 假設輸入類型有效,則 MFT 會評估輸出類型是否也會變更。 如果不是,則資料流程會繼續進行,不需要採取任何進一步的動作。
- 如果輸出類型變更:
- MFT 會使其目前的輸出媒體類型失效,並更新可用輸出媒體類型的清單。
- ProcessOutput的下一個呼叫會傳回 MF _ E _ 轉換 _ 資料流程 _ 變更,如上一節中所述。
- 用戶端會呼叫 IMFTransform:: GetOutputAvailableType 來取得更新的輸出類型清單。
- 用戶端會呼叫 SetOutputType。
MFT _ 支援 _ 動態 _ 格式 _ 變更為 TRUE
- 用戶端會呼叫 IMFTransform:: SetInputType 來設定新的輸入類型。
- MFT 會驗證輸入類型。 如果類型無效, SetInputType 會傳回 MF _ E _ INVALIDMEDIATYPE 或其他錯誤碼。 否則, SetInputType 會傳回 S _ OK。
- 假設輸入類型有效,則 MFT 會評估輸出類型是否也會變更。 如果不是,則資料流程會繼續進行,不需要採取任何進一步的動作。
- 在輸出類型變更之前,MFT 必須處理任何快取的輸入範例,如下所示:
- MFT 不會使其目前的輸出類型無效。
- 從快取的輸入範例中,MFT 產生的輸出越多。
- 無論是在處理快取的範例時,MFT 是否接受新的輸入範例都是選擇性的。 如果是,新的輸入範例將會使用新的輸入格式,因此 MFT 必須在格式變更時追蹤點。
- 在 MFT 處理輸入類型變更之前所收到的所有範例之後, IMFTransform::P rocessoutput 會傳回 MF _ E _ 轉換 _ 資料流程 _ 變更。
- MFT 會使其目前的輸出類型失效,並更新可用輸出媒體類型的清單。
- 如先前所述,用戶端會協商新的輸出類型。
針對 MFT _ 支援 _ 動態 _ 格式 _ 變更屬性,非同步 MFTs必須傳回 TRUE 值。 使用非同步 MFT 時,用戶端可以假設 [ MFT _ 支援 _ 動態 _ 格式 _ 變更 ] 屬性設定為 [ TRUE]。
當 MFT _ 支援 _ 動態 _ 格式 _ 變更 為 TRUE 時,主要的差異在於,用戶端不需要在設定新的輸入類型之前清空 MFT。 因此,當 MFT 在輸入範例上時,輸入類型可能會變更。 請務必不要只卸載這些範例。 此外,在 MFT 處理其所有快取的資料之前,輸出類型無法變更。
先前的段落特別適用于影片解碼器,它可以從時態順序接收程式碼框架,因此需要加以快取。 如果 MFT 未快取輸入範例,則清空其實是無作業。 在此情況下,MFT 可以將 (_ _ 動態 _ 格式 _ 變更 為 FALSE ,或將屬性保留為未設定) 。
此外,請注意,在清空之後,每個 MFT 都應該正確地處理格式變更。 Mft _ 支援 _ 動態 _ 格式 _ 變更屬性指出 mft 是否支援格式變更,而不需要清空。
以交錯模式變更
影片交錯模式中的變更是特殊案例,因為它們不會使目前的媒體類型無效。 相反地,您可以藉由設定媒體範例上的屬性,為每個影片框架指定交錯模式。 影片 MFT 應檢查每個輸入範例是否有這些旗標。
當欄位支配從最上層欄位切換至底部欄位,或影片在漸進式和交錯式圖片之間切換時,交錯模式可能會變更。
如需詳細資訊,請參閱 在範例上交錯旗標。