/****************************************************************************** Copyright (C), 2016-2017, Hisilicon Tech. Co., Ltd. ****************************************************************************** File Name : hi_comm_rc.h Version : Initial Draft Author : Hisilicon multimedia software group Created : 2016/11/15 Last Modified : Description : common struct definition for Rate control Function List : ******************************************************************************/ #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; /* rc mode */ 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; /* qpmap mode*/ 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; /* the attribute of h264e fixqp*/ typedef struct hiVENC_H264_FIXQP_S { HI_U32 u32Gop; /* RW; Range:[1, 65536]; the interval of ISLICE. */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate ; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ HI_U32 u32IQp; /* RW; Range:[0, 51]; qp of the i frame */ HI_U32 u32PQp; /* RW; Range:[0, 51]; qp of the p frame */ HI_U32 u32BQp; /* RW; Range:[0, 51]; qp of the b frame */ } VENC_H264_FIXQP_S; /* the attribute of h264e cbr*/ typedef struct hiVENC_H264_CBR_S { HI_U32 u32Gop; /* RW; Range:[1, 65536]; the interval of I Frame. */ HI_U32 u32StatTime; /* RW; Range:[1, 60]; the rate statistic time, the unit is senconds(s) */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate ; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ HI_U32 u32BitRate; /* RW; Range:[2, 409600]; average bitrate */ } VENC_H264_CBR_S; /* the attribute of h264e vbr*/ typedef struct hiVENC_H264_VBR_S { HI_U32 u32Gop; /* RW; Range:[1, 65536]; the interval of ISLICE. */ HI_U32 u32StatTime; /* RW; Range:[1, 60]; the rate statistic time, the unit is senconds(s) */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate ; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ HI_U32 u32MaxBitRate; /* RW; Range:[2, 409600];the max bitrate */ }VENC_H264_VBR_S; /* the attribute of h264e avbr*/ typedef struct hiVENC_H264_AVBR_S { HI_U32 u32Gop; /* RW; Range:[1, 65536]; the interval of ISLICE. */ HI_U32 u32StatTime; /* RW; Range:[1, 60]; the rate statistic time, the unit is senconds(s) */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate ; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ HI_U32 u32MaxBitRate; /* RW; Range:[2, 409600];the max bitrate */ }VENC_H264_AVBR_S; /* the attribute of h264e qpmap*/ typedef struct hiVENC_H264_QPMAP_S { HI_U32 u32Gop; /* RW; Range:[1, 65536]; the interval of ISLICE. */ HI_U32 u32StatTime; /* RW; Range:[1, 60]; the rate statistic time, the unit is senconds(s) */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate ; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ }VENC_H264_QPMAP_S; /* the attribute of h265e qpmap*/ typedef struct hiVENC_H265_QPMAP_S { HI_U32 u32Gop; /* RW; Range:[1, 65536]; the interval of ISLICE. */ HI_U32 u32StatTime; /* RW; Range:[1, 60]; the rate statistic time, the unit is senconds(s) */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate ; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ VENC_RC_QPMAP_MODE_E enQpMapMode; /* RW; the QpMap Mode.*/ }VENC_H265_QPMAP_S; typedef struct hiVENC_H264_CBR_S VENC_H265_CBR_S; typedef struct hiVENC_H264_VBR_S VENC_H265_VBR_S; typedef struct hiVENC_H264_AVBR_S VENC_H265_AVBR_S; typedef struct hiVENC_H264_FIXQP_S VENC_H265_FIXQP_S; /* the attribute of mjpege fixqp*/ typedef struct hiVENC_MJPEG_FIXQP_S { HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ HI_U32 u32Qfactor; /* RW; Range:[1,99];image quality. */ }VENC_MJPEG_FIXQP_S; /* the attribute of mjpege cbr*/ typedef struct hiVENC_MJPEG_CBR_S { HI_U32 u32StatTime; /* RW; Range:[1, 60]; the rate statistic time, the unit is senconds(s) */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate ; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ HI_U32 u32BitRate; /* RW; Range:[2, 409600]; average bitrate */ } VENC_MJPEG_CBR_S; /* the attribute of mjpege vbr*/ typedef struct hiVENC_MJPEG_VBR_S { HI_U32 u32StatTime; /* RW; Range:[1, 60]; the rate statistic time, the unit is senconds(s) */ HI_U32 u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc chnnel */ HI_FR32 fr32DstFrameRate; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc chnnel */ HI_U32 u32MaxBitRate; /* RW; Range:[2, 409600];the max bitrate */ }VENC_MJPEG_VBR_S; /* the attribute of rc*/ typedef struct hiVENC_RC_ATTR_S { VENC_RC_MODE_E enRcMode; /* RW; the type of rc*/ union { VENC_H264_CBR_S stH264Cbr; VENC_H264_VBR_S stH264Vbr; VENC_H264_AVBR_S stH264AVbr; VENC_H264_FIXQP_S stH264FixQp; VENC_H264_QPMAP_S stH264QpMap; VENC_MJPEG_CBR_S stMjpegCbr; VENC_MJPEG_VBR_S stMjpegVbr; VENC_MJPEG_FIXQP_S stMjpegFixQp; VENC_H265_CBR_S stH265Cbr; VENC_H265_VBR_S stH265Vbr; VENC_H265_AVBR_S stH265AVbr; VENC_H265_FIXQP_S stH265FixQp; VENC_H265_QPMAP_S stH265QpMap; }; }VENC_RC_ATTR_S; /*the super frame mode*/ typedef enum hiRC_SUPERFRM_MODE_E { SUPERFRM_NONE=0, /* sdk don't care super frame */ SUPERFRM_DISCARD, /* the super frame is discarded */ SUPERFRM_REENCODE, /* the super frame is re-encode */ SUPERFRM_BUTT }VENC_SUPERFRM_MODE_E; /* The param of H264e cbr*/ typedef struct hiVENC_PARAM_H264_CBR_S { HI_U32 u32MinIprop; /* RW; Range:[1, 100]; the min ratio of i frame and p frame */ HI_U32 u32MaxIprop; /* RW; Range:[u32MinIprop, 100]; the max ratio of i frame and p frame */ HI_U32 u32MaxQp; /* RW; Range:(MinQp, 51];the max QP value */ HI_U32 u32MinQp; /* RW; Range:[0, 51]; the min QP value */ HI_U32 u32MaxIQp; /* RW; Range:(MinQp, 51]; max qp for i frame */ HI_U32 u32MinIQp; /* RW; Range:[0, 51]; min qp for i frame */ HI_S32 s32MaxReEncodeTimes; /* RW; Range:[0, 3]; Range:max number of re-encode times.*/ HI_BOOL bQpMapEn; /* RW; Range:[0, 1]; enable qpmap.*/ }VENC_PARAM_H264_CBR_S; /* The param of H264e vbr*/ typedef struct hiVENC_PARAM_H264_VBR_S { HI_S32 s32ChangePos; /* RW; Range:[50, 100]; Indicates the ratio of the current bit rate to the maximum bit rate when the QP value starts to be adjusted */ HI_U32 u32MinIprop; /* RW; Range:[1, 100] ; the min ratio of i frame and p frame */ HI_U32 u32MaxIprop; /* RW; Range:[u32MinIprop, 100] ; the max ratio of i frame and p frame */ HI_S32 s32MaxReEncodeTimes; /* RW; Range:[0, 3]; max number of re-encode times */ HI_BOOL bQpMapEn; HI_U32 u32MaxQp; /* RW; Range:(MinQp, 51]; the max P B qp */ HI_U32 u32MinQp; /* RW; Range:[0, 51]; the min P B qp */ HI_U32 u32MaxIQp; /* RW; Range:(MinIQp, 51]; the max I qp */ HI_U32 u32MinIQp; /* RW; Range:[0, 51]; the min I qp */ } VENC_PARAM_H264_VBR_S; /* The param of H264e avbr*/ typedef struct hiVENC_PARAM_H264_AVBR_S { HI_S32 s32ChangePos; /* RW; Range:[50, 100]; Indicates the ratio of the current bit rate to the maximum bit rate when the QP value starts to be adjusted */ HI_U32 u32MinIprop; /* RW; Range:[1, 100] ; the min ratio of i frame and p frame */ HI_U32 u32MaxIprop; /* RW; Range:[u32MinIprop, 100] ; the max ratio of i frame and p frame */ HI_S32 s32MaxReEncodeTimes; /* RW; Range:[0, 3]; max number of re-encode times */ HI_BOOL bQpMapEn; HI_S32 s32MinStillPercent; /* RW; Range:[20, 100]; the min percent of target bitrate for still scene */ HI_U32 u32MaxStillQP; /* RW; Range:[MinIQp, MaxIQp]; the max QP value of I frame for still scene*/ HI_U32 u32MinStillPSNR; /* RW; reserved,Invalid member currently */ HI_U32 u32MaxQp; /* RW; Range:(MinQp, 51]; the max P B qp */ HI_U32 u32MinQp; /* RW; Range:[0, 51]; the min P B qp */ HI_U32 u32MaxIQp; /* RW; Range:(MinIQp, 51]; the max I qp */ HI_U32 u32MinIQp; /* RW; Range:[0, 51]; the min I qp */ HI_U32 u32MotionSensitivity; /* RW; Range:[0, 100]; Motion Sensitivity */ } VENC_PARAM_H264_AVBR_S; /* The param of mjpege cbr*/ typedef struct hiVENC_PARAM_MJPEG_CBR_S { HI_U32 u32MaxQfactor; /* RW; Range:[MinQfactor, 99]; the max Qfactor value*/ HI_U32 u32MinQfactor; /* RW; Range:[1, 99]; the min Qfactor value */ }VENC_PARAM_MJPEG_CBR_S; /* The param of mjpege vbr*/ typedef struct hiVENC_PARAM_MJPEG_VBR_S { HI_S32 s32ChangePos; /* RW; Range:[50, 100]; Indicates the ratio of the current bit rate to the maximum bit rate when the Qfactor value starts to be adjusted */ HI_U32 u32MaxQfactor; /* RW; Range:[MinQfactor, 99]; max image quailty allowed */ HI_U32 u32MinQfactor; /* RW; Range:[1, 99]; min image quality allowed */ }VENC_PARAM_MJPEG_VBR_S; /* The param of h265e cbr*/ typedef struct hiVENC_PARAM_H265_CBR_S { HI_U32 u32MinIprop; /* RW; Range: [u32MinIprop, 100]; the min ratio of i frame and p frame */ HI_U32 u32MaxIprop; /* RW; Range: [1, 100];the max ratio of i frame and p frame */ HI_U32 u32MaxQp; /* RW; Range:(MinQp, 51];the max QP value */ HI_U32 u32MinQp; /* RW; Range:[1, 51];the min QP value */ HI_U32 u32MaxIQp; /* RW; Range:(MinIQp, 51];max qp for i frame */ HI_U32 u32MinIQp; /* RW; Range:[1, 51];min qp for i frame */ HI_S32 s32MaxReEncodeTimes; /* RW; Range:[0, 3]; Range:max number of re-encode times.*/ HI_BOOL bQpMapEn; /* RW; Range:[0, 1]; enable qpmap.*/ VENC_RC_QPMAP_MODE_E enQpMapMode; /* RW; Qpmap Mode*/ }VENC_PARAM_H265_CBR_S; /* The param of h265e vbr*/ typedef struct hiVENC_PARAM_H265_VBR_S { HI_S32 s32ChangePos; /* RW; Range:[50, 100];Indicates the ratio of the current bit rate to the maximum bit rate when the QP value starts to be adjusted */ HI_U32 u32MinIprop; /* RW; [1, 100]the min ratio of i frame and p frame */ HI_U32 u32MaxIprop; /* RW; (MinIprop, 100]the max ratio of i frame and p frame */ HI_S32 s32MaxReEncodeTimes; /* RW; Range:[0, 3]; Range:max number of re-encode times.*/ HI_U32 u32MaxQp; /* RW; Range:(MinQp, 51]; the max P B qp */ HI_U32 u32MinQp; /* RW; Range:[0, 51]; the min P B qp */ HI_U32 u32MaxIQp; /* RW; Range:(MinIQp, 51]; the max I qp */ HI_U32 u32MinIQp; /* RW; Range:[0, 51]; the min I qp */ HI_BOOL bQpMapEn; /* RW; Range:[0, 1]; enable qpmap.*/ VENC_RC_QPMAP_MODE_E enQpMapMode; /* RW; Qpmap Mode*/ } VENC_PARAM_H265_VBR_S; /* The param of h265e vbr*/ typedef struct hiVENC_PARAM_H265_AVBR_S { HI_S32 s32ChangePos; /* RW; Range:[50, 100];Indicates the ratio of the current bit rate to the maximum bit rate when the QP value starts to be adjusted */ HI_U32 u32MinIprop; /* RW; [1, 100]the min ratio of i frame and p frame */ HI_U32 u32MaxIprop; /* RW; (MinIprop, 100]the max ratio of i frame and p frame */ HI_S32 s32MaxReEncodeTimes; /* RW; Range:[0, 3]; Range:max number of re-encode times.*/ HI_S32 s32MinStillPercent; /* RW; Range:[20, 100]; the min percent of target bitrate for still scene */ HI_U32 u32MaxStillQP; /* RW; Range:[MinIQp, MaxIQp]; the max QP value of I frame for still scene*/ HI_U32 u32MinStillPSNR; /* RW; reserved */ HI_U32 u32MaxQp; /* RW; Range:(MinQp, 51];the max P B qp */ HI_U32 u32MinQp; /* RW; Range:[1, 51];the min P B qp */ HI_U32 u32MaxIQp; /* RW; Range:(MinIQp, 51];the max I qp */ HI_U32 u32MinIQp; /* RW; Range:[1, 51];the min I qp */ HI_U32 u32MotionSensitivity; /* RW; Range:[0, 100]; Motion Sensitivity */ HI_BOOL bQpMapEn; /* RW; Range:[0, 1]; enable qpmap.*/ VENC_RC_QPMAP_MODE_E enQpMapMode; /* RW; Qpmap Mode*/ } VENC_PARAM_H265_AVBR_S; /* The param of rc*/ typedef struct hiVENC_RC_PARAM_S { HI_U32 u32ThrdI[RC_TEXTURE_THR_SIZE]; /*RW; Range:[0, 255]; Mad threshold for controlling the macroblock-level bit rate of I frames */ HI_U32 u32ThrdP[RC_TEXTURE_THR_SIZE]; /*RW; Range:[0, 255]; Mad threshold for controlling the macroblock-level bit rate of P frames */ HI_U32 u32ThrdB[RC_TEXTURE_THR_SIZE]; /*RW; Range:[0, 255]; Mad threshold for controlling the macroblock-level bit rate of B frames */ HI_U32 u32DirectionThrd; /*RW; Range:[0, 16]; The direction for controlling the macroblock-level bit rate*/ HI_U32 u32RowQpDelta; /* RW; Range:[0, 10];the start QP value of each macroblock row relative to the start QP value */ HI_S32 s32FirstFrameStartQp; /* RW; Range:[1, 51];Start QP value of the first frame*/ union { VENC_PARAM_H264_CBR_S stParamH264Cbr; VENC_PARAM_H264_VBR_S stParamH264Vbr; VENC_PARAM_H264_AVBR_S stParamH264AVbr; VENC_PARAM_H265_CBR_S stParamH265Cbr; VENC_PARAM_H265_VBR_S stParamH265Vbr; VENC_PARAM_H265_AVBR_S stParamH265AVbr; VENC_PARAM_MJPEG_CBR_S stParamMjpegCbr; VENC_PARAM_MJPEG_VBR_S stParamMjpegVbr; }; }VENC_RC_PARAM_S; /* the frame lost mode*/ typedef enum hiVENC_FRAMELOST_MODE_E { FRMLOST_NORMAL=0, /*normal mode*/ FRMLOST_PSKIP, /*pskip*/ FRMLOST_BUTT, }VENC_FRAMELOST_MODE_E; /* The param of the frame lost mode*/ typedef struct hiVENC_FRAMELOST_S { HI_BOOL bFrmLostOpen; /* RW; Range:[0,1];Indicates whether to discard frames to ensure stable bit rate when the instant bit rate is exceeded */ HI_U32 u32FrmLostBpsThr; /* RW; Range:[64k, 163840k];the instant bit rate threshold */ VENC_FRAMELOST_MODE_E enFrmLostMode; /* frame lost strategy*/ HI_U32 u32EncFrmGaps; /* RW; Range:[0,65535]; the gap of frame lost*/ }VENC_FRAMELOST_S; /* the rc priority*/ typedef enum hiVENC_RC_PRIORITY_E { VENC_RC_PRIORITY_BITRATE_FIRST = 1, /* bitrate first */ VENC_RC_PRIORITY_FRAMEBITS_FIRST, /* framebits first*/ VENC_RC_PRIORITY_BUTT, } VENC_RC_PRIORITY_E; /* the config of the superframe */ typedef struct hiVENC_SUPERFRAME_CFG_S { VENC_SUPERFRM_MODE_E enSuperFrmMode; /* RW; Indicates the mode of processing the super frame*/ HI_U32 u32SuperIFrmBitsThr; /* RW; Range:[0, 4294967295];Indicate the threshold of the super I frame for enabling the super frame processing mode */ HI_U32 u32SuperPFrmBitsThr; /* RW; Range:[0, 4294967295];Indicate the threshold of the super P frame for enabling the super frame processing mode */ HI_U32 u32SuperBFrmBitsThr; /* RW; Range:[0, 4294967295];Indicate the threshold of the super B frame for enabling the super frame processing mode */ VENC_RC_PRIORITY_E enRcPriority; /* RW; Rc Priority*/ }VENC_SUPERFRAME_CFG_S; #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* __HI_COMM_RC_H__ */