Linux&UVC驱动
+ -

uvc_parse_streaming分析

2024-03-25 11 0

除过usb_driver_claim_interface函数功能有之外,uvc_parse_streaming主要是对申请的内存结构体struct uvc_streaming 进行初始化,其数据来源于对UVC视频流接口描述符的解析。

视频流接口描述符的内存布局大致如下:

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);

参考资料

0 篇笔记 写笔记

UVC 视频流接口描述符
视频流接口描述符包含了所有完整的视频流接口信息。视频流接口信息以标准的视频流接口开头。视频流接口描述符由标准视频控制接口描述符以及各控制相关描述符组成。标准视频流接口描述符使用通用USB设备接口描述符数据结构。struct _INTERFACE_DESCRIPTOR_STRUCT; { BY......
USB摄像头UVC视频流描述符中的bFormatIndex和bFrameIndex
bFormatIndexUSB摄像头一般支持多种视频格式,比如MJPG,H264,YUY2,NV12,RGB等,这些不同的视频格式代表着传输的视频图像的数据组织方式。这些视频格式通过UVC视频流各视频流相关的类型描述符来进行描述符。在Windows系统下,我们可以通过PotPlayer来查看摄像头......
LINUX&UVC驱动视频流接口描述符与视频控制接口描述符的解析关系
UVC控制接口描述符包其下的子各类描述符代表着UVC设备的拓扑结构,关于UVC设备的控制一般都是通过UVC控制接口描述符各个终端,实例的特定类请求来实现的,其中也包括用于用户自定义通讯的扩展单元描述符。与UVC控制接口描述符相对的是UVC视频流接口描述符,UVC规范可以有0个或者多个。至于有多少个,......
uvc_parse_streaming分析
除过usb_driver_claim_interface函数功能有之外,uvc_parse_streaming主要是对申请的内存结构体struct uvc_streaming 进行初始化,其数据来源于对UVC视频流接口描述符的解析。视频流接口描述符的内存布局大致如下:视频流对应的接口描述符视频......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!