编解码
系统概述
概述
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 |