⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ratectl.c

📁 h.264标准和jm
💻 C
📖 第 1 页 / 共 3 页
字号:
				||(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:
 /*filed 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;
	  }
}

// coded bits for top field
void setbitscount(int nbits)
{
	bits_topfield = nbits;
}

//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->InterlaceCodingOption==1)\
							||(input->InterlaceCodingOption==3))
						{
							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->InterlaceCodingOption==1)\
							||(input->InterlaceCodingOption==3))
						{
							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(input->InterlaceCodingOption==0)
					{
						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->InterlaceCodingOption==1)\
					||(input->InterlaceCodingOption==3))\
					&&(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(input->InterlaceCodingOption==0)
					{
						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->InterlaceCodingOption==2)
			 {
				 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*/
		if(img->type==I_SLICE)
		{
			m_Qc=MyInitialQp;
			return m_Qc;
		}
		/*bottom field of I frame*/
		else if((img->type==P_SLICE)&&(img->IFLAG==1)&&(img->FieldControl==1))
		{
			m_Qc=MyInitialQp;
			return m_Qc;
		}
		else if(img->type==B_SLICE)
		{
			/*top filed of B frame*/
			if((topfield)||(img->FieldControl==0))
			{
				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->InterlaceCodingOption==1)\
						||(input->InterlaceCodingOption==3))
					{
						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->InterlaceCodingOption==1)\
						||(input->InterlaceCodingOption==3))
					{
						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;//0
				else if((PreviousQp2-PreviousQp1)==(-2*input->successive_Bframe+1))
					StepSize=1;//1
				else
					StepSize=2;//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;
			}
			/*bottom field of B frame*/
			else
				return m_Qc;
		}
		else if(img->type==P_SLICE)
		{
			if((img->NumberofGOP==1)&&(img->NumberofPPicture==0))
			{
				if((img->FieldControl==0)||((img->FieldControl==1)\
					&&(img->IFLAG==0)))
				{
				/*top field of the first P frame*/
					m_Qc=MyInitialQp;
					img->NumberofBasicUnitHeaderBits=0;
					img->NumberofBasicUnitTextureBits=0;
					NumberofBasicUnit--;
				/*bottom field of the first P frame*/
					if((!topfield)&&(NumberofBasicUnit==0))
					{
						/*frame coding or field coding*/
						if((input->InterlaceCodingOption==0)||(input->InterlaceCodingOption==2))
						{
							img->TotalQpforPPicture +=m_Qc;
							PreviousQp1=PreviousQp2;
							PreviousQp2=m_Qc;
							PAveFrameQP=m_Qc;
							PAveHeaderBits3=PAveHeaderBits2;
						}
						/*adaptive frame/field coding*/
						else if((input->InterlaceCodingOption==1)\
							||(input->InterlaceCodingOption==3))
						{
							if(img->FieldControl==0)
							{
								FrameQPBuffer=m_Qc;
								FrameAveHeaderBits=PAveHeaderBits2;
							}
							else
							{
								FieldQPBuffer=m_Qc;
								FieldAveHeaderBits=PAveHeaderBits2;
							}
						}
					}
					Pm_Qp=m_Qc;
					TotalFrameQP +=m_Qc;
					return m_Qc;
				}
			}
			else
			{
				m_X1=Pm_X1;
				m_X2=Pm_X2;
				m_Hp=PPreHeader;
				m_Qp=Pm_Qp;
				DuantQp=PDuantQp;
				MADPictureC1=PMADPictureC1;
				MADPictureC2=PMADPictureC2;

				if(img->FieldControl==0)
					SumofBasicUnit=TotalNumberofBasicUnit;
				else
					SumofBasicUnit=TotalNumberofBasicUnit/2;

				/*the average QP of the previous frame is used to coded the first basic unit of the current frame or field*/
				if(NumberofBasicUnit==SumofBasicUnit)
				{

					/*adaptive field/frame coding*/
					if(((input->InterlaceCodingOption==1)\
						||(input->InterlaceCodingOption==3))\
						&&(img->FieldControl==0))
					{
						/*previous choice is frame coding*/
						if(img->FieldFrame==1)
						{
							if(img->NumberofPPicture>0)
								img->TotalQpforPPicture +=FrameQPBuffer;
							PAveFrameQP=FrameQPBuffer;
							PAveHeaderBits3=FrameAveHeaderBits;
						}				
						/*previous choice is field coding*/
						else
						{
							if(img->NumberofPPicture>0)
								img->TotalQpforPPicture +=FieldQPBuffer;
							PAveFrameQP=FieldQPBuffer;
							PAveHeaderBits3=FieldAveHeaderBits;
						}
					}

					if(T<=0)
					{
						m_Qc=PAveFrameQP+2;
						if(m_Qc>RC_MAX_QUANT)
							m_Qc=RC_MAX_QUANT;
						if(topfield||(img->FieldControl==0))
							GOPOverdue=TRUE;
					}
					else
					{
						m_Qc=PAveFrameQP; 
					}
					TotalFrameQP +=m_Qc;
					NumberofBasicUnit--;
					Pm_Qp=PAveFrameQP;
					return m_Qc;
				}else
			   {
        	/*compute the number of remaining bits*/
				   TotalBasicUnitBits=img->NumberofBasicUnitHeaderBits+img->NumberofBasicUnitTextureBits;
				   T -=TotalBasicUnitBits;
				   img->NumberofBasicUnitHeaderBits=0;
				   img->NumberofBasicUnitTextureBits=0;
				   if(T<0)
				   {
					   if(GOPOverdue==TRUE)
						   m_Qc=m_Qp+2;
					   else 
						   m_Qc=m_Qp+DDquant;//2 
					   m_Qc = MIN(m_Qc, RC_MAX_QUANT);	// clipping
					   if(input->basicunit>=MBPerRow)
						   m_Qc = MIN(m_Qc, PAveFrameQP+6); 
					   else
						   m_Qc = MIN(m_Qc, PAveFrameQP+3);

					   TotalFrameQP +=m_Qc;
					   NumberofBasicUnit--;
					   if(NumberofBasicUnit==0)
					   {
						   if((!topfield)||(img->FieldControl==0))
						   {
							   /*frame coding or field coding*/
							   if((input->InterlaceCodingOption==0)||(input->InterlaceCodingOption==2))
							   {
								   PAverageQP=(int)(1.0*TotalFrameQP/TotalNumberofBasicUnit+0.5);
								   if (img->NumberofPPicture == (input->intra_period - 2))
							            QPLastPFrame = PAverageQP;

								   img->TotalQpforPPicture +=PAverageQP;
								   if(GOPOverdue==TRUE)
								   {
									   PreviousQp1=PreviousQp2+1;
									   PreviousQp2=PAverageQP;								   
									 }
								   else
								   {
									   if((img->NumberofPPicture==0)&&(img->NumberofGOP>1))
									   {
										   PreviousQp1=PreviousQp2;
										   PreviousQp2=PAverageQP;
									   }
									   else if(img->NumberofPPicture>0)
									   {
										    PreviousQp1=PreviousQp2+1;
						    				PreviousQp2=PAverageQP;
									   }
								   }
								   PAveFrameQP=PAverageQP;
								   PAveHeaderBits3=PAveHeaderBits2;
							   }
							   /*adaptive field/frame coding*/
							   else if((input->InterlaceCodingOption==1)\
								   ||(input->InterlaceCodingOption==3))
							   {
								   if(img->FieldControl==0)
								   {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -