UVC视频流接口(VideoStreaming Interface)
UVC视频流接口(VideoStreaming Interface)用于在 Host 和 Video 设备之间传输视频数据流。 每个接口可以有一个同步或批量数据端点。 支持同步视频传输的接口必须具有备用或转换接口,使主机能够根据带宽要求更改同步管道。 还必须提供零带宽备用设置作为默认备用设置(备用设置零,即设备关闭,无数据传输),它为主机软件提供通过切换到此备用接口来临时放弃 USB带宽的选项。
在UVC示例中,视频流接口的零带宽备用设置由标准接口描述符和特定于类的VS接口描述符描述。
标准VS接口描述符提供接口号、属于该接口的端点数等。如果带宽为零,则转换接口的端点数为零。
类特定VS接口描述符用于描述支持的视频流格式、视频帧细节、静态图像帧细节、视频数据的颜色配置文件等。以下是这些特定于类的描述符的列表:
- Input Header descriptor
- Output Header descriptor
- Payload Format descriptor
- Video Frame descriptor
- Still Image frame descriptor
- Color Matching descriptor
Input Header descriptor
Input Header descriptor 用于包含IN端点的接口,输出头用于包含OUT端点的接口
USB_VS_INPUT_HEADER, /* 2 bDescriptorSubType - INPUT HEADER */
0x01, /* 3 bNumFormats - One format supported */
0x47, 0x00, /* 4 wTotalLength - Size of class-specific VS descriptors */
(VIDEO_DATA_EP_NUM | 0x80), /* 6 bEndpointAddress - Iso EP for video streaming */
0x00, /* 7 bmInfo - No dynamic format change */
0x02, /* 8 bTerminalLink - Denotes the Output Terminal */
上面的代码显示了支持的视频格式数量、传输视频数据的端点地址以及链接到此流接口的输出终端ID。
USB_VS_FORMAT_UNCOMPRESSED, /* 2 bDescriptorSubType - FORMAT UNCOMPRESSED */
0x01, /* 3 bFormatIndex */
0x01, /* 4 bNumFrameDescriptors - 1 Frame descriptor followed */
0x59,0x55,0x59,0x32,
0x00,0x00,0x10,0x00,
0x80,0x00,0x00,0xAA,
0x00,0x38,0x9B,0x71, /* 5 guidFormat - YUY2 Video format */
BITS_PER_PIXEL, /* 21 bBitsPerPixel - 16 bits */
0x01, /* 22 bDefaultFrameIndex */
上面的代码显示视频流是未压缩的YUY2格式,每像素使用16位。
视频帧描述符提及帧分辨率、帧速率、视频缓冲区大小等。以下代码显示了该描述符的字段:
USB_VS_FRAME_UNCOMPRESSED, /* 2 bDescriptorSubType */
0x01, /* 3 bFrameIndex */
0x01, /* 4 bmCapabilities - Still image capture method 1 */
SHORT_CHARS(WIDTH), /* 5 wWidth - 480 pixels */
SHORT_CHARS(HEIGHT), /* 7 wHeight - 320 pixels */
WORD_CHARS(MIN_BIT_RATE), /* 9 dwMinBitRate */
WORD_CHARS(MAX_BIT_RATE), /* 13 dwMaxBitRate */
WORD_CHARS(MAX_FRAME_SIZE), /* 17 dwMaxVideoFrameBufSize */
WORD_CHARS(FRAME_INTERVAL), /* 21 dwDefaultFrameInterval (in 100ns units) */
0x01, /* 25 bFrameIntervalType */
WORD_CHARS(FRAME_INTERVAL), /* 26 dwFrameInterval (in 100ns units) */
/* USB Video resolution */
#define BITS_PER_PIXEL 16
#define WIDTH 480
#define HEIGHT 320
/* Frame rate */
#define FPS 30
#define MAX_FRAME_SIZE (WIDTH * HEIGHT * BITS_PER_PIXEL / 8)
#define MIN_BIT_RATE (MAX_FRAME_SIZE * FPS * 8)
#define MAX_BIT_RATE (MIN_BIT_RATE)
#define PAYLOAD_SIZE (1 * 1024)
/* Interval defined in 100ns units */
#define FRAME_INTERVAL (10000000/FPS)
该接口的另一个备用设置具有数据流等时端点,它是操作备用设置。在这种替代设置中,不会重复特定于类的描述符。
/* Standard VS Isochronous Video Data Endpoint Descriptor */
0x07, /* 0 bLength */
USB_DESCTYPE_ENDPOINT, /* 1 bDescriptorType */
(VIDEO_DATA_EP_NUM | 0x80), /* 2 bEndpointAddress - IN Endpoint */
0x05, /* 3 bmAttributes - Isochronous EP (Asynchronous) */
0x00, 0x04, /* 4 wMaxPacketSize 1x 1024 bytes*/
0x01, /* 6 bInterval */
上面的代码显示,端点的最大数据包大小为1024字节,0x01的“bInterval”请求主机在每个微帧(125us)轮询端点。
一般来说,USB 视频设备支持一组视频参数组合(包括视频格式、帧大小和帧速率)以及具有不同最大数据包大小端点的多种备用设置。这使主机能够选择适当的备用设置,该设置仅提供给定视频参数组合所需的带宽。