K230视频编解码API参考
1. 概述
1.1 概述
视频编解码模块,支持H.264、H.265、JPEG编解码。VENC模块实现2D运算和编码功能,两者既可以同时使能,也可以单独运算。VDEC模块实现解码功能。
VENC、VENC+2D和VDEC支持系统绑定,2D单独运算时不支持系统绑定。
1.2 功能描述
1.2.1 视频编码
图1-1编码数据流程图
典型的编码流程包括了输入图像的接收、图像内容的遮挡和覆盖、图像的编码、以及码流的输出等过程。
编码模块由VENC接收通道、编码通道、2D接收通道、2D运算模块组成。编码能力和2D运算能力见下表。
编码数据流程图中的绿色箭头所示路径,为单独做2D运算的流程。蓝色箭头所示路径为单独做编码运算的流程。紫色箭头所示路径为先做2D运算再进行编码的流程。
表 1-1 编码能力
H264 | HEVC | JPEG | |
---|---|---|---|
输入格式 | YUV420 NV12 8bit, ARGB8888, BGRA8888 | YUV420 NV12 8bit, ARGB8888, BGRA8888 | YUV420 NV12 8bit, YUV422 UYVY 8bit, ARGB8888, BGRA8888 |
输出格式 | YUV420 H.264 Baseline Profile(BP) ; H.264 Main Profile(MP) ; H.264 High Profile(HP); H.264 High 10 Profile(HP) | YUV420 HEVC (H.265) Main ; HEVC (H.265) Main 10 Profile | YUV420 and YUV422 JPEG baseline sequential |
最大分辨率 | 3840x2160 | 3840x2160 | 8192x8192 |
码率控制模式 | CBR/VBR/FIXQP | CBR/VBR/FIXQP | FIXQP |
GOP | I/P帧 | I/P帧 | - |
编码通道 | 4路 | 4路 | 4路 |
注意:H264/HEVC/JPEG共用4路。
表1-2 2D运算能力
video输入格式 | video输出格式 | 叠加数据格式 | 最大分辨率 |
---|---|---|---|
I420/NV12/ARGB8888/BGRA8888 | 同输入格式 | ARGB8888/ARGB4444/ARGB1555 | 3840x2160 |
1.2.1.1 编码通道
编码通道作为基本容器,保存编码通道的多种用户设置和管理编码通道的多种内部资源。编码通道完成图像叠加和编码的功能。2D模块实现图像叠加运算,编码器模块实现图像编码,两者既可以单独使用,也可以协同使用。
图1-2 编码通道
1.2.1.2 码率控制
码率控制器实现对编码码率进行控制。
从信息学的角度分析,图像的压缩比越低,压缩图像的质量越高;图像压缩比例越高,压缩图像的质量越低。在场景变化的情况下,追求图像质量稳定,则编码码率会波动较大;如追求编码码率稳定,则图像质量会波动较大。
H264/H265编码支持CBR、VBR和FIXQP三种码率控制模式。
MJPEG只支持FIXQP模式。
1.2.1.2.1 CBR
(Constant Bit Rate)固定比特率。即在码率统计时间内保证编码码率平稳。
1.2.1.2.2 VBR
VBR( Variable Bit Rate)可变比特率,即允许在码率统计时间内编码码率波动,从而保证编码图像质量平稳。
1.2.1.2.3 FIXQP
FIXQP固定QP值。在码率统计时间内,编码图像所有宏块QP值相同,采用用户设定的图像QP值。
1.2.1.3 GOP结构
本模块只支持I 帧和P帧
1.2.1.4 2D运算
2D运算模块可以实现对图像数据的OSD叠加,OSD模式可以实现8个region图像叠加,各region不重叠。支持的OSD格式有:ARGB4444/ARGB1555/ARGB8888。
1.2.1.4.1 2D转换系数的计算
在OSD叠加运算时,如果输入video的格式为YUV,则OSD层需要做RGB to YUV的转换。内核态有一组默认的转换系数,用户如果需要自定义一组12bit的转换系数。转换系数由RGB to YUV的转换公式得到。
已知,RGB to YUV的转换公式如下:
则,3*3矩阵中的系数乘以256后四舍五入取整得到对应的转换系数,3*1矩阵中的值为对应的转换系数。
以BT709 LIMITED为例,RGB->YUV的转换公式为:
Y = 0.1826*R + 0.6142*G + 0.0620*B + 16
U = -0.1007*R - 0.3385*G + 0.4392*B + 128
V = 0.4392*R - 0.3990*G - 0.0402*B + 128
得到,转换系数为:128
1.2.1.4.2 2D转换系数的配置
2D转换系数可以通过用户自定义系数接口kd_mpi_venc_set_2d_custom_coef和色域配置接口kd_mpi_venc_set_2d_color_gamut进行配置,两者中选择一个接口进行配置即可。如果两个接口在开始运算前都没有调用,会使用默认系数进行色域转换。
1.2.1.5 限制条件
编码运算存在以下限制:
- 如果输入数据格式为YUV420,Y、U、V各分量的图像数据的物理起始地址需要保证4k对齐。
- 如果输入数据格式为NV12,Y和UV数据的图像数据的物理起始地址需要保证4k对齐。
2D运算存在以下限制:
- 源图像以及目的图像在ddr的物理起始地址要保证8byte align。
- 支持图像、osd、框的尺寸为偶数。
- 叠加和画框运算中的video数据的src和dst地址必须相同。
解码运算存在以下限制:
- 每帧输入数据的物理起始地址需要4k对齐。
1.2.1.6 编码典型应用举例
图1-3 编码典型应用场景流程图
1.2.2 视频解码
表 12 vpu解码能力
H264 | HEVC | JPEG | |
---|---|---|---|
输入格式 | H.264 Baseline;H.264 Main;H.264 High;H.264 High10;支持interlaced stream | HEVC (H.265) Main/Main10 | JPEG, baseline sequential |
输出格式 | YUV420 NV12 | YUV420 NV12 | YUV422 UYVY, YUV420 NV12 |
解码通道 | 4路 | 4路 | 4路 |
注意:H264/HEVC/JPEG共用4路。
VDEC支持流式发送:
- 流式发送( K_VDEC_SEND_MODE_STREAM):用户每次可发送任意长度码流到解码器,由解码器内部完成一帧码流的识别过程。须注意,对H.264/H.265而言,在收到下一帧码流才能识别当前帧码流的结束,所以在该发送模式下,输入一帧H.264/H.265码流,不能希望马上开始解码图像。
1.2.2.1 解码典型应用举例
图1-3 编码典型应用场景流程图
2. API参考
2.1 视频编码
该功能模块提供以下API:
- kd_mpi_venc_create_chn:创建编码通道。
- kd_mpi_venc_destory_chn:销毁编码通道。
- kd_mpi_venc_start_chn:开启编码通道接收输入图像。
- kd_mpi_venc_stop_chn:停止编码通道接收输入图像。
- kd_mpi_venc_query_status:查询编码通道状态。
- kd_mpi_venc_get_stream:获取编码后的码流。
- kd_mpi_venc_release_stream:释放码流缓存。
- kd_mpi_venc_send_frame:支持用户发送原始图像进行编码。
- kd_mpi_venc_set_rotaion:设置编码图像旋转角度。
- kd_mpi_venc_get_rotaion:获取编码图像旋转角度。
- kd_mpi_venc_set_mirror:设置编码图像旋转角度。
- kd_mpi_venc_get_mirror:获取编码图像翻转方式。
- kd_mpi_venc_enable_idr:使能IDR帧,根据GOP间隔产生IDR帧。
- kd_mpi_venc_set_2d_mode:设置2D运算模式。
- kd_mpi_venc_get_2d_mode:获取2D运算模式。
- kd_mpi_venc_set_2d_osd_param:设置2D运算中OSD的区域属性。
- kd_mpi_venc_get_2d_osd_param:获 取2D运算中指定索引的OSD的区域属性。
- kd_mpi_venc_set_2d_border_param:设置2D运算中的画框属性。
- kd_mpi_venc_get_2d_border_param:获取2D运算中的画框属性。
- kd_mpi_venc_set_2d_custom_coef:设置2D运算中的图像格式转换系数。
- kd_mpi_venc_get_2d_custom_coef:获取2D运算中的图像格式转换系数。
- kd_mpi_venc_set_2d_color_gamut:设置2D运算的色域。
- kd_mpi_venc_get_2d_color_gamut:获取2D运算的色域
- kd_mpi_venc_attach_2d:将2D运算与venc关联。
- kd_mpi_venc_detach_2d:将2D运算与venc分离。
- kd_mpi_venc_send_2d_frame:向2D模块发送一帧数据。
- kd_mpi_venc_get_2d_frame:获取2D运算结果。
- kd_mpi_venc_start_2d_chn:开始2D通道接收输入图像。
- kd_mpi_venc_stop_2d_chn:停止2D通道接收输入图像。
- kd_mpi_venc_request_idr:请求IDR帧,在调用之后立即产生一个IDR帧。
- kd_mpi_venc_set_h265_sao:设置H.265通道的Sao属性。
- kd_mpi_venc_get_h265_sao:获取H.265通道的Sao属性。
- kd_mpi_venc_set_dblk:设置协议编码通道的Deblocking使能。
- kd_mpi_venc_get_dblk