一.VENC模块的介绍
VENC模块是RV1126专门用于视频编码的模块,VENC模块提供了多种编码方式,分别是:H264/H265/MJPEG/JPEG。而在此次编码模块中,我们重点是讲解H264、H265编码模块(MJPEG/JPEG用的不多,所以就不作详细讲解)。
二.VENC结构体的定义
/* the attribute of the venc chnl*/
typedef struct rkVENC_CHN_ATTR_S {
VENC_ATTR_S stVencAttr; // 编码器基础属性结构体 the attribute of video encoder
VENC_RC_ATTR_S stRcAttr; // 编码码率控制属性结构体 the attribute of rate ctrl
VENC_GOP_ATTR_S stGopAttr; // 编码器GOP属性结构体 the attribute of gop
} VENC_CHN_ATTR_S;
VENC_CHN_ATTRS是管理整个VENC模块的管理结构体,这里面它包含三个VENC子类结构体:分别是VENC_ATTR_S结构体(编码器基础属性结构体)、VENC_RC_ATTR_S结构体(编码码率控制属性结构体)、VENC_GOP_ATTR_S结构体(编码器GOP属性结构体)。
2.1. VENC_ATTR_S结构体(编码器基础属性结构体):
这个结构体主要是设置编码器的基础属性,比方说:分辨率、编码器类型、Profile等等。具体的我们来看看,它的定义:
/* the attribute of the Venc*/
typedef struct rkVENC_ATTR_S {
CODEC_TYPE_E enType; // 编码器协议类型 RW; the type of encodec
IMAGE_TYPE_E imageType; // 输入图像类型,通常来说venc的imageType和vi的imageType是一致的 the type of input image
RK_U32 u32VirWidth; // stride width, same to buffer_width, must greater than
// width, often set vir_width=(width+15)&(~15)
RK_U32 u32VirHeight; // stride height, same to buffer_height, must greater
// than height, often set vir_height=(height+15)&(~15)
RK_U32 u32Profile; // RW;
// H.264: 66: baseline; 77:MP; 100:HP;
// H.265: default:Main;
// Jpege/MJpege: default:Baseline
RK_BOOL bByFrame; // RW; Range:[0,1];
// get stream mode is slice mode or frame mode
RK_U32 u32PicWidth; // 编码图像宽度
RK_U32 u32PicHeight; // 编码图像高度
VENC_ROTATION_E enRotation;
union {
VENC_ATTR_H264_S stAttrH264e; // attributes of H264e
VENC_ATTR_H265_S stAttrH265e; // attributes of H265e
VENC_ATTR_MJPEG_S stAttrMjpege; // attributes of Mjpeg
VENC_ATTR_JPEG_S stAttrJpege; // attributes of jpeg
};
} VENC_ATTR_S;
2.1.1. enType:编码器协议类型,下面是画框部分就是它支持的视频编码类型:包括RK_CODEC_TYPE_H264、RK_CODEC_TYPE_H265、RK_CODEC_TYPE_JPEG、RK_CODEC_TYPE_MJPEG
typedef enum rk_CODEC_TYPE_E {
RK_CODEC_TYPE_NONE = -1,
// Audio
RK_CODEC_TYPE_AAC,
RK_CODEC_TYPE_MP2,
RK_CODEC_TYPE_VORBIS,
RK_CODEC_TYPE_G711A,
RK_CODEC_TYPE_G711U,
RK_CODEC_TYPE_G726,
// Video
RK_CODEC_TYPE_H264,
RK_CODEC_TYPE_H265,
RK_CODEC_TYPE_JPEG,
RK_CODEC_TYPE_MJPEG,
RK_CODEC_TYPE_NB
} CODEC_TYPE_E;
2.1.2. imageType: 输入图像类型,venc的imageType和VI的imageType必须保持一致
typedef enum rk_IMAGE_TYPE_E {
IMAGE_TYPE_UNKNOW = 0,
IMAGE_TYPE_GRAY8,
IMAGE_TYPE_GRAY16,
IMAGE_TYPE_YUV420P,
IMAGE_TYPE_NV12,
IMAGE_TYPE_NV21,
IMAGE_TYPE_YV12,
IMAGE_TYPE_FBC2,
IMAGE_TYPE_FBC0,
IMAGE_TYPE_YUV422P,
IMAGE_TYPE_NV16,
IMAGE_TYPE_NV61,
IMAGE_TYPE_YV16,
IMAGE_TYPE_YUYV422,
IMAGE_TYPE_UYVY422,
IMAGE_TYPE_RGB332,
IMAGE_TYPE_RGB565,
IMAGE_TYPE_BGR565,
IMAGE_TYPE_RGB888,
IMAGE_TYPE_BGR888,
IMAGE_TYPE_ARGB8888,
IMAGE_TYPE_ABGR8888,
IMAGE_TYPE_JPEG,
IMAGE_TYPE_BUTT
} IMAGE_TYPE_E;
2.1.3. u32VirWidth:编码图像的虚宽,一般虚宽和宽度保持一致
2.1.4. u32VirHeight:编码图像的高度,一般高度和高度保持一致
2.1.5. u32Profile:H264支持66:baseline、77: MP、100:HP。H265支持default:Main;
2.1.6. bByFrame:RW,范围是[0,1],默认是0
2.1.7. u32PicWidth:编码图像宽度
2.1.8. u32PicHeight:编码图像高度
2.1.9. enRotation:图像旋转角度,VENC_ROTATION_0, VENC_ROTATION_90, VENC_ROTATION_180,VENC_ROTATION_270。
typedef enum rkVENC_ROTATION_E {
VENC_ROTATION_0 = 0,
VENC_ROTATION_90 = 90,
VENC_ROTATION_180 = 180,
VENC_ROTATION_270 = 270,
VENC_ROTATION_BUTT
} VENC_ROTATION_E;
2.1.10. 编码器额外属性:VENC_ATTR_H264_S、VENC_ATTR_H265_S、VENC_ATTR_MJPEG_S、VENC_ATTR_JPEG_S
union {
VENC_ATTR_H264_S stAttrH264e; // attributes of H264e
VENC_ATTR_H265_S stAttrH265e; // attributes of H265e
VENC_ATTR_MJPEG_S stAttrMjpege; // attributes of Mjpeg
VENC_ATTR_JPEG_S stAttrJpege; // attributes of jpeg
};
主要是定义了H264、H265、MJPEG、JPEGE四种编码器的额外属性。
2.1.10.1. VENC_ATTR_H264_S:
typedef struct rkVENC_ATTR_H264_S {
RK_U32 u32Level;
// reserved
} VENC_ATTR_H264_S;
u32Level:Profile的IDC值,这个值跟上面u32Profile值一样
2.1.10.2. VENC_ATTR_H265_S:
typedef struct rkVENC_ATTR_H265_S {
// reserved
} VENC_ATTR_H265_S;
2.1.10.3. VENC_ATTR_MJPEG_S:
/*the attribute of mjpege*/
typedef struct rkVENC_ATTR_MJPEG_S {
RK_U32 u32ZoomWidth; // Zoom to specified width
RK_U32 u32ZoomHeight; // Zoom to specified height
RK_U32 u32ZoomVirWidth;
RK_U32 u32ZoomVirHeight;
} VENC_ATTR_MJPEG_S;
2.1.10.3.1. u32ZoomWidth:缩放的指定宽度
2.1.10.3.2.u32ZoomWidth:缩放的指定高度
2.1.10.3.3.u32ZoomVirWidth:缩放的虚拟宽度
2.1.10.3.4.u32ZoomVirWidth:缩放的虚拟高度
2.1.10.4. VENC_ATTR_JPEG_S:
/*the attribute of jpege*/
typedef struct rkVENC_ATTR_JPEG_S {
RK_U32 u32ZoomWidth; // Zoom to specified width
RK_U32 u32ZoomHeight; // Zoom to specified height
RK_U32 u32ZoomVirWidth;
RK_U32 u32ZoomVirHeight;
} VENC_ATTR_JPEG_S;
2.2. VENC_RC_ATTR_S结构体(编码器基础属性结构体):
这个结构体主要设置码率控制属性,这其中包括:enRcMode、stH264Cbr(H264的CBR码率控制模式)、stH264Vbr(H264的VBR码率控制模式)、stH264Avbr(H264的AVBR码率控制模式)、stMJpegCbr(MJPEG的CBR模式)、stMJpegVbr(MJPEG的VBR模式)、stH265Cbr(H265的CBR码率控制模式)、
stH265Vbr(H265的VBR码率控制模式)、stH265Avbr(H265的AVBR码率控制模式)
/* the attribute of rc*/
typedef struct rkVENC_RC_ATTR_S {
/* RW; the type of rc*/
VENC_RC_MODE_E enRcMode;
union {
VENC_H264_CBR_S stH264Cbr;
VENC_H264_VBR_S stH264Vbr;
VENC_H264_AVBR_S stH264Avbr;
VENC_MJPEG_CBR_S stMjpegCbr;
VENC_MJPEG_VBR_S stMjpegVbr;
VENC_H265_CBR_S stH265Cbr;
VENC_H265_VBR_S stH265Vbr;
VENC_H265_AVBR_S stH265Avbr;
};
} VENC_RC_ATTR_S;
2.2.1. enRcMode:码率控制类型,下面是不同编码的控制码率类型(注意:编码类型必须要和码率控制的编码类型要一致,比方说:若enType是H264,那enRcMode对应的码率控制结构体是stH264Cbr、stH264Vbr、stH264Avbr结构体)。
/* rc mode */
typedef enum rkVENC_RC_MODE_E {
// H264
VENC_RC_MODE_H264CBR = 1,
VENC_RC_MODE_H264VBR,
VENC_RC_MODE_H264AVBR,
// MJPEG
VENC_RC_MODE_MJPEGCBR,
VENC_RC_MODE_MJPEGVBR,
// H265
VENC_RC_MODE_H265CBR,
VENC_RC_MODE_H265VBR,
VENC_RC_MODE_H265AVBR,
VENC_RC_MODE_BUTT,
} VENC_RC_MODE_E;
2.2.2. stH264Cbr:H264的CBR码率控制结构体
/* the attribute of h264e cbr*/
typedef struct rkVENC_H264_CBR_S {
RK_U32 u32Gop; // RW; Range:[1, 65536]; the interval of I Frame.
RK_U32 u32SrcFrameRateNum;
RK_U32 u32SrcFrameRateDen;
RK_FR32 fr32DstFrameRateNum;
RK_FR32 fr32DstFrameRateDen;
RK_U32 u32BitRate; // RW; Range:[2, 614400]; average bitrate
} VENC_H264_CBR_S;
2.2.2.1.u32Gop:GOP长度的设置
2.2.2.2.u32SrcFrameRateNum:数据源帧率分子
2.2.2.3.u32SrcFrameRateDen:数据源帧率分母
2.2.2.4.u32DstFrameRateNum:目标帧率分子
2.2.2.5.u32DstFrameRateDen:目标帧率分母
2.2.2.6.u32BitRate:平均码率,取值范围[2000, 98000000]bps(比特率)
2.2.3. stH264Vbr:H264的VBR码率控制结构体
/* the attribute of h264e vbr*/
typedef struct rkVENC_H264_VBR_S {
RK_U32 u32Gop; // RW; Range:[1, 65536]; the interval of ISLICE.
RK_U32 u32SrcFrameRateNum;
RK_U32 u32SrcFrameRateDen;
RK_FR32 fr32DstFrameRateNum;
RK_FR32 fr32DstFrameRateDen;
RK_U32 u32MaxBitRate; // RW; Range:[2, 614400];the max bitrate
} VENC_H264_VBR_S;
2.2.3.1.u32Gop:GOP长度的设置
2.2.3.2.u32SrcFrameRateNum:数据源帧率分子
2.2.3.3.u32SrcFrameRateDen:数据源帧率分母
2.2.3.4.u32DstFrameRateNum:目标帧率分子
2.2.3.5.u32DstFrameRateDen:目标帧率分子
2.2.3.6.u32MaxBitRate:最大码率,取值范围[2000, 98000000]bps(比特数)。注意:最大码率不是说设置多少,就不能超过多少,他时时刻刻以画面质量进行动态码率调节:它很有可能会超过你设置的值。
2.2.4. stH264Avbr:H264的AVBR码率控制结构体
/* the attribute of h264e vbr*/
typedef struct rkVENC_H264_AVBR_S {
RK_U32 u32Gop; // RW; Range:[1, 65536]; the interval of ISLICE.
RK_U32 u32SrcFrameRateNum;
RK_U32 u32SrcFrameRateDen;
RK_FR32 fr32DstFrameRateNum;
RK_FR32 fr32DstFrameRateDen;
RK_U32 u32MaxBitRate; // RW; Range:[2, 614400];the max bitrate
} VENC_H264_AVBR_S;
2.2.4.1.u32Gop:GOP长度的设置
2.2.4.2.u32SrcFrameRateNum:数据源帧率分子
2.2.4.3.u32SrcFrameRateDen:数据源帧率分母
2.2.4.4.u32DstFrameRateNum:目标帧率分子
2.2.4.5.u32DstFrameRateDen:目标帧率分子
2.2.4.6.u32MaxBitRate:最大码率,取值范围[2000, 98000000]bps(比特数)。注意:最大码率不是说设置多少,就不能超过多少,他时时刻刻以画面质量进行动态码率调节:它很有可能会超过你设置的值。
2.2.5. stMjpegCbr:MJPEG的CBR码率控制结构体
/* the attribute of mjpege cbr*/
typedef struct rkVENC_MJPEG_CBR_S {
RK_U32 u32SrcFrameRateNum;
RK_U32 u32SrcFrameRateDen;
RK_FR32 fr32DstFrameRateNum;
RK_FR32 fr32DstFrameRateDen;
RK_U32 u32BitRate; // RW; Range:[2000, 98000000]; average bitrate
} VENC_MJPEG_CBR_S;
2.2.5.1. u32SrcFrameRateNum:数据源帧率分子
2.2.5.2.u32SrcFrameRateDen:数据源帧率分母
2.2.5.3.u32DstFrameRateNum:目标帧率分子
2.2.5.4.u32DstFrameRateDen:目标帧率分母
2.2.5.5.u32BitRate:平均码率,取值范围[2000, 98000000]bps(比特数)
2.2.6. stMjpegVbr:MJPEG的VBR码率控制结构体
/* the attribute of mjpege vbr*/
typedef struct rkVENC_MJPEG_VBR_S {
RK_U32 u32SrcFrameRateNum;
RK_U32 u32SrcFrameRateDen;
RK_FR32 fr32DstFrameRateNum;
RK_FR32 fr32DstFrameRateDen;
RK_U32 u32BitRate; // RW; Range:[2000, 98000000]; average bitrate
} VENC_MJPEG_VBR_S;
2.2.6.1. u32SrcFrameRateNum:数据源帧率分子
2.2.6.2.u32SrcFrameRateDen:数据源帧率分母
2.2.6.3.u32DstFrameRateNum:目标帧率分子
2.2.6.4. u32DstFrameRateDen:目标帧率分子
2.2.6.5. u32BitRate:平均码率,取值范围[2000, 98000000]bps(比特数)
2.2.8. stH265Cbr:H265的CBR码率控制结构体
VENC_H265_CBR_S结构体的参数和VENC_H264_CBR_S参数一致
2.2.9. stH265Vbr:H265的VBR码率控制结构体
VENC_H265_VBR_S结构体的参数和VENC_H264_VBR_S参数一致
2.2.10. stH265AVbr:H265的VBR码率控制结构体
VENC_H265_AVBR_S结构体的参数和VENC_H264_AVBR_S参数一致
2.3. VENC_GOP_ATTR_S结构体(编码器GOP属性结构体):
这个结构体主要是设置编码器的GOP属性,具体的我们来看看,它的定义:
/* the attribute of the gop*/
typedef struct rkVENC_GOP_ATTR_S {
VENC_GOP_MODE_E enGopMode;
RK_U32 u32GopSize;
RK_S32 s32IPQpDelta;
RK_U32 u32BgInterval;
RK_S32 s32ViQpDelta;
} VENC_GOP_ATTR_S;
2.3.1. enGopMode:GOP类型,我们来看看有几种:
/* the gop mode */
typedef enum rkVENC_GOP_MODE_E {
VENC_GOPMODE_NORMALP = 0,
VENC_GOPMODE_TSVC,
VENC_GOPMODE_SMARTP,
VENC_GOPMODE_BUTT,
} VENC_GOP_MODE_E;
2.3.1.1. VENC_GOPMODE_NORMALP:普通GOP模式
2.3.1.2. VENC_GOPMODE_TSVC:TSVC模式
2.3.1.3. VENC_GOPMODE_SMARTP:智能SMARTP模式
2.3.2. u32GopSize:编码GOP大小,可以理解为关键帧间隔数量
2.3.3. s32IPQpDelta:I帧相对于P帧的QP差值
2.3.4. u32BgInterval:长期参考帧间隔(SMARTP模式才会用到)
2.3.5. s32ViQpDelta:虚拟I帧相对于普通P帧的QP差值