/******************************************************************************

  Copyright (C), 2001-2012, Hisilicon Tech. Co., Ltd.

 ******************************************************************************
  File Name     : hi_comm_rc.h
  Version       : 
  Author        : Hisilicon Hi35xx MPP Team
  Created       : 2006/11/24
  Last Modified :
  Description   : common struct definition for Rate control
  Function List :
  History       :
******************************************************************************/
#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_H264ABR,        
    VENC_RC_MODE_H264FIXQP,      

    VENC_RC_MODE_MJPEGCBR,    
    VENC_RC_MODE_MJPEGVBR,        
    VENC_RC_MODE_MJPEGABR,        
    VENC_RC_MODE_MJPEGFIXQP,  

    VENC_RC_MODE_MPEG4CBR,    
    VENC_RC_MODE_MPEG4VBR,        
    VENC_RC_MODE_MPEG4ABR,        
    VENC_RC_MODE_MPEG4FIXQP,  

    VENC_RC_MODE_H265CBR,    
    VENC_RC_MODE_H265VBR,        
    VENC_RC_MODE_H265FIXQP,    
    
    VENC_RC_MODE_BUTT,

}VENC_RC_MODE_E;


typedef struct hiVENC_ATTR_H264_FIXQP_S
{
    HI_U32      u32Gop;                                  /*the interval of ISLICE. */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */     
    HI_U32      u32IQp;                                  /* qp of the i frame */
    HI_U32      u32PQp;                                  /* qp of the p frame */
} VENC_ATTR_H264_FIXQP_S;

typedef struct hiVENC_ATTR_H264_CBR_S
{
    HI_U32      u32Gop;                                  /*the interval of ISLICE. */
    HI_U32      u32StatTime;                             /* the rate statistic time, the unit is senconds(s) */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */ 
    HI_U32      u32BitRate;                              /* average bitrate */
    HI_U32      u32FluctuateLevel;                       /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */
} VENC_ATTR_H264_CBR_S;                                         
                                         
typedef struct hiVENC_ATTR_H264_VBR_S
{
    HI_U32      u32Gop;                                  /*the interval of ISLICE. */
    HI_U32      u32StatTime;                             /* the rate statistic time, the unit is senconds(s) */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */     
    HI_U32      u32MaxBitRate;                           /* the max bitrate */                      
    HI_U32      u32MaxQp;                                /* the max qp */
    HI_U32      u32MinQp;                                /* the min qp */
}VENC_ATTR_H264_VBR_S;

typedef struct hiVENC_ATTR_H264_ABR_S
{
    HI_U32      u32Gop;                                  /*the interval of ISLICE. */
    HI_U32      u32StatTime;                             /* the rate statistic time, the unit is senconds(s) */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */    
    HI_U32      u32AvgBitRate;                           /* average bitrate */        
    HI_U32      u32MaxBitRate;                           /* the max bitrate */
}VENC_ATTR_H264_ABR_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_FIXQP_S VENC_ATTR_H265_FIXQP_S;



typedef struct hiVENC_ATTR_MPEG4_FIXQP_S
{
    HI_U32      u32Gop;                                  /*the interval of ISLICE. */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */     
    HI_U32      u32IQp;                                  /* qp of the i frame */
    HI_U32      u32PQp;                                  /* qp of the p frame */
}VENC_ATTR_MPEG4_FIXQP_S;

typedef struct hiVENC_ATTR_MPEG4_CBR_S
{
    HI_U32      u32Gop;                                  /*the interval of ISLICE. */
    HI_U32      u32StatTime;                             /* the rate statistic time, the unit is senconds(s) */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */ 
    HI_U32      u32BitRate;                              /* average bitrate */
    HI_U32      u32FluctuateLevel;                       /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */
}VENC_ATTR_MPEG4_CBR_S;

typedef struct hiVENC_ATTR_MPEG4_VBR_S
{
    HI_U32      u32Gop;                                  /* the interval of ISLICE. */
    HI_U32      u32StatTime;                             /* the rate statistic time, the unit is senconds(s) */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */     
    HI_U32      u32MaxBitRate;                           /* the max bitrate */                      
    HI_U32      u32MaxQp;                                /* the max qp */
    HI_U32      u32MinQp;                                /* the min qp */
}VENC_ATTR_MPEG4_VBR_S;
 
typedef struct hiVENC_ATTR_MJPEG_FIXQP_S
{
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate;                          /* the target frame rate of the venc chnnel */
    HI_U32      u32Qfactor;                              /* image quality :[1,99]*/
}VENC_ATTR_MJPEG_FIXQP_S;

typedef struct hiVENC_ATTR_MJPEG_CBR_S
{
    HI_U32      u32StatTime;                             /* the rate statistic time, the unit is senconds(s) */
    HI_U32      u32SrcFrmRate;                           /* the input frame rate of the venc chnnel */
    HI_FR32     fr32DstFrmRate ;                         /* the target frame rate of the venc chnnel */
    HI_U32      u32BitRate;                              /* average bitrate */
    HI_U32      u32FluctuateLevel;                       /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */
} VENC_ATTR_MJPEG_CBR_S;

typedef struct hiVENC_ATTR_MJPEG_VBR_S
{
     HI_U32      u32StatTime;                            /* the rate statistic time, the unit is senconds(s) */
     HI_U32      u32SrcFrmRate;                          /* the input frame rate of the venc chnnel */
     HI_FR32     fr32DstFrmRate;                         /* the target frame rate of the venc chnnel */
     HI_U32      u32MaxBitRate;                          /* max bitrate */
     HI_U32      u32MaxQfactor;                          /* max image quailty allowed */
     HI_U32      u32MinQfactor;                          /* min image quality allowed */
 }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_FIXQP_S  stAttrH264FixQp;
        VENC_ATTR_H264_ABR_S    stAttrH264Abr;

        VENC_ATTR_MPEG4_CBR_S   stAttrMpeg4Cbr;
        VENC_ATTR_MPEG4_FIXQP_S stAttrMpeg4FixQp;
        VENC_ATTR_MPEG4_VBR_S   stAttrMpeg4Vbr;

        VENC_ATTR_MJPEG_CBR_S   stAttrMjpegeCbr;
        VENC_ATTR_MJPEG_FIXQP_S stAttrMjpegeFixQp;
        VENC_ATTR_MJPEG_VBR_S   stAttrMjpegeVbr;

        VENC_ATTR_H265_CBR_S    stAttrH265Cbr;
        VENC_ATTR_H265_VBR_S    stAttrH265Vbr;
        VENC_ATTR_H265_FIXQP_S  stAttrH265FixQp;
    };   
    HI_VOID*       pRcAttr ;                             /*the rc attribute which could be specified by user*/
 
}VENC_RC_ATTR_S;

typedef enum hiRC_SUPERFRM_MODE_E
{
    SUPERFRM_NONE,                                       /* 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;

typedef struct hiVENC_PARAM_H264_CBR_S
{
    HI_U32  u32MinIprop;                                 /* the min ratio of i frame and p frame */           
    HI_U32  u32MaxIprop;                                 /* the max ratio of i frame and p frame */
    HI_U32  u32MaxQp;                                    /* the max QP value */
    HI_U32  u32MinQp;                                    /* the min QP value */
    HI_S32  s32IPQPDelta;                                /* the qp difference between the i frame and the before gop avarage qp; == Qp(P) - Qp(I) */
    HI_S32  s32QualityLevel;                             /* quality of picture [1, 5] */
    HI_S32  s32MaxReEncodeTimes;                         /* max number of re-encode times [0, 3]*/ 
    HI_U32  u32MinIQp;                                   /* min qp for i frame */
}VENC_PARAM_H264_CBR_S;

typedef struct hiVENC_PARAM_H264_VBR_S
{
    HI_S32 s32IPQPDelta;                                 /* the qp difference between the i frame and the before gop avarage qp; == Qp(P) - Qp(I) */
    HI_S32 s32ChangePos;                                 /* Indicates the ratio of the current bit rate to the maximum 
                                                            bit rate when the QP value starts to be adjusted */
    HI_U32  u32MinIprop;                                 /* the min ratio of i frame and p frame */           
    HI_U32  u32MaxIprop;                                 /* the max ratio of i frame and p frame */                                          
    HI_U32  u32MinIQP;                                   /* min qp for i frame */
}VENC_PARAM_H264_VBR_S;



typedef struct hiVENC_PARAM_MJPEG_CBR_S
{
    HI_U32  u32MaxQfactor;                               /* the max Qfactor value*/
    HI_U32  u32MinQfactor;                               /* the min Qfactor value */    
    HI_U32  u32RQRatio[RC_RQRATIO_SIZE];                               /* the rate stabilization weight, 
                                                            100-u32RQRatio[i] is the sequence quality stabilization weight */ 

}VENC_PARAM_MJPEG_CBR_S;

typedef struct hiVENC_PARAM_MJPEG_VBR_S
{
    HI_S32 s32DeltaQfactor;                              /* Indicates the maximum change of Qfactor values of frames 
                                                            when the picture quality changes */
    HI_S32 s32ChangePos;                                 /* Indicates the ratio of the current bit rate to the maximum 
                                                            bit rate when the Qfactor value starts to be adjusted */                                               
}VENC_PARAM_MJPEG_VBR_S;

typedef struct hiVENC_PARAM_MPEG4_CBR_S
{
    HI_U32  u32MinIprop;                                 /* the min ratio of i frame and p frame*/           
    HI_U32  u32MaxIprop;                                 /* the max ratio of i frame and p frame */
     
    HI_U32  u32MaxQp;                                    /* the max QP value*/
    HI_U32  u32MinQp;                                    /* the min QP value */
    HI_U32  u32MaxPPDeltaQp;                             /* the max qp value difference between two successive P frame */
    HI_U32  u32MaxIPDeltaQp;                             /* the max qp value difference between p frame and the next i frame */    
    HI_S32 s32IPQPDelta;                                 /* the qp difference between the i frame and the before gop avarage qp*/

    HI_U32  u32RQRatio[RC_RQRATIO_SIZE];                               /* the rate stabilization weight, 
                                                            100-u32RQRatio[i] is the sequence quality stabilization weight */
}VENC_PARAM_MPEG4_CBR_S;

typedef struct hiVENC_PARAM_MPEG4_VBR_S
{
    HI_S32 s32IPQPDelta;                                 /* the qp difference between the i frame and the before gop avarage qp*/
    
    HI_S32 s32ChangePos;                                 /* Indicates the ratio of the current bit rate to the maximum 
                                                            bit rate when the QP value starts to be adjusted */

    HI_U32  u32MinIprop;                                 /* the min ratio of i frame and p frame */           
    HI_U32  u32MaxIprop;                                 /* the max ratio of i frame and p frame */                                               
}VENC_PARAM_MPEG4_VBR_S;

typedef struct hiVENC_PARAM_H264_CBR_S   VENC_PARAM_H265_CBR_S; 
typedef struct hiVENC_PARAM_H264_VBR_S   VENC_PARAM_H265_VBR_S; 


typedef struct hiVENC_RC_PARAM_S
{     
    HI_U32 u32ThrdI[RC_TEXTURE_THR_SIZE];                /* just useful for h264/h265 and mpeg4 for now */
    HI_U32 u32ThrdP[RC_TEXTURE_THR_SIZE];
    HI_U32 u32RowQpDelta;
    union
    {
        VENC_PARAM_H264_CBR_S     stParamH264Cbr;
        VENC_PARAM_H264_VBR_S     stParamH264VBR;
        VENC_PARAM_MJPEG_CBR_S    stParamMjpegCbr;
        VENC_PARAM_MJPEG_VBR_S    stParamMjpegVbr;
        VENC_PARAM_MPEG4_CBR_S    stParamMpeg4Cbr;
        VENC_PARAM_MPEG4_VBR_S    stParamMpeg4Vbr;
        VENC_PARAM_H265_CBR_S     stParamH265Cbr;
        VENC_PARAM_H265_VBR_S     stParamH265Vbr;        
    };

    HI_VOID* pRcParam;                      			/*RC parameter which could be specified by usrer*/
}VENC_RC_PARAM_S;



typedef enum hiVENC_FRAMELOST_MODE_E
{   
    FRMLOST_NORMAL,                                		/*normal mode*/         
    FRMLOST_PSKIP,                                  	/*pskip  mode*/ 
    FRMLOST_BUTT,
}VENC_FRAMELOST_MODE_E;

typedef struct hiVENC_PARAM_FRAMELOST_S
{ 
    HI_BOOL bFrmLostOpen;                           	/* Indicates whether to discard frames to ensure 
                                                            stable bit rate when the instant bit rate is exceeded */
    HI_U32  u32FrmLostBpsThr;                       	/* the instant bit rate threshold */
    VENC_FRAMELOST_MODE_E enFrmLostMode;            	/*frame lost strategy*/
    HI_U32  u32EncFrmGaps;                          	/*the gap of frame lost*/
}VENC_PARAM_FRAMELOST_S;


typedef struct hiVENC_SUPERFRAME_CFG_S
{ 
      VENC_SUPERFRM_MODE_E  enSuperFrmMode;             /* Indicates the mode of processing the super frame,[SUPERFRM_NONE,SUPERFRM_DISCARD,SUPERFRM_REENCODE]*/
      HI_U32  u32SuperIFrmBitsThr;                      /* Indicate the threshold of the super I frame 
                                                               for enabling the super frame processing mode */              
      HI_U32  u32SuperPFrmBitsThr;                      /* Indicate the threshold of the super P frame */                                                     
      HI_U32  u32SuperBFrmBitsThr;                      /* Indicate the threshold of the super B frame */                                                   
}VENC_SUPERFRAME_CFG_S;

typedef enum hiVENC_RC_PRIORITY_E
{
    VENC_RC_PRIORITY_BITRATE_FIRST = 1,    				/* BitRate is prior to super frame */
    VENC_RC_PRIORITY_FRAMEBITS_FIRST,					/* Super frame  is prior to bitRate */

    VENC_RC_PRIORITY_BUTT,
} VENC_RC_PRIORITY_E;


#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */

#endif /* __HI_COMM_RC_H__ */
