www.pudn.com > wm2.5.zip > ratectl.h
/* *********************************************************************** * * Copyright * ************************************************************************ */ /*! *************************************************************************** * \file * ratectl.h * * \author * LI Xiao * * \date * 17 Sep 2004 * * \brief * Headerfile for rate control ************************************************************************** */ #ifndef _RATE_CTL_H_ #define _RATE_CTL_H_ #define MIN(a,b) (((a)<(b)) ? (a) : (b)) #define MAX(a,b) (((a)<(b)) ? (b) : (a)) #define MaxWindowSize 20 double bit_rate; double frame_rate; double GAMMAP; double BETAP; int RC_MAX_QUANT; int RC_MIN_QUANT; double BufferSize; double GOPTargetBufferLevel; double CurrentBufferFullness; double TargetBufferLevel; double PreviousBit_Rate; double AWp; double AWb; int MyInitialQp; int PAverageQp; /*quadratic rate-distortion model*/ int m_rgRejected[21]; // 是否用于计算新的模型参数 double m_rgQp[21]; // 已经编码 Basic Units 的 QP double m_rgRp[21]; // 已经编码 Basic Units 的 (R-H)/(MAD) double m_X1; // RD 模型的一次项系数 Q-1 double m_X2; // RD 模型的一次项系数 Q-2 int m_Qc; // 当前 Macroblock QP double m_Qstep; // 当前 Macroblock QPstep int m_Qp; // 当前 Macroblock QP 的预测值 int Pm_Qp; // 前一个 Macroblock 使用的 QP int PreAveMBHeader; int CurAveMBHeader; int PPreHeader; int PreviousQp1; int PreviousQp2; int NumberofBFrames; /*basic unit layer rate control*/ int TotalFrameQP; // 已编码的 Macroblock 中 QP 的和, 在编码时累加 int NumberofBasicUnit; // 一帧图像中未编码 Macroblock 的数目 int PAveHeaderBits1; // 当前图像已编码的 Macroblock 的平均头信息的比特数 int PAveHeaderBits2; // 当前图像和前一帧图像已编码的 Macroblock 的平均头信息的比特数 int PAveHeaderBits3; // 前一帧图像已编码的 Macroblock 的平均头信息的比特数 int PAveFrameQP; // 前一帧图像中 QP 的平均值 int TotalNumberofBasicUnit; // 一帧图像中 Macroblock 的数目 int CodedBasicUnit; // 一帧图像中已编码 Macroblock 的数目 double MINVALUE; // 确定一个 Macroblock 应分配的比特数的比例 int m_Hp; // 当前 Macroblock 头信息编码使用的比特数 int m_windowSize; int DDquant; // Macroblock 大于等于 9 时设为 1, 其余为 2 int MBPerRow; // 水平方向上的宏块数 double AverageMADPreviousFrame; int TotalBasicUnitBits; int QPLastPFrame; // 上一个 GOP 最后一个 P 帧的 QP int QPLastGOP; // 上一个 GOP 的初始 QP /////////////////////////////////////////////////////////////////////////////// int FrameActualBit ; double Pm_rgQp[20]; double Pm_rgRp[20]; double Pm_X1; double Pm_X2; int Pm_Hp; /* adaptive field/frame coding*/ int FieldQPBuffer; int FrameQPBuffer; int FrameAveHeaderBits; int FieldAveHeaderBits; double BUPFMAD[6336]; // 前一帧各 Basic Unit 的 MAD double BUCFMAD[6336]; // 当前帧各 Basic Unit 的 MAD double FCBUCFMAD[6336]; double FCBUPFMAD[6336]; int GOPOverdue; //GOP 是否还有可分配的比特数, 只在对 P 帧的第一个 Macroblock 编码时检测并修改 //comput macroblock activity for rate control int diffy[16][16]; int diffyy[16][16]; int diffy8[16][16];//for P8X8 mode extern int Iprev_bits; extern int Pprev_bits; #define MAX_FRAME_TO_BE_CNCODED 1000 unsigned int g_unFrameEncoded; double g_lfBuffleFullness[MAX_FRAME_TO_BE_CNCODED]; int g_nAllocatedBits[MAX_FRAME_TO_BE_CNCODED]; double g_nbestDCTcoef[MB_BLOCK_SIZE][MB_BLOCK_SIZE]; double DCTscale[BLOCK_SIZE][BLOCK_SIZE]; double CurrentFrameLValidbits; // 当前帧亮度有效比特数 double PreviousFrameLValidbits; double PredictedFrameLValidbits; // 预测的有效比特数 int PicLValidbitsRejected[MaxWindowSize+1]; double PPicLValidbits[MaxWindowSize+1]; // 已编码帧的有效比特, 序号小表示离当前帧较近 double PicLValidbits[MaxWindowSize+1]; // 预测帧的有效比特 double RefLValidbits[MaxWindowSize+1]; // 参考帧的有效比特 double PreviousPicLValidbits; // 前一帧图像有效比特数 double LValidbitsPicC1; // 有效比特数预测模型的一次项系数 double LValidbitsPicC2; // 有效比特数预测模型的常数项系数 double PLValidbitsPicC1; double PLValidbitsPicC2; int Validbitsm_windowSize; // 有效比特数预测窗的大小 ///////////////////////////////////////////////////////////////////////////// void rc_init_seq(); void rc_init_GOP(int np, int nb); void rc_update_pict_frame(int nbits); void rc_init_pict(int fieldpic,int topfield, int targetcomputation); void rc_update_pict(int nbits); int updateQuantizationParameter(int topfield); void updateRCModel (); //////////////////////////////////////////////////////////////////////// int skipThisFrame (); ///////////////////////////////////////////////////////////////////////// void RCModelEstimator (int n_windowSize); void ValidbitsModelEstimator (int n_windowSize); void updateValidbitsModel (); int Qstep2QP( double Qstep ); double QP2Qstep( int QP ); #endif