uvc_parse_streaming分析
			 2024-03-25
			  本文链接为:http://www.usbzh.com/article/detail-1336.html ,欢迎转载,转载请附上本文链接。
	
			
			
			
			
		
			除过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
 Linux&UVC驱动
			Linux&UVC驱动
			




