0
点赞
收藏
分享

微信扫一扫

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

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

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

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


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

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


  • bLength:描述符长度。
  • bDescriptorType:描述符类型
  • bDescriptorSubtype:描述符子类,输出头
  • bNumFormats:支持的视频格式
  • wTotalLength:整个 VS 接口描述符返回的总长度,包含头
  • bEndpointAddress:端点地址
  • bTerminalLink:IT 的Terminal ID
  • bStillCaptueMethod:支持image capture
  • bControlSize:bmaControls number

2.3 格式和帧描述

Payload Format Descriptors

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

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

MJPEG


  • bLength:描述符长度。
  • bDescriptorType:描述符类型
  • bDescriptorSubtype:描述符子类,MJPEG格式
  • bFormatIndex:格式描述符索引
  • bNumFrameDescriptors:帧描述符个数
  • bmFlags:指定特征格式
  • bDefaultFrameIndex:初始化帧索引,用来选择默认分辨率
  • bAspectRatioX:x 方向图片尺寸比例
  • bAspectRatioY:x 方向图片尺寸比例
  • bmInterfaceFlags:bm 接口控制,默认未用
  • bCopyProtect:复制保护,可限制重复。

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

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协议未压缩的格式目前支持以下几种:

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

比MJPEG相比多了guidFormat这项


  • bLength:描述符长度。
  • bDescriptorType:描述符类型
  • bDescriptorSubtype:描述符子类,未压缩格式
  • bFormatIndex:格式描述符索引
  • bNumFrameDescriptors:帧描述符个数
  • guidFormat:指定格式
  • bBitsPerPixel:每个像素占字节
  • bDefaultFrameIndex:初始化帧索引,用来选择默认分辨率
  • bAspectRatioX:x 方向图片尺寸比例
  • bAspectRatioY:x 方向图片尺寸比例
  • bmInterfaceFlags:bm 接口控制,默认未用
  • bCopyProtect:复制保护,可限制重复。

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

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

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

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

YUV​YUV 

帧描述符信息同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]:帧间隔设置,默认设置一个即可。

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

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.

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


  • alt setting0 用来配置视频格式和帧信息
  • alt setting1 用来开启传输,通过In Endpoint 将video stream 传到pc.

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

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


  • 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


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

举报

相关推荐

0 条评论