📄 ratectl.c
字号:
{
T = (long) floor(Wp*R/(Np*Wp+Nb*Wb) + 0.5);
T1 = (long) floor(bit_rate/frame_rate-GAMMAP*(CurrentBufferFullness-TargetBufferLevel)+0.5);
T1 = MAX(0,T1);
T = (long)(floor(BETAP*T+(1.0-BETAP)*T1+0.5));
}
}
/* reserve some bits for smoothing */
T=(long)((1.0-0.0*input->successive_Bframe)*T);
/* HRD consideration */
T = MAX(T, (long) LowerBound);
T = MIN(T, (long) UpperBound2);
if((topfield)||(fieldpic&&((input->PicInterlace==ADAPTIVE_CODING)\
||(input->MbInterlace))))
T_field=T;
}
}
if(fieldpic||topfield)
{
/* frame layer rate control */
img->NumberofHeaderBits=0;
img->NumberofTextureBits=0;
/* basic unit layer rate control */
if(img->BasicUnit<img->Frame_Total_Number_MB)
{
TotalFrameQP=0;
img->NumberofBasicUnitHeaderBits=0;
img->NumberofBasicUnitTextureBits=0;
img->TotalMADBasicUnit=0;
if(img->FieldControl==0)
NumberofBasicUnit=TotalNumberofBasicUnit;
else
NumberofBasicUnit=TotalNumberofBasicUnit/2;
}
}
if((img->type==P_SLICE)&&(img->BasicUnit<img->Frame_Total_Number_MB)\
&&(img->FieldControl==1))
{
/* top filed at basic unit layer rate control */
if(topfield)
{
bits_topfield=0;
T=(long)(T_field*0.6);
}
/* bottom filed at basic unit layer rate control */
else
{
T=T_field-bits_topfield;
img->NumberofBasicUnitHeaderBits=0;
img->NumberofBasicUnitTextureBits=0;
img->TotalMADBasicUnit=0;
NumberofBasicUnit=TotalNumberofBasicUnit/2;
}
}
}
/*!
*************************************************************************************
* \brief
* calculate MAD for the current macroblock
*
* \return
* calculated MAD
*
*************************************************************************************
*/
double calc_MAD()
{
int k,l;
int s = 0;
double MAD;
for (k = 0; k < 16; k++)
for (l = 0; l < 16; l++)
s+= abs(diffy[k][l]);
MAD=s*1.0/256;
return MAD;
}
/*!
*************************************************************************************
* \brief
* update one picture after frame/field encoding
*
* \param nbits
* number of bits used for picture
*
*************************************************************************************
*/
void rc_update_pict(int nbits)
{
R-= nbits; /* remaining # of bits in GOP */
CurrentBufferFullness += nbits - bit_rate/frame_rate;
/*update the lower bound and the upper bound for the target bits of each frame, HRD consideration*/
LowerBound +=(long)(bit_rate/frame_rate-nbits);
UpperBound1 +=(long)(bit_rate/frame_rate-nbits);
UpperBound2 = (long)(OMEGA*UpperBound1);
return;
}
/*!
*************************************************************************************
* \brief
* update after frame encoding
*
* \param nbits
* number of bits used for frame
*
*************************************************************************************
*/
void rc_update_pict_frame(int nbits)
{
/* update the complexity weight of I, P, B frame */
int Avem_Qc;
int X=0;
/* frame layer rate control */
if(img->BasicUnit==img->Frame_Total_Number_MB)
X = (int) floor(nbits*m_Qc+ 0.5);
/* basic unit layer rate control */
else
{
if(img->type==P_SLICE)
{
if(((img->IFLAG==0)&&(img->FieldControl==1))\
||(img->FieldControl==0))
{
Avem_Qc=TotalFrameQP/TotalNumberofBasicUnit;
X=(int)floor(nbits*Avem_Qc+0.5);
}
}
else if(img->type==B_SLICE)
X = (int) floor(nbits*m_Qc+ 0.5);
}
switch (img->type)
{
case P_SLICE:
/* field coding */
if(((img->IFLAG==0)&&(img->FieldControl==1))\
||(img->FieldControl==0))
{
Xp = X;
Np--;
Wp=Xp;
Pm_Hp=img->NumberofHeaderBits;
img->NumberofCodedPFrame++;
img->NumberofPPicture++;
}
else if((img->IFLAG!=0)&&(img->FieldControl==1))
img->IFLAG=0;
break;
case B_SLICE:
Xb = X;
Nb--;
Wb=Xb/THETA;
img->NumberofCodedBFrame++;
NumberofBFrames++;
break;
}
}
/*!
*************************************************************************************
* \brief
* coded bits for top field
*
* \param nbits
* number of bits used for top field
*
*************************************************************************************
*/
void setbitscount(int nbits)
{
bits_topfield = nbits;
}
/*!
*************************************************************************************
* \brief
* compute a quantization parameter for each frame
*
*************************************************************************************
*/
int updateQuantizationParameter(int topfield)
{
double dtmp;
int m_Bits;
int BFrameNumber;
int StepSize;
int PAverageQP;
int SumofBasicUnit;
int i;
/* frame layer rate control */
if(img->BasicUnit==img->Frame_Total_Number_MB)
{
/* fixed quantization parameter is used to coded I frame, the first P frame and the first B frame
the quantization parameter is adjusted according the available channel bandwidth and
the type of vide */
/*top field*/
if((topfield)||(img->FieldControl==0))
{
if(img->type==I_SLICE)
{
m_Qc=MyInitialQp;
return m_Qc;
}
else if(img->type==B_SLICE)
{
if(input->successive_Bframe==1)
{
BFrameNumber=(NumberofBFrames+1)%input->successive_Bframe;
if(BFrameNumber==0)
BFrameNumber=input->successive_Bframe;
/*adaptive field/frame coding*/
else if(BFrameNumber==1)
{
if((input->PicInterlace==ADAPTIVE_CODING)\
||(input->MbInterlace))
{
if(img->FieldControl==0)
{
/*previous choice is frame coding*/
if(img->FieldFrame==1)
{
PreviousQp1=PreviousQp2;
PreviousQp2=FrameQPBuffer;
}
/*previous choice is field coding*/
else
{
PreviousQp1=PreviousQp2;
PreviousQp2=FieldQPBuffer;
}
}
}
}
if(PreviousQp1==PreviousQp2)
m_Qc=PreviousQp1+2;
else
m_Qc=(PreviousQp1+PreviousQp2)/2+1;
m_Qc = MIN(m_Qc, RC_MAX_QUANT); // clipping
m_Qc = MAX(RC_MIN_QUANT, m_Qc);//clipping
}
else
{
BFrameNumber=(NumberofBFrames+1)%input->successive_Bframe;
if(BFrameNumber==0)
BFrameNumber=input->successive_Bframe;
/*adaptive field/frame coding*/
else if(BFrameNumber==1)
{
if((input->PicInterlace==ADAPTIVE_CODING)\
||(input->MbInterlace))
{
if(img->FieldControl==0)
{
/*previous choice is frame coding*/
if(img->FieldFrame==1)
{
PreviousQp1=PreviousQp2;
PreviousQp2=FrameQPBuffer;
}
/*previous choice is field coding*/
else
{
PreviousQp1=PreviousQp2;
PreviousQp2=FieldQPBuffer;
}
}
}
}
if((PreviousQp2-PreviousQp1)<=(-2*input->successive_Bframe-3))
StepSize=-3;
else if((PreviousQp2-PreviousQp1)==(-2*input->successive_Bframe-2))
StepSize=-2;
else if((PreviousQp2-PreviousQp1)==(-2*input->successive_Bframe-1))
StepSize=-1;
else if((PreviousQp2-PreviousQp1)==(-2*input->successive_Bframe))
StepSize=0;
else if((PreviousQp2-PreviousQp1)==(-2*input->successive_Bframe+1))
StepSize=1;
else
StepSize=2;
m_Qc=PreviousQp1+StepSize;
m_Qc +=MIN(2*(BFrameNumber-1),MAX(-2*(BFrameNumber-1), \
(BFrameNumber-1)*(PreviousQp2-PreviousQp1)/(input->successive_Bframe-1)));
m_Qc = MIN(m_Qc, RC_MAX_QUANT); // clipping
m_Qc = MAX(RC_MIN_QUANT, m_Qc);//clipping
}
return m_Qc;
}
else if((img->type==P_SLICE)&&(img->NumberofPPicture==0))
{
m_Qc=MyInitialQp;
if(img->FieldControl==0)
{
if(active_sps->frame_mbs_only_flag)
{
img->TotalQpforPPicture +=m_Qc;
PreviousQp1=PreviousQp2;
PreviousQp2=m_Qc;
Pm_Qp=m_Qc;
}
/*adaptive field/frame coding*/
else
FrameQPBuffer=m_Qc;
}
return m_Qc;
}
else
{
/*adaptive field/frame coding*/
if(((input->PicInterlace==ADAPTIVE_CODING)\
||(input->MbInterlace))\
&&(img->FieldControl==0))
{
/*previous choice is frame coding*/
if(img->FieldFrame==1)
{
img->TotalQpforPPicture +=FrameQPBuffer;
Pm_Qp=FrameQPBuffer;
}
/*previous choice is field coding*/
else
{
img->TotalQpforPPicture +=FieldQPBuffer;
Pm_Qp=FieldQPBuffer;
}
}
m_X1=Pm_X1;
m_X2=Pm_X2;
m_Hp=PPreHeader;
m_Qp=Pm_Qp;
DuantQp=PDuantQp;
MADPictureC1=PMADPictureC1;
MADPictureC2=PMADPictureC2;
PreviousPictureMAD=PPictureMAD[0];
/* predict the MAD of current picture*/
CurrentFrameMAD=MADPictureC1*PreviousPictureMAD+MADPictureC2;
/*compute the number of bits for the texture*/
if(T<0)
{
m_Qc=m_Qp+DuantQp;
m_Qc = MIN(m_Qc, RC_MAX_QUANT); // clipping
}
else
{
m_Bits =T-m_Hp;
m_Bits = MAX(m_Bits, (int)(bit_rate/(MINVALUE*frame_rate)));
dtmp = CurrentFrameMAD * m_X1 * CurrentFrameMAD * m_X1 \
+ 4 * m_X2 * CurrentFrameMAD * m_Bits;
if ((m_X2 == 0.0) || (dtmp < 0) || ((sqrt (dtmp) - m_X1 * CurrentFrameMAD) <= 0.0)) // fall back 1st order mode
m_Qstep = (float) (m_X1 * CurrentFrameMAD / (double) m_Bits);
else // 2nd order mode
m_Qstep = (float) ((2 * m_X2 * CurrentFrameMAD) / (sqrt (dtmp) - m_X1 * CurrentFrameMAD));
m_Qc=Qstep2QP(m_Qstep);
m_Qc = MIN(m_Qp+DuantQp, m_Qc); // control variation
m_Qc = MIN(m_Qc, RC_MAX_QUANT); // clipping
m_Qc = MAX(m_Qp-DuantQp, m_Qc); // control variation
m_Qc = MAX(RC_MIN_QUANT, m_Qc);
}
if(img->FieldControl==0)
{
/*frame coding*/
if(active_sps->frame_mbs_only_flag)
{
img->TotalQpforPPicture +=m_Qc;
PreviousQp1=PreviousQp2;
PreviousQp2=m_Qc;
Pm_Qp=m_Qc;
}
/*adaptive field/frame coding*/
else
FrameQPBuffer=m_Qc;
}
return m_Qc;
}
}
/*bottom field*/
else
{
if((img->type==P_SLICE)&&(img->IFLAG==0))
{
/*field coding*/
if(input->PicInterlace==FIELD_CODING)
{
img->TotalQpforPPicture +=m_Qc;
PreviousQp1=PreviousQp2+1;
PreviousQp2=m_Qc;//+0 Recent change 13/1/2003
Pm_Qp=m_Qc;
}
/*adaptive field/frame coding*/
else
FieldQPBuffer=m_Qc;
}
return m_Qc;
}
}
/*basic unit layer rate control*/
else
{
/*top filed of I frame*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -