扩展相机控件

扩展控件使用 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 字节。

照片确认元数据由 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 执行以下作:

  1. 从 IMFSample 接口MFSampleExtension_CaptureMetadata调用 GetUnknown,以获取属性包的 IMFAttributes 接口。

  2. 从上一步获取的 IMFAttributes 接口MF_CAPTURE_METADATA_FRAME_RAWSTREAM上调用 GetUnknown 以获取 IMFMediaBuffer 接口。

  3. 调用 Lock 以获取与 IMFMediaBuffer 关联的原始元数据缓冲区。

若要将所需的 IMFAttributes 添加到 MFSampleExtension_CaptureMetadata 属性包中,MFT0 执行以下操作:

  1. MFSampleExtension_CaptureMetadata 中从 IMFSample 接口调用 GetUnknown,以便获得属性包的 IMFAttributes 接口。

  2. 根据上表中指定的 GUID 和数据类型,在从上一步获取的 IMFAttributes 接口中对MF_CAPTURE_METADATA_XXX调用SetUINT32SetBlobSetUnknown

必需元数据属性

可在捕获统计信息元数据属性中找到可用的元数据属性的完整列表

焦点优先级

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 必须执行以下作:

  1. 驱动程序在管道提供的元数据缓冲区中提供自定义 EXIF 元数据。 当样本返回给 DevProxy 时,由 DevProxy 将其作为 IMFAttribute 附加到 MFSampleExtension_CaptureMetadataMF_CAPTURE_METADATA_FRAME_RAWSTREAM

  2. 当 MFT0 收到 IMFSample 时,它会从 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 获取原始元数据缓冲区,并分析自定义 EXIF 元数据项并将其转换为 OEM 定义的 IMFAttribute,并将其附加到 MFSampleExtension_CaptureMetadata 属性包。

若要将 EXIF 数据从 MFT0 传递到 HW JPEG 编码器,管道照片接收器执行以下作:

  1. 从 IMFSample MFSampleExtension_CaptureMetadata调用 GetUnknown,以便在收到 IMFSample 时获取属性包的 IMFAttributes 接口。

  2. 调用 IPropertyBag2::Write 将 SampleMetadata 标识的编码器选项属性设置为 HW JPEG 编码器。 编码器选项属性包含从上一步获取的 IMFAttributes 接口。 此接口包含所有自定义子属性,包括 OEM EXIF 子属性,以及本主题前面讨论的 元数据 部分中的标准化子属性。

若要检索 EXIF 数据以供进一步处理,HW JPEG 编码器执行以下作:

  1. 调用 IPropertyBag2::Read 以检索 SampleMetadata 属性名称和 VT_UNKNOWN 类型标识的属性的属性值。 返回时, VARIANT.punkVal 接收 MFSampleExtension_CaptureMetadata的 IMFAttributes 接口。

  2. 在上一步中获得的接口上调用 OEM EXIF 子属性的 GetBlobGetUnknown,以根据 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 关联的唯一控件。