隐私快门/开关通知
一些相机制造商可能希望包括物理快门或终止开关,这些开关可以使用无法由软件覆盖的物理控件来阻止相机。 由于存在意外激活和导致客户混淆的风险,不建议使用这些功能,但如果实施,它们必须遵循 相机隐私百叶窗和终止开关中所述的指导,包括报告快门/开关的状态。
当快门关闭或终止开关处于活动状态时,相机将继续对使用现有相机 API 的 Windows 和应用程序完全正常运行,但图像或视频流将为黑色或深色 (或替换为静态图像,例如具有指向物理控件) 位置的箭头的设备图片。 这引发了一些潜在问题,即访问相机的应用程序不知道相机被遮挡,并且无意中激活物理控件的最终用户可能会对相机未按预期工作的原因感到困惑。
为了解决这些问题,实现百叶窗或杀伤开关的相机必须实施一种机制来检测快门/开关的状态,并将其报告给操作系统。 本主题为将实现此报告机制的 OEM 和 ODM 提供指导,还介绍了相机驱动程序开发人员用于将快门/开关状态发布到 OS 的控件和结构。
除了隐私快门/开关通知功能外,OS 还实现了相机遮挡检测,其中,当盖子 开关关闭操作 设置为“不执行任何操作”时, (FFC) 的前置摄像头被设备盖遮挡,例如,当机盖关闭时,计算机不会进入睡眠状态或关闭电源。 例如,当笔记本电脑的机盖关闭时,连接笔记本电脑(使用外部监视器)。 可能有一些设备外形规格不需要此行为,因此,下面定义了一种选择退出设备盖遮挡检测的机制。
体系结构概述
当 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 使用的相同 Set GUID 和 ID 发出。
为了阐明上图中显示的内容,OS 希望 AVS 驱动程序实现机制(如果驱动程序开发人员选择支持此功能),以获取和侦听快门传感器生成的状态更改。 OS 通过 KSPROPERTY get 方法查询状态,并发出等待 的 KSEVENT ,让驱动程序在快门状态更改时发出信号。 例如,快门/开关状态更改不得阻止相机运行,导致错误情况。
注意: 如果 AVS 驱动程序支持此功能,但基础硬件不支持,则当 OS 发出 KSEVENT 注册时,AVS 驱动程序应返回“不支持”错误。
感知和报告方法
某些相机使用图像信号处理器 (ISP) 固件中运行的像素分析算法来感知快门状态。 这对这些相机施加了限制,即相机必须主动流式传输才能感知和报告快门状态。 有关相机何时 以及如何报告其快门 /开关状态的详细信息,请参阅快门状态感知和报告。
同样,利用相机遮挡信号的应用程序开发人员不得利用报告的快门状态,除非相机正在主动流式传输。 有关详细信息,请参阅 CameraOcclusionInfo 类 。
KSPROPERTY
使用情况摘要表 (KSPROPERTY)
Get | 设置 | Target | 属性描述符类型 | 属性值类型 |
---|---|---|---|---|
是 | 否 | 筛选器 | KSPROPERTY_CAMERACONTROL_S | LONG |
操作数据) (属性值为 LONG,指定是启用或禁用隐私模式:
值为 0 表示相机传感器可以捕获视频图像
值为 1 表示相机传感器无法捕获视频图像
必须按如下所示填充 KSPROPERTY_CAMERA_CONTROL_S 结构:
结构成员 | 值 |
---|---|
KSPROPERTY。设置 | 必须 PROPSETID_VIDCAP_CAMERACONTROL |
KSPROPERTY.Id | 必须 KSPROPERTY_CAMERACONTROL_PRIVACY |
KSPROPERTY。标志 | 必须是 KSPROPERTY_TYPE_GET |
值 | 初始化为 0 |
标志 | 忽略,设置为 0 |
功能 | 忽略,设置为 0 |
KSEVENT
KSEVENT) (使用情况摘要表
Get | 设置 | Target | 事件描述符类型 | 事件值类型 |
---|---|---|---|---|
否 | 是 | 筛选器 | KSEVENT | KSEVENTDATA |
KSEVENT 结构必须填充如下:
结构成员 | 值 |
---|---|
设置 | 必须 PROPSETID_VIDCAP_CAMERACONTROL |
Id | 必须 KSPROPERTY_CAMERACONTROL_PRIVACY |
标志 | 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 在驱动程序 INF 文件中提供设备属性密钥,或者在没有 INF 文件(例如,使用 UVC 内置相机驱动程序的 USB 相机)的情况下,使用 MS OS 描述符提供设备属性密钥。
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)
};