本文介绍如何为支持快门状态报告的相机启用图像替换。 它还介绍如何提供自定义替换映像。
在此功能实现之前,具有隐私遮挡快门/开关的相机驱动程序会提供来自相机传感器的数据样本,或必须实现专有功能以检测快门状态,并对样本数据进行替换。 此功能允许相机驱动程序依赖于 OS 来将示例中的图像替换为 OS 提供的解决方案或相机驱动程序提供的自定义图像。
从 Windows 11 版本 21H2 开始,Windows 硬件兼容性计划(WHCP)要求具有隐私快门或终止开关的相机来报告相机快门状态。 此要求允许作系统和应用程序知道快门的当前状态,并用于提供有关如何更改快门状态的有用用户指南。 OEM 合作伙伴使用此机制在其驱动程序中构建功能,以将来自相机的图像替换为向用户提供信息的内容。 此功能允许 OEM 利用此功能,而无需在 DeviceMFT 中编写专有代码。
要求
此功能仅由具有隐私快门/终止开关的相机实现。 隐私百叶窗/开关通知的文章中描述了隐私百叶窗的实施细节。
希望支持用于映像替换的自定义映像的设备还必须提供包含其替换映像、作为其驱动程序包一部分的已签名二进制文件。
由于图像替换会覆盖现有的输出缓冲区,因此设备输出未压缩的帧。 对于 MJPEG 和 JPEG 等压缩帧,不会发生图像替换,而是传递驱动程序的原始图像。
实现概述
当设备发送关闭设备的快门通知时,会发生图像替换。 如果关闭了快门状态并启用了图像替换,则相机管道将从相机驱动程序提供的自定义图像或使用此处显示的收件箱替换图像加载替换图像。
加载后,管道会将图像转换为输出缓冲区,该缓冲区与相机驱动程序当前所选媒体类型的分辨率和介质类型匹配。 如果分辨率不同,则图像会被放大或缩小,但不会超出其现有纵横比进行拉伸。
从那一点开始,直到快门状态更改为打开,相机驱动程序提供的所有样本都有其元数据和示例属性复制到新的样本中,并丢弃了媒体缓冲区。 新的媒体缓冲区是从处理过的快门图像复制而来,并替代原有缓冲区使用。 然后,此新示例将通过管道发送,就好像它是原始示例一样。
实施指南
若要启用图像替换,必须将以下注册表项添加到相机的设备接口节点,并将值设置为 1。
| Regkey 类型 | Regkey 名称 | 注册表键值 |
|---|---|---|
| REG_DWORD | 启用图像替换 | 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 名称 | 注册表键值 |
|---|---|---|
| REG_BINARY | 相机图像背景色 | 0x1 |
对于驱动程序 INF,可以添加它,如下所示:
...
[Device.AddReg]
HKR,,CameraImageBackgroundColor,%REG_ BINARY%,00,00,00,FF
[Strings]
REG_BINARY=0x00000001