以筛选器为中心的处理

如果筛选器使用以筛选器为中心的处理,则默认情况下,当每个引脚实例上都有可用的数据帧时,AVStream 会调用微型驱动程序提供的 AVStrMiniFilterProcess 回调例程。 微型驱动程序可以通过设置 KSPIN_DESCRIPTOR_EX 结构的 Flags 成员来修改此默认行为。

若要实现以筛选器为中心的处理,请在 KSFILTER_DISPATCH 结构的 Process 成员中提供指向微型驱动程序提供的 AVStrMiniFilterProcess 回调例程的指针。 将 KSPIN_DISPATCHProcess 成员设置为 NULL

仅当满足以下所有条件时,AVStream 才调用 AVStrMiniFilterProcess

  • 帧在需要帧进行处理的引脚上可用。 微型驱动程序可以通过在 KSPIN_DESCRIPTOR_EXFlags 成员中设置标志来修改处理行为。 请特别注意相互排斥的标志KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING和KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING的组合。 微型驱动程序还可以通过使用 KsPinAttachAndGateKsPinAttachOrGate 例程来修改需要帧的引脚集。

  • 固定实例的数目等于或大于 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]。验证 ProcessPinsIndex [n] 的 Count 成员是否至少为一个,或者 Pins [0] 中包含的 KSPIN_DESCRIPTOR_EX 结构的 InstancesNecessary 成员至少为 1 之前,该图 [0] 。 (如果后者为 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;

微型驱动程序还可以访问对应于当前流指针和引脚的流标头结构:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

大多数使用以筛选器为中心的处理的微型驱动程序仅将流指针用于流标头访问。 在以筛选器为中心的模型中,AVStream 在内部操作流指针。 因此,微型驱动程序在以筛选器为中心的驱动程序中操作流指针时应谨慎操作。