AVStream 小型驅動程式可以使用 AVStream 類別驅動程式的功能,在資料流通過特定接腳時,將資料流分割成多個副本。 如果您的驅動程式需要複製輸入資料流程以產生兩個相同的輸出資料流程,此分割程式會很有用。
若要這樣做,請在針腳KSPIN_DESCRIPTOR_EX結構的 Flags 成員中設定 KSPIN_FLAG_SPLITTER。 當此旗標設定在針腳上時,針腳會充當自動分割器。 AVStream 會自動複製所有必要的資料,以分割資料流。
在 DirectX8.0 之後的版本中,KSPIN_FLAG_SPLITTER 旗標適用於 以篩選為中心 和 以針腳為中心的 篩選上的針腳。 舊版僅支援用於以濾鏡為中心的濾鏡上的針腳此旗標。
下圖顯示濾波器的設定,其中輸入針腳會將資料流程分割成兩個輸出針腳。 此輸出針腳的下游濾波器會 就地變更資料。
框架到達輸入端並放入輸入隊列中。 迷你驅動程式只會與來源針腳的輸入佇列和輸出佇列進行互動。 AVStream 會自動將資料從第一個針腳的佇列複製到第二個針腳的佇列。
為簡單起見,此圖未顯示如何將幀提供給輸出引腳。 例如,若要將框架提供給輸出針腳,可以有與每個佇列相關聯並屬於此管道區段的請求者和配置器。 或者,幀可能來自下游過濾器。
在 KSFILTER_DISPATCH 結構中,迷你驅動程式會指定廠商提供的 AVStrMiniFilterProcess 回呼常式的指標。 此回呼常式是迷你驅動程式接收指向 KSPROCESSPIN_INDEXENTRY 結構的指標,該結構包含下圖所示的 KSPROCESSPIN 結構陣列。
此圖顯示迷你驅動程式如何區分進程針腳清單中的兩個輸出針腳:
在此圖中,DB 會參考 KSPROCESSPIN 結構的 DelegateBranch 成員,而 CS 會參考 CopySource 成員。 輸入針腳和第一個輸出針腳的 DelegateBranch 和 CopySource 成員都是 NULL。 這顯示迷你驅動程式負責處理這些接腳上的幀。
不過,第二個輸出針腳具有 CopySource ,可指向第一個輸出針腳。 這表示第二個輸出針腳位於與第一個輸出針腳不同的管道中,而且 AVStream 會自動將放置在第一個輸出針腳佇列中的任何數據複製到第二個輸出針腳的佇列中。
當兩個輸出引腳內置在同一管道中時,可能會出現更複雜的分路器情況。 例如,迷你驅動程式可以在相同的管道中包含兩個基於分接器的輸出腳位,只要下游篩選不會變更從這些腳位傳送的資料。 由於資料未被修改,因此输出端視為唯讀;兩個下游過濾器都會接收相同的缓冲区。
某些自動附加至分接針的下游篩選器也可能變更資料,而其他篩選器則不會。
在此情況下,篩選配置可能類似於下圖,其中描述包含分割輸出針腳三個實例的篩選:
針腳 A 和 B 被指派給相同的管道,因為下游的過濾器不會改變資料,A 和 B 的下游過濾器會接收相同的緩衝區指標。
迷你驅動程式只會與輸入佇列和單一輸出佇列互動。 AVStream 會自動從 A/B 佇列和 C 佇列複製。 它也會建立一個分流器物件,透過針腳 A 和針腳 B 傳送相同的數據幀(請注意,資料流標頭不同)。
KSPROCESSPIN 結構陣列如下:
在正常情況下,迷你驅動程式必須互動的唯一引腳是引腳 A。
為了簡化上述圖表,圖表中省略了請求者和分配者。 這些圖表僅用於演示幀分割過程。