uvc_parse_streaming分析
2024-03-25
84
0
除过usb_driver_claim_interface函数功能有之外,uvc_parse_streaming主要是对申请的内存结构体struct uvc_streaming 进行初始化,其数据来源于对UVC视频流接口描述符的解析。
视频流接口描述符的内存布局大致如下:
- 视频流对应的接口描述符
- 视频流输入头描述符或视频流输出头描述符
- 视频格式描述符1
- 该格式下的第一个帧格式描述符
…
- 该格式下的第一个帧格式描述符
- 视频格式描述符
- 该格式下的第一个帧格式描述符
…
- 该格式下的第一个帧格式描述符
- 视频格式描述符N
- 该格式下的第一个帧格式描述符
…
- 该格式下的第一个帧格式描述符
- 颜色匹配描述符(可选)
- 同步模式下的备用接口描述符(批量模式下不存在)
1.申请内存streaming = uvc_stream_new(dev, intf);并使用usb_interface相关信息初始化最基本的信息。
2.根据头描述符填充相关的信息。头描述符的bDescriptorSubtype有2种,相关的一般为bDescriptorSubtypeUVC_VS_INPUT_HEADER和UVC_VS_OUTPUT_HEADER,即输入头描述符和输出头描述符。
#define UVC_VS_INPUT_HEADER 0x01
#define UVC_VS_OUTPUT_HEADER 0x02
其分别用于标识streaming的类型:
/* Parse the header descriptor. */
switch (buffer[2]) {
case UVC_VS_OUTPUT_HEADER:
streaming->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
size = 9;
break;
case UVC_VS_INPUT_HEADER:
streaming->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
size = 13;
break;
default:
uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface "
"%d HEADER descriptor not found.\n", dev->udev->devnum,
alts->desc.bInterfaceNumber);
goto error;
}
然后就是其它相关的信息:
streaming->header.bNumFormats = p;
streaming->header.bEndpointAddress = buffer[6];
if (buffer[2] == UVC_VS_INPUT_HEADER) {
streaming->header.bmInfo = buffer[7];
streaming->header.bTerminalLink = buffer[8];
streaming->header.bStillCaptureMethod = buffer[9];
streaming->header.bTriggerSupport = buffer[10];
streaming->header.bTriggerUsage = buffer[11];
} else {
streaming->header.bTerminalLink = buffer[7];
}
streaming->header.bControlSize = n;
streaming->header.bmaControls = kmemdup(&buffer[size], p * n,GFP_KERNEL);
3.然后解析视频流的格式和分辨率,主要分为以下几大类:
#define UVC_VS_FORMAT_UNCOMPRESSED 0x04
#define UVC_VS_FORMAT_MJPEG 0x06
#define UVC_VS_FORMAT_FRAME_BASED 0x10
#define UVC_VS_FORMAT_DV 0x0c
#define UVC_VS_FORMAT_MPEG2TS 0x0a
#define UVC_VS_FORMAT_STREAM_BASED 0x12
Frame分为:
#define UVC_VS_FRAME_UNCOMPRESSED 0x05
#define UVC_VS_FRAME_MJPEG 0x07
#define UVC_VS_FRAME_FRAME_BASED 0x11
这里大家可以对照某种格式的定义来学习。
4.查看视频流传输所使用的端点描述符
5.list_add_tail(&streaming->list, &dev->streams);
参考资料
- UVC视频格式细节详解及分类大全 https://www.usbzh.com/article/detail-1338.html
- UVC视频C语言宏定义 https://www.usbzh.com/article/detail-1337.html