编解码
系统概述
概述
Codec(Coder-Decoder)是指编解码器,用于压缩或解压缩视频、图像、音频等媒体数据;S100 Soc 中存在两种硬件编解码单元,分别是 VPU(Video process unit)和 JPU(Jpeg process unit),可提供4K@90fps 的视频编解码能力和4K@90fps 的图像编解码能力。
JPU 硬件特性
| HW Feature | Feature Indicator |
|---|---|
| HW number | 1 |
| maximum input | 8192x8192 |
| minimum input | 32x32 |
| performance | 4K@90fps |
| max instance | 64 |
| input image format | 4:0:0, 4:2:0, 4:2:2, 4:4:0, and 4:4:4 color format |
| output image format | 4:0:0, 4:2:0, 4:2:2, 4:4:0, and 4:4:4 color format |
| input crop | Supports |
| bitrate control | FIXQP(MJPEG) |
| rotation | 90, 180, 270 |
| mirror | Vertical, Horizontal, Vertical+Horizontal |
| quantization table | Supports Custom Settings |
| huffman table | Supports Custom Settings |
VPU 硬件特性
| HW Feature | Feature Indicator |
|---|---|
| HW number | 1 |
| maximum input | 8192x4096 |
| minimum input | 256x128 |
| input alignment required | width 32, height 8 |
| performance | 4K@90fps |
| max instance | 32 |
| input image format | 4:2:0, 4:2:2 color format |
| output image format | 4:2:0, 4:2:2 color format |
| input crop | Supports |
| bitrate control | CBR, VBR, AVBR, FIXQP, QPMAP |
| rotation | 90, 180, 270 |
| mirror | Vertical, Horizontal, Vertical+Horizontal |
| long-term reference prediction | Supports Custom Settings |
| intra refresh | Supports |
| deblocking filter | Supports |
| request IDR | Supports |
| ROI mode | mode1: Users can set multiple zones’(up to 64) qp value(0 |
| GOP mode | 0: Custom GOP 1 : I-I-I-I,..I (all intra, gop_size=1) 2 : I-P-P-P,… P (consecutive P, gop_size=1) 3 : I-B-B-B,…B (consecutive B, gop_size=1) 4 : I-B-P-B-P,… (gop_size=2) 5 : I-B-B-B-P,… (gop_size=4) 6 : I-P-P-P-P,… (consecutive P, gop_size=4) 7 : I-B-B-B-B,… (consecutive B, gop_size=4) 8 : I-B-B-B-B-B-B-B-B,… (random access, gop_size=8) 9 : I-P-P-P,… P (consecutive P, gop_size = 1, with single reference) |
软件功能
整体框架
MediaCodec 子系统会提供音视频和图像的编解码组件,原始流封装和视频录像等功能。该系统主要会封装底层 codec 硬件资源和软件编解码库,为上层提供编解码能力。开发者可以基于提供的编解码接口实现 H265和 H264视频的编解码功能,也可以使用 JPEG 编码功能将摄像头数据存成 JPEG 图片,还可以使用视频录像功能实现摄像头数据的录制。
码率控制模式
MediaCodec 支持对 H264/H265和 MJPEG 协议的码率控制,分别支持 H264/H265编码通道的 CBR、VBR、AVBR、FixQp 和 QpMap 五种码率控制方式,以及支持 MJPGE 编码通道的 FixQp 码率控制方式。
CBR 说明
CBR 表示恒定码率,能够保证整体的编码码率稳定。下面是 CBR 模式下各个参数含义:
| 数据项 | 描述 | 取值范围 | 默认值 |
|---|---|---|---|
| intra_period | I 帧间隔 | [0,2047] | 28 |
| intra_qp | I 帧的 QP 值 | [0,51] | 0 |
| bit_rate | 目标平均比特率,单位是 kbps | [0,700000] | 0 |
| frame_rate | 目标帧率,单位是 fps | [1,240] | 30 |
| initial_rc_qp | 指定码率控制时的初始 QP 值,当该值不在[0,51]范围内,编码器内部会决定初始值 | [0,63] | 63 |
| vbv_buffer_size | 指定 VBV Buffer 的大小,单位是 ms;实际的 VBV buffer 的空间大小为 bit_rate*vbv_buffer_size/1000(kb),该 buffer 的大小会影响编码图像质量和码率控制精度。当该 buffer 比较小时,码率控制精确度高,但图像编码质量较差;当该 buffer 比较大时,图像编码质量高,但是码率波动大。 | [10,3000] | 10 |
| ctu_level_rc_enalbe | H264/H265的码率控制可以工作在 CTU 级别的控制,该模式可以达到更高精度的码率控制,但是会损失编码图像质量,该模式不可以和 ROI 编码一起工作,当使能 ROI 编码时,该功能自动失效。 | [0,1] | 0 |
| min_qp_I | I 帧的最小 QP 值 | [0,51] | 8 |
| max_qp_I | I 帧的最大 QP 值 | [0,51] | 51 |
| min_qp_P | P 帧的最小 QP 值 | [0,51] | 8 |
| max_qp_P | P 帧的最大 QP 值 | [0,51] | 51 |
| min_qp_B | B 帧的最小 QP 值 | [0,51] | 8 |
| max_qp_B | B 帧的最大 QP 值 | [0,51] | 51 |
| hvs_qp_enable | H264/H265的码率控制可以工作在 subCTU 级别的控制,该模式会调整子宏块的 QP 值,进而提高 主观图像质量。 | [0,1] | 1 |
| hvs_qp_scale | 当 hvs_qp_enable 使能后有效,该值表示 QP 缩放因子。 | [0,4] | 2 |
| max_delta_qp | 当 hvs_qp_enable 使能后有效,指定 HVS qp 值的最大偏差范围。 | [0,51] | 10 |
| qp_map_enable | 使能 ROI 编码时的 QP map | [0,1] | 0 |
VBR 说明
VBR 表示可变码率,简单场景分配比较大的 qp,压缩率小,质量高。复杂场景分配较小 qp,可以保证编码图像的质量稳定。下面是 VBR 模式下各个参数含义:
| 数据项 | 描述 | 取值范围 | 默认值 |
|---|---|---|---|
| intra_period | I 帧间隔 | [0,2047] | 28 |
| intra_qp | I 帧的 QP 值 | [0,51] | 0 |
| frame_rate | 目标帧率,单位是 fps | [1,240] | 0 |
| qp_map_enable | 使能 ROI 编码时的 QP map | 0,1 | 0 |
AVBR 说明
ABR 表示恒定平均目标码率,简单场景分配较低码率,复杂场景分配足够码率,使得有限的码率能够在不同场景下合理分配,这类似 VBR。同时一定时间内,平均码率又接近设置的目标码率,这样可以控制输出文件的大小,这又类似 CBR。可以认为是 CBR 和 VBR 的折中方案,产生码率和图像质量相对稳定的码流。下面是 AVBR 模式下各个参数含义:
| 数据项 | 描述 | 取值范围 | 默认值 |
|---|---|---|---|
| intra_period | I 帧间隔 | [0,2047] | 28 |
| intra_qp | I 帧的 QP 值 | [0,51] | 0 |
| bit_rate | 目标平均比特率,单位是 kbps | [0,700000] | 0 |
| frame_rate | 目标帧率,单位是 fps | [1,240] | 30 |
| initial_rc_qp | 指定码率控制时的初始 QP 值,当该值不在[0,51]范围内,编码器内部会决定初始值 | [0,63] | 63 |
| vbv_buffer_size | 指定 VBVBuffer 的大小,单位是 ms;实际的 VBVbuffer 的空间大小为 bit_rate*vbv_buffer_size/1000(kb),该 buffer 的大小会影响编码图像质量和码率控制精度。当该 buffer 比较小时,码率控制精确度高,但图像编码质量较差;当该 buffer 比较大时,图像编码质量高,但是码率波动大。 | [10,3000] | 3000 |
| ctu_level_rc_enalbe | H264/H265的码率控制可以工作在 CTU 级别的控制,该模式可以达到更高精度的码率控制,但是会损失编码图像质量,该模式不可以和 ROI 编码一起工作,当使能 ROI 编码时,该功能自动失效。 | [0,1] | 0 |
| min_qp_I | I 帧的最小 QP 值 | [0,51] | 8 |
| max_qp_I | I 帧的最大 QP 值 | [0,51] | 51 |
| min_qp_P | P 帧的最小 QP 值 | [0,51] | 8 |
| max_qp_P | P 帧的最大 QP 值 | [0,51] | 51 |
| min_qp_B | B 帧的最小 QP 值 | [0,51] | 8 |
| max_qp_B | B 帧的最大 QP 值 | [0,51] | 51 |
| hvs_qp_enable | H264/H265的码率控制可以工作在 subCTU 级别的控制,该模式会调整子宏块 的 QP 值,进而提高主观图像质量。 | [0,1] | 1 |
| hvs_qp_scale | 当 hvs_qp_enable 使能后有效,该值表示 QP 缩放因子。 | [0,4] | 2 |
| max_delta_qp | 当 hvs_qp_enable 使能后有效,指定 HVSqp 值的最大偏差范围。 | [0,51] | 10 |
| qp_map_enable | 使能 ROI 编码时的 QPmap | [0,1] | 0 |
FixQp 说明
FixQp 表示固定每一个 I 帧、P 帧的 QP 值,对于 I/P 帧可以分别设值。下面是 FixQp 模式下各个参数含义:
| 数据项 | 描述 | 取值范围 | 默认值 |
|---|---|---|---|
| intra_period | I 帧间隔 | [0,2047] | 28 |
| frame_rate | 目标帧率,单位是 fps | [1,240] | 30 |
| force_qp_I | 强制 I 帧的 QP 值 | [0,51] | 0 |
| force_qp_P | 强制 P 帧的 QP 值 | [0,51] | 0 |
| force_qp_B | 强制 B 帧的 QP 值 | [0,51] | 0 |
QPMAP 说明
QPMAP 表示为一帧图像中的每一个块指定 QP 值,其中 H265块大小为32x32,H264块大小为16x16。下面是 QPMAP 模式下各个参数含义:
| 数据项 | 描述 | 取值范围 | 默认值 |
|---|---|---|---|
| intra_period | I 帧间隔 | [0,2047] | 28 |
| frame_rate | 目标帧率,单位是 fps | [1,240] | 30 |
| qp_map_array | 指定 QPmap 表,H265的 subCTU 大小为32x32,需要为每一个 subCTU 指定一个 QP 值,每个 QP 值占一个字节,并且按照光栅扫描方向排序。 | 指针地址 | NULL |
| qp_map_array_count | 指定 QPmap 表的大小。 | [0, MC_VIDEO_MAX_SUB_CTU_NUM]&&(ALIGN64(picWidth)>>5)*(ALIGN64(picHeight)>>5) | 0 |
调试方法
编码效果调优
根据当前客户使用 codec 进行视频编码的场景,多将码率模式设置为 CBR,当编码的场景较为复杂时,为了保证视频质量,硬件会自动提高码率值,导致输出的视频较预期更大。因此为了兼顾视频质量和实际码率,需要统筹 bit_rate 和 max_qp_I/P 值的设置。下面给出了全 I 帧模式下,不同复杂场景下,码率设置为15000kbps 时,不同 max_qp_I 下实际码率和 qp 的情况(不同场景复杂程度不同,下列数据仅供参考):
| 场景&参数 | 室外白天复杂场景 bitrate(15000) max_qp_I(35) | 室外白天复杂场景 bitrate(15000) max_qp_I(38) | 室外白天复杂场景 bitrate(15000) max_qp_I(39) |
|---|---|---|---|
| Bit alloction(bps)(越大图像质量越高) | 60300045 | 42186920 | 35898230 |
| Qp avg(越小图像质量越高) | 35 | 38 | 39 |
GOP 结构说明
H264/H265编码支持 GOP 结构的设置,用户可从预置的3种 GOP 结构种选择,也可自定义 GOP 结构。
GOP 结构表可定义一组周期性的 GOP 结构,该 GOP 结构将用于整个编码过程。单个结构表中的元素如下表所示,其中可以指定该图像的参考帧,如果 IDR 帧后的其他帧指定的参考帧为 IDR 帧前的数据帧,编码器内部会自动处理这种情况使其不参考其他帧,用户无需关心这种情况。用户在自定义 GOP 结构时需要指明结构表的数量,最多可定义3个结构表,结构表的顺序需要按照解码顺序排列。 下面表示了结构表中各个元素的含义:
| 元素 | 描述 |
|---|---|
| Type | 帧类型(I、P、B) |
| POC | GOP 内帧的显示顺序,取值范围为[1,gop_size]。 |
| QPoffset | 自定义 GOP 中图片的量化参数 |
| NUM_REF_PIC_L0 | 标记为 P 帧使用多参考图片,仅在 PIC_TYPE 为 P 时有效。 |
| temporal_id | 帧的时间层,帧无法从具有较高时间 id(0~6)的帧进行预测。 |
| 1st_ref_POC | L0的第一张参考图片的 POC |
| 2nd_ref_POC | Type 为 B 时,第一张参考图片的 POC 是 L1的; Type 为 P 时,第二张参考图片的 POC 是 L0的; 可以使 reference_L1和 B slice 中的参考图片具有相同的 POC, 但出于压缩效率的考虑,建议 reference_L1和 reference_L0的 POC 不同。 |
GOP 预置结构
一共支持设置九种 GOP 预置结构
| 序号 | GOP 结构 | 低延迟(编码顺序和显示顺序相同) | GOP 大小 | 编码顺序 | 最小源帧 buffer 数量 | 最小解码图片 buffer 数量 | 周期内(I 帧间隔)要求 |
|---|---|---|---|---|---|---|---|
| 1 | I | Yes | 1 | I0-I1-I2… | 1 | 1 | |
| 2 | P | Yes | 1 | P0-P1-P2… | 1 | 2 | |
| 3 | B | Yes | 1 | B0-B1-B2… | 1 | 3 | |
| 4 | BP | NO | 2 | B1-P0-B3-P2… | 1 | 3 | |
| 5 | BBBP | Yes | 1 | B2-B1-B3-P0… | 7 | 4 | |
| 6 | PPPP | Yes | 4 | P0-P1-P2-P3… | 1 | 2 | |
| 7 | BBBB | Yes | 4 | B0-B1-B2-B3… | 1 | 3 | |
| 8 | BBBB BBBB | Yes | 1 | B3-B2-B4- B1-B6-B5- B7-B0… | 12 | 5 | |
| 9 | P | Yes | 1 | P0 | 1 | 2 |
GOP Preset 1
- 只有 I 帧,没有相互参考;
- 低延时;
GOP Preset 2
- 只有 I 帧和 P 帧;
- P 帧参考2个前向参考帧;
- 低延时 ;
GOP Preset 3
- 只有 I 帧和 B 帧;
- B 帧参考2个前向参考帧;
- 低延时;
GOP Preset 4
- 只有 I 帧、P 帧和 B 帧;
- P 帧参考2个前向参考帧;
- B 帧参考1个前向参考帧和一个后向参考帧;
GOP Preset 5
- 只有 I 帧、P 帧和 B 帧;
- P 帧参考2个前向参考帧;
- B 帧参考1个前向参考帧和一个后向参考帧,后向参考帧可为 P 帧或 B 帧;
GOP Preset 6
- 只有 I 帧和 P 帧;
- P 帧参考2个前向参考帧;
- 低延时;
GOP Preset 7
- 只有 I 帧和 B 帧;
- B 帧参考2个前向参考帧;
- 低延时;
GOP Preset 8
- 只有 I 帧和 B 帧;
- B 帧参考1个前向参考帧,一个后向参考帧;
GOP Preset 9
- 只有 I 帧和 P 帧;
- P 帧参考1个前向参考帧;
- 低延时;
VPU 调试方式
VPU(视频处理单元)是一种专用的视觉处理单元,可以高效处理视频内容。VPU 可以实现 H265视频格式的编解码处理。用户通过 Codec 提供的接口即可获得输入的编码/解码流。