UVC规范(USB摄像头)
+ -

UVC 负载数据头 Payload Header Information-摄像头数据包格式分析

2020-10-29 511 34
UVC学习笔记是以最新的UVC1.5为基础,带你学习和了解最新的UVC规范和协议。

UVC数据传输时,每次USB传输,数据包中有一个负载数据头(Payload Header Information),数据头后为有效的数据。其数据包格式见图:

UVC数据格式

负载数据头为最大为12个字节,包括固定的前2字节的负载数据头和10个字节的扩展负载数据头。

数据偏移 数据标识 长度 数据类型 描述
0 bHeaderLength 1 数字 负载数据长(包括bHeaderLength)
1 bmHeaderInfo 1 位图 采样数据的信息
/ dwPresentationTime 4 数字 时间戳(PTS)
/ scrSourceClock 6 数字 设备时钟源
Offset Field Size Value Description
0 bHeaderLength 1 Number 有效负载头的长度(以字节为单位),包括此字段。
1 bmHeaderInfo 1 Bitmap 提供有关标题后面的示例数据的信息,以及此标题中可选标题字段的可用性。
D0: Frame ID – 对于基于帧的格式,每当新的视频帧开始时,该位在0和1之间切换。 对于基于流的格式,在每个新的特定于编解码器的段的开头,该位在0和1之间切换。 此行为对于基于帧的有效载荷格式(例如DV)是必需的,对于基于流的有效载荷格式(例如MPEG-2 TS)是可选的。 对于基于流的格式,必须通过“视频探测和提交”控件的bmFramingInfo字段指示对此位的支持(请参见第4.3.1.1节“视频探测和提交控件”)。
D1: End of Frame – 如果以下有效负载数据标记了当前视频或静止图像帧的结束(对于基于帧的格式),或者指示编解码器特定的段的结束(对于基于流的格式),则该位置1。 对于所有有效负载格式,此行为都是可选的。 对于基于流的格式,必须通过“视频探测和提交控件”的bmFramingInfo字段指示对此位的支持(请参见第4.3.1.1节“视频探测和提交控件”)。
D2: Presentation Time – 如果dwPresentationTime字段作为标头的一部分发送,则此位置1。
D3: Source Clock Reference – 如果dwSourceClock字段作为标头的一部分发送,则此位置1。
D4: 有效负载特定位。 请参阅各个有效负载规格以进行使用。
D5: Still Image – 如果随后的数据是静止图像帧的一部分,则设置此位,并且仅用于静止图像捕获的方法2和3。 对于时间编码格式,该位指示随后的数据是帧内编码帧的一部分。
D6: Error – 如果此有效载荷的视频或静止图像传输出错,则设置此位。 流错误代码控件将反映错误原因。
D7: End of header – 如果这是数据包中的最后一个报头组,则设置此位,其中报头组引用此字段以及由该字段中的位标识的任何可选字段(为将来的扩展定义)。
  • bHeaderLength占一个字节,表示帧头的数据长度(包括自己)。
  • bmHeaderInfo 占一个字节,表示的信息比较多。

    • BIT0:经常在0和1之间切换。每次切换表示一个新帧数据的产生。
    • BIT1:帧的结束标志位。这个是可选的。
    • BIT2:如果标识为1,说明 dwPresentationTime有效并被传输。
    • BIT3:如果标识为1,说明dwSourceClock有效并被传输。
    • BIT4:特定位,详见 individual payload specifications的用法。
    • BIT5:如果为1,表示后面的为抓取的静态图片数据,仅支持2,3方法
    • BIT6:如果为1,表示传输错误. 如果此有效载荷的视频或静止图像传输出错,则设置此位。 流错误代码控件将反映错误原因。
    • BIT7:如果为1,表示是负载数据头的最后一个字节,即bHeaderLength=2.
  • dwPresentationTime占4个字节:
    演示时间戳(PTS)。设备中的源时钟,帧捕获时的时钟。

  • scrSourceClock 占6个字节,包含2部分:

    • D31..D0: Source Time Clock in nativedevice clock units
    • D42..D32: 1KHz SOF token counter
    • D47..D43: Reserved, set to zero

在以下情况下,则dwPresentationTime and dwSourceClock 必须有效。

  • 设备有多个视频或者音频源;
  • 音视频需要同步的;
  • 视频流中不包含同步信息;

负载数据头布局

以下是对未压缩流的包头格式的描述。长度48位

HLE     |                  Header Length                |
--------------------------------------------------------
BFH[0]  | EOH | ERR | STI | RES | SCR | PTS | EOF | FID |
--------------------------------------------------------
PTS     |                   PTS [7:0]                   |
        |                   PTS [15:8]                  |
        |                   PTS [23:16]                 |
        |                   PTS [31:24]                 |
--------------------------------------------------------
SCR     |                   SCR [7:0]                   |
        |                   SCR [15:8]                  |
        |                   SCR [23:16]                 |
        |                   SCR [31:24]                 |
        |                   SCR [39:32]                 |
        |                   SCR [47:40]                 |
  • HLE,标头长度字段,标头长度字段指定标头的长度(以字节为单位)。
  • BFH,位字段头字段
    • FID: 帧标识符,该位在每个帧起始边界处切换,并在其余帧中保持不变。
    • EOF: 帧结束,该位指示视频帧的结束,并在属于帧的最后一个视频样本中设置。
    • PTS: Presentation Time Stamp,该位置1时表示存在PTS字段。
    • SCR: 源时钟参考,该位置1时表示存在SCR字段。
    • RES: 保留,设置为0。
    • STI: 静止图像,置位时,将视频样本标识为属于静止图像。
    • ERR: 错误位,该位置1时,表明设备流中存在错误。
    • EOH: 标头结尾,该位置1时,指示BFH字段的结尾。
  • PTS,图像时间戳记(PTS)字段。当BFH[0]字段中的PTS位置1时,将显示PTS字段。 请参见“视频设备的USB设备类别定义”规范中的第2.4.3.3节“视频和静止图像有效载荷标题”。
  • SCR,源时钟参考(SCR)字段。当在BFH [0]字段中设置SCR位时,将出现SCR字段。 请参见“视频设备的USB设备类别定义”规范中的第2.4.3.3节“视频和静止图像有效载荷标题”。

PTS

图像时间戳(PTS)。

开始原始帧捕获时,以本机设备时钟为单位的源时钟时间。 对于包括单个视频帧的多个有效载荷传输,可以重复此字段,但要限制该值在整个视频帧中保持相同。PTS与视频探针控制响应的dwClockFrequency字段中指定的单位相同。

SCR

由两部分组成的源时钟参考(SCR)值

  • D31..D0:本机设备时钟单元中的源时间时钟
  • D42..D32:1KHz SOF令牌计数器
  • D47..D43:保留,设置为零。

最低有效的32位(D31..D0)包含从源处的系统时间时钟(STC)采样的时钟值。时钟分辨率应根据本规范表4-47中定义的设备的探测和提交响应的dwClockFrequency字段。该值应符合相关的流有效载荷规范。采样STC的时间必须与USB总线时钟相关联。

为此,SCR的下一个最高11位(D42..D32)包含一个1 KHz SOF计数器,表示在对STC进行采样时的帧号。在任意SOF边界对STC进行采样。SOF计数器的大小和频率与与USB SOF令牌关联的帧号相同。但是,不需要匹配当前的帧号。这允许使用可以触发SOF令牌(但无法准确获取帧号)的芯片组来实现,以保留其自己的帧计数器。

保留最高有效的5位(D47..D43),并且必须将其设置为零。

包含SCR值的有效负载报头之间的最大间隔为100ms或视频帧间隔,以较大者为准。 允许间隔更短。


H264视频和静态图像有效载荷帧头数据示例

下面我们通过BUSBOUD抓取一个H264摄像头的数据并进行分析举例,这里我们每包只抓取前16个字节

  30.3  IN     0c 0c 00 00  00 00 00 00  00 00 00 00  00 00 00 01 
  30.3  IN     0c 0c 00 00  00 00 00 00  00 00 00 00  2f fa b1 0a 
  30.3  IN     0c 0c 00 00  00 00 00 00  00 00 00 00  69 c8 92 51 
  30.3  IN     0c 0e 00 00  00 00 00 00  00 00 00 00  ed e7 3e 2c 
  30    IN                                                        
  30.3  IN     0c 0d 00 00  00 00 00 00  00 00 00 00  00 00 00 01 
  30.3  IN     0c 0d 00 00  00 00 00 00  00 00 00 00  ae 0c 8e 63 
  30.3  IN     0c 0d 00 00  00 00 00 00  00 00 00 00  63 68 78 d0 
  30.3  IN     0c 0f 00 00  00 00 00 00  00 00 00 00  d0 93 b5 aa 
  30    IN                                                        
  30.3  IN     0c 0c 00 00  00 00 00 00  00 00 00 00  00 00 00 01 
  30.3  IN     0c 0c 00 00  00 00 00 00  00 00 00 00  df ac 8a 22 
  30.3  IN     0c 0c 00 00  00 00 00 00  00 00 00 00  55 e3 23 cc 
  30.3  IN     0c 0e 00 00  00 00 00 00  00 00 00 00  3c f8 30 f4

可以看到,视频图像数据负载头长度为0x0c12个字节。
通过第二个字节的变化,可知抓取了3帧视频帧的数据,每帧数据分为4包。
第一帧从0C变成0E,其中起始帧位位0,变成0E后,结束帧置位。
第二帧从0d开始,可以看到起始帧位从第一帧的0变成了1.
而BIT2和BIT3都存在,却被填充了00.

YUV2视频和静态图像有效载荷帧头数据示例

每包只抓取前16个字节

Device  Phase  Data                                               
------  -----  ---------------------------------------------------
   6.1  IN     0c 0f 00 20  00 00 00 20  00 00 00 20  df 80 df 83 
   6.1  IN     0c 0e 01 20  00 00 01 20  00 00 01 20  e0 80 e0 83 
   6.1  IN     0c 0f 02 20  00 00 02 20  00 00 02 20  df 80 dd 83 
   6.1  IN     0c 0e 03 20  00 00 03 20  00 00 03 20  e3 7f e4 83 
   6.1  IN     0c 0f 04 20  00 00 04 20  00 00 04 20  df 80 e0 83 
   6.1  IN     0c 0e 05 20  00 00 05 20  00 00 05 20  e4 7f e0 83 
   6.1  IN     0c 0f 06 20  00 00 06 20  00 00 06 20  e2 80 de 83 
   6.1  IN     0c 0e 07 20  00 00 07 20  00 00 07 20  e2 7f e1 83 
   6.1  IN     0c 0f 08 20  00 00 08 20  00 00 08 20  e1 7f e1 83 
   6.1  IN     0c 0e 09 20  00 00 09 20  00 00 09 20  e0 7f e0 82 
   6.1  IN     0c 0f 0a 20  00 00 0a 20  00 00 0a 20  df 7f df 83
作者使用windows开发UVC摄像头驱动,欢迎加入字节流官方QQ群:952873936或联系站长进行技术交流。
字节流是站长多年来的工作经验和技术总结,和站长一起学习,每天都有进步。

0 篇笔记 写笔记

UVC 负载数据头
UVC数据传输时,每次USB传输,数据包中有一个负载数据头(Payload Header Information),数据头后为有效的数据。其数据包格式见图:负载数据头为最大为12个字节,包括固定的前2字节的负载数据头和10个字节的扩展负载数据头。数据偏移数据标识长度数据类型描述0bHeaderLen......
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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