扩展控件使用 KSPROPERTY 机制向应用程序公开相机控件。
以下标准化扩展控件列表(由 Media Foundation 定义)支持其他 Windows 相机功能:
某些控件作为异步控件向应用程序公开,而其他控件则作为同步控件公开。
同步控件
对于这些控件,捕获管道发送一个 KSPROPERTY 摄像头控制结构,并要求驱动程序同步返回请求。
异步控件
对于这些控件,捕获管道发出 KSPROPERTY、启用与该属性关联的 KSEVENT ,并等待事件发出信号。 驱动程序必须同步完成 KSPROPERTY,并将其用作触发器来启动异步操作。 异步操作完成后,驱动程序必须向正在等待的捕获管道的关联 KSEVENT 发送信号。 捕获管道在收到信号时通知应用程序作完成情况。
如果异步控件可以取消,则必须在控件中指定标志 KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION 。 如果无法取消控件,则控件的作业时间不得超过 5 毫秒。
这些扩展控件是 ksmedia.h 中定义的以下 KS 属性集的一部分:
#define STATIC_KSPROPERTYSETID_ExtendedCameraControl \
0x1CB79112, 0xC0D2, 0x4213, 0x9C, 0xA6, 0xCD, 0x4F, 0xDB, 0x92, 0x79, 0x72
DEFINE_GUIDSTRUCT("1CB79112-C0D2-4213-9CA6-CD4FDB927972", KSPROPERTYSETID_ExtendedCameraControl);
#define KSPROPERTYSETID_ExtendedCameraControl DEFINE_GUIDNAMED(KSPROPERTYSETID_ExtendedCameraControl);
Metadata
若要检索元数据,用户模式组件(DevProxy)必须查询驱动程序以获取元数据缓冲区要求。 用户模式组件获得此信息后,将为驱动程序分配相应的元数据缓冲区,以便填充并返回到用户模式组件。
客户端使用在KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY枚举中定义的KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA属性 ID 来查询元数据缓冲区的要求。这些要求包括所需的元数据大小、内存对齐要求,以及期望的内存分配类型,以便为元数据缓冲区进行分配。
用户模式组件从驱动程序获取元数据缓冲区要求后,它会从所需的内存池中分配大小适当的元数据缓冲区,并将所需的内存对齐方式分配给该缓冲区。 此元数据缓冲区以及实际帧缓冲区将发送到驱动程序以完成,然后在填充时返回给用户模式组件。 对于多拍摄方案,将为每个已分配的帧缓冲区分配一个相应的元数据缓冲区,并将其传送到相机驱动程序。
KSSTREAM_METADATA_INFO结构以及以下标志用于将元数据缓冲区发送到驱动程序。
#define KSSTREAM_HEADER_OPTIONSF_METADATA 0x00001000
缓冲区(元数据 + 帧)排队到驱动程序后,DevProxy 会发送标准 KSSTREAM_HEADER 结构,接着是 KS_FRAME_INFO 结构,再接着是 KSSTREAM_METADATA_INFO 结构。 DevProxy 将使用 KSSTREAM_HEADER_OPTIONSF_METADATA 进一步屏蔽 KSSTREAM_HEADER.OptionFlags,然后才将缓冲区传递给驱动程序。
如果驱动程序不支持元数据,或者 未实现KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA , 则KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA 属性控件将失败。 在这种情况下,DevProxy 不会分配元数据缓冲区,从 DevProxy 传递到驱动程序的有效负载将不包含 KSSTREAM_METADATA_INFO 结构。
如果驱动程序支持元数据,而客户端不需要任何元数据,则在将缓冲区发送到驱动程序时,DevProxy 不会分配元数据缓冲区,也不会传递 KSSTREAM_METADATA_INFO。 如果应用不希望给定引脚上的元数据,则此行为可减少不必要的元数据内存分配。
以下结构描述元数据项的布局,这些元数据项将由元数据缓冲区中的相机驱动程序填充。
下面的列表包含元数据项的布局。 这必须对齐 8 字节。
Metadata
照片确认元数据由 MetadataId_PhotoConfirmation标识。 出现时,它指示关联的预览帧是照片确认帧。 照片确认元数据由 DevProxy 分析。
自定义元数据由从 MetadataId_Custom_Start 开始的 MetadataId 标识。 自定义元数据项可以包含一个元数据 blob,该元数据可以是预览引脚和/或图像引脚的焦点状态,以及检测到的人脸,EXIF 和/或 OEM 元数据。 自定义 Blob 的确切格式由实现驱动程序和 MFT0 的 OEM 确定。 MFT0 负责解析自定义 blob,并将每个元数据项附加为在 MFSampleExtension_CaptureMetadata 属性包下进行分组的属性,格式为 MF 捕获管道和/或 WinRT 可读格式。
以下 IMFAttributes 在 mfapi.h 中定义。 MF 捕获管道和/或 WinRT 需要这些项。 请注意,MFT0 不会为照片确认设置任何 IMFAttributes,因为照片确认帧不会流过 DevProxy。
| 属性(GUID) | 数据类型 |
|---|---|
| MF_CAPTURE_METADATA_FOCUSSTATE | UINT32 |
| MF_CAPTURE_METADATA_FACEROIS | 团块 |
| MF_CAPTURE_METADATA_FRAME_RAWSTREAM | IUnknown |
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes 由 DevProxy 创建并附加到MFSampleExtension_CaptureMetadata,其中包含一个指向与原始元数据缓冲区关联的 IMFMediaBuffer 接口的指针(KSSTREAM_METADATA_INFO.Data)。
当 MFT0 收到 IMFSample 时,它会从 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 获取原始元数据缓冲区,并分析任何其他自定义元数据项(如焦点状态),并将其转换为上面定义的相应 IMFAttributes,并将其附加到 MFSampleExtension_CaptureMetadata 属性包。 以下 IMFAttributes 必须由 MF 管道和任何第三方提供的 MFT 传递:
| 名称 | 类型 |
|---|---|
| MFSampleExtension_CaptureMetadata | IUnknown (IMFAttributes) |
| MFSampleExtension_EOS | UINT32 (布尔值) |
| MFSampleExtension_PhotoThumbnail | IUnknown (IMFMediaBuffer) |
| MFSampleExtension_PhotoThumbnailMediaType | IUnknown (IMFMediaType) |
若要访问原始元数据缓冲区,MFT0 执行以下作:
从 IMFSample 接口MFSampleExtension_CaptureMetadata调用 GetUnknown,以获取属性包的 IMFAttributes 接口。
从上一步获取的 IMFAttributes 接口MF_CAPTURE_METADATA_FRAME_RAWSTREAM上调用 GetUnknown 以获取 IMFMediaBuffer 接口。
调用 Lock 以获取与 IMFMediaBuffer 关联的原始元数据缓冲区。
若要将所需的 IMFAttributes 添加到 MFSampleExtension_CaptureMetadata 属性包中,MFT0 执行以下操作:
在 MFSampleExtension_CaptureMetadata 中从 IMFSample 接口调用 GetUnknown,以便获得属性包的 IMFAttributes 接口。
根据上表中指定的 GUID 和数据类型,在从上一步获取的 IMFAttributes 接口中对MF_CAPTURE_METADATA_XXX调用SetUINT32、SetBlob或SetUnknown。
必需元数据属性
可在捕获统计信息元数据属性中找到可用的元数据属性的完整列表
焦点优先级
KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY属性 ID 是与焦点优先级 DDI 关联的唯一控件。
焦点状态
KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE属性 ID 是与焦点状态 DDI 关联的唯一控件。
扩展的感兴趣区域 ROI
以下属性 ID 是与 ROI DDI 关联的控件:
照片确认
KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION属性 ID 是与照片确认 DDI 关联的唯一控件。
照片序列子模式
KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE属性 ID 是与照片序列 DDI 关联的唯一控件。
EXIF 和 HW JPEG 编码器
无需管道来处理或扭曲 HW JPEG 编码器的任何 EXIF 数据;因此,驱动程序、MFT0 和 OEM HW JPEG 编码器提供 EXIF 数据格式。 OEM 合作伙伴可以为 EXIF 属性定义任何自定义属性 GUID 和变体类型,并将其附加到 MFSampleExtension_CaptureMetaData 属性包,供 OEM 组件使用。 如果 HW JPEG 编码器可用,管道照片接收器组件将加载 HW JPEG 编码器,并使用 IPropertyBag2::Write 方法将MFSampleExtension_CaptureMetaData属性包中保存的 EXIF 数据设置为 EXIF 编码器选项。
编码器选项属性包包含一组指定可用编码选项属性的PROPBAG2结构。 设置在 HW JPEG 编码器上的 EXIF 编码器选项,可以通过编码器选项属性包中的以下属性进行标识:
| 属性名称 | VARTYPE | 价值 | 适用的编解码器 |
|---|---|---|---|
| SampleMetaData | VT_UNKNOWN | 指针指向用于MFSampleExtension_CaptureMetaData属性包的IMFAttributes接口,其中包含含有EXIF数据的OEM子属性。 | JPEG |
MFSampleExtension_CaptureMetaData属性包只能包含 MFT0 和 HW JPEG 编码器可以读取以保存 EXIF 数据的任何 OEM 定义的 EXIF 子属性。 若要将 EXIF 数据从驱动程序传递到 HW JPEG 编码器,驱动程序和 MFT0 必须执行以下作:
驱动程序在管道提供的元数据缓冲区中提供自定义 EXIF 元数据。 当样本返回给 DevProxy 时,由 DevProxy 将其作为 IMFAttribute 附加到 MFSampleExtension_CaptureMetadata 和 MF_CAPTURE_METADATA_FRAME_RAWSTREAM。
当 MFT0 收到 IMFSample 时,它会从 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 获取原始元数据缓冲区,并分析自定义 EXIF 元数据项并将其转换为 OEM 定义的 IMFAttribute,并将其附加到 MFSampleExtension_CaptureMetadata 属性包。
若要将 EXIF 数据从 MFT0 传递到 HW JPEG 编码器,管道照片接收器执行以下作:
从 IMFSample MFSampleExtension_CaptureMetadata调用 GetUnknown,以便在收到 IMFSample 时获取属性包的 IMFAttributes 接口。
调用 IPropertyBag2::Write 将 SampleMetadata 标识的编码器选项属性设置为 HW JPEG 编码器。 编码器选项属性包含从上一步获取的 IMFAttributes 接口。 此接口包含所有自定义子属性,包括 OEM EXIF 子属性,以及本主题前面讨论的 元数据 部分中的标准化子属性。
若要检索 EXIF 数据以供进一步处理,HW JPEG 编码器执行以下作:
调用 IPropertyBag2::Read 以检索 SampleMetadata 属性名称和 VT_UNKNOWN 类型标识的属性的属性值。 返回时, VARIANT.punkVal 接收 MFSampleExtension_CaptureMetadata的 IMFAttributes 接口。
在上一步中获得的接口上调用 OEM EXIF 子属性的 GetBlob 或 GetUnknown,以根据 OEM EXIF 子属性的 GUID 和数据类型获取 EXIF 数据 blob。
缩略图
MFT0 不需要为相机驱动程序生成任何缩略图。 相机应用应生成自己的缩略图。 缩略图可以从照片确认图像、HW JPEG 编码器或调整全尺寸图像的大小生成。 这由应用开发人员决定。 若要维护 API 和应用与 Windows 8.1 应用的兼容性,相机驱动程序不得实现 KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL 控件。
整数 ISO
KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED属性 ID 是与整数 ISO DDI 关联的唯一控件。
高级聚焦
KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE属性 ID 是与整数 ISO DDI 关联的唯一控件。
Flash
KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE属性 ID 是与闪存 DDI 关联的唯一控件。
缩放
KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM属性 ID 是与缩放 DDI 关联的唯一控件。
场景模式
KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE属性 ID 是与场景模式 DDI 关联的唯一控件。