UVC 基础学习(5):VideoStream Interface 描述符介绍

简介: 今天我们继续学习UVC的接口描述符:VideoStream 。 VideoStream 接口描述符是整个UVC设备最重要的组成之一,和VideoControl一样,其也包含标准接口和特殊类接口。

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:接口字符串描述符的索引值


image.png


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 数据,同时提供了不同格式的描述符信息。


image.png


  • 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数据,同时提供不同的格式描述


image.png


  • bLength:描述符长度。


  • bDescriptorType:描述符类型


  • bDescriptorSubtype:描述符子类,输出头


  • bNumFormats:支持的视频格式


  • wTotalLength:整个 VS 接口描述符返回的总长度,包含头


  • bEndpointAddress:端点地址


  • bTerminalLink:IT 的Terminal ID


  • bStillCaptueMethod:支持image capture


  • bControlSize:bmaControls number


2.3 格式和帧描述


Payload Format Descriptors


视频格式描述符定义了,特定的格式信息,相关介绍记录在以下文档中:


image.png


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:复制保护,可限制重复。



image.png


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]:帧间隔设置,默认设置一个即可。


image.png

image.png


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]:帧间隔设置,默认设置一个即可。


image.png

image.png


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.


image.png


  • alt setting0 用来配置视频格式和帧信息


  • alt setting1 用来开启传输,通过In Endpoint 将video stream 传到pc.

继续拆分,VS 接口描述符如下:


image.png


  • 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


相关文章
|
Linux API
嵌入式Linux中的 gpio、gpiod基本分析
嵌入式Linux中的 gpio、gpiod基本分析
1003 0
|
10月前
|
Java
BIO、NIO、AIO 有什么区别
BIO(阻塞I/O)模型中,服务器实现模式为一个连接一个线程;NIO(非阻塞I/O)使用单线程或少量线程处理多个请求;AIO(异步I/O)则是在NIO基础上进一步优化,采用事件通知机制,提高并发处理能力。
340 6
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
778 12
|
测试技术 Linux Android开发
i2c总线及设备测试工具i2ctools:i2cdetect、i2cdump、i2cget、i2cset
本文介绍了i2ctools工具集的使用,包括i2cdetect、i2cdump、i2cget和i2cset,这些工具有助于I2C设备的开发和调试,通过检测设备、读写寄存器和数据块来提高开发效率。
2727 1
|
传感器 编解码 Linux
V4L2框架 | MIPI Camera指令调试笔记
V4L2框架 | MIPI Camera指令调试笔记
6100 2
|
编解码 Linux API
【Camera基础(一)】Camera摄像头工作原理及整机架构
【Camera基础(一)】Camera摄像头工作原理及整机架构
|
编解码 Linux 对象存储
Linux系统中内核音频驱动实现
Linux系统中内核音频驱动实现
1908 2
|
Shell Android开发
Android USB系统初始化init.usb.rc
Android USB系统初始化init.usb.rc
1084 0
|
索引
UVC 基础学习(4):VideoContrl Interface 及其描述符介绍
所有信息整理来源于UVC 官方spec 翻译理解及内核源码做参考
1158 0
|
存储 编解码 缓存
【ffmpeg 移动视频流位置】深入理解FFmpeg:精细探讨seek操作和编解码上下文
【ffmpeg 移动视频流位置】深入理解FFmpeg:精细探讨seek操作和编解码上下文
683 0