某些相机制造商可能希望包括物理快门或终止开关,这些开关可以使用无法由软件覆盖的物理控制来阻止相机。 由于无意激活和导致客户混淆的风险,不建议使用这些功能,但如果实施,它们必须遵循 相机隐私快门和终止开关中所述的指导,包括报告快门/开关的状态。
关闭快门或终止开关处于活动状态时,相机将继续对使用现有相机 API 的 Windows 和应用程序完全正常运行,但图像或视频流将为黑色或深色(或替换为静态图像,例如设备图片,箭头指向物理控件的位置)。 这引发了可能的问题:正在访问相机的应用程序不知道相机被遮挡,无意中激活物理控件的最终用户可能会对为什么相机无法按预期工作感到困惑。
若要解决这些问题,实现百叶窗或终止开关的相机必须实现一种机制来检测快门/开关的状态并将其报告给作系统。 本主题提供有关将实施此报告机制的 OEM 和 ODM 的指导,并介绍了相机驱动程序开发人员用于将快门/开关状态发布到 OS 的控件和结构。
除了隐私快门/开关通知功能外,OS 还实现了相机遮挡检测,例如,当设备盖子将前置摄像头遮挡,并且 盖子开关关闭操作 设置为“不执行任何操作”时,电脑不会进入睡眠或关闭电源。 作为一个例子,当笔记本电脑的盖子关闭时,笔记本电脑可以停靠并使用外部显示器。 某些设备外形规格可能不需要此行为,因此,下面定义了一种选择退出设备盖遮挡检测的机制。
体系结构概述
当 OS 从相机驱动程序查询当前状态时,将使用 KSPROPERTY_CAMERACONTROL_PRIVACY 控件。 它应仅用作 Get 属性。 驱动程序开发人员不得在其驱动程序中支持 KSPROPERTY_CAMERACONTROL_PRIVACY 控件 Set 属性。
注释
实施隐私快门或终止开关的相机必须符合 相机隐私快门和终止开关中所述的要求。
在 USB 视频类(UVC)驱动程序中,KSPROPERTY_CAMERACONTROL_PRIVACY控件映射到 UVC v1.5 类规范中定义的CT_PRIVACY_CONTROL属性。
除了使用现有的 KSPROPERTY 控件 ,KSPROPERTY_CAMERACONTROL_PRIVACY引入了新的 KSEVENT 调用流,因此,如果存在注册该 KSEVENT 的客户端注册,相机驱动程序可以在相机的隐私快门/开关状态发生更改时发出信号。
KSEVENT 是使用与 KSPROPERTY 使用的同一组 GUID 和 ID 颁发的。
为了阐明上图中所示的内容,OS 希望 AVS 驱动程序实现机制(如果驱动程序开发人员选择支持此功能),获取和侦听快门传感器正在生成的状态更改。 OS 通过 KSPROPERTY get 方法查询状态,并发出一个等待的 KSEVENT,指示驱动程序在快门状态更改时发出信号。 快门/开关状态更改不得阻止相机正常运行,例如,导致错误情况。
注意: 如果 AVS 驱动程序支持此功能,但基础硬件不支持,则当 OS 发出 KSEVENT 注册时,AVS 驱动程序将返回不支持的错误。
传感器和报告方法
某些相机使用图像信号处理器 (ISP) 固件中运行的像素分析算法感知快门状态。 这对这些相机施加了限制,即相机必须主动流式传输,才能感知和报告快门状态。 有关相机何时以及如何报告快门/切换状态的更多详细信息,请参阅 快门状态感知和报告 。
同样,使用相机遮挡信号的应用程序开发人员不得利用报告的快门状态,除非相机处于活动的流媒体传输中。 如需了解更多详情,请参阅 CameraOcclusionInfo 类。
KSPROPERTY
使用情况摘要表 (KSPROPERTY)
| 获取 | Set | 目标 | 属性描述符类型 | 属性值类型 |
|---|---|---|---|---|
| 是的 | 否 | 过滤器 | KSPROPERTY_CAMERACONTROL_S | LONG |
属性值(操作数据)是一个 LONG 类型的值,指定隐私模式是启用还是禁用。
值为 0 表示相机传感器可以捕获视频图像
值为 1 表示阻止相机传感器捕获视频图像
必须按如下所示填充 KSPROPERTY_CAMERA_CONTROL_S 结构:
| 结构成员 | 价值 |
|---|---|
| KSPROPERTY.Set | 必须是 PROPSETID_VIDCAP_CAMERACONTROL |
| KSPROPERTY.Id | 必须是 KSPROPERTY_CAMERACONTROL_PRIVACY |
| KSPROPERTY。标志 | 必须是 KSPROPERTY_TYPE_GET |
| 价值 | 初始化为 0 |
| Flags | 忽略,设置为 0 |
| 功能 | 忽略,设置为 0 |
KSEVENT
使用情况摘要表 (KSEVENT)
| 获取 | Set | 目标 | 事件描述符类型 | 事件值类型 |
|---|---|---|---|---|
| 否 | 是的 | 过滤器 | KSEVENT | KSEVENTDATA |
必须按如下所示填充 KSEVENT 结构:
| 结构成员 | 价值 |
|---|---|
| Set | 必须是 PROPSETID_VIDCAP_CAMERACONTROL |
| Id | 必须是 KSPROPERTY_CAMERACONTROL_PRIVACY |
| Flags | KSEVENT_TYPE_ENABLE |
必须按如下所示填充 KSEVENTDATA 结构:
| 结构成员 | 价值 |
|---|---|
| NotificationType | 必须是 KSEVENTF_EVENT_HANDLE |
选择退出设备盖遮挡检测
若要选择退出设备盖遮挡检测,OEM 可以定义以下设备属性密钥:
DEVPROPKEY
DEVPROPGUID = {3AB8560B-EFCF-43C1-A7EC-130E46857AF4}
DEVPROPID = 2
DEVPROPTYPE = DEVPROP_TYPE_UINT32
PropertyBuffer = (ULONG) 1
PropertyBufferSize = sizeof(ULONG)
注释
将 PropertyBuffer 值设置为 0 与根本不定义设备属性密钥相同。
可以使用 AddProperty 或 MS OS 描述符在驱动程序 INF 文件中提供设备属性密钥(例如,如果没有 INF 文件,例如使用 UVC 收件箱相机驱动程序的 USB 相机)。
INF AddProperty 示例
[OptOutLidOcclusionSampleAddPropertySection]
{3AB8560B-EFCF-43C1-A7EC-130E46857AF4},2,7,,1
MS OS 描述符示例
UCHAR Example2_MSOS20DescriptorSet_UVCDevicePropertyKeyForLidOcclusionOptOut[0x76] =
{
//
// Microsoft OS 2.0 Descriptor Set Header
//
0x0A, 0x00, // wLength of MSOS20_SET_HEADER_DESCRIPTOR (10 bytes)
0x00, 0x00, // wDescriptorType MSOS20_SET_HEADER_DESCRIPTOR
0x00, 0x00, 0x00, 0x0A, // dwWindowsVersion – 0x10000000 for Windows 10
0x76, 0x00, // wTotalLength – 0x76(118) bytes
//
// Microsoft OS 2.0 Registry Value Feature Descriptor
//
0x6C, 0x00, // wLength - 0x6C(108) bytes
0x04, 0x00, // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
0x04, 0x00, // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
0x5E, 0x00, // wPropertyNameLength – 0x5E(94) bytes
'D', 0x00, 'K', 0x00, // Property Name – DKEY-{3AB8560B-EFCF-43C1-A7EC-130E46857AF4},2
'E', 0x00, 'Y', 0x00,
'-', 0x00, '{', 0x00,
'3', 0x00, 'A', 0x00,
'B', 0x00, '8', 0x00,
'5', 0x00, '6', 0x00,
'0', 0x00, 'B', 0x00,
'-', 0x00, 'E', 0x00,
'F', 0x00, 'C', 0x00,
'F', 0x00, '-', 0x00,
'4', 0x00, '3', 0x00,
'C', 0x00, '1', 0x00,
'-', 0x00, 'A', 0x00,
'7', 0x00, 'E', 0x00,
'C', 0x00, '-', 0x00,
'1', 0x00, '3', 0x00,
'0', 0x00, 'E', 0x00,
'4', 0x00, '6', 0x00,
'8', 0x00, '5', 0x00,
'7', 0x00, 'A', 0x00,
'F', 0x00, '4', 0x00,
'}', 0x00, ',', 0x00,
'2', 0x00, 0x00, 0x00,
0x00, 0x00,
0x04, 0x00, // wPropertyDataLength – 4 bytes
0x01, 0x00, 0x00, 0x00 // PropertyData – 0x00000001 (1)
};