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