KS相机驱动
+ -

CCapturePin::IntersectHandler

2025-02-25 9 0

IntersectHandler是 KSPIN_DESCRIPTOR_EX的成员函数指针,是该Pin的公共函数。
每一个PIN可以有一个KSPIN_DESCRIPTOR_EX,KSPIN_DESCRIPTOR_EX数组指针位于KSFILTER_DESCRIPTOR成员中,其数组的大小表示了PIN的数量。

typedef struct {
  const KSPIN_DISPATCH*  Dispatch;
  const KSAUTOMATION_TABLE*  AutomationTable;
  KSPIN_DESCRIPTOR  PinDescriptor;
  ULONG  Flags;
  ULONG  InstancesPossible;
  ULONG  InstancesNecessary;
  const KSALLOCATOR_FRAMING_EX*  AllocatorFraming;
 PFNKSINTERSECTHANDLEREX  IntersectHandler;//所有PIN公共函数
} KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;

见:CCapturePin::IntersectHandler

NTSTATUS CCapturePin::IntersectHandler(
    IN PKSFILTER Filter,
    IN PIRP Irp,
    IN PKSP_PIN PinInstance,
    IN PKSDATARANGE CallerDataRange,     //client
    IN PKSDATARANGE DescriptorDataRange, //pin descriptor
    IN ULONG BufferSize,
    OUT PVOID Data OPTIONAL,
    OUT PULONG DataSize
    )

文档解释CallerDataRange和DescriptorDataRange相交的DATA_RANGE是否相同,如果相同,则将数据返回给Data和DataSize,返回的格式为DATA_FORMAT(KS_DATAFORMAT_VIDEOINFOHEADER).

IntersectHandler运行在创建CCaptureFilter之后,在创建CCapturePin之前。

创建CCapturePin意味着要打开相机。
创建CCaptureFilter意味着要读取相机属性,如格式分辨率等。

输出内容:

typedef struct tagKS_DATAFORMAT_VIDEOINFOHEADER {
    KSDATAFORMAT            DataFormat;
    KS_VIDEOINFOHEADER      VideoInfoHeader;
} KS_DATAFORMAT_VIDEOINFOHEADER, *PKS_DATAFORMAT_VIDEOINFOHEADER;
`

输入内容拆分出KS_DATAFORMAT_VIDEOINFOHEADER:

缩进的为要剔除的成员。

typedef struct tagKS_DATARANGE_VIDEO {
   KSDATARANGE                  DataRange;
               BOOL                         bFixedSizeSamples;      // all samples same size?
               BOOL                         bTemporalCompression;   // all I frames?
               DWORD                        StreamDescriptionFlags; // KS_VIDEO_DESC_*
               DWORD                        MemoryAllocationFlags;  // KS_VIDEO_ALLOC_*
               KS_VIDEO_STREAM_CONFIG_CAPS  ConfigCaps;
   KS_VIDEOINFOHEADER           VideoInfoHeader;        // default format
} KS_DATARANGE_VIDEO, *PKS_DATARANGE_VIDEO;

另外KSDATAFORMAT就是KSDATAFORMAT。

typedef union {
    struct {
        ULONG   FormatSize;
        ULONG   Flags;
        ULONG   SampleSize;
        ULONG   Reserved;
        GUID    MajorFormat;
        GUID    SubFormat;
        GUID    Specifier;
    };
    LONGLONG    Alignment;
} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;

数据返回:

ULONG DataFormatSize =  sizeof(KSDATAFORMAT) + KS_SIZE_VIDEOHEADER(&callerDataRange->VideoInfoHeader);

*DataSize = DataFormatSize;

PKS_DATAFORMAT_VIDEOINFOHEADER FormatVideoInfoHeader = PKS_DATAFORMAT_VIDEOINFOHEADER(Data);

RtlCopyMemory(&FormatVideoInfoHeader->DataFormat,
                DescriptorDataRange, 
                sizeof (KSDATAFORMAT));

FormatVideoInfoHeader->DataFormat.FormatSize = DataFormatSize;

RtlCopyMemory(&FormatVideoInfoHeader->VideoInfoHeader,
                &callerDataRange->VideoInfoHeader,
                KS_SIZE_VIDEOHEADER (&callerDataRange->VideoInfoHeader));

FormatVideoInfoHeader->VideoInfoHeader.bmiHeader.biSizeImage = 
            FormatVideoInfoHeader->DataFormat.SampleSize = 
            KS_DIBSIZE(FormatVideoInfoHeader->VideoInfoHeader.bmiHeader);

另外,对于IntersectHandler,有几种格式,需要校验几种格式。

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!