如果筛选器使用以筛选器为中心的处理,则默认情况下,当每个引脚实例上都有可用的数据帧时,AVStream 会调用微型驱动程序提供的 AVStrMiniFilterProcess 回调例程。 微型驱动程序可以通过设置KSPIN_DESCRIPTOR_EX结构的 Flags 成员来修改此默认行为。
若要实现以筛选器为中心的处理,需在KSFILTER_DISPATCH结构的Process成员中,提供指向微型驱动程序提供的AVStrMiniFilterProcess回调例程的指针。 将KSPIN_DISPATCH的进程成员设置为 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 按引脚 ID 对 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] 的 Count 成员至少为一个之前,或者Pins [0] 中包含的 KSPIN_DESCRIPTOR_EX 结构的 InstancesNecessary 成员至少为一个之前,微型驱动程序不应引用 ProcessPinsIndex [n] 中的Pins [0]。 (如果后者为 true,则保证引脚存在。
然后,若要指定捕获帧的引脚, AVStrMiniFilterProcess 回调例程会将指向 KSPROCESSPIN 结构的指针传递给 CaptureFrame(供应商提供的捕获例程):
VidCapPin -> CaptureFrame (VideoPin, m_Tick);
然后,捕获例程可以复制到或从 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 在内部处理流指针。 因此,微型驱动程序在处理以筛选器为中心的驱动程序中的流指针时,应谨慎行事。