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,有几种格式,需要校验几种格式。