交涉配置器

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

當兩個針腳連線時,他們需要交換媒體資料的機制。 此機制稱為 傳輸。 一般而言,DirectShow 架構對於傳輸是中性的。 兩個篩選準則都同意使用兩者支援的任何傳輸進行連線。

最常見的傳輸是本機 記憶體 傳輸,其中媒體資料位於主要記憶體中。 本機記憶體傳輸有兩種類型, 即推送模型提取模型。 在推送模型中,來源篩選會使用下游篩選輸入針腳上的 IMemInputPin 介面,將資料推送至下游篩選。 在提取模型中,下游篩選準則會使用來源篩選輸出針腳上的 IAsyncReader 介面,從來源篩選要求資料。 如需這兩個數據流模型的詳細資訊,請參閱 篩選圖形中的資料流程

在本機記憶體傳輸中,負責配置記憶體緩衝區的物件稱為 配置器。 配置器支援 IMemAllocator 介面。 這兩個針腳都會共用單一配置器。 任一針腳都可以提供配置器,但輸出針腳會選取要使用的配置器。

輸出針腳也會設定配置器屬性,以決定配置器所建立的緩衝區數目、每個緩衝區的大小,以及記憶體對齊方式。 輸出針腳可能會延遲至緩衝區需求的輸入針腳。

IMemInputPin 連線中,配置器交涉的運作方式如下:

  1. 選擇性地,輸出針腳會呼叫 IMemInputPin::GetAllocatorRequirements。 這個方法會擷取輸入針腳的緩衝區需求,例如記憶體對齊。 一般而言,輸出針腳應該接受輸入針腳的要求,除非有好的理由不要這麼做。
  2. 選擇性地,輸出針腳會呼叫 IMemInputPin::GetAllocator。 這個方法會從輸入針腳要求配置器。 輸入針腳提供一個,或傳回錯誤碼。
  3. 輸出針腳會選取配置器。 它可以使用輸入針腳所提供的輸入針腳,或自行建立。
  4. 輸出針腳會呼叫 IMemAllocator::SetProperties 來設定配置器屬性。 不過,配置器可能不會接受要求的屬性。 (例如,如果輸入針腳提供 allocator.) 配置器傳回實際屬性做為 SetProperties 方法中的輸出參數,就會發生這種情況。
  5. outpin 會呼叫 IMemInputPin::NotifyAllocator ,以通知選取範圍的輸入針腳。
  6. 輸入針腳應該呼叫 IMemAllocator::GetProperties ,以確認配置器屬性是否可接受。
  7. 輸出針腳負責認可和取消配置器。 當串流啟動和停止時,就會發生這種情況。

IAsyncReader 連線中,配置器交涉的運作方式如下:

  1. 輸入針腳會在輸出針腳上呼叫 IAsyncReader::RequestAllocator 。 輸入針腳會指定其緩衝區需求,並選擇性地提供配置器。
  2. 輸出針腳會選取配置器。 如果有的話,它可以使用輸入針腳所提供的輸入針腳,或建立自己的輸入針腳。
  3. 輸出針腳會傳回配置器做為 RequestAllocator 方法中的傳出參數。 輸入針腳應該檢查配置器屬性。
  4. 輸入針腳負責認可和取消配置器。
  5. 配置器交涉程式期間,任一針腳都可能會失敗連線。
  6. 如果輸出針腳使用輸入針腳的配置器,它只能使用該配置器將樣本傳遞給該輸入針腳。 擁有的篩選準則不得使用配置器將樣本傳遞至其他針腳。

提供自訂配置器