UVC MJPEG视频帧描述符
2021-03-31
4656
0
Motion-JPEG视频格式描述符
Offset | Field | Size | Value | Description |
---|---|---|---|---|
0 | bLength | 1 | Number | 此描述符的大小,以字节为单位:11 |
1 | bDescriptorType | 1 | Constant | CS_INTERFACE描述符类型。 |
2 | bDescriptorSubtype | 1 | Constant | VS_FORMAT_MJPEG描述符子类型 |
3 | bFormatIndex | 1 | Number | 该格式描述符的索引 |
4 | bNumFrameDescriptors | 1 | Number | 与此格式相对应的后续帧描述符的数量 |
5 | bmFlags | 1 | Number | 指定此格式的特征 D0: FixedSizeSamples. 1 = 是 所有其他位保留供将来使用,应将其重置为零。 |
6 | bDefaultFrameIndex | 1 | Number | 此流的最佳帧索引(用于选择分辨率) |
7 | bAspectRatioX | 1 | Number | 图片长宽比的X维度。 |
8 | bAspectRatioY | 1 | Number | 图片长宽比的Y维度。 |
9 | bmInterlaceFlags | 1 | Bitmap | 指定隔行信息。 如果此流支持“摄像机终端”中的扫描模式控件,则此字段应反映隔行模式中使用的字段格式。(PAL中的顶部字段是字段1,NTSC中的顶部字段是字段2。): D0: 隔行扫描流或变量。 1 =是 D1: 每帧的字段。 0= 字段2, 1 = 字段1 D2: 字段1优先. 1 = 是 D3: 已预留 D5..4: 字段模式 00 = 仅字段1 01 = 仅字段2 10 = 字段1和2的规则模式 11 = 字段1和2的随机模式 D7..6: 保留。 不使用。 |
10 | bCopyProtect | 1 B | oolean | 指定是否应限制视频流的复制: 0: 无限制 1: 限制重复 |
bFrameIndex字段包含此帧描述符的从一开始的索引,并且主机请求使用它来设置和获取所使用格式的当前帧索引。 对于设备支持的每个相应的格式描述符,此索引都是基于一个的。
支持的帧间隔范围可以是连续范围或一组离散值。 对于连续范围,dwMinFrameInterval,dwMaxFrameInterval和dwFrameIntervalStep指示范围的限制和粒度。 对于离散值,dwFrameInterval(x)字段指示在此帧大小下支持的帧间隔范围(以及帧速率)。 帧间隔是以100ns为单位的单个解码视频帧的平均显示时间。
MJPEG视频帧描述符标识以下内容。
Offset | Field | Size | Value | Description |
---|---|---|---|---|
0 | bLength | 1 | Number | 当bFrameIntervalType为0时,此描述符的大小以字节为单位。当bFrameIntervalType> 0时,此描述符的大小以字节为单位:26+(4 * n) |
1 | bDescriptorType | 1 | Constant | CS_INTERFACE描述符类型 |
2 | bDescriptorSubtype | 1 Constant | VS_FRAME_MJPEG描述符子类型 | |
3 | bFrameIndex | 1 | Number | 该帧描述符的索引 |
4 | bmCapabilities | 1 | Number | D0: 支持静止图像指定此帧设置是否支持静止图像。 这仅适用于具有使用静止图像捕获方法1的IN视频终结点的VS接口,在所有其他情况下应将其设置为0。 D1: 固定帧速率指定设备是否在与此帧描述符关联的流上提供固定帧速率。 如果启用了固定速率,则设置为1;否则,设置为1。 否则,设置为0。 D7..2: 保留,设置为0。 |
5 | wWidth | 2 | Number | 解码后的位图帧的宽度(以像素为单位) |
7 | wHeight | 2 | Number | 解码后的位图帧的高度(以像素为单位) |
9 | dwMinBitRate | 4 | Number | 指定默认压缩质量下的最小比特率和最长帧间隔(以bps为单位),可以以该速率传输数据。 |
13 | dwMaxBitRate | 4 | Number | 指定默认压缩质量下的最大比特率和最短帧间隔(以bps为单位),可以以该速率传输数据。 |
17 | dwMaxVideoFrameBufferSize | 4 | Number | 不建议使用此字段。 指定压缩器将产生的视频(或静止图像)帧的最大字节数。“视频探测和提交”控件的dwMaxVideoFrameSize字段替换此描述符字段。 为了与实现本规范较早版本的主机软件兼容,应选择该字段的值。 |
21 | dwDefaultFrameInterval | 4 | Number | 指定设备要指示用作默认值的帧间隔。 这必须是以下字段中所述的有效帧间隔。 |
25 | bFrameIntervalType | 1 | Number | 指示如何设置帧间隔:0:连续帧间隔1..255:支持的离散帧间隔数(n) |
26… | 请参阅以下帧间隔表。 |
连续帧间隔
Offset | Field | Size | Value | Description |
---|---|---|---|---|
26 | dwMinFrameInterval | 4 | Number | 支持的最短帧间隔(以最高帧速率),以100ns为单位。 |
30 | dwMaxFrameInterval | 4 | Number | 支持的最长帧间隔(最低帧速率),以100ns为单位。 |
34 | dwFrameIntervalStep | 4 | Number | 表示帧间隔范围的粒度,以100ns为单位。 |
离散帧间隔
Offset | Field | Size | Value | Description |
---|---|---|---|---|
26 | dwFrameInterval(1) | 4 | Number | 支持的最短帧间隔(以最高帧速率),以100ns为单位。 |
… | … | … | … | … |
26+(4*n)-4 | dwFrameInterval(n) | 4 | Number | 支持的最长帧间隔(最低帧速率),以100ns为单位。 |
视频样本
每个MJPEG帧均被视为单个视频样本。 视频样本由一个或多个有效载荷传输(如视频设备的USB设备类别规范中定义)组成。
对于同步管道,每个(微)帧将包含单个有效载荷传输。 每次有效负载传输将由一个有效负载报头组成,紧随其后是一个或多个数据事务中的有效负载数据(对于高速高带宽端点,最多为3个数据事务)。
对于散装管道,每个有效载荷传输的第一个散装数据包应在包的开头包含一个有效载荷报头,然后是有效载荷数据,并根据需要扩展到其他散装数据事务。
MJPEG有效载荷信息
MJPEG有效负载的每一帧都通过JPEG压缩进行编码,并在其头之前包含一个标题,该标题包含诸如压缩表和霍夫曼编码表之类的压缩参数的必需和可选定义。 必需和可选参数用“标记”标识,并包含标记段。
每个帧的结构如下。
- SOI (图像开始, 0xFFD8) – 必要
- APPn (应用标记, 0xFFEn) – 可选,除非使用隔行视频,在这种情况下,需要带有“ AVI1”标记和字段ID信息的APP0段。
- DRI (定义重启间隔, 0xFFDD) – 可选
- DQT (定义量化表, 0xFFDB) – 必要
- DHT (定义霍夫曼表, 0xFFC4) – 可选, 如果未指定,则使用JPEG标准(ISO 10918-1)第K.3.3节中指定的标准表。
- SOF0 (帧开始, 0xFFC0)- 必要. 不支持所有其他SOFn段。
- SOS (扫描开始, 0xFFDA) – 必要
- 编码图像数据 – 必要
- RSTn (重新启动次数, 0xFFDn) – 可选
- EOI (图片结尾, 0xFFD9) - 必要
图像数据需要以下内容:
- 颜色编码 - YCbCr
- 每像素位数 - 每个颜色分量8个(在过滤/二次采样之前)
- 二次抽样 - 422
- 基线顺序DCT (SOF0)
- 所有关键帧
MJPG视频帧格式结构体定义
// Motion-JPEG Video Format Descriptor
typedef struct _MJPEG_VIDEO_FORMAT_DESCRIPTOR
{
UINT8 bLength;
UINT8 bDescriptorType;
UINT8 bDescriptorSubtype;
UINT8 bFormatIndex;
UINT8 bNumberFrameDescriptor;
UINT8 bmFlags;
UINT8 bDefaultFrameIndex;
UINT8 bAspectRationX;
UINT8 bAspectRationY;
UINT8 bmInterlaceFlags;
UINT8 bCopyProtect;
} MJPEG_VIDEO_FORMAT_DESCRIPTOR;
// Motion-JPEG Video Format Frame Descriptor
typedef struct _MJPEG_VIDEO_FRAME_DESCRIPTOR
{
UINT8 bLength;
UINT8 bDescriptorType;
UINT8 bDescriptorSubtype;
UINT8 bFrameIndex;
UINT8 bmCapabilities;
UINT16 wWidth;
UINT16 wHeight;
UINT32 dwMinBitRate;
UINT32 dwMaxBitRate;
UINT32 dwMaxVideoFrameBufferSize;
UINT32 dwDefaultFrameInterval;
UINT8 bFrameIntervalType;
UINT32 dwFrameInterval;
} MJPEG_VIDEO_FRAME_DESCRIPTOR;
MJPG视频帧格式示例
----- Video Streaming MJPEG Frame Type Descriptor -----
---> This is the Default (optimum) Frame index
bLength : 0x1E (30 bytes)
bDescriptorType : 0x24 (Video Streaming Interface)
bDescriptorSubtype : 0x07 (MJPEG Frame Type)
bFrameIndex : 0x01
bmCapabilities : 0x00
wWidth : 0x0500 (1280)
wHeight : 0x02D0 (720)
dwMinBitRate : 0x1A5E0000 (442368000 bps -> 55.296 MB/s)
dwMaxBitRate : 0x1A5E0000 (442368000 bps -> 55.296 MB/s)
dwMaxVideoFrameBufferSize: 0x001C224D (1843789 bytes)
dwDefaultFrameInterval : 0x00051615 (33.3333 ms -> 30.0000 fps)
bFrameIntervalType : 0x01 (1 discrete frame interval supported)
adwFrameInterval[1] : 0x00051615 (33.3333 ms -> 30.0000 fps)
Data (HexDump) : 1E 24 07 01 00 00 05 D0 02 00 00 5E 1A 00 00 5E .$.........^...^
1A 4D 22 1C 00 15 16 05 00 01 15 16 05 00 .M"...........
----- Video Streaming MJPEG Frame Type Descriptor -----
bLength : 0x1E (30 bytes)
bDescriptorType : 0x24 (Video Streaming Interface)
bDescriptorSubtype : 0x07 (MJPEG Frame Type)
bFrameIndex : 0x02
bmCapabilities : 0x00
wWidth : 0x03C0 (960)
wHeight : 0x021C (540)
dwMinBitRate : 0x0ED4E000 (248832000 bps -> 31.104 MB/s)
dwMaxBitRate : 0x0ED4E000 (248832000 bps -> 31.104 MB/s)
dwMaxVideoFrameBufferSize: 0x000FD44D (1037389 bytes)
dwDefaultFrameInterval : 0x00051615 (33.3333 ms -> 30.0000 fps)
bFrameIntervalType : 0x01 (1 discrete frame interval supported)
adwFrameInterval[1] : 0x00051615 (33.3333 ms -> 30.0000 fps)
Data (HexDump) : 1E 24 07 02 00 C0 03 1C 02 00 E0 D4 0E 00 E0 D4 .$..............
0E 4D D4 0F 00 15 16 05 00 01 15 16 05 00 .M............
----- Video Streaming MJPEG Frame Type Descriptor -----
bLength : 0x1E (30 bytes)
bDescriptorType : 0x24 (Video Streaming Interface)
bDescriptorSubtype : 0x07 (MJPEG Frame Type)
bFrameIndex : 0x03
bmCapabilities : 0x00
wWidth : 0x0350 (848)
wHeight : 0x01E0 (480)
dwMinBitRate : 0x0BA54000 (195379200 bps -> 24.422 MB/s)
dwMaxBitRate : 0x0BA54000 (195379200 bps -> 24.422 MB/s)
dwMaxVideoFrameBufferSize: 0x000C6E4D (814669 bytes)
dwDefaultFrameInterval : 0x00051615 (33.3333 ms -> 30.0000 fps)
bFrameIntervalType : 0x01 (1 discrete frame interval supported)
adwFrameInterval[1] : 0x00051615 (33.3333 ms -> 30.0000 fps)
Data (HexDump) : 1E 24 07 03 00 50 03 E0 01 00 40 A5 0B 00 40 A5 .$...P....@...@.
0B 4D 6E 0C 00 15 16 05 00 01 15 16 05 00 .Mn...........
----- Video Streaming MJPEG Frame Type Descriptor -----
bLength : 0x1E (30 bytes)
bDescriptorType : 0x24 (Video Streaming Interface)
bDescriptorSubtype : 0x07 (MJPEG Frame Type)
bFrameIndex : 0x04
bmCapabilities : 0x00
wWidth : 0x0280 (640)
wHeight : 0x01E0 (480)
dwMinBitRate : 0x08CA0000 (147456000 bps -> 18.432 MB/s)
dwMaxBitRate : 0x08CA0000 (147456000 bps -> 18.432 MB/s)
dwMaxVideoFrameBufferSize: 0x0009624D (614989 bytes)
dwDefaultFrameInterval : 0x00051615 (33.3333 ms -> 30.0000 fps)
bFrameIntervalType : 0x01 (1 discrete frame interval supported)
adwFrameInterval[1] : 0x00051615 (33.3333 ms -> 30.0000 fps)
Data (HexDump) : 1E 24 07 04 00 80 02 E0 01 00 00 CA 08 00 00 CA .$..............
08 4D 62 09 00 15 16 05 00 01 15 16 05 00 .Mb...........
----- Video Streaming MJPEG Frame Type Descriptor -----
bLength : 0x1E (30 bytes)
bDescriptorType : 0x24 (Video Streaming Interface)
bDescriptorSubtype : 0x07 (MJPEG Frame Type)
bFrameIndex : 0x05
bmCapabilities : 0x00
wWidth : 0x0280 (640)
wHeight : 0x0168 (360)
dwMinBitRate : 0x06978000 (110592000 bps -> 13.824 MB/s)
dwMaxBitRate : 0x06978000 (110592000 bps -> 13.824 MB/s)
dwMaxVideoFrameBufferSize: 0x00070A4D (461389 bytes)
dwDefaultFrameInterval : 0x00051615 (33.3333 ms -> 30.0000 fps)
bFrameIntervalType : 0x01 (1 discrete frame interval supported)
adwFrameInterval[1] : 0x00051615 (33.3333 ms -> 30.0000 fps)
Data (HexDump) : 1E 24 07 05 00 80 02 68 01 00 80 97 06 00 80 97 .$.....h........
06 4D 0A 07 00 15 16 05 00 01 15 16 05 00 .M............
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936