UVC调试笔记
+ -

打开UVC摄像头(特定类请求)数据分析

2020-10-29 625 0
欢迎加入官方QQ群:952873936或联系站长进行技术交流。

通过上节可以知道,设备支持4种的视频格式,且每种格式如下:

MPJPG数据格式
bFormatIndex bFrameIndex 分辩率及及帧率
1 1 640x480x(30,15,10)
1 2 1280x720x(30,15,10)
1 3 1920x1080x(30,15,10)

该UVC摄像头中MJPG格式的最分辨率为1920x1080,最小分辨率为 640x480。

YUV数据格式
bFormatIndex bFrameIndex 分辩率及及帧率
2 1 640x480
2 2 1280x720

该UVC摄像头中YUV数据格式的最分辨率为1280x720,最小分辨率为 640x480。

H264数据格式
bFormatIndex bFrameIndex 分辩率及及帧率
3 1 640x480
3 2 1280x720
3 3 1920x1080

该UVC摄像头中H264数据格式的最分辨率为1920x1080,最小分辨率为 640x480。

H265数据格式
bFormatIndex bFrameIndex 分辩率及及帧率
4 1 640x480
4 2 1280x720
4 3 1920x1080

该UVC摄像头中H265数据格式的最分辨率为1920x1080,最小分辨率为 640x480。

默认格式打开

现在我们使用默认的数据格式打开摄像头,通过BUSHound抓包分析:

BUSHOUND是一款WINDOWS抓包软件,这里我们使用分析UVC数据包格式。

-----  ---------------------------------------------------------------------------------------------
第1组
CTL    a1 81 00 01  01 00 1a 00          GET CUR        
IN     01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 0c  00 00   

第2组
CTL    21 01 00 01  01 00 1a 00         SET CUR        
OUT    01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 00  00 00

第3组
CTL    a1 81 00 01  01 00 1a 00         GET CUR        
IN     01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 0c  00 00  

第4组
CTL    a1 83 00 01  01 00 1a 00         GET MAX        
IN     00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00

第5组
CTL    a1 82 00 01  01 00 1a 00         GET MIN        
IN     00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00

第6组
CTL    21 01 00 01  01 00 1a 00        SET CUR        
OUT    01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 00  00 00           

第7组
CTL    a1 81 00 01  01 00 1a 00        GET CUR        
IN     01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 0c  00 00           

第8组
CTL    21 01 00 02  01 00 1a 00        SET CUR        
OUT    01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 0c  00 00           

第9组
CTL    01 0b 01 00  01 00 00 00       SET INTERFACE

第4组和第5组分别获取最大和最小参数值,这里全返回的是00.
可以看到,数据包的大小为26字节,使用的是UVC1.0协议。
对照视频流控制接口请求UVC 特定类请求 我们进行数据分析。

第一组请求:GET_CUR,数据为

CTL    a1 81 00 01  01 00 1a 00          GET CUR        
IN     01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 0c  00 00

控制数据:

  • a1:表示获取接口数据
  • 81:表示GET_CUR
  • 00 01:高位为01,低为为00,表示视频流控制接口选择子CS的VS_PROBE_CONTROL请求。
  • 01 00:表示接口01,表示发向的是视频流接口(通过上节可知,视频控制接口VC为0,视频流接口VS为01)。
  • 1a 00 :表示接收数据长度为26个字节。

收到的数据:

  • 01 00:参照视频流控制接口,dwFrameInterval=1,指定在视频流传输过程中帧速率不变。
  • 01:bFormatIndex=1,表示视频流格式为1,为MJPG.
  • 03:bFrameIndex=3,表示分辩率为 1920x1080。
  • 15 16 05 00:0x051615=333333百纳秒,即33.3333ms,即帧间隔为33ms.
  • 00 00:即wKeyFrameRate=0x0000,即只有第一帧是关键帧。
  • 00 00:wPFrameRate=0x0000
  • 00 00:wCompQuality=00
  • 00 00 :wCompQuality=00
  • 00 00:wDelay=00,内部视频流接口延迟(毫秒).
  • 8c 0a 00 00:dwMaxVideoFrameSize=0x00000a8c=2700
  • 00 0c 00 00 :dwMaxPayloadTransferSize=0x0c00=3072.

第一组获取的数据是默认的MJPG格式,第二组数据使用SET_CUR,提交当前数据,注意这里使用的选择子还是VS_PROBE_CONTROL。

第三组再次使用GET_CUR获取数据。

第四、第五组使用GET_MIN和GET_MAX返回参数,这里返回的是00.

第六,七组再次获取GET_CUR和设置SET_CUR,数据。

到第八组时,这里改变了选择子,使用了VS_COMMIT_CONTROL选择子,提交上面的参数,以激活视频流接口,表示开始传递数据。

最后一个 SET INTERFACE 是因为视频流接口需要使用端点0X81来读取数据,但此接口处于视频流接口1的转换接口1中,故需要选择接口。

选择H264打开

手动选择打开H264,分辨率为1920x1080x30,抓包分析如下:

Phase  Data                                                                                Description  
-----  ----------------------------------------------------------------------------------- ---------
CTL    a1 81 00 01  01 00 1a 00                                                            GET CUR      
IN     01 00 01 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 0c  00 00 .............

//协商bFormatIndex=3,bFrameIndex=3
CTL    21 01 00 01  01 00 1a 00                                                            SET CUR      
OUT    01 00 03 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 00 8c  0a 00 00 00  00 00 .............

CTL    a1 81 00 01  01 00 1a 00                                                            GET CUR      
IN     01 00 03 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 49 0a  09 00 00 0c  00 00 .............

CTL    a1 83 00 01  01 00 1a 00                                                            GET MAX      
IN     00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 .............

CTL    a1 82 00 01  01 00 1a 00                                                            GET MIN      
IN     00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 .............

CTL    21 01 00 01  01 00 1a 00                                                            SET CUR      
OUT    01 00 03 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 49 0a  09 00 00 00  00 00 .............

CTL    a1 81 00 01  01 00 1a 00                                                            GET CUR      
IN     01 00 03 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 49 0a  09 00 00 0c  00 00 .............

CTL    21 01 00 02  01 00 1a 00                                                            SET CUR      
OUT    01 00 03 03  15 16 05 00  00 00 00 00  00 00 00 00  00 00 49 0a  09 00 00 0c  00 00 .............

CTL    01 0b 01 00  01 00 00 00                                                            SET INTERFACE

通过第一个GET_CUR,可以看到返回的是bFormatIndex=1,bFrameIndex=3,即默认的MJPG格式,但通过SET_CUR协商bFormatIndex=3,bFrameIndex=3,即H264格式。

协调是指在SET_CUR时指出协商的bFormatIndex和bFrameIndex,下次通过GET_CUR即可获取相关的参数。

0 篇笔记 写笔记

打开UVC摄像头(特定类请求)数据分析
通过上节可以知道,设备支持4种的视频格式,且每种格式如下:MPJPG数据格式bFormatIndexbFrameIndex分辩率及及帧率11640x480x(30,15,10)121280x720x(30,15,10)131920x1080x(30,15,10)该UVC摄像头中MJPG格式的最分辨率......
UVC特定类请求get cur返回长度是26或者是34的是什么?
从返回的长度来看,你应该是在应用打开摄像头,进行视频格式及图形分辨率协商返回的数据长度.UVC视频流接口这两个特别重要的选择子,分别用于协商过程和提交数据格式,让固件开始发送数据。ControlSelector ValueVS_PROBE_CONTROL0x01VS_COMMIT_CONTROL0x......
USB标准请求、类特定请求总结
做USB开发,最常见的就是USB的控制请求的那8个字节的分析,如果抓包工具有协议分析那还好说,但是如果不带速协议分析,那其实还是挺郁闷的。所以说,如何快速的通过USB请求的那几个字段定位出是何请求,是可以大大的提高我们的协议分析效率的。USB的请求这里包括USB的标准请求和特定类请求,其包括以下几......
UAC 特定类请求
特定类请求一般用于设置或获取音频控制。这些控制又分为两大部分:音频控制请求:对音频控制单元或终端进行控制。音频流请求: 如对音频流控制的请求,如音频采相率等。音频设备类也支持其他特定于类的请求:内存请求(Memory Request),每个可寻址的实体或终端,可导出一个内存映射接口。提供对该实体内存......
UVC 再议特定类请求
通过特定请求的支持 GET_INFO可以获取设备支持的特定类请求。当然在UVC规范中,有些特定类请求是可选择的,有些是必须的,这种情况因特定类请求的使用环境不同而定。我们知道,特定类请求一般包括:名称值 说明RC_UNDEFINED0x00未定义SET_CUR0x01设置属性GET_CUR0x81获......
USB 标准请求
USB定义了8个字节的标准请求,通过这些请求,可以对设备的状态进行更改或对设备进行枚举。USB的标准请求的数据传输方式都是控制传输方式,所以使用的端点是设备的默认端点0。USB这8个字节的的控制请求并包括传输过程中的数据,但包括了控制请求的数据长度。当数据度为不为0时,设备或主机向对方传输相应长的......
UVC 特定类请求概述
本节我们来讲述UVC的特定类请求。UVC特定类请求的功能UVC特定类请求的主要功能用于控制UVC摄像头,实现对UVC摄像头的打开,关闭及摄像头参数的控制。通过对UVC规范的学习,使用我们可详细的了解UVC是怎样通过这些特定类请求实现对UVC摄像头的控制。UVC特定类请求的分类大多数特定于类的请求用于......
UVC 处理单元特定类请求示例
笔者手中有一UVC摄像头,其处理单元描述符bUnitID为2,其处理单元描述符内容如下: -------- Video Control Processing Unit Descriptor -----------------------bLength ......
U盘枚举失败-该设备无法启动(GET_MAX_LUN请求)
群里有人用STM32搞了一个U盘,但是U盘在插入电脑后在设备管理器是枚举失败。我让他看一下设备状态:又是熟悉的错误码10,表示设备启动失败。设备的启动失败,一般在设备获取描述符获取之后,初始会失败,我之前在弄USB虚拟鼠标的时候也遇到此类情况。不过由于这个设备是U盘,本人还没有研究USB存储协议,只......
BUSHOUND抓包stall pid的USTS c0000004错误
对USB设备进行数据分析,使用最多的也就是BUSHOUND了,不过经常遇到一个问题就是 USTS c0000004 stall pid 错误。USTS c0000004 stall pid在本站中搜......
BOT MASS_STORAGE_RESET
Bulk-Only Mass Storage Reset类特定请求是USB大容量存储设备独有的。 该特定类请求的功能用于复位大容量存储设备和与之关联的接口。通知设备接下来的批量端点输出数据为命令块包(CBW)。由于该请求是控制请求,所以是通过端点0发送的。在设备完成该请求即复位之前,设备应......
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!