1 概述
1.1 摘要
Microsoft 对 USB 视频类规范 的扩展支持新的控制功能,并使得能够以标准格式携带定义完善的帧元数据。
1.2 体系结构决策
USB 视频类(UVC)帧元数据支持适用于 ISOCH 和 BULK 端点。 但是,对于 BULK 终结点,元数据大小限制为 240 字节(因为所有视频帧数据都在 BULK 终结点上的单个视频帧数据包中传输)。
UVC 元数据支持仅适用于基于帧的有效负载。
UVC 元数据支持只能通过媒体基础架构(Media Foundation,MF)捕获管道获得。
UVC 元数据为选择性加入。 需要元数据支持的每个 IHV/OEM 都必须通过自定义 INF 文件启用。
UVC 元数据仅支持系统分配的内存。 不支持 VRAM 或 DX 图面。
2 体系结构概述
2.1 说明
2.2.1 通过 INF 发现功能
2.2.1.1 静态图像捕获 - 方法 2
某些现有 UVC 设备可能不支持在 USB 视频类规范 网站下载的 UVC 1.5 类 specification.pdf 的第 2.4.2.4 节(静态图像捕获)中描述的方法 2。
在 Windows 10 版本 1607 及更早版本中,捕获管道不使用方法 2,即使设备根据 UVC 1.5 规范宣称支持它。
在 Windows 10 版本 1703 中,使用此方法的设备必须使用相机驱动程序的自定义 INF 文件,但给定硬件需要自定义 INF 才能启用方法 2 静止图像捕获。
注意:相机驱动程序可以基于 Windows USBVIDEO.SYS,也可以基于自定义驱动程序二进制文件。
基于自定义 UVC 驱动程序或收件箱 UVC 驱动程序的自定义 INF 文件应包含以下 AddReg 条目:
EnableDependentStillPinCapture:REG_DWORD:0x0(禁用)到 0x1(启用)
如果此项设置为“已启用”(0x1),则捕获管道将使用方法2进行静止图像捕获,只要固件也提供对 UVC 1.5 规范中指定的方法2的支持。
自定义 INF 部分的示例如下所示:
[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface
[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg
[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnableDependentStillPinCapture,0x00010001,0x00000001
2.2.2 扩展单元控件
Microsoft 对 USB 视频类规范 进行扩展以启用新控件,这种扩展通过由 GUID MS_CAMERA_CONTROL_XU(称为 Microsoft-XU)标识的扩展单元完成。
// {0F3F95DC-2632-4C4E-92C9-A04782F43BC8}
DEFINE_GUID(MS_CAMERA_CONTROL_XU,
0xf3f95dc, 0x2632, 0x4c4e, 0x92, 0xc9, 0xa0, 0x47, 0x82, 0xf4, 0x3b, 0xc8);
设备固件实现的 Microsoft-XU 包含以下小节中定义的新控件。 以下请求定义适用于所有这些控件,除非为该控件显式指定了覆盖定义。 有关 D3、D4、GET_INFO 等的定义,请参阅 UVC 1.5 类 specification.pdf 。
GET_INFO请求应报告没有自动更新和异步功能的控件(例如,D3 和 D4 位应设置为 0)。
GET_LEN请求应报告此控件的有效负载的最大长度(wLength)。
GET_RES请求应报告 qwValue/dwValue 的分辨率(步骤大小)。 所有其他字段应设置为 0。
GET_MIN请求应报告 qwValue/dwValue 的最小支持值。 所有其他字段应设置为 0。
GET_MAX请求应报告 qwValue/dwValue 支持的最大值。 此外,所有受支持的标志应设置为 bmControlFlags 中的 1。 所有其他字段应设置为 0。
GET_DEF和GET_CUR请求应分别报告 qwValue/dwValue 和 bmControlFlags 字段的默认设置和当前设置。 所有其他字段应设置为 0。
设置所有字段后,主机会发出SET_CUR请求。
下表将 Microsoft-XU 的控件选择器映射到其各自的值以及扩展单元描述符中 bmControls 字段的位位置:
| 控件选择器 | 价值 | 位位置 (bmControls 字段) |
|---|---|---|
| MSXU_CONTROL_UNDEFINED | 0x00 | 暂无 |
| MSXU控制焦点 | 0x01 | D0 |
| 曝光控制(MSXU_CONTROL_EXPOSURE) | 0x02 | D1 |
| MSXU_CONTROL_EVCOMPENSATION (曝光补偿控制) | 0x03 | D2 |
| MSXU_CONTROL_WHITEBALANCE(白平衡控制) | 0x04 | D3 |
| 保留以供将来使用 | 0x05 | D4 |
| 面部认证控制 (MSXU_CONTROL_FACE_AUTHENTICATION) | 0x06 | D5 |
| MSXU_CONTROL_CAMERA_EXTRINSICS | 0x07 | D6 |
| MSXU_CONTROL_CAMERA_INTRINSICS | 0x08 | D7 |
| MSXU控制元数据 | 0x09 | D8 |
| MSXU_CONTROL_红外手电筒 | 0x0A | D9 |
| MSXU_CONTROL_数字窗口 | 0X0B | D10 |
| MSXU_CONTROL_DIGITALWINDOW_CONFIG | 0X0C | D11 |
| MSXU_CONTROL_VIDEO_HDR | 0X0D | D12 |
| MSXU_CONTROL_FRAMERATE_THROTTLE | 0x0E | D13 |
| MSXU_CONTROL_FIELDOFVIEW2_CONFIG | 0x0F | D14 |
| MSXU_CONTROL_FIELDOFVIEW2 | 0x10 | D15 |
2.2.2.1 可取消控件
可以使用自动更新功能在此处定义可取消控件。
GET_INFO请求应报告自动更新控件(例如,应将 D3 位设置为 1)等控件,但不作为异步控件(例如,D4 位应设置为 0)。
对于此类控制,可以发出SET_CUR请求来设置新值(SET_CUR(NORMAL) 请求,其中 bmOperationFlags:D0 位设置为 0),或取消以前的 SET_CUR(NORMAL) 请求(SET_CUR(CANCEL) 请求,其中 bmOperationFlags:D0 位设置为 1)。 收到请求后,设备应立即完成SET_CUR请求,即便硬件未配置好或未调整到请求的新设置。 对于每个SET_CUR(NORMAL)请求,当应用新设置或接收到SET_CUR(CANCEL)请求时,设备会生成相应的控制更改中断信号;在该中断到来之前,SET_CUR(NORMAL)请求被认为正在处理中。 当SET_CUR(NORMAL)请求正在进行时,此特定控件的其他SET_CUR(NORMAL)请求将导致失败。 SET_CUR(CANCEL)请求应始终成功。 如果没有需要取消的内容,则设备不会执行任何操作。
如果应用了SET_CUR(NORMAL)指定的设置(例如,发生收敛),则控制更改中断的有效负载中的位bmOperationFlags:D0应被设置为0。而如果由于在SET_CUR(NORMAL)请求之后的SET_CUR(CANCEL)请求导致这些设置未被应用(例如,收敛尚未发生),则应将位设置为1。
2.2.2.2 焦点控件
此控件允许主机软件指定相机的焦点设置。 这是一个全局控件,它影响与视频控制接口关联的所有视频流式处理接口上的所有终结点。
此控件应充当可取消控件(有关GET_INFO请求要求和SET_CUR请求的功能行为,请参阅第 2.2.2.1 节)。
GET_MAX要求:此控件应在bmControlFlags中声明支持位D0、D1、D2、D8和D18。
GET_DEF要求: bmControlFlags 的默认值应为 D0,D18 设置为 1,dwValue 设置为 0。
对于GET_CUR/SET_CUR请求,以下限制适用于字段 bmControlFlags:
在 D0、D1 和 D8 位中,只能设置一位:如果设置了 D2 位,则其中的任何设置都无效。
在 D16、D17、D18、D19 和 D20 中,只能设置一位,其中任何一个都无效。
D1 与当前定义的所有其他位不兼容(D0、D2、D8、D16、D17、D18、D19 和 D20)。
D2 与 D1 和 D8 不兼容。
如果未设置 D0,D2 与 D16、D17、D18、D19 和 D20 不兼容。
2.2.2.3 曝光控制
此控件允许主机软件指定相机的曝光设置。 这是一个全局控件,它影响与视频控制接口关联的所有视频流式处理接口上的所有终结点。
GET_INFO请求应将此控件报告为异步控件(例如,D4 位应设置为 1),但不能作为自动更新控件(例如,D3 位应设置为 0)。
GET_MAX要求:此控件应在 bmControlFlags 中声明对位 D0、D1 和 D2 的支持。
GET_DEF要求:bmControlFlags 的默认值应为将 D0 设置为 1,qwValue 设置为 0。
对于GET_CUR/SET_CUR请求,以下限制适用于字段 bmControlFlags:
- 在 D0、D1 和 D2 位中,应至少设置一位。
- D1 与 D0 和 D2 不兼容。
2.2.2.4 EV 补偿控制
此控件允许主机软件指定相机的 EV 补偿设置。 这是一个全局控件,它影响与视频控制接口关联的所有视频流式处理接口上的所有终结点。
GET_INFO请求应将此控件报告为异步控件(例如,D4 位应设置为 1),但不能作为自动更新控件(例如,D3 位应设置为 0)。
GET_RES请求应通过设置bmControlFlags中的相应位来报告所有受支持的分辨率(即步距大小)。 所有其他字段应设置为 0。
GET_MIN和GET_MAX请求应报告 dwValue 支持的最小值和最大值。 位 D4(指示步骤大小为 1)应为 bmControlFlags 中设置的唯一位。 所有其他字段应设置为 0。
GET_DEF,GET_CUR,SET_CUR请求应遵循第 2.2.2.1 节中的定义,但对于字段bmControlFlags,在D0、D1、D2、D3和D4位中,应且仅应设置一个位。 此外,GET_DEF请求应将 dwValue 设置为 0。
2.2.2.5 白平衡控制
此控件允许主机软件指定相机的白平衡设置。 这是一个全局控件,它影响与视频控制接口关联的所有视频流式处理接口上的所有终结点。
GET_INFO请求应将此控件报告为异步控件(例如,D4 位应设置为 1),但不能作为自动更新控件(例如,D3 位应设置为 0)。
GET_RES,GET_MIN,GET_MAX请求应遵循第 2.2.2.1 节中的定义,但 dwValueFormat 设置为 1。
GET_MAX要求:此控件应在 bmControlFlags 中声明对位 D0、D1 和 D2 的支持。
GET_DEF要求:bmControlFlags 的默认值应设置为 D0,dwValueFormat 和 dwValue 设置为 0。
对于GET_CUR/SET_CUR请求,以下限制适用于字段 bmControlFlags:
- 在 D0、D1 和 D2 位中,至少应设置一个。
- D1 与 D0 和 D2 不兼容。
2.2.2.6 人脸身份验证控制
此控件允许主机软件指定相机是否支持用于人脸身份验证的流式处理模式。 对此控件的支持意味着相机能够进行人脸身份验证。 否则,不应支持此控件。
此控件仅适用于能够生成 Infra-Red(IR)数据的相机,并且仅适用于指定的流式处理接口(这是与视频控制接口关联的所有视频流式处理接口的子集)。
GET_RES和GET_MIN请求应报告字段 bNumEntries 设置为 0,因此没有其他字段。
对于GET_MAX请求,bmControlFlags 字段中位如设为 1,则表示该流式处理接口支持相应的模式。 GET_MAX请求的输出应仅列出那些支持 D1 或 D2 的流式接口(例如,如果一个流式接口只要支持 D1 或 D2,就会被列出,否则则不被列出)。 此外,任何流式处理接口不应被宣传为具备同时支持 D1 和 D2 的能力。 如果流式处理接口还用于常规用途(例如,在人脸身份验证之外),则 D0 应设置为该流式处理接口的 1(除 D1/D2 外)。
对于GET_DEF/GET_CUR/SET_CUR请求,如果bmControlFlags字段中的某个位被设置为1,则表示为该流媒体接口选择了相应的模式。 在这些请求中,必须在 D0、D1 和 D2 中仅设置特定的流式处理接口的一位。 对于返回默认选择(特定于实现)的GET_DEF请求,如果流式处理接口还用于常规用途(例如,在人脸身份验证之外),则默认情况下,D0 应设置为 1:否则,默认情况下,D1 或 D2(但不能同时设置为 1)。 GET_DEF/GET_CUR请求输出应包含有关GET_MAX请求输出中列出的所有流式处理接口的信息,但是,SET_CUR请求只能包含GET_MAX请求输出中列出的流式处理接口的子集。
示例:
假设相机有四个视频流接口,编号分别为0x03、0x05、0x08和0x0b。其中,视频流接口0x05生成RGB数据,其余三个接口生成IR数据。 在生成 IR 数据的流式接口中,让我们假设流式接口0x03和0x0b都支持 D1,但流式接口0x03也支持 D0。 在此示例中,人脸身份验证控制仅适用于0x03和0x0b编号的流式处理接口,因此仅这些接口显示在请求中。
GET_MAX请求的输出应如下:
GET_DEF请求的输出应如下:
要将流式接口 0x03 上的设置更改为 D1,SET_CUR 请求如下所示:
上述SET_CUR请求之后GET_CUR请求的输出应如下所示:
2.2.2.7 相机外线控制
此控件允许主机软件获取与视频控制接口关联的视频流接口上的终结点的相机外向数据。 对于每个端点获取的数据,会作为属性 MFStreamExtension_CameraExtrinsics 显示在相应流的属性存储中(通过 IMFDeviceTransform::GetOutputStreamAttributes 调用获取)。
GET_RES、GET_MIN、GET_MAX、GET_CUR请求应报告字段 bNumEntries 设置为 0,因此没有其他字段。
GET_DEF请求应列出具有可用外向信息的所有终结点。
示例:
假设相机有三个视频流式处理接口,其中包含数字0x03、0x05和0x08分别在视频流式处理接口0x05除了支持所有视频流接口支持的视频捕获之外,还支持使用方法 2 进行图像捕获。 在这些流式处理接口中,让我们假设流式处理接口0x05,0x08具有外向信息,而流式处理接口0x03没有可用的外在信息。
在此示例中,GET_DEF请求的输出应为以下内容:
2.2.2.8 相机内参控制
此控件允许主机软件获取与视频控制接口关联的视频流接口上终结点的相机内部数据。 因此,为每个端点获取的数据会显示为相应流的属性存储器中的属性MFStreamExtension_PinholeCameraIntrinsics(通过调用IMFDeviceTransform::GetOutputStreamAttributes获取)。
GET_RES、GET_MIN、GET_MAX、GET_CUR请求应报告字段 bNumEntries 设置为 0,因此没有其他字段。
GET_DEF请求应列出所有具有可用内建函数信息的端点。
示例:
假设相机有三个视频流式处理接口,其中包含数字0x03、0x05和0x08分别在视频流式处理接口0x05除了支持所有视频流接口支持的视频捕获之外,还支持使用方法 2 进行图像捕获。 在这些流式处理接口中,让我们假设流接口0x05,0x08具有可用的内部函数信息,而流式处理接口0x03没有可用的内部函数信息。
在此示例中,GET_DEF请求的输出应为以下内容:
2.2.2.9 元数据控件
此控件允许主机软件查询和控制相机生成的元数据。 这是一个全局控件,它影响与视频控制接口关联的所有视频流式处理接口上的所有终结点。
此控件由相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA 。
如果固件支持SET_CUR请求,则适用以下内容:
GET_MIN,GET_DEF请求应将字段dwValue报告为0。
GET_RES请求应将字段 dwValue 报告为与GET_MAX请求报告的相同值。
当收到 dwValue 设置为 0 的SET_CUR请求时,相机不应生成任何元数据。 当收到SET_CUR请求时,若dwValue设置为与GET_MAX请求报告的值相同,相机可以生成元数据,并且这些元数据的大小对任何帧都不能超过dwValue。
如果固件不支持SET_CUR请求,则适用以下内容:
GET_MIN 和 GET_DEF 请求应将字段 dwValue 报告为与 GET_MAX 请求报告相同的值。
GET_RES请求应报告字段 dwValue 设置为 0。
相机可以生成元数据,并且此类元数据的总大小不能超过 dwValue(如 GET_MAX 请求所报告)乘以 1024 字节,再减去任何帧中 UsbVideoHeader 元数据有效负载的大小。
UsbVideoHeader 元数据有效负载是 sizeof(KSCAMERA_METADATA_ITEMHEADER) + sizeof(KSTREAM_UVC_METADATA) 或 24 个字节。
生成的元数据应符合第2.2.3节中所述的Microsoft标准格式元数据。
2.2.2.10 IR 火炬控制
此控件为 IR LED 硬件提供了一种灵活的方法,用于报告其可控制的程度,并提供控制它的能力。 这是一个全局控制,通过调整连接到相机的 IR 灯的电源来作用于所有与视频控制接口关联的视频流接口上的所有终结点。
此控件由相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_IRTORCHMODE 。
以下内容适用:
GET_LEN请求应报告值 8。
GET_INFO请求应报告值 3。 此值指示支持GET_CUR和SET_CUR的同步控件。
GET_MIN请求应报告字段 dwMode 设置为 0,dwValue 设置为指示最小功率的值。 电源级别为 0 可能表示 OFF,但最低作功率级别不需要为 0。
GET_RES请求应报告字段 dwMode 设置为 0,dwValue 设置为小于或等于 GET_MAX(dwValue) – GET_MIN(dwValue),这样GET_MAX(dwValue) – GET_MIN(dwValue)将均匀地被该值分割。 dwValue 可能不是零(0)。
GET_MAX请求应报告字段dwMode的设置,其中位D[0-2]被设置为标识此控件的功能。 dwMode 必须设置位 D0,指示支持 OFF,并且必须至少有一个其他位集,支持活动状态。 dwValue 必须设置为指示正常功率的值。
GET_DEF请求必须报告字段dwMode,并将其设置为默认模式,系统应在流式传输开始之前处于该模式。 dwMode 必须设置为 2(ON)或 4(交替)。 dwValue 应设置为通常用于 FaceAuth 控件的电源级别。 dwValue 由制造商定义。
GET_CUR请求应报告字段 dwMode 设置为当前作模式, dwValue 设置为当前照明。
收到SET_CUR请求时,IR Torch使用请求的操作模式将照明设置为按比例调节的强度。
IR Torch 必须在每个帧中发出 MF_CAPTURE_METADATA_FRAME_ILLUMINATION 属性。 它可以通过设备 MFT 提供此功能,也可以通过在相机的元数据有效负载中包含 MetadataId_FrameIllumination 属性来提供此功能。 请参阅 2.2.3.4.4 部分。
此元数据的唯一用途是指示帧是否被照亮。 这是 KSPROPERTY_CAMERACONTROL_EXTENDED_FACEAUTH_MODE DDI 和第 2.2.2.6 节中定义的 MSXU_FACE_AUTHENTICATION_CONTROL 所需的相同元数据。
2.2.2.11 数字窗口控件
数字视窗在相机流式传输期间指定相机的视野和缩放。 此控件可能是平移、倾斜和缩放的替代项。 此控件仅在相机主动流式传输时适用。
此控件可用于所有类型的相机,独立于正在流式传输的媒体类型。
此控件允许主机软件查询和控制与相机关联的数字窗口。
这是一个全局控件,它影响与视频控制接口关联的所有视频流式处理接口上的所有终结点。 它调整 ISP 使用的像素数据的源。 这包括方法 2 和方法 3 的静态捕捉引脚。
此控件由收件箱相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_DIGITALWINDOW 。
以下内容适用:
GET_LEN请求应报告值 16。
GET_INFO请求应报告值 3。 此值指示支持GET_CUR和SET_CUR的同步控件。
GET_MIN请求应将字段 dwMode 设置为 0、OriginX 和 OriginY 设置为 0.0,WindowSize 设置为 1.0。 此请求当前未使用。
GET_RES请求应将字段 dwMode 设置为 0、OriginX 和 OriginY 设置为 0.0,WindowSize 设置为 1.0。 此请求当前未使用。
GET_MAX请求应报告字段 dwMode,将位 D0 设置以识别此控件的功能。 值为 0 表示仅支持手动模式。 值为 1 表示支持自动人脸框架模式。 这些字段的其余部分未使用,但我们建议将 OriginX 和 OriginY 设置为 0.0,WindowSize 设置为 1.0。
GET_DEF请求应将字段 dwMode 设置为 0、OriginX 和 OriginY 设置为 0.0,WindowSize 设置为 1.0。 这始终是默认窗口。
GET_CUR请求应将字段 dwMode 设置为当前作模式, OriginX、 OriginY 和 WindowSize 描述当前数字窗口。
收到SET_CUR请求时,摄像头会调整其视野,以匹配所选的操作模式和数字窗口。
如果选择了自动人脸框架模式,相机将选择一个窗口,该窗口将完全包含场景中的主宰人脸,并且将忽略传入的 OriginX、 OriginY 和 WindowSize 。 如果未找到人脸,则使用默认窗口。
对数字窗口所做的任何更改都必须反映在每个示例的元数据有效负载中。
对数字窗口的更改可能不会立即生效,但控件应立即响应。 在帧的元数据有效负载生效后,必须立即报告对数字窗口的更改。
2.2.2.12 数字窗口配置控件
数字窗口配置上限控件用于指定在所有可用分辨率情况下相机的缩放限制。 分辨率独立于媒体类型,因此将两种媒体类型广告相同的显示分辨率合并为一种功能。
由于控制终结点的大小限制,此控件最多可以描述 1820 个唯一分辨率。
如果该控件也存在,则此控件必须始终可用于报告数字窗口控件的功能。
此控件由收件箱相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_DIGITALWINDOW_CONFIGCAPS 。
以下内容适用:
GET_LEN请求应报告负载的整个大小。 有效负载大小必须是 36 的倍数,因为每个分辨率定义长度为 36 字节。
GET_INFO请求应报告 1。 此值指示仅支持GET_CUR的同步控件。
GET_CUR请求应报告一系列功能。 上面定义了功能结构的字段。
未使用GET_MIN、GET_MAX、GET_RES和GET_DEF请求,但应返回与GET_CUR相同的值。
不支持SET_CUR请求。
2.2.2.13 视频 HDR 控件
此控件允许主机软件指定相机是否支持视频 HDR。 对此控件的支持意味着相机能够尽最大努力执行视频 HDR。 如果相机不支持视频 HDR,则它不得实现此控件。
此控件由相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR 。
以下内容适用:
GET_LEN请求应报告负载的整个大小(例如 4 个字节)。
GET_INFO请求应报告值 3。 此值指示支持GET_CUR SET_CUR的同步控件。
GET_CUR请求应将字段 dwMode 报告为当前操作模式。
GET_DEF应将 dwMode 设置为 OFF (0)。
GET_MAX请求应声明对可用操作模式的支持:[1(开/关)、3(开/关/自动)]。 此控件必须支持“开启”(1)。
GET_MIN和GET_RES请求应报告 0。
SET_CUR请求应将模式设置为 OFF (0)、ON (1)或 AUTO (2)。
2.2.2.14 帧速率限制控制
此控件允许主机软件指定相机是否支持帧速率限制功能。
此控件仅在相机主动流式传输时适用。 若要主动流式传输意味着预览或记录引脚必须处于KSSTATE_RUN中,并且能够传送帧。 如果流未处于活动状态,则在集中,此控件应返回STATUS_INVALID_DEVICE_STATE。
即使这是筛选器范围控件,帧速率控件也不应影响照片引脚或无 RGB 流(如 IR/深度)。 此外,当帧速率限制生效时,样本持续时间也应相应调整。
此控件由相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_FRAMERATE_THROTTLE 。
| 控件选择器 | MSXU_CONTROL_FRAMERATE_THROTTLE |
|---|---|
| 强制请求 | GET_INFO、GET_LEN、GET_RES、GET_MIN、GET_MAX、GET_DEF、GET_CUR、SET_CUR |
| 可选请求 | |
| wLength | 20 |
| Offset | 领域 | 尺寸 | 价值 | DESCRIPTION |
|---|---|---|---|---|
| 0 | dwMode | 4 | 旗帜 | D0:0(关)或 1(开) D1-D31:保留并设置为 0 |
| 4 | scaleFactorPercentage | 4 | 编号 | 此值应位于 Min 和 Max 的范围内,应设置为“步骤”值的倍数。 例如:如果 Min = 5、Max = 100 和 Step = 5,并且应用程序决定将帧速率降低到原始值的 80%,则应将此成员值设置为 80。 通过适当设置此值,应用可以确保新帧速率永远不会超过原始值,也不会达到零,但原始帧速率是可能的。 |
| 8 | min | 4 | 编号 | 最小值应至少等于一个步长,或者应是步长的倍数(例如:步长1、步长2 等)。 最小值不能设置为 0。 |
| 12 | 最大 | 4 | 编号 | 最大值必须设置为 100,这意味着帧速率没有变化。 |
| 16 | 步 | 4 | 编号 | 步骤应是 Max 的严格因素,例如 {Max % Step == 0}。 示例:1、2、4、5 等。 |
以下内容适用:
GET_LEN请求应报告负载的整个大小(例如 20 个字节)。
GET_INFO请求应报告值 3。 此值指示支持GET_CUR SET_CUR的同步控件。
GET_CUR请求应将字段 dwMode 设置为当前操作模式,并将 scaleFactorPercentage 设置为当前 scaleFactor 值。 最小值、最大值和步骤应按上表所述报告值。
GET_DEF应将 dwMode 设置为 OFF(0),scaleFactorPercentage=100,最小值设置为默认值,最大值设置为 100,步骤设置为默认步骤值。 最小值和步骤的值应由制造商定义,但应遵循上表中提到的准则。
GET_ MAX 请求应公布支持的可用操作模式,并报告状态值 1 [ ON | OFF ]。 此控件必须同时支持 ON 和 OFF。 最小、最大、步骤和 scaleFactorPercentage 可以设置为默认值。
GET_MIN和GET_RES请求应报告 0。
SET_CUR请求应将模式设置为 OFF(0)、ON(1)。 如果 dwMode 设置为 ON,则 scaleFactorPercentage 应生效。 对于 OFF 和 ON 情况,scaleFactorPercentage 必须如上表所述有效。
2.2.2.15 视图 2 配置控件的字段
视野2配置控件将支持的对角视野角度值指定为一个值数组。 所有支持的值必须在理论最小值和最大值之间,即1度到360度范围内。
如果设备想要支持连续的“视图字段”值,则需要报告所有支持的值。 例如,如果设备希望支持从 85 度到 60 度(步骤大小为 1)的对角字段,则此控件需要报告值数组 [85, 84, 83, 82, ..., 62, 61, 60]。
当视图 2 控件存在时,此控件必须可用于报告功能。
这是同步筛选器级别控制。
此控件由相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2_CONFIGCAPS 。
| 控件选择器 | MSXU_CONTROL_FIELDOFVIEW2_CONFIG |
|---|---|
| 强制请求 | GET_INFO、GET_LEN、GET_RES、GET_MIN、GET_MAX、GET_DEF、GET_CUR |
| 可选请求 | |
| wLength | 4 个字节 + 计数 乘 4 个字节,其中 计数 是唯一的视野值的数量。 |
| Offset | 领域 | 尺寸 | 价值 | DESCRIPTION |
|---|---|---|---|---|
| 0 | dwDefaultFieldOfView | 4 | 编号 | 默认对角字段必须是 FieldOfViewValues 数组中报告的值之一。 |
| 4 | FieldOfViewValues[0] | 4 | 编号 | 第一个视图字段值,此值必须是最宽的 FoV(视图字段)值。 |
| … | … | … | … | … |
| 4 + 4*(Count-1) | FieldOfViewValues [Count -1] | 4 | 编号 | 最后一个视图字段值,此值必须是最窄的 FoV 值。 |
以下内容适用:
GET_LEN请求应报告负载的整个大小。
GET_INFO请求应报告数字1。 此值指示仅支持GET_CUR的同步控件。
GET_CUR请求应按降序报告包含默认 FoV 和受支持 FoV 值的数组的数据。 上面定义了结构的域。
GET_DEF请求应报告的内容与GET_CUR相同。
GET_MIN、GET_MAX和GET_RES请求未使用,但应返回与GET_CUR相同的值。
不支持SET_CUR请求。
视图字段值必须按降序排列,例如,最宽的视图字段是第一个,最窄的字段是最后一个。
2.2.2.16 视场 2 控制
此控件指定相机在流式传输时使用的基视图字段。 可以在流式处理之前或流式处理期间应用此控件。
此控件可用于所有类型的相机,独立于正在流式传输的媒体类型。
此控件允许主机软件查询和控制与相机关联的视场。
这是一个全局控件,它影响与视频控制接口关联的所有视频流式处理接口上的所有终结点。 它调整 ISP(图像信号处理器)使用的像素(或传感器)数据的源。 这包括方法 2 和方法 3 的静态捕捉引脚。
这是同步筛选器级别控制。
此控件由相机驱动程序映射到 KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2 。
| 控件选择器 | MSXU_CONTROL_FIELDOFVIEW2 |
|---|---|
| 强制请求 | GET_INFO、GET_LEN、GET_RES、GET_MIN、GET_MAX、GET_DEF、GET_CUR、SET_CUR |
| 可选请求 | |
| wLength | 4 |
| Offset | 领域 | 尺寸 | 价值 | DESCRIPTION |
|---|---|---|---|---|
| 0 | dwValue | 4 | 编号 | 以度为单位的对角视场值。 |
以下内容适用:
GET_LEN请求应报告值 4。
GET_INFO请求应报告 3。 此值指示支持GET_CUR和SET_CUR的同步控件。
GET_MIN请求应报告字段dwValue设置为支持的最小视野值。
GET_RES请求应报告字段 dwValue set 0。 此请求当前未使用。
GET_MAX请求应将字段dwValue设置为支持的最大视场值。
GET_DEF请求应报告字段 dwValue 并将其设置为默认的视场值。
GET_CUR请求应将字段 dwValue 设置为当前视场值。
收到SET_CUR请求时,相机将设置其视场以匹配给定的 dwValue。
如果相机实现CT_ZOOM_RELATIVE_CONTROL和/或CT_ZOOM_ABSOLUTE_CONTROL,则调用MSXU_CONTROL_FIELDOFVIEW2 SET_CUR时,这些控件应重置为其默认值。
如果相机实现MSXU_CONTROL_DIGITALWINDOW,则当设置新的“视图字段”值时,它应反映窗口更改。 反之亦然,视场应反映通过数字窗口所做的更改。 有关详细信息 ,请参阅KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2 。
2.2.3 元数据
标准格式框架元数据的设计基于 Windows 10 的 UVC 自定义元数据设计。 在 Windows 10 中,通过为相机驱动程序使用自定义的 INF 来支持 UVC 的自定义元数据(请注意:虽然相机驱动程序可以基于 Windows USBVIDEO.SYS,但为了使元数据能够传送,针对特定硬件的 INF 是必需的)。 如果 MetadataBufferSizeInKB<PinIndex> 注册表项存在且非零,则该引脚支持自定义元数据,该值表示用于元数据的缓冲区大小。
<PinIndex> 字段表明视频引脚索引是从 0 开始的。
在 Windows 10 版本 1703 中,相机驱动程序可以通过包含以下 AddReg 条目来指示对Microsoft标准格式元数据的支持:
StandardFormatMetadata<PinIndex>:REG_DWORD:0x0(不支持)到 0x1(支持)
DevProxy 将读取此注册表项,并通过在 KSSTREAM_METADATA_INFO 结构的 Flags 字段中设置标志 KSSTREAM_METADATA_INFO_FLAG_STANDARDFORMAT 来通知 UVC 驱动程序元数据采用标准格式。
2.2.3.1 Microsoft标准格式元数据
Microsoft标准格式元数据是以下结构的一个或多个实例:
typedef struct tagKSCAMERA_METADATA_ITEMHEADER {
ULONG MetadataId;
ULONG Size; // Size of this header + metadata payload following
} KSCAMERA_METADATA_ITEMHEADER, *PKSCAMERA_METADATA_ITEMHEADER;
MetadataId 字段由以下枚举定义的标识符填充,其中包含定义完善的标识符和自定义标识符(identifiers >= MetadataId_Custom_Start)。
typedef enum {
MetadataId_Standard_Start = 1,
MetadataId_PhotoConfirmation = MetadataId_Standard_Start,
MetadataId_UsbVideoHeader,
MetadataId_CaptureStats,
MetadataId_CameraExtrinsics,
MetadataId_CameraIntrinsics,
MetadataId_FrameIllumination,
MetadataId_Standard_End = MetadataId_FrameIllumination,
MetadataId_Custom_Start = 0x80000000,
} KSCAMERA_MetadataId;
“大小”字段设置为 sizeof(KSCAMERA_METADATA_ITEMHEADER) + sizeof(Metadata Payload)。
2.2.3.2 固件从 USB 视频帧数据包生成的标准格式元数据
在通过 UVC 传输基于帧的视频时,视频帧被分组化为一系列数据包,每个数据包都有一个 UVC 负载头。 每个 UVC 有效负载标头由 USB 视频类驱动程序的帧基负载规范定义:
Payload 标头
下面是有关帧为基础的格式的有效负载标头格式的说明。
HLE (标头长度) 字段
标头长度字段指定标头的长度(以字节为单位)。
位字段标头字段
FID:帧标识符
- 此位在每个帧开始边界处切换,并在帧的其余部分保持不变。
EOF:帧结束
- 此位指示视频帧的末尾,并在属于帧的最后一个视频示例中设置。 使用此位是一种优化,以减少帧传输完成时的延迟,并且是可选的。
PTS:演示文稿时间戳
- 当设置此位时,指示 PTS 字段的存在。
SCR:源时钟参考
- 当此位被设置时,指示存在SCR字段。
RES:保留。
- 设置为 0。
STI:静止图像
- 设置时,此位将视频示例标识为属于静止图像。
ERR:错误位
- 设置此位时,表示设备流媒体传输出现错误。
EOH: 标题结束
- 设置时,此位指示 BFH 字段的末尾。
PTS:演示文稿时间戳,大小:4 字节,值:数字
- 当在 BFH[0] 字段中设置 PTS 位时,会出现 PTS 字段。 请参阅 适用于视频设备的 USB 设备类定义 中的第 2.4.3.3 节“视频和静止图像有效负载标头”。
SCR:源时钟参考,大小:6 字节,值:数字
- 当在 BFH[0] 字段中设置 SCR 位时,会出现 SCR 字段。 请参阅适用于视频设备的 USB 设备类定义规范中的第 2.4.3.3 节视频和静止图像有效负载标头。
现有 UVC 驱动程序中的 HLE 字段固定为 2 个字节(不存在 PTS/SCR),或最多 12 个字节(PTS/SCR 存在)。 但是,HLE 字段(作为字节大小的字段)最多可以指定 255 字节的标头数据。 如果同时存在 PTS/SCR,并且 HLE 大于 12 个字节,当 INF 条目 StandardFormatMetadata<PinIndex> 被设置时,将把有效负载头的前 12 个字节之后的所有其他数据作为视频帧特定的标准元数据处理。
通过将视频帧数据包中找到的部分 blob 进行连接,获取帧的标准格式元数据(由固件生成)。
2.2.3.3 提供给用户模式组件的元数据缓冲区
提供给用户模式组件的元数据缓冲区将包括一个由 UVC 驱动程序生成的 UVC 时间戳元数据项,接着是固件生成的元数据项,其安排如下:
标准元数据标识符的元数据格式 2.2.3.4
固件可以选择是否生成与标识符对应的元数据。 如果固件选择生成与标识符对应的元数据,则该标识符的元数据应存在于固件发出的所有帧上。
2.2.3.4.1 MetadataId_CaptureStats
此标识符的元数据格式由以下结构定义:
typedef struct tagKSCAMERA_METADATA_CAPTURESTATS {
KSCAMERA_METADATA_ITEMHEADER Header;
ULONG Flags;
ULONG Reserved;
ULONGLONG ExposureTime;
ULONGLONG ExposureCompensationFlags;
LONG ExposureCompensationValue;
ULONG IsoSpeed;
ULONG FocusState;
ULONG LensPosition; // a.k.a Focus
ULONG WhiteBalance;
ULONG Flash;
ULONG FlashPower;
ULONG ZoomFactor;
ULONGLONG SceneMode;
ULONGLONG SensorFramerate;
} KSCAMERA_METADATA_CAPTURESTATS, *PKSCAMERA_METADATA_CAPTURESTATS;
“标志”字段指示结构中的哪些后续字段已填充并具有有效数据。 “标志”字段不得因帧而异。 目前,定义了以下标志:
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURETIME 0x00000001
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURECOMPENSATION 0x00000002
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_ISOSPEED 0x00000004
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FOCUSSTATE 0x00000008
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_LENSPOSITION 0x00000010
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_WHITEBALANCE 0x00000020
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FLASH 0x00000040
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FLASHPOWER 0x00000080
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_ZOOMFACTOR 0x00000100
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_SCENEMODE 0x00000200
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_SENSORFRAMERATE 0x00000400
保留字段保留为将来,应设置为 0。
ExposureTime 字段包含捕获帧时应用于传感器的曝光时间(以 100 ns 为单位)。 这显示为相应 MF 示例中的属性MF_CAPTURE_METADATA_EXPOSURE_TIME。
ExposureCompensationFlags 字段包含 EV 补偿步骤(应设置KSCAMERA_EXTENDEDPROP_EVCOMP_XXX步骤标志之一)用于传达 EV 补偿值。 ExposureCompensationValue 字段包含捕获帧时应用于传感器的步骤单位的 EV 补偿值。 这些在相应的 MF 样本中显示为属性 MF_CAPTURE_METADATA_EXPOSURE_COMPENSATION。
IsoSpeed 字段包含捕获帧时应用于传感器的 ISO 速度值。 它是无单位的。 这在相应的 MF 示例中显示为属性 MF_CAPTURE_METADATA_ISO_SPEED。
FocusState 字段包含当前焦点状态,该状态可以采用枚举KSCAMERA_EXTENDEDPROP_FOCUSSTATE中定义的值之一。 这在相应的 MF 示例中显示为属性 MF_CAPTURE_METADATA_FOCUSSTATE。
LensPosition 字段包含捕获帧时的逻辑镜头位置,这是无单位的。 此值与可从 GET 调用中的KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUS查询的值相同。 这在相应的MF示例中显示为属性MF_CAPTURE_METADATA_LENS_POSITION。
WhiteBalance 字段包含捕获帧时应用于传感器的白色平衡,这是 Kelvin 中的值。 在相应的 MF 示例中,这将显示为属性MF_CAPTURE_METADATA_WHITEBALANCE。
Flash 字段包含一个布尔值,其中 1 表示闪烁,0 表示在捕获帧时关闭。 这显示为相应的 MF 示例中的属性 MF_CAPTURE_METADATA_FLASH。
FlashPower 字段包含应用于拍摄帧的闪光功率,数值范围为 [0, 100]。 如果驱动程序不支持闪存的可调整电源,则应省略此字段。 这显示为相应 MF 示例中的属性 MF_CAPTURE_METADATA_FLASH_POWER。
ZoomFactor 字段包含应用于捕获的帧的 Q16 格式的缩放值。 这显示为相应 MF 示例中的属性MF_CAPTURE_METADATA_ZOOMFACTOR。
SceneMode 字段包含应用于捕获的帧(即 64 位KSCAMERA_EXTENDEDPROP_SCENEMODE_XXX标志)的场景模式。 这将显示为对应MF示例中的属性:MF_CAPTURE_METADATA_SCENE_MODE。
SensorFramerate 字段包含在捕获帧时测量的传感器读取率,其由上32位中的分子值和下32位中的分母值组成。 这在相应的 MF 示例中显示为属性 MF_CAPTURE_METADATA_SENSORFRAMERATE。
2.2.3.4.2 MetadataId_CameraExtrinsics
此标识符的元数据格式涉及标准KSCAMERA_METADATA_ITEMHEADER后跟字节数组数据负载。 负载应与 MFCameraExtrinsics 结构对齐,接着是零个或多个 MFCameraExtrinsic_CalibratedTransform 结构。 有效负载必须 8 字节对齐,所有未使用的字节应位于有效负载的末尾,并设置为 0。
2.2.3.4.3 MetadataId_CameraIntrinsics
此标识符的元数据格式是使用标准 KSCAMERA_METADATA_ITEMHEADER,后跟字节数组负载数据。 有效负载应与 MFPinholeCameraIntrinsics 结构保持一致。 有效负载需要是 8 字节对齐的,所有未使用的字节应位于有效负载的末尾,并设置为 0。
2.2.3.4.4 元数据ID_帧照明
此标识符的元数据格式由以下结构定义:
typedef struct tagKSCAMERA_METADATA_FRAMEILLUMINATION {
KSCAMERA_METADATA_ITEMHEADER Header;
ULONG Flags;
ULONG Reserved;
} KSCAMERA_METADATA_FRAMEILLUMINATION, *PKSCAMERA_METADATA_FRAMEILLUMINATION;
“标志”字段指示有关捕获的帧的信息。 目前,定义了以下标志:
#define KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON 0x00000001
如果在照明已经打开的情况下捕获帧,则应设置标志KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON。 否则,不应设置此标志。
保留字段保留供将来使用,应设置为 0。
示例:
例如,指示照明状态的 KSCAMERA_METADATA_FRAMEILLUMINATION 结构如下所示:
KSCAMERA_METADATA_FRAMEILLUMINATION.Header.MetadataId = MetadataId_FrameIllumination;
KSCAMERA_METADATA_FRAMEILLUMINATION.Header.Size = 16; // 4 ULONG variables in total inside the structure
KSCAMERA_METADATA_FRAMEILLUMINATION.Flags = KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON;
KSCAMERA_METADATA_FRAMEILLUMINATION.Reserved = 0;
2.2.3.4.5 MetadataId_USBVideoHeader
此标识符的元数据格式由一个通用的KSCAMERA_METADATA_ITEMHEADER定义,接着是一个KSSTREAM_UVC_METADATA结构:
typedef struct
{
ULONG PresentationTimeStamp;
ULONG SourceClockReference;
union
{
struct
{
USHORT Counter : 11;
USHORT Reserved : 5;
};
USHORT SCRToken;
};
USHORT Reserved0;
ULONG Reserved1;
} KSSTREAM_UVC_METADATATYPE_TIMESTAMP, *PKSSTREAM_UVC_METADATATYPE_TIMESTAMP;
typedef struct {
KSSTREAM_UVC_METADATATYPE_TIMESTAMP StartOfFrameTimestamp;
KSSTREAM_UVC_METADATATYPE_TIMESTAMP EndOfFrameTimestamp;
} KSSTREAM_UVC_METADATA, *PKSSTREAM_UVC_METADATA;
StartOfFrameTimestamp 和 EndOfFrameTimestamp 字段是相机发出的第一个和最后一个 UVC 有效负载中用于构造此帧的 UVC 标头中包含的时间戳。
设备不应发送此有效负载。
此元数据有效负载是唯一的,因为它是唯一由 USB 视频类驱动程序直接从从 UVC 兼容有效负载标头获取的信息生成的元数据有效负载。
此有效负载被预先添加到每个帧的元数据缓冲区。
如果设备支持标准化元数据,则其缓冲区要求中必须包括存储该有效载荷所需的空间,正如第 2.2.2.9 节中定义的元数据控制所报告。