隐私快门替换图像
本文介绍如何为支持快门状态报告的相机启用图像替换。 同时还介绍如何提供自定义替换图像。
在此功能实现之前具有隐私快门/开关的相机驱动程序提供来自相机传感器的示例,或者必须实现专有功能来检测快门状态并替换示例本身。 此功能允许相机驱动程序依赖于 OS,使用 OS 提供的解决方案或相机驱动程序提供的自定义图像替换示例中的图像。
从 Windows 11 版本 21H2 开始,Windows 硬件兼容性计划 (WHCP) 要求具有隐私快门或终止开关的相机报告相机快门状态。 这一要求允许操作系统和应用程序了解快门的当前状态,并用于就如何更改快门的状态提供有用的用户指导。 OEM 合作伙伴使用此机制在其驱动程序中构建功能,以将来自相机的图像替换为向用户提供信息的图像。 此功能允许 OEM 使用相同的功能,而无需在 DeviceMFT 中编写专有代码。
要求
此功能仅由具有隐私快门/终止开关的相机实现。 隐私快门/开关通知文章中介绍了隐私快门的实施详细信息。
想要支持用于图像替换的自定义图像的设备还必须提供一个带签名的二进制文件,这是其驱动程序包的一部分,其中包含其替换图像。
实现概述
当设备发送设备快门已关闭的通知时,就会发生图像替换。 如果快门状态关闭并且启用了图像替换,则相机管道从相机驱动程序提供的自定义图像或使用此处显示的收件箱替换图像加载替换图像。
加载后,管道将图像转换为输出缓冲区,该缓冲区与当前选定的相机驱动程序媒体类型的分辨率和媒体类型相同。 如果分辨率不同,则会纵向扩展或缩减图像,但不会超出现有的纵横比。
从那时起,直到快门状态更改为打开,相机驱动程序传递的所有示例都将其元数据和示例属性复制到新示例中,并丢弃其媒体缓冲区。 从转换后的快门图像中复制并使用新的媒体缓冲区。 然后,此新示例将通过管道发送,就好像它是原始示例一样。
实施指南
若要启用图像替换,必须将以下注册表项添加到相机的设备接口节点,并将值设置为 1。
Regkey 类型 | Regkey 名称 | Regkey 值 |
---|---|---|
REG_DWORD | EnableImageReplacement | 0x1 |
对于驱动程序 INF,可以添加如下所示的内容。
...
[Device.AddReg]
HKR,,EnableImageReplacement,%REG_DWORD%,1
...
[Strings]
REG_DWORD=0x00010001
对于 MS-OS 描述符,可以添加如下名称:
UVC-EnableImageReplacement
自定义映像
对于自定义图像替换,驱动程序必须提供以下内容:
一个或多个格式为 BMP 类型的 ARGB32 的图像文件,大小为 1000 x 1000 像素。 在本示例中,为“TestImage.bmp”。
资源 DLL,其中包含图像文件作为资源。 在本示例中,为“SampleSocMFT.dll”。
驱动程序提供的图像文件必须是 1000 x 1000 像素的 ARGB32 图像。 这将替换实现概述中显示的图像。 对示例的所有其他更改都按说明进行,只有要替换的图像是驱动程序的自定义更改。 资源 DLL 必须是驱动程序包的一部分,并且必须签名。 对于大多数设备,这意味着将其放置在驱动程序 DeviceMFT 中。
若要将图像文件添加到资源 DLL,请修改项目的资源文件 *.rc,示例如下。
#ifdef ID_REPLACEMENT_IMAGE
#define ID_REPLACEMENT_IMAGE 200
#endif
ID_REPLACEMENT_IMAGE RCDATA "TestImage.bmp"
下一步是修改驱动程序 INF。 如果使用的资源 DLL 是新的,则它必须是 CopyFiles 指令的一部分。 最后,必须添加另外三个 AddReg 指令。
[SourceDisksFiles]
AvsCameraSim.sys=1
SampleSocMFT.dll=1
[DestinationDir]
AvsCameraSim.CopySys=13
AvsCameraSim.CopyDMFT=13
[AvsCameraSim.CopySys]
AvsCameraSim.sys
[AvsCameraSim.CopyDMFT]
SampleSocMFT.dll
[AvsCameraSim]
Include=ks.inf, kscaptur.inf
Needs=KS.registration, KSCaptur.Registration.NT
CopyFiles=AvsCameraSim.CopySys, AvsCameraSim.CopyDMFT
AddReg=AvsCameraSim.AddReg
[AvsCameraSim.AddReg]
HKR,,CameraImageResource,,%13%\%DMFT.NAME%
HKR,,CameraImageResourceID,%REG_DWORD%,%ResourceID%
HKR,,EnableImageReplacement,%REG_DWORD%,1
[Strings]
DMFT.Name="SampleSocMFT.dll"
REG_DWORD=0x00010001
;localizable
ResourceID=200
...
资源的 INF ResourceID 和 ID_REPLACEMENT_IMAGE 标识符必须匹配。 可以调整这些值,使得单个资源 DLL 可以包含多个资源 ID 和多个图像,并且可以本地化 INF 以选择正确的资源 ID。
自定义图像边框
对于出现字母框时不需要黑色边界的自定义图像,可以通过自定义替换示例边框的注册表指定 MFARGB 结构。
Regkey 类型 | Regkey 名称 | Regkey 值 |
---|---|---|
REG_BINARY | CameraImageBackgroundColor | 0x1 |
对于驱动程序 INF,可以添加如下所示的内容:
...
[Device.AddReg]
HKR,,CameraImageBackgroundColor,%REG_ BINARY%,00,00,00,FF
[Strings]
REG_BINARY=0x00000001