篩選中心處理

如果篩選準則使用篩選中心處理,則根據預設,AVStream 會在每個針腳實例上有可用的資料框架時,呼叫 minidriver 提供的 AVStrMiniFilterProcess 回呼常式。 Minidrivers 可以藉由設定KSPIN_DESCRIPTOR_EX結構的Flags成員來修改此預設行為。

若要實作以篩選為中心的處理,請在KSFILTER_DISPATCH結構的Process成員中,提供 minidriver 提供的AVStrMiniFilterProcess回呼常式的指標。 將KSPIN_DISPATCHProcess成員設定為Null

只有在符合下列所有條件時,AVStream 才會呼叫 AVStrMiniFilterProcess

  • 框架可在需要畫面格才能進行處理的針腳上使用。 Minidrivers 可以在KSPIN_DESCRIPTOR_EXFlags成員中設定旗標來修改處理行為。 請特別注意互斥旗標的組合,KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING和KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING。 minidriver 也可以透過 使用 KsPinAttachAndGateKsPinAttachOrGate 常式來修改需要框架的一組針腳。

  • 針腳實例數目等於或大於KSPIN_DESCRIPTOR_EX結構的InstancesNecessary成員。 KSPIN結構的ClientState成員會指定目前設定針腳的特定KSSTATE列舉值。 符合 InstancesNecessary之後,處於KSSTATE_STOP狀態的其他針腳將不會防止篩選處理。

  • 符合所需的針腳實例數目 (,如KSPIN_DESCRIPTOR_EX結構的InstancesNecessary成員所指定。

  • minidriver 尚未使用 KSGATEXxx 函式關閉篩選的進程式控制制閘道。

AVStrMiniFilterProcess 回呼常式中,minidriver 會接收 KSPROCESSPIN_INDEXENTRY 結構的陣列指標。 AVStream 會依針腳識別碼排序KSPROCESSPIN_INDEXENTRY結構的陣列。

下列程式碼範例說明如何使用進程針腳結構。 程式碼取自 AVStream Filter-Centric模擬擷取驅動程式 (Avssamp) 範例,示範如何撰寫以篩選為中心的擷取驅動程式。 原始程式碼和此範例的描述包含在 Windows 驅動程式套件範例下載中。

minidriver 會在其篩選進程分派中接收KSPROCESSPIN_INDEXENTRY結構的陣列。 在此範例中,minidriver 會從索引VIDEO_PIN_ID的KSPROCESSPIN_INDEXENTRY結構擷取第一個 KSPROCESSPIN 結構:

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

minidriver 不應該參考ProcessPinsIndex [n]。確認ProcessPinsIndex [n] 的Count成員至少為一個,或者Pin [0] 內含之KSPIN_DESCRIPTOR_EX結構的InstancesNecessary成員至少為一個。 (如果後者為 true,則保證針腳存在。)

然後,若要指定要擷取畫面的針腳, AVStrMiniFilterProcess 回呼常式會將 KSPROCESSPIN 結構的指標傳遞至 CaptureFrame,這是廠商提供的擷取常式:

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

擷取常式接著可以複製到 KSPROCESSPIN 結構的 Data 成員或從中複製。 它也可能會更新這個結構的 BytesUsedTerminate 成員,如下列範例所示:

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

minidriver 也可以存取對應至目前資料流程指標和釘選的資料流程標頭結構:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

大部分使用篩選中心處理的迷你驅動程式只會使用資料流程指標來進行資料流程標頭存取。 在以篩選為中心的模型中,AVStream 會在內部運算元據流指標。 因此,如果迷你驅動程式在以篩選為主的驅動程式中運算元據流指標,應該小心。