开始研究海思码率控制器各个参数对图像质量的影响,这里记录一下,各参数含义如下:
#ifndef __HI_COMM_RC_H__
#define __HI_COMM_RC_H__
#include "hi_defines.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
typedef HI_U32 HI_FR32;
typedef enum hiVENC_RC_MODE_E
{
VENC_RC_MODE_H264CBR = 1,
VENC_RC_MODE_H264VBR,
VENC_RC_MODE_H264AVBR,
VENC_RC_MODE_H264FIXQP,
VENC_RC_MODE_H264QPMAP,
VENC_RC_MODE_MJPEGCBR,
VENC_RC_MODE_MJPEGVBR,
VENC_RC_MODE_MJPEGFIXQP,
VENC_RC_MODE_H265CBR,
VENC_RC_MODE_H265VBR,
VENC_RC_MODE_H265AVBR,
VENC_RC_MODE_H265FIXQP,
VENC_RC_MODE_H265QPMAP,
VENC_RC_MODE_BUTT,
}VENC_RC_MODE_E;
typedef enum hiVENC_RC_QPMAP_MODE_E
{
VENC_RC_QPMAP_MODE_MEANQP= 0,
VENC_RC_QPMAP_MODE_MINQP ,
VENC_RC_QPMAP_MODE_MAXQP,
VENC_RC_QPMAP_MODE_BUTT,
}VENC_RC_QPMAP_MODE_E;
typedef struct hiVENC_ATTR_H264_FIXQP_S
{
HI_U32 u32Gop; /*H264的gop值,范围[1,65536]. */
HI_U32 u32SrcFrmRate; /* vi输入帧率 */
HI_FR32 fr32DstFrmRate ; /* 编码器输出帧率 */
HI_U32 u32IQp; /* I帧的QP值 */
HI_U32 u32PQp; /* P帧的QP值*/
HI_U32 u32BQp; /* B帧的QP值 */
} VENC_ATTR_H264_FIXQP_S;
typedef struct hiVENC_ATTR_H264_CBR_S
{
HI_U32 u32Gop; /*H364 CBR的GOP值 */
HI_U32 u32StatTime; /* 码率统计时间 */
HI_U32 u32SrcFrmRate; /* VI输入帧率 */
HI_FR32 fr32DstFrmRate ; /* 编码器输出帧率 */
HI_U32 u32BitRate; /* 平均码率,[2,102400] */
HI_U32 u32FluctuateLevel; /* 最大码率相对于平均码率的波动等级,保留;[1,5] */
} VENC_ATTR_H264_CBR_S;
typedef struct hiVENC_ATTR_H264_VBR_S
{
HI_U32 u32Gop; /*GOP值 */
HI_U32 u32StatTime; /* 码率统计时间 */
HI_U32 u32SrcFrmRate; /* vi输出帧率 */
HI_FR32 fr32DstFrmRate ; /* 编码器输出帧率 */
HI_U32 u32MaxBitRate; /* 最大码率 */
HI_U32 u32MaxQp; /* P B的最大QP值 */
HI_U32 u32MinQp; /* P B的最小QP值 */
HI_U32 u32MinIQp; /* I的最小QP值 */
}VENC_ATTR_H264_VBR_S;
typedef struct hiVENC_ATTR_H264_AVBR_S
{
HI_U32 u32Gop; /*GOP值 */
HI_U32 u32StatTime; /* t码率统计时间 */
HI_U32 u32SrcFrmRate; /* vi输入帧率 */
HI_FR32 fr32DstFrmRate ; /* 编码器输出帧率 */
HI_U32 u32MaxBitRate; /* 最大码率 */
}VENC_ATTR_H264_AVBR_S;
typedef struct hiVENC_ATTR_H264_QPMAP_S{
HI_U32 u32Gop; /*GOP值 */
HI_U32 u32StatTime; /* 码率统计时间 */
HI_U32 u32SrcFrmRate; /* vi输入帧率 */
HI_FR32 fr32DstFrmRate ; /* 编码器输出帧率 */
VENC_RC_QPMAP_MODE_E enQpMapMode; /* CU32或CU64的QP值的取值方式 */
HI_BOOL bQpMapAbsQp; /* CU32或CU64的QP.HI_FALSE: 相对QP.HI_TURE: 绝对QP.*/
HI_U32 u32Reserved; /* 保留字段 */
}VENC_ATTR_H264_QPMAP_S;
typedef struct hiVENC_ATTR_H264_CBR_S VENC_ATTR_H265_CBR_S;
typedef struct hiVENC_ATTR_H264_VBR_S VENC_ATTR_H265_VBR_S;
typedef struct hiVENC_ATTR_H264_AVBR_S VENC_ATTR_H265_AVBR_S;
typedef struct hiVENC_ATTR_H264_FIXQP_S VENC_ATTR_H265_FIXQP_S;
typedef struct hiVENC_ATTR_H264_QPMAP_S VENC_ATTR_H265_QPMAP_S;
typedef struct hiVENC_ATTR_MJPEG_FIXQP_S
{
HI_U32 u32SrcFrmRate; /* vi输入帧率*/
HI_FR32 fr32DstFrmRate; /* 编码器输出帧率 */
HI_U32 u32Qfactor; /* MJPEG的编码的Qfactor:[1,99]*/
}VENC_ATTR_MJPEG_FIXQP_S;
typedef struct hiVENC_ATTR_MJPEG_CBR_S
{
HI_U32 u32StatTime; /* 编码统计时间 */
HI_U32 u32SrcFrmRate; /* vi输入帧率 */
HI_FR32 fr32DstFrmRate ; /* 编码器输出帧率 */
HI_U32 u32BitRate; /* 平均码率*/
HI_U32 u32FluctuateLevel; /* 最大码率相对于平均码率的波动等级,保留; 1-5: 10%-50%. 1: SDK optimized, recommended; */
} VENC_ATTR_MJPEG_CBR_S;
typedef struct hiVENC_ATTR_MJPEG_VBR_S
{
HI_U32 u32StatTime; /* 码率统计时间 */
HI_U32 u32SrcFrmRate; /* vi输入帧率 */
HI_FR32 fr32DstFrmRate; /* 编码器输出帧率 */
HI_U32 u32MaxBitRate; /* 最大码率*/
HI_U32 u32MaxQfactor; /* 最大量化因子[1, 99] */
HI_U32 u32MinQfactor; /* 最小量化因子[1, 99] */
}VENC_ATTR_MJPEG_VBR_S;
typedef struct hiVENC_RC_ATTR_S
{
VENC_RC_MODE_E enRcMode; /*the type of rc*/
union
{
VENC_ATTR_H264_CBR_S stAttrH264Cbr;
VENC_ATTR_H264_VBR_S stAttrH264Vbr;
VENC_ATTR_H264_AVBR_S stAttrH264AVbr;
VENC_ATTR_H264_FIXQP_S stAttrH264FixQp;
VENC_ATTR_H264_QPMAP_S stAttrH264QpMap;
VENC_ATTR_MJPEG_CBR_S stAttrMjpegeCbr;
VENC_ATTR_MJPEG_VBR_S stAttrMjpegeVbr;
VENC_ATTR_MJPEG_FIXQP_S stAttrMjpegeFixQp;
VENC_ATTR_H265_CBR_S stAttrH265Cbr;
VENC_ATTR_H265_VBR_S stAttrH265Vbr;
VENC_ATTR_H265_AVBR_S stAttrH265AVbr;
VENC_ATTR_H265_FIXQP_S stAttrH265FixQp;
VENC_ATTR_H265_QPMAP_S stAttrH265QpMap;
};
HI_VOID* pRcAttr ; /*the rc attribute which could be specified by user*/
}VENC_RC_ATTR_S;
typedef enum hiRC_SUPERFRM_MODE_E
{
SUPERFRM_NONE=0, /* 无特殊策略 */
SUPERFRM_DISCARD, /* 丢弃超大帧 */
SUPERFRM_REENCODE, /* 重编超大帧*/
SUPERFRM_BUTT
}VENC_SUPERFRM_MODE_E;
typedef struct hiVENC_PARAM_H264_CBR_S
{
HI_U32 u32MinIprop; /*最小IP帧码率的比值 */
HI_U32 u32MaxIprop; /* 醉倒IP帧码率的比值 */
HI_U32 u32MaxQp; /* PB帧的最大QP */
HI_U32 u32MinQp; /* PB帧的最小QP */
HI_U32 u32MaxIQp; /* I帧的最大QP*/
HI_U32 u32MinIQp; /* I帧的最小QP*/
HI_S32 s32QualityLevel; /* 质量等级。数值越小表示质量越好 */
HI_S32 s32MaxReEncodeTimes; /*每帧重复编码次数,0表示不进行。[0, 3]*/
HI_BOOL bQpMapEn;
}VENC_PARAM_H264_CBR_S;
typedef struct hiVENC_PARAM_H264_VBR_S
{
HI_S32 s32ChangePos; /* VBR开始调整QP时的码率相对于最大码率的比例[50, 100] */
HI_U32 u32MinIprop; /* 最小IP帧比例*/
HI_U32 u32MaxIprop; /* 最大IP帧比例 */
HI_S32 s32MaxReEncodeTimes; /* 重复编码的次数 [0, 3]*/
HI_BOOL bQpMapEn; /*是否是能QpMap功能*/
}VENC_PARAM_H264_VBR_S;
typedef struct hiVENC_PARAM_H264_AVBR_S
{
HI_S32 s32ChangePos; /* AVBR开始调整是的码率相对于最大码率的比值 */
HI_U32 u32MinIprop; /* 最小IP帧的比例 */
HI_U32 u32MaxIprop; /* 最大IP帧的比例 */
HI_S32 s32MaxReEncodeTimes; /* 重复编码次数 [0, 3]*/
HI_BOOL bQpMapEn;
HI_S32 s32MinStillPercent; /* 静止状态下的目标码率的最小百分比 */
HI_U32 u32MaxStillQP; /* 静止状态下的醉的I帧QP值*/
HI_U32 u32MinStillPSNR; /* reserved */
HI_U32 u32MaxQp; /* PB帧的最大QP */
HI_U32 u32MinQp; /* PB帧的最小QP */
HI_U32 u32MaxIQp; /* 最大I帧QO */
HI_U32 u32MinIQp; /* 最小I帧QP */
} VENC_PARAM_H264_AVBR_S;
typedef struct hiVENC_PARAM_MJPEG_CBR_S
{
HI_U32 u32MaxQfactor; /* 帧最大Qfactor,用于钳位质量*/
HI_U32 u32MinQfactor; /* 帧最小Qfactor,用于钳位质量 */
}VENC_PARAM_MJPEG_CBR_S;
typedef struct hiVENC_PARAM_MJPEG_VBR_S
{
HI_S32 s32ChangePos; /* VBR 开始调整 Qp 时的码率相对于最大码率的比例 */
}VENC_PARAM_MJPEG_VBR_S;
typedef struct hiVENC_PARAM_H265_CBR_S
{
HI_U32 u32MinIprop; /* 最小IP帧比例*/ */
HI_U32 u32MaxIprop; /* 最大IP帧比例 */
HI_U32 u32MaxQp; /* PB帧的最大QP */
HI_U32 u32MinQp; /* PB帧的最小QP*/
HI_U32 u32MaxIQp; /* I帧的QP值 */
HI_U32 u32MinIQp; /* I帧的最小QP*/ */
HI_S32 s32QualityLevel; /* 图像质量,数值越小质量越好[1,5] */
HI_S32 s32MaxReEncodeTimes; /*最大重复编码次数 [0, 3]*/
HI_BOOL bQpMapEn;
VENC_RC_QPMAP_MODE_E enQpMapMode;
}VENC_PARAM_H265_CBR_S;
typedef struct hiVENC_PARAM_H265_VBR_S
{
HI_S32 s32ChangePos; /* VBR 开始调整 Qp 时的码率相对于最大码率的比例 */
HI_U32 u32MinIprop; /* 最小IP帧比例*/ */
HI_U32 u32MaxIprop; /* 最大IP帧比例 */
HI_S32 s32MaxReEncodeTimes; /* 重复编码的次数 [0, 3]*/
HI_BOOL bQpMapEn;
VENC_RC_QPMAP_MODE_E enQpMapMode;
}VENC_PARAM_H265_VBR_S;
typedef struct hiVENC_PARAM_H265_AVBR_S
{
HI_S32 s32ChangePos; /* AVBR 开始调整 Qp 时的码率相对于最大码率的比例 */
HI_U32 u32MinIprop; /* 最小IP帧的比例 */
HI_U32 u32MaxIprop; /* 最大IP帧的比例 */
HI_S32 s32MaxReEncodeTimes; /* 重复编码的次数 [0, 3]*/
HI_BOOL bQpMapEn;
VENC_RC_QPMAP_MODE_E enQpMapMode;
HI_S32 s32MinStillPercent; /* 静止状态下的目标码率的最小百分比 */
HI_U32 u32MaxStillQP; /* 静止状态下的子最大的I帧QP值*/*/
HI_U32 u32MinStillPSNR; /* 保留,暂时无效 */
HI_U32 u32MaxQp; /* PB帧的最大QP*/
HI_U32 u32MinQp; /* PB帧的最小QP */
HI_U32 u32MaxIQp; /* I帧的最大QP */
HI_U32 u32MinIQp; /* I帧的最小QP*/
} VENC_PARAM_H265_AVBR_S;
typedef struct hiVENC_RC_PARAM_S
{
HI_U32 u32ThrdI[RC_TEXTURE_THR_SIZE]; /* I帧宏块级码率控制的mad门限*/
HI_U32 u32ThrdP[RC_TEXTURE_THR_SIZE]; /* P帧宏块级码率控制的mad门限*/
HI_U32 u32ThrdB[RC_TEXTURE_THR_SIZE]; /* B帧宏块级码率控制的mad门限*/
HI_U32 u32QpDeltaLevelI[RC_TEXTURE_THR_SIZE]; /* I 帧宏块级码率控制的 mad 每级 QpDelta level 值。 */
HI_U32 u32QpDeltaLevelP[RC_TEXTURE_THR_SIZE]; /* P 帧宏块级码率控制的 mad 每级 QpDelta level 值。
HI_U32 u32QpDeltaLevelB[RC_TEXTURE_THR_SIZE]; /* B 帧宏块级码率控制的 mad 每级 QpDelta level 值。
HI_U32 u32RowQpDelta; /* 在宏块级码率控制时,每一行宏块的起始 Qp 相对于
帧起始 Qp 的波动幅度值。[0, 10] */
HI_S32 s32FirstFrameStartQp; /* 设置第一帧的起始QO值 */
union
{
VENC_PARAM_H264_CBR_S stParamH264Cbr;
VENC_PARAM_H264_VBR_S stParamH264VBR;
VENC_PARAM_H264_AVBR_S stParamH264AVbr;
VENC_PARAM_MJPEG_CBR_S stParamMjpegCbr;
VENC_PARAM_MJPEG_VBR_S stParamMjpegVbr;
VENC_PARAM_H265_CBR_S stParamH265Cbr;
VENC_PARAM_H265_VBR_S stParamH265Vbr;
VENC_PARAM_H265_AVBR_S stParamH265AVbr;
};
HI_VOID* pRcParam; /*RC parameter which could be specified by usrer*/
}VENC_RC_PARAM_S;
typedef enum hiVENC_FRAMELOST_MODE_E
{
FRMLOST_NORMAL=0, /* 瞬时码率超过阈值时正常丢帧 */
FRMLOST_PSKIP, /* 瞬时码率超过阈值时编码pskip帧*/
FRMLOST_BUTT,
}VENC_FRAMELOST_MODE_E;
typedef struct hiVENC_PARAM_FRAMELOST_S
{
HI_BOOL bFrmLostOpen; /* 瞬时码率超过阈值时丢帧开关 */
HI_U32 u32FrmLostBpsThr; /* 丢帧阈值 */
VENC_FRAMELOST_MODE_E enFrmLostMode; /* 瞬时码率超过阈值时的丢帧模式*/
HI_U32 u32EncFrmGaps; /*丢帧间隔,默认0*/
}VENC_PARAM_FRAMELOST_S;
typedef enum hiVENC_RC_PRIORITY_E
{
VENC_RC_PRIORITY_BITRATE_FIRST = 1, /* 目标码率优先 */
VENC_RC_PRIORITY_FRAMEBITS_FIRST, /* 超大帧阈值优先 */
VENC_RC_PRIORITY_BUTT,
} VENC_RC_PRIORITY_E;
typedef struct hiVENC_SUPERFRAME_CFG_S
{
VENC_SUPERFRM_MODE_E enSuperFrmMode; /* 超大帧处理模式, 默认SUPERFRM_NONE;[SUPERFRM_NONE,SUPERFRM_DISCARD,SUPERFRM_REENCODE]*/
HI_U32 u32SuperIFrmBitsThr; /* I帧超大阈值;默认500000 */
HI_U32 u32SuperPFrmBitsThr; /* P帧超大阈值;默认500000 */
HI_U32 u32SuperBFrmBitsThr; /* B帧超大阈值;默认500000 */
VENC_RC_PRIORITY_E enRcPriority; /* 码率优先级,默认为VENC_RC_PRIORITY_BITRATE_FIRST */
}VENC_SUPERFRAME_CFG_S;
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __HI_COMM_RC_H__ */
各个参数的具体影响情况还没有实际测试,估计接下来的一周就做这个工作了。
————
版权声明:本文为CSDN博主「sdsszk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:《海思码率控制器各参数说明》