海思码率控制器各参数说明

开始研究海思码率控制器各个参数对图像质量的影响,这里记录一下,各参数含义如下:

#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__ */

各个参数的具体影响情况还没有实际测试,估计接下来的一周就做这个工作了。

发布了13 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sdsszk/article/details/82354448
今日推荐