1引言
1.1目的
本文档详细描述了符合视频设备类规范的USB视频设备的示例实现。本文档是作为USB视频设备类规范的实现者提供的,因此仅提供信息。如果本文件与规范之间出现冲突,则该规范应优先考虑。
1.2相关文件
USB规范修订2.0,2000年4月27日,www.usb.org
USB设备类定义,www.usb.org
接口关联描述符ECN,www.usb.org
2桌面摄像机示例
2.1产品说明
本节中描述的设备是一个全速桌面摄像机(或“网络摄像头”)。该特定的实现有两个视频源,一个CCD传感器和一个设备上的复合输入连接器,可以通过使用设备上的选择单元来切换。它以单帧速率(15帧每秒)的单帧大小(176x144)将视频数据传输到主机,并作为异步源,使用其内部时钟作为参考。它能够通知主机的按钮按下事件以触发静止图像捕获(使用方法1),并包含一个能够调整视频流的亮度水平的处理单元。这个示例实现将假定我们使用一个视频接口集合。视频控制接口(接口编号0)和视频流媒体接口(接口编号1)是此视频接口集合的一部分。
下图表示了相机的内部拓扑结构。
图2-1 USB摄像机拓扑结构
视频功能包含两个输入端子,一个代表传感器,另一个代表复合视频输入连接器。这些终端捕获的视频流经过任何必要的模拟数字转换,并路由到选择单元。然后将所选的视频流发送到处理单元以进行视频信号处理。输出被路由到单个输出终端,该输出终端通过USB IN端点将视频流传输到主机。此端点是该设备所包含的单个视频流媒体接口的一部分。
视频功能(单元和终端拓扑)的内部结构通过(强制性的)视频控制界面呈现给主机。
2.2描述符层次结构
此USB摄像设备使用一个视频接口集合,其中包括视频控制接口(接口0)和单个视频流媒体接口(接口1)。视频流媒体界面有两个不同的设置。第一个替代设置(0)与之相关的带宽为零(这意味着缺少一个等时端点),因此切换到这个替代设置可以释放此设备在USB上已分配的所有带宽。备用设置1是接口的操作部分,它包含了向主机提供视频数据的同步端点。
此图显示了描述符的层次结构。
图2-2 USB摄像机描述器层次结构
2.3描述符
以下部分介绍了用于描述该设备的所有描述符。
2.3.1设备描述符
偏移 | 名称 | 字节数 | 数值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x12
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x01
|
设备描述符 |
2 |
bcdUSB
|
2 |
0x0200
|
2.00-USB规范的当前修订版本,低8位在前,高八位在后 |
4 |
bDeviceClass
|
1 |
0xEF
|
其他设备类别 |
5 |
bDeviceSubClass
|
1 |
0x02
|
通用类 |
6 |
bDeviceProtocol
|
1 |
0x01
|
接口关联描述符 |
7 |
bMaxPacketSize0
|
1 |
0x40
|
控制端点数据包大小为64字节(写得0x08是1.1版本协议,1.5版本是64) |
8 |
idVendor
|
2 |
0xXXXX
|
供应商ID(程序里都是0x0483) |
10 |
idProduct
|
2 |
0xXXXX
|
产品ID(程序里都是0x5740) |
12 |
bcdDevice
|
2 |
0xXXXX
|
设备发布代码(程序里都是0x0200) |
14 |
iManufacturer
|
1 |
0x01
|
索引到单一码中包含字符串<Your Name>的字符串描述符 |
15 |
iProduct
|
1 |
0x02
|
索引到字符串中包含Unicode中的<您的产品名称>的字符串描述符 |
16 |
iSerialNumber
|
1 |
0x00
|
未使用 |
17 |
bNumConfigurations
|
1 |
0x01
|
一个配置 |
2.3.2配置描述符
偏移 | 名称 | 字节数 | 数值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x09
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x02
|
配置描述符 |
2 |
wTotalLength
|
2 |
0x00C0
|
总配置块的长度,包括此描述符,单位为字节 |
4 |
bNumInterfaces
|
1 |
0x02
|
此设备有两个接口 |
5 |
bConfigurationValue
|
1 |
0x01
|
此配置的ID |
6 |
iConfiguration
|
1 |
0x00
|
未使用 |
7 |
bmAttributes
|
1 |
0x80
|
由总线供电的设备,无远程唤醒功能 |
8 |
bMaxPower
|
1 |
0xFA
|
最大功耗为500 mA,单位是2mA |
2.3.3接口关联描述符
此设备使用接口关联描述符来描述其视频接口集合。
偏移 | 名称 | 字节数 | 数值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x08
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x0B
|
接口关联描述符 |
2 |
bFirstInterface
|
1 |
0x00
|
与此功能相关联的视频控制接口的接口编号 |
3 |
bInterfaceCount
|
1 |
0x02
|
与此功能关联的连续视频接口数 |
4 |
bFunctionClass
|
1 |
0x0E
|
CC_VIDEO
|
5 |
bFunctionSubClass
|
1 |
0x03
|
SC_VIDEO_INTERFACE_COLLECTIO
N
|
6 |
bFunctionProtocol
|
1 |
0x00
|
未使用。必须设置为PC_PROTOCOL_UNDEFINED。 |
7 |
iFunction
|
1 |
0x02
|
索引到字符串中包含Unicode中的<您的产品名称>的字符串描述符。必须匹配标准VC接口描述符中的i接口字段。 |
2.3.4视频控制接口描述符
视频控制接口描述设备结构(视频功能拓扑),并用于操作视频控制。
2.3.4.1标准VC接口描述符
视频控制接口没有与之相关联的专用端点。它使用默认管道(端点0)用于所有通信目的,但事件通知除外,在这种情况下将使用中断端点。使用默认管道发送特定于类的视频控制请求。
偏移 | 名称 | 字节数 | 数值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x09
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x04
|
接口描述符类型 |
2 |
bInterfaceNumber
|
1 |
0x00
|
此接口的索引 |
3 |
bAlternateSetting
|
1 |
0x00
|
此设置的索引 |
4 |
bNumEndpoints
|
1 |
0x01
|
1个端点(中断端点) |
5 |
bInterfaceClass
|
1 |
0x0E
|
CC_VIDEO
|
6 |
bInterfaceSubClass
|
1 |
0x01
|
SC_VIDEOCONTROL
|
7 |
bInterfaceProtocol
|
1 |
0x00
|
PC_PROTOCOL_15 (1.1版本
未使用。必须设置为PC_PROTOCOL_UNDEFINED) |
8 |
iInterface
|
1 |
0x02
|
索引到字符串中包含Unicode中的<您的产品名称>的字符串描述符。必须匹配标准视频接口功能字段的采集IAD |
2.3.4.2类特定的VC接口描述符
类特定的VC接口描述符总是由一个头描述符领导,其中包含关于视频控制接口的一般信息。它包含了描述与所描述的视频功能相关联的视频接口集合所需的所有指针。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 | 0x0D | 此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 | 0x24 |
CS_INTERFACE
|
2 |
bDescriptorSubType
|
1 | 0x01 |
VC_HEADER subtype
|
3 |
bcdUVC
|
2 | 0x0150 | 设备符合视频类规范1.5。(0x0110,设备符合视频类规范1.1。) |
5 |
wTotalLength
|
2 | 0x0042 | 特定于类的描述符的总大小 |
7 |
dwClockFrequency
|
4 | 0x005B8D80 | 已不赞成使用此字段。该设备将提供时间戳和一个基于6MHz时钟的设备时钟参考。 |
11 |
bInCollection
|
1 | 0X01 | 流媒体接口的数量。 |
12 |
baInterfaceNr(1)
|
1 | 0X01 | 视频流媒体接口1属于这个视频控制接口 |
2.3.4.3输入终端描述符(摄像机)
此描述符描述表示CCD传感器(以及相关的A/D转换器)的输入终端。由此产生的数字视频流通过单个输出引脚离开输入终端。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x11
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x24
|
CS_INTERFACE
|
2 |
bDescriptorSubtype
|
1 |
0x02
|
VC_INPUT_TERMINAL
|
3 |
bTerminalID
|
1 |
0x01
|
此输入终端的ID |
4 |
wTerminalType
|
2 |
0x0201
|
ITT_CAMERA,这个终端表示CCD传感器的相机终端。
|
6 |
bAssocTerminal
|
1 |
0x00
|
无关联 |
7 |
iTerminal
|
1 |
0x00
|
未使用 |
8 |
wObjectiveFocalLengthMin
|
2 |
0x0000
|
不支持光学变焦 |
10 |
wObjectiveFocalLengthMax
|
2 |
0x0000
|
不支持光学变焦 |
12 |
wOcularFocalLength
|
2 |
0x0000
|
不支持光学变焦 |
14 |
bControlSize
|
1 |
0x02
|
bmContorsls的大小为2字节(此终端不实现任何控件)。 |
15 |
bmControls
|
2 |
0x0000
|
不支持控件 |
2.3.4.4输入终端描述符(复合)
此描述符描述表示复合视频输入连接器(以及相关的A/D转换器)的输入终端。由此产生的数字视频流通过单个输出引脚离开输入终端。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x08
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x24
|
CS_INTERFACE
|
2 |
bDescriptorSubtype
|
1 |
0x02
|
VC_INPUT_TERMINAL
|
3 |
bTerminalID
|
1 |
0x02
|
此输入终端的ID |
4 |
wTerminalType
|
2 |
0x0401
|
COMPOSITE_CONNECTOR.此端子是复合连接器。
|
6 |
bAssocTerminal
|
1 |
0x00
|
无关联 |
7 |
iTerminal
|
1 |
0x00
|
未使用 |
2.3.4.5输出终端描述符
此描述符描述表示到主机的USB管道的输出终端。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x09
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x24
|
CS_INTERFACE
|
2 |
bDescriptorSubtype
|
1 |
0x03
|
VC_OUTPUT_TERMINAL
|
3 |
bTerminalID
|
1 |
0x03
|
此终端的ID |
4 |
wTerminalType
|
2 |
0x0101
|
TT_STREAMING.该终端是一个USB流媒体终端
|
6 |
bAssocTerminal
|
1 |
0x00
|
无关联 |
7 |
bSourceID
|
1 |
0x05
|
该单元输入引脚连接到0x05输出 |
8 |
iTerminal
|
1 | 0x00 | 未使用 |
2.3.4.6选择器单元描述符
此描述符描述了连接到处理单元的选择器单元。可以选择CCD传感器或复合视频连接器作为输入。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1
|
0x08 | 此描述符的大小,以字节为单位 |
1 |
bDescriptorType
|
1 | 0x24 |
CS_INTERFACE
|
2 |
bDescriptorSubtype
|
1 |
0x04
|
VC_SELECTOR_UNIT
|
3 |
bUnitID
|
1 |
0x04
|
此单元的ID |
4 |
bNrInPins
|
1 |
0x02
|
输入引脚数量 |
5 |
baSourceID(1)
|
1 |
0x01
|
该单元的输入1连接到单元ID0x01-相机终端(CMOS传感器)。 |
6 |
baSourceID(2)
|
1 |
0x02
|
此单元的输入2已连接到单元ID0x02-复合连接器。 |
7 | iSelector | 1 |
0x00
|
未使用 |
2.3.4.7处理单元描述符
此描述符描述了处理由选择器单元传递的视频流数据的处理单元。此实现所支持的唯一控制是亮度控制。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x0C
|
此描述符的大小,以字节表示。 (1.1是0x0B) |
1 |
bDescriptorType
|
1 |
0x24
|
CS_INTERFACE
|
2 |
bDescriptorSubtype
|
1 |
0x05
|
VC_PROCESSING_UNIT
|
3 |
bUnitID
|
1 |
0x05
|
此单元的ID |
4 |
bSourceID
|
1 |
0x04
|
该单元的此输入引脚连接到ID为0x04的单元的输出引脚。 |
5 |
wMaxMultiplier
|
2 |
0x0000
|
未使用 |
7 |
bControlSize
|
1 |
0x03
|
bmControls字段的大小,单位为字节。(1.1是0x02) |
8 |
bmControls
|
2 |
0x0001
|
支持亮度控制 |
10 |
iProcessing
|
1 |
0x00
|
未使用 |
11 |
bmVideoStandards
|
1 | 0x00 | 未使用 |
2.3.4.8标准中断端点描述符
此描述符描述用于状态返回的中断端点,在这种情况下,可通知主机有关按钮按下事件。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x07
|
此描述符的大小,以字节为单位 |
1 |
bDescriptorType
|
1 |
0x05
|
端点描述符 |
2 |
bEndpointAddress
|
1 |
0x81
|
IN端点1 |
3 |
bmAttributes
|
1 |
0x03
|
中断传输类型 |
4 |
wMaxPacketSize
|
2 |
0x0040
|
64字节状态包 |
6 |
bInterval
|
1 |
0x20
|
至少每32个ms投票一次。 |
2.3.4.9特定于类的中断端点描述符
此描述符描述了中断的特定于类的信息。
偏移 | 名称 | 字节数 | 值 | 描述 |
---|---|---|---|---|
0 |
bLength
|
1 |
0x05
|
此描述符的大小,以字节表示。 |
1 |
bDescriptorType
|
1 |
0x05
|
CS_ENDPOINT
|
2 |
bDescriptorSubType
|
1 |
0x03
|
EP_INTERRUPT
|
3 |
wMaxTransferSize
|
2 |
0x0040
|
64字节状态包 |
2.3.5视频流接口描述符
视频流界面有两种可能的替代设置,0和1。
2.3.5.1零带宽备用设置0
备用设置0是一个零带宽设置,用于在设备不使用时放弃总线上所要求的带宽。这是开机后的默认设置。零带宽设置意味着在备用0中省略了一个同步端点。这个替代设置还包括描述设备的视频流格式功能的类特定格式和帧描述符。