1、获得设备信息
Subtype为0x01,表示为VC_HEADER,UVC协议版本号为0x0100,即1.00。VC类特征描述符信息返回的总字节数为0x004E,即78。时钟频率为0x00e4e1c0,即15Mhz,VS接口数为1,第一个VS接口的接口序号为1.
Subtype为0x03,表示为VC_OUTPUT_TERMINAL,终端标识号ID为0x03,终端类型为0x0101,即TT_STREAMING.该输出终端没有内部输入终端与之连接。该终端连接的单元或终端的ID为0x04,该终端没有字符描述。
VC扩展单元描述符:subtype为0x06,即表示VC_EXTENSION_UNIT,单元ID为0x04,供应商特征ID为8CA72912-B4479440-B0CEDB07-386FB938 。该扩展单元支持的控制数为0x02,即2,单元支持的输入脚有1个。该扩展单元第一个输入脚所连接的终端ID为0x02,bmControls的大小为2,bmControls的内容为0x0600,没有关于该扩展单元的字符描述。
Subtype为0x02,表示为VC_INPUT_TERMINAL,终端标识号ID为0x01,终端类型为0x0201,即ITT_CAMERA.该输出终端没有内部输入终端与之连接,该终端没有字符描述。
Subtype为0x05,表示为VC_PROCESSING_UNIT,单元ID为0x02,与该终端连接的单元ID为0x01,不支持数字乘法器,该单元支持的bmControls的大小为2,内容为0x177f,可能摄像头使用老版本UVC1.0协议的原因,有些字段对不上,这里我们只看低16位就好。字符串描述0x7ADC7BF0。
描述符类型为0x25,即CS_ENDPOINT,Subtype为0x03,即EP_INTERRUPT,该中断端点支持的最大发送结构大小为0x0010,即16字节。
描述符类型为0x24,即CS_INTERFACE,Subtype为0x01,即VS_INPUT_HEADER,视频载荷类型,即payload类型只有1种,VS描述符返回信息的总长度为0x0057,即87字节。Isochronous[等时]或bulk[批量]传输端点地址为0x01,方向为输入[对host而言是输入]。支持动态格式转换,该终端连接的终端ID为0x03,支持静态图片捕获和硬件触发,静态图像捕获初始化,bmControls大小为1,内容为1.
这里CS_INTERFACE即是0x24,VS_FORMAT_UNCOMPRESSED即是0x04,格式描述符索引号为0x01,后跟的帧描述符有共有2个,流编码格式GUID号为59555932-1000-800000AA-389B71
,也就是如下所示的YUV2格式.像素位数为0x10,即16位,默认的帧索引为0x01,x/y维的透明度均为0,即不透明。Interlaceflags值取0,参照上面各位含义理解。拷贝权限为0,即无限制。
这里0x05即VS_FRAME_UNCOMPRESSED,帧描述符索引号为0x01,不支持静态图像和固定帧率,待解码图像的宽度为0x00A0,即160,高度为0x0078,即120,最小传输比特率为0x002EE000
,即384 KB/s,最大传输速率为0x002EE000,即384 KB/s,需要的最大帧缓冲大小为0x00009600 ,即38,400byte,默认帧间隔时间为0x00F4240,即100 ms,帧间隔类型个数为0x01,即支持1种离散帧间隔。对应的帧率分别为10fps
这里0x03即VS_STILL_IMAGE_FRAME,支持静态图像和固定帧率,bEndpointAddress为0,wWidth(1) *wHight(1)图像的大小为160*120。bNumCompressionPatterns为00即 不压缩。
0x0D即为VS_COLORFORMAT,相信各位读者对此已毫无疑问,不然,可以自己去搜搜文档内部这个标识了。这里基色用的是默认的BT.709,即0x01,Gamma校正也是选取的默认BT709,什么你不清楚什么是Gamma校正,请参考文档【USB经典博文\理解伽马(Gamma).pdf】。亮度和色彩转换系数矩阵采用的是默认值BT601。
Interface Descriptor 1/1 Video,接口1的第二种模式选择,注意端点包大小的变化,此处为128bytes
端点地址为0x01,采用异步等时输入[对于host来说是输入]。TransferType=Isochronous SyncType=Asynchronous,1 ms
Interface Descriptor 1/2Video,接口1的第三种模式选择,注意端点包大小的变化,此处为256bytes
端点地址为0x01,采用异步等时输入[对于host来说是输入]。TransferType=Isochronous SyncType=Asynchronous,1 ms
Interface Descriptor 1/3Video,接口1的第四种模式选择,注意端点包大小的变化,此处为384Bytes。
端点地址为0x01,采用异步等时输入[对于host来说是输入]。TransferType=Isochronous SyncType=Asynchronous,1 ms
Interface Descriptor 1/4Video,接口1的第五种模式选择,注意端点包大小的变化,此处为512Bytes
端点地址为0x01,采用异步等时输入[对于host来说是输入]。TransferType=Isochronous SyncType=Asynchronous,1 ms
Interface Descriptor 1/5Video,接口1的第六种模式选择,端点包大小为768Bytes
端点地址为0x01,采用异步等时输入[对于host来说是输入]。TransferType=Isochronous SyncType=Asynchronous,1 ms
Interface Descriptor 1/6Video,接口1的第七种模式选择,端点包大小为780Bytes
端点地址为0x01,采用异步等时输入[对于host来说是输入]。TransferType=Isochronous SyncType=Asynchronous,1 ms
Interface Descriptor 1/7Video,接口1的第八种模式选择,端点包大小为800Bytes
端点地址为0x01,采用异步等时输入[对于host来说是输入]。TransferType=Isochronous SyncType=Asynchronous,1 ms
关于Video嗅探和提交这块的内容有些多,读者可以自行翻阅【官方文档\USB_Video_Class_1_1_090711\USB Video Class1_1\USB_Video_Class_1.1.pdf】103页开始的内容。根据当中的内容,我们知道数据流参数的选择是基于一种共享形式的协商模型,共享的双方是
Host和视频流接口。当在嗅探[probe]过程中,一组流参数被成功接收,提交控制器[commit]就会从嗅探控制器中获取这组协商参数来配置硬件。如下图分别是同步传输协商成功和失败的流程图:
了解了嗅探提交协商的流程,我们来分析以下返回数据,前两个字节为bmHint定参设置,这里0x0000,表示没有定参,接下来0x01,表示使用流格式描述符中的第一种流格式,这里只有YUV2这一种流格式可供选取。0x01表示帧格式分辨率选取,这里选择第一种帧分辨率,即0.0001s,帧间隔时间为0x10000000 ,IPB帧是H264视频流格式中里要用到的概念,关键帧,运动帧,YUV2输出并没有用到这些内容,所以这里直接将这些字段取0了。wCompWindowSize值为0x0000,wDelay值为0x0004,即内部视频流延迟时间为4.最大视频帧所占空间为0x0009600,即38400Byte。单个载荷数据包能传输的最大字节数为0x00000200,即512字节。
第二条指令,从host发送到端点0,要求后续数据流方向为从host输出到设备。这是一条SET_CUR命令,设置的是接口1.实体0的当前属性,即设置Video Streaming的接口,设置的内容共26字节长度,以上指令执行的顺序从这里看是符合我们上面提到的嗅探提交流程的。