AVStream 管道和線路
管道是一組共用通用配置器的AVStream 篩選器。
下圖顯示由三個 AVStream 篩選準則組成的管道:來源篩選、 就地 轉換篩選和轉譯器篩選。
在此範例中, KSProxy (未顯示) 已選擇配置器,以圖表中的 Alloc 區塊表示。
AVStream 會建立與來源篩選相關聯的內部要求者物件。 在圖表中,要求者會顯示為 Req。minidriver 會在 allocatorFraming 成員中指定 KSPIN_DESCRIPTOR_EX 要指派給框架的記憶體類型和連續記憶體數量。 因此,要求者會從配置器取得畫面格,並將其傳遞至線路中的下一個元件。
來源篩選的資料會流向另一個 AVStream 驅動程式所實作的轉換篩選。
最後,資料流程流向第三個 AVStream 篩選所實作的轉譯器篩選。
由於此圖表中的所有針腳都是 AVStream 針腳,因此 AVStream 會使用自己的內部傳輸介面,而不是透過 IoCallDriver傳送 IRP,以減少延遲並改善效能。
具體來說,當應用程式讓圖形轉換KSSTATE_ACQUIRE ( 例如,當使用者按一下 GraphEdit) 播放 時,AVStream 會直接連線篩選佇列,如上所示。
因此,框架會將下游傳回給要求者,在轉譯完成時可以回收它們。 此 AVStream 資料路徑是 線路。
請考慮下圖所示的第二個範例,其中轉換篩選器不是 AVStream 篩選準則,但仍是核心模式篩選。
如第一個範例所示,此範例包含三個篩選:AVStream 來源、KS 轉換 (這可能是直接使用 KS 的驅動程式,或是資料流程類別下) 的迷你驅動程式,以及 AVStream 轉譯器。
如第一個圖例所示,針腳會先互連。 不過,當篩選圖形轉換成 KSSTATE_ACQUIRE時,核心串流 1.0 篩選不支援 AVStream 傳輸介面。 因此,AVStream 不會略過針腳;相反地,它必須使用 I/O 在篩選之間移動資料。
具體而言,當畫面離開來源篩選的佇列時,AVStream 會呼叫 IoCallDriver。 在此呼叫中, Irp 參數包含要從來源的輸出針腳傳遞至轉換篩選的框架。
當轉譯器的輸入針腳收到 IRP 時,針腳會將 IRP 放在佇列中。 當轉譯器驅動程式完成畫面格時,它會將框架傳回至轉譯器的輸入針腳,如第二個範例所示。
AVStream 現在會呼叫 IoCompleteRequest 以傳回框架上游。 來源篩選的輸出針腳會收到完成通知。 Minidriver 的 針腳進程回呼 常式接著可以呼叫 KsStreamPointerUnlock ,並將畫面移回要求者,以回收至線路。
請考慮畫面來源處於使用者模式的最後一個範例。 (或者,最終框架目的地可能位於使用者模式中。)
在下圖中,核心模式 非就地 轉換篩選會接收來自使用者模式 DirectShow 篩選的畫面,並將轉換的畫面傳送至核心模式 AVStream 轉譯器:
當畫面從使用者模式抵達時,AVStream 釘選物件會將它們放在輸入管道區段的佇列中。
非就地轉換篩選準則會以核心模式配置已轉換的畫面格,然後使用第二個管道作為這些畫面的線路。 因為轉譯器是 AVStream 篩選器,所以 AVStream 會略過針腳,並使用 AVStream 傳輸介面直接將畫面放在轉譯篩選的佇列中。
minidriver 可以呼叫KsPinSubmitFrame或KsPinSubmitFrameMdl,將框架插入線路。 如果 minidriver 使用這個方法,AVStream 要求者會收到這些呼叫的結果,而不是從核心模式配置器接收框架。