LINUX&UVC驱动视频流接口描述符与视频控制接口描述符的解析关系
2024-03-25
88
0
UVC控制接口描述符包其下的子各类描述符代表着UVC设备的拓扑结构,关于UVC设备的控制一般都是通过UVC控制接口描述符各个终端,实例的特定类请求来实现的,其中也包括用于用户自定义通讯的扩展单元描述符。
与UVC控制接口描述符相对的是UVC视频流接口描述符,UVC规范可以有0个或者多个。至于有多少个,这是由UVC视频控制接口描述符头的bInCollection来决定的。详见UVC 类特定视频控制接口头描述符 https://www.usbzh.com/article/detail-4.html
在LINUX&UVC驱动代码uvc_parse_standard_control函数中,其相关的代码如下:
n = buflen >= 12 ? buffer[11] : 0;
/* Parse all USB Video Streaming interfaces. */
for (i = 0; i < n; ++i) {
intf = usb_ifnum_to_if(udev, buffer[12+i]);
if (intf == NULL) {
uvc_trace(UVC_TRACE_DESCR, "device %d "
"interface %d doesn't exists\n",
udev->devnum, i);
continue;
}
uvc_parse_streaming(dev, intf);
}
这里的n就是UVC视频控制接口描述符头的bInCollection,其后的字段baInterfaceNr为一个数组,大小为n,其每项代表着其对应的视频接口描述符的接口描述符id.
UINT8 bInCollection; //视频流接口描述符的个数
UINT8 baInterfaceNr[bInCollection]; //数量由bInCollection决定。
通过usb_ifnum_to_if函数,依据参数接口描述符的id,就可以定位该接口描述符的位置,这样通过uvc_parse_streaming函数即可解析该接口描述符下的视频流相关的信息。这些信息包括该接口(相机)支持的视频格式,分辨率大小等。