如果篩選器使用以篩選為核心的處理,則在預設情況下,當每個接腳實例上都有可用的數據框架時,AVStream 會呼叫微型驅動程式提供的 AVStrMiniFilterProcess 回呼常式。 迷你驅動程式可以藉由設定 KSPIN_DESCRIPTOR_EX 結構的 Flags 成員來修改此預設行為。
若要實作以篩選為中心的處理,請在 KSFILTER_DISPATCH 結構的 Process 成員中提供迷你驅動程式提供的 AVStrMiniFilterProcess 回呼常式的指標。 將 KSPIN_DISPATCH 的 Process 成員設定為 NULL。
只有在符合下列所有條件時,AVStream 才會呼叫 AVStrMiniFilterProcess :
框架可在需要框架進行處理的針腳上使用。 迷你驅動程式可以在KSPIN_DESCRIPTOR_EX的 Flags 成員中設定旗標來修改處理行為。 特別注意互斥的旗標 KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 與 KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 的組合。 迷你驅動程式也可以使用 KsPinAttachAndGate 或 KsPinAttachOrGate 常式來修改需要框架的針腳集。
針腳實例數目等於或大於KSPIN_DESCRIPTOR_EX結構的 InstancesNecessary 成員。 KSPIN 結構的 ClientState 成員會指定目前設定針腳的特定 KSSTATE 列舉值。 符合 InstancesNecessary 的條件之後,處於 KSSTATE_STOP 狀態的其他針腳不會阻礙濾波處理。
所需的針腳實例數目已達成(如 KSPIN_DESCRIPTOR_EX 結構的 InstancesNecessary 成員所指定)。
迷你驅動程式尚未使用 KSGATEXxx 函式關閉篩選的進程控制閘道。
在 AVStrMiniFilterProcess 回呼例程中,迷你驅動程式會收到一個指向 KSPROCESSPIN_INDEXENTRY 結構體陣列的指標。 AVStream 會依針腳識別碼排序KSPROCESSPIN_INDEXENTRY結構陣列。
下列程式碼範例說明如何使用處理引腳結構。 程式碼取自 AVStream Filter-Centric 模擬擷取驅動程式 (Avssamp) 範例,示範如何撰寫以篩選為中心的擷取驅動程式。 原始程式碼和此範例的描述包含在 Windows 驅動程式套件範例下載中。
迷你驅動程式會在其篩選程序調度中接收 KSPROCESSPIN_INDEXENTRY 結構陣列。 在此範例中,迷你驅動程式會從索引VIDEO_PIN_ID的KSPROCESSPIN_INDEXENTRY結構擷取第一個 KSPROCESSPIN 結構:
NTSTATUS
CCaptureFilter::
Process (
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
)
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}
迷你驅動程式不應該參考 ProcessPinsIndex [n] 的 Pins [0],除非它已確認 ProcessPinsIndex [n] 的 Count 成員至少為 1,或 Pins [0] 中所包含的 KSPIN_DESCRIPTOR_EX 結構的 InstancesNecessary 成員至少為 1。 (如果後者為真,則保證引腳存在。)
然後,若要指定用來擷取畫面的針腳,回呼常式 AVStrMiniFilterProcess 會將一個指向 KSPROCESSPIN 結構的指標傳遞給廠商提供的擷取常式 CaptureFrame。
VidCapPin -> CaptureFrame (VideoPin, m_Tick);
然後,擷取常式可以複製到 KSPROCESSPIN 結構的 Data 成員,或從 KSPROCESSPIN 結構的 Data 成員複製。 它也可能會更新此結構的 BytesUsed 和 Terminate 成員,如下列範例所示:
RtlCopyMemory ( ProcessPin -> Data,
m_SynthesisBuffer,
m_VideoInfoHeader -> bmiHeader.biSizeImage
);
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;
迷你驅動程式也可以存取對應至目前資料流指標和針腳的資料流標頭結構:
PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;
大部分使用以篩選為中心的處理的迷你驅動程式只會使用串流指標來存取串流標頭。 在以篩選為中心的模型中,AVStream 會進行內部操作流指標。 因此,如果迷你驅動程式在以濾波器為中心的驅動程式中操作串流指標,則應該謹慎行事。