1. 标准VS接口
标准 VS 接口描述符和标准接口描述符的定义是一样的,只是用来表示接口本身。
- bLength:描述符长度,固定为9
- bDescriptorType:描述符类型。这里为接口描述符,设为0x4
- bInterfaceNumber:接口索引,0表示VideoControl,1表示VideoStream
- bAlternateSetting:可替换设置索引
- bNumEndpoints:端点0以外的端点数
- bInterfaceClass:接口类,0xE表示Video_Class
- bInterfaceSubClass:接口子类,这里是0x1表示VideoControl,0x2表示VideoStream
- bInterfaceProtocol:协议代码,uvc1.5的协议所以须设为1.
- iInterface:接口字符串描述符的索引值
static struct usb_interface_descriptor uvc_streaming_intf_alt0 = { .bLength = USB_DT_INTERFACE_SIZE, .bDescriptorType = USB_DT_INTERFACE, .bInterfaceNumber = UVC_INTF_VIDEO_STREAMING, .bAlternateSetting = 0, .bNumEndpoints = 0, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING, .bInterfaceProtocol = 0x00, /*uvc1.5 设置为1 */ .iInterface = 0, }; static struct usb_interface_descriptor uvc_streaming_intf_alt1 = { .bLength = USB_DT_INTERFACE_SIZE, .bDescriptorType = USB_DT_INTERFACE, .bInterfaceNumber = UVC_INTF_VIDEO_STREAMING, .bAlternateSetting = 1, .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING, .bInterfaceProtocol = 0x00, .iInterface = 0, };
2. 特殊类描述符
类特殊描述符包含Inputer Header 、Output Header, Format 和 Frame 描述符。即包含:
- 输入头;
- 输出头;
- 视频格式;
- 帧信息;
每个VS 接口都有一个输入或者输出头描述符,一个支持的视频格式描述符,以及一个或多个帧描述符。也会是说每种视频格式都需要一个VS接口。每个VS 接口对应处理一种视频数据。
2.1 Input 接口
输入头描述符,包含输入端点,用来处理video stream 数据,同时提供了不同格式的描述符信息。
- bLength:描述符长度。
- bDescriptorType:描述符类型
- bDescriptorSubtype:描述符子类,输入头
- bNumFormats:支持的视频格式
- wTotalLength:整个 VS 接口描述符返回的总长度,包含头
- bEndpointAddress:端点地址
- bmInfo:默认设为0,支持视频格式动态修改
- bTerminalLink:OT 的Terminal ID
- bStillCaptueMethod:支持image capture
- bTriggerSupport:特殊的硬件触发
- bTriggerUsage:默认为0
- bControlSize:bmaControls number
DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(1, 2); static const struct UVC_INPUT_HEADER_DESCRIPTOR(1, 2) uvc_input_header = { .bLength = UVC_DT_INPUT_HEADER_SIZE(1, 2), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VS_INPUT_HEADER, .bNumFormats = 2, .wTotalLength = 0, /* dynamic */ .bEndpointAddress = 0, /* dynamic */ .bmInfo = 0, .bTerminalLink = 3, .bStillCaptureMethod = 0, .bTriggerSupport = 0, .bTriggerUsage = 0, .bControlSize = 1, .bmaControls[0][0] = 0, .bmaControls[1][0] = 4, };
2.2 Output Header
输出头描述符,包含一个输出端点,用来处理video stream数据,同时提供不同的格式描述
- bLength:描述符长度。
- bDescriptorType:描述符类型
- bDescriptorSubtype:描述符子类,输出头
- bNumFormats:支持的视频格式
- wTotalLength:整个 VS 接口描述符返回的总长度,包含头
- bEndpointAddress:端点地址
- bTerminalLink:IT 的Terminal ID
- bStillCaptueMethod:支持image capture
- bControlSize:bmaControls number
2.3 格式和帧描述
Payload Format Descriptors
视频格式描述符定义了,特定的格式信息,相关介绍记录在以下文档中:
MJPEG
- bLength:描述符长度。
- bDescriptorType:描述符类型
- bDescriptorSubtype:描述符子类,MJPEG格式
- bFormatIndex:格式描述符索引
- bNumFrameDescriptors:帧描述符个数
- bmFlags:指定特征格式
- bDefaultFrameIndex:初始化帧索引,用来选择默认分辨率
- bAspectRatioX:x 方向图片尺寸比例
- bAspectRatioY:x 方向图片尺寸比例
- bmInterfaceFlags:bm 接口控制,默认未用
- bCopyProtect:复制保护,可限制重复。
static const struct uvc_format_mjpeg uvc_format_mjpg = { .bLength = UVC_DT_FORMAT_MJPEG_SIZE, .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VS_FORMAT_MJPEG, .bFormatIndex = 2, .bNumFrameDescriptors = 2, /* /* 表示支持 两种分辨率格式 */*/ .bmFlags = 0, .bDefaultFrameIndex = 1, .bAspectRatioX = 0, .bAspectRatioY = 0, .bmInterfaceFlags = 0, .bCopyProtect = 0, };
YUV
UVC协议未压缩的格式目前支持以下几种:
比MJPEG相比多了guidFormat这项
- bLength:描述符长度。
- bDescriptorType:描述符类型
- bDescriptorSubtype:描述符子类,未压缩格式
- bFormatIndex:格式描述符索引
- bNumFrameDescriptors:帧描述符个数
- guidFormat:指定格式
- bBitsPerPixel:每个像素占字节
- bDefaultFrameIndex:初始化帧索引,用来选择默认分辨率
- bAspectRatioX:x 方向图片尺寸比例
- bAspectRatioY:x 方向图片尺寸比例
- bmInterfaceFlags:bm 接口控制,默认未用
- bCopyProtect:复制保护,可限制重复。
static const struct uvc_format_uncompressed uvc_format_yuv = { .bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE, .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED, .bFormatIndex = 1, .bNumFrameDescriptors = 2, .guidFormat = { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}, .bBitsPerPixel = 16, .bDefaultFrameIndex = 1, .bAspectRatioX = 0, .bAspectRatioY = 0, .bmInterfaceFlags = 0, .bCopyProtect = 0, };
帧描述符
主要描述视频帧信息,包括分辨率大小,帧间隔等
MJPEG
- bLength:描述符长度
- bDescriptorType:描述符类型,
- bDescriptorSubType:描述符子类
- bFrameIndex:帧索引。
- bmCapabilities:是否支持still image
- wWidth:帧款,
- wHeight:帧高,
- dwMinBitRate:最小速率
- dwMaxBitRate:最大速率,
- dwMaxVideoFrameBufferSize:最大buffer
- dwDefaultFrameInterval:初始化帧间隔,支持的帧率。
- bFrameIntervalType:帧间隔类型。0,Continuous Frame Interval;1~255 discrete Frame Interval support(n)
- dwFrameInterval[n]:帧间隔设置,默认设置一个即可。
static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_360p = { .bLength = UVC_DT_FRAME_MJPEG_SIZE(3), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VS_FRAME_MJPEG, .bFrameIndex = 1, .bmCapabilities = 0, .wWidth = cpu_to_le16(640), /* 分辨率 */ .wHeight = cpu_to_le16(360), .dwMinBitRate = cpu_to_le32(18432000), .dwMaxBitRate = cpu_to_le32(55296000), .dwMaxVideoFrameBufferSize = cpu_to_le32(460800), .dwDefaultFrameInterval = cpu_to_le32(666666), .bFrameIntervalType = 1, .dwFrameInterval[0] = cpu_to_le32(666666), };
YUVYUV
帧描述符信息同MJPEG
- bLength:描述符长度
- bDescriptorType:描述符类型,
- bDescriptorSubType:描述符子类
- bFrameIndex:帧索引。
- bmCapabilities:是否支持still image
- wWidth:帧款,
- wHeight:帧高,
- dwMinBitRate:最小速率
- dwMaxBitRate:最大速率,
- dwMaxVideoFrameBufferSize:最大buffer
- dwDefaultFrameInterval:初始化帧间隔,支持的帧率。
- bFrameIntervalType:帧间隔类型。0,Continuous Frame Interval;1~255 discrete Frame Interval support(n)
- dwFrameInterval[n]:帧间隔设置,默认设置一个即可。
static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_360p = { .bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(1), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED, .bFrameIndex = 1, .bmCapabilities = 0, .wWidth = cpu_to_le16(640), .wHeight = cpu_to_le16(360), .dwMinBitRate = cpu_to_le32(18432000), .dwMaxBitRate = cpu_to_le32(55296000), .dwMaxVideoFrameBufferSize = cpu_to_le32(460800), .dwDefaultFrameInterval = cpu_to_le32(666666), .bFrameIntervalType = 1, .dwFrameInterval[0] = cpu_to_le32(666666), };
3. 总结
一个标准的uvc设备的VS 接口描述符如下,包括alt setting 0 和 alt setting1.
- alt setting0 用来配置视频格式和帧信息
- alt setting1 用来开启传输,通过In Endpoint 将video stream 传到pc.
继续拆分,VS 接口描述符如下:
- VS Interface
- VS MJPEG Format
- VS Uncompressed Foramt(YUY2/NV12等)
- ...
- VS MJPEG Frame
- VS MJPEG Frame
- VS Uncompressed Frame
- VS Uncompressed Frame
- Video Class-specific VS Input Header
- VS Interaface
- In Endpoint