亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ratecontrol.c

?? 用MPEG-4對YUV視頻文件編碼壓縮成divx視頻文件
?? C
?? 第 1 頁 / 共 2 頁
字號:
 * \brief
 *
 * Step 2: Target Bit Calculation (Before Encoding the Current Frame)
 *
 ***************************************************************************
 */

void Target_Bit_Calculation(RCQ2* rc,			/*<--> rc struct */
							int frametype		/*<--  I or P frame type */
							)
{
	int temp,temp1;/*,temp2,temp3;*/
	int Nrp=0,Nri=0;/*number of I,P,B*/

		Nri=rc->Nr/rc->max_key_interval;
		Nrp=rc->Nr-Nri;

/*	if(frametype==0&&(rc->Nr==rc->max_key_interval)) */
		/*whq,2002.12.22*/
	if(frametype==0)
		temp1=(int)((float)rc->Rr/(float)(1+(3*Nrp/8)));
		/*設(shè)置I,P之間的位數(shù)關(guān)系,可以在此直接改變*/
	else 
		temp1=rc->Rr/(Nrp);
	
	rc->T=(temp1*95+rc->data[frametype].S*5)/100;

	temp=(2*rc->Bs-rc->B)*1000/(rc->B+rc->Bs);
	rc->T=(int)(rc->T*temp)/1000;	/* increase if less than half */
						/* decrease if more than half, don't change if half */
	if (rc->B+rc->T > rc->Bs*9/10)
		rc->T = (int)max(rc->Rs/30,9*rc->Bs/10-rc->B);	/* to avoid overflow*/
	else if (rc->B-rc->Rp+rc->T < rc->Bs/10)
		rc->T = (int)(rc->Rp-rc->B+rc->Bs/10);		/* to avoid underflow*/

}

/*!
 ****************************************************************************
 * \brief
 *
 * Step 3: Quantisation Level Calculation  (Before Encoding the Current Frame)
 *
 ***************************************************************************
 */

void Quantisation_Calculation(FILE *pfile,		/*<--  file pointer,output stat*/
							  RCQ2* rc,			/*<--> rc struct */
							  int frametype		/*<--  I or P frame type */
							  )
{	

	int delt=0;
	rc->T= max(rc->Rp/3+rc->data[frametype].Hp, rc->T);

#ifdef stat_output
	fprintf(pfile,"before  rc->T=%d \n",rc->T );
#endif

	delt=(int)rc->data[frametype].X1*(int)rc->data[frametype].X1+4*(int)rc->data[frametype].X2*(rc->T-rc->data[frametype].Hp)/rc->data[frametype].Ec;

	if ((rc->data[frametype].X2==0.0) || (delt<0))/* fall back to one order model */
	{
		rc->data[frametype].Qc = (int)(rc->data[frametype].X11*(double)rc->data[frametype].Ec/(double)(rc->T-rc->data[frametype].Hp));		/* fall back 1st order mode */
	}
	else /* quadratic rate distortion model  */
	{
		rc->data[frametype].Qc=(int)((2*rc->data[frametype].X2)/((int)sqrt((double)delt)-(int)rc->data[frametype].X1));
	} 
	if(frametype==0) /* clip */
	{
		rc->data[frametype].Qc =(int) min(ceil(rc->data[frametype].Ql*1.25), min(rc->data[frametype].Qc, 31)); /* clipping   22*/
		rc->data[frametype].Qc =(int) max(ceil(rc->data[frametype].Ql*0.75), max(rc->data[frametype].Qc, 1));  /* clipping   8 */

	}
	else if(frametype==1)
	{
		rc->data[frametype].Qc =(int) min(ceil(rc->data[frametype].Ql*1.25), min(rc->data[frametype].Qc, 31)); /* clipping  28*/
		rc->data[frametype].Qc =(int) max(ceil(rc->data[frametype].Ql*0.75), max(rc->data[frametype].Qc, 1));  /* clipping  8*/
	}

#ifdef stat_output	
	fprintf(pfile," %dth frametype=%d ,rc->Qc=%d \n",rc->N_Total,frametype,rc->data[frametype].Qc );
#endif

}

/*!
 ****************************************************************************
 * \brief
 *
 * Step 4: After encoding the current frame,update rate control param and 
 *         model after coding one frame
 *
 ***************************************************************************
 */
void After_encoding_current(FILE *pfile,		/*<--  file pointer,output stat*/
							RCQ2* rc,			/*<--> rc struct */
							int frametype,		/*<--  I or P frame type */
							int length,			/*<--  frame length */
							int head_vector,	/*<--  motion vector length */
							int mad				/*<--  frame mad */
							)
{	
	rc->N_Total++; 
	rc->data[frametype].Rc=length;
	rc->data[frametype].S=rc->data[frametype].Rc;
	rc->data[frametype].Hc=head_vector;
	rc->data[frametype].Hp=rc->data[frametype].Hc;	/* update the previous header and motion bit counts */
	rc->data[frametype].Ep=rc->data[frametype].Ec;
	rc->data[frametype].Ec=mad;
	rc->data[frametype].Ql= rc->data[frametype].Qc;
	rc->Nr--;	
	if(frametype==0)
	{
		rc->Rf=length;
		rc->Rr-=rc->Rf;                            /* total number of bits available for this segment */
		rc->B +=rc->Rf-rc->Rp;	
	}
	else
	{
		rc->B += rc->data[frametype].Rc - rc->Rp;	/* update buffer fullness */
		rc->Rr -= rc->data[frametype].Rc;			/* update the remaining bit counts */

	}


	rch_store_after(rc->rc_queue,frametype,rc->data[frametype].Rc,rc->data[frametype].Qc,rc->data[frametype].Hc,rc->data[frametype].Ec);
	UpdateRDModel(rc,frametype);

	
}


/*!
 ****************************************************************************
 * \brief
 *
 * update the model after coding one frame 
 *
 ***************************************************************************
 */

void UpdateRDModel (RCQ2* rc,			/*<--> rc struct */
					int frametype		/*<--  I or P frame type */
					)
{
/*	
	n: number of encoded past frames;
	x: matrix contains Q;
	y: matrix contains Q*(R-H)/E;
	Ep:	mean absolute difference for the previous frame. This is computed after motion compensation for the Y component only.
*/
	int w,n; 
	n=rch_get_size(rc->rc_queue,frametype);
	w = min(n, 20);	/* Maximum data number set to 20 */
	if(w>1){
	
		if(rc->data[frametype].Ep>rc->data[frametype].Ec)
			w = (int)ceil((double)rc->data[frametype].Ec/(double)rc->data[frametype].Ep*(double)w);		/* sliding window for scene change */

		else
			w = (int)ceil((double)rc->data[frametype].Ep/(double)rc->data[frametype].Ec*(double)w);		/* sliding window for scene change */
	}

	rc->data[frametype].Ep = rc->data[frametype].Ec;				/* update mad */
	
	rch_get_data(rc->rc_queue,frametype,w,rc->data[frametype].QpArray,rc->data[frametype].RpArray);
	Estimator(rc,frametype,&w);
	RemoveOutlier(rc,frametype,rc->data[frametype].X1,rc->data[frametype].X2,
		rc->data[frametype].QpArray,rc->data[frametype].RpArray,rc->data[frametype].Ec,&w);
	Estimator(rc,frametype,&w);
}


/*!
 ****************************************************************************
 * \brief
 *
 * compute quadratic rate distortion model param X1,X2
 *
 ***************************************************************************
 */

void Estimator(RCQ2* rc,			/*<--> rc struct */
			   int frametype,		/*<--  I or P frame type */
			   int * w				/*<--  number of points*/
			   )
{


	double a,b,c,x,y;
	int i;
	int  temp_cmp;
	BOOL cmp_result;
	
	a=b=c=x=y=0.0;
	
	for(i=0;i<*w;i++){
		rc->array_x[i][0]=1.0;
		rc->array_x[i][1]=1.0/(double)rc->data[frametype].QpArray[i];	

		rc->array_y[i]=(double)rc->data[frametype].QpArray[i]*rc->data[frametype].RpArray[i];
	}
	
	cmp_result=FALSE;
	temp_cmp=rc->data[frametype].QpArray[0];
	rc->data[frametype].X11=0.0;
	for (i=0; i<*w; i++)
	{   
		rc->data[frametype].X11 += rc->array_y[i]/(*w);/*可以最后做個(gè)除法,提到外面去*/
		
		if((!cmp_result)&&(temp_cmp!=rc->data[frametype].QpArray[i]))
			cmp_result=TRUE;
		else
			temp_cmp=rc->data[frametype].QpArray[i];
	}

	rc->data[frametype].X11=(int)(rc->data[frametype].X11+0.5) ;
	if (cmp_result) 
	{
		
		/* Dimension of the matrix */
		/* 2x1 = (2xw * wx2)**(-1)*(2xw)*(w*1) */
		
		for (i=0;i<*w;i++){
			a+=rc->array_x[i][0]*rc->array_x[i][0];
			b+=rc->array_x[i][0]*rc->array_x[i][1];
			c+=rc->array_x[i][1]*rc->array_x[i][1];
			x+=rc->array_x[i][0]*rc->array_y[i];
			y+=rc->array_x[i][1]*rc->array_y[i];
		}
		rc->data[frametype].X1=(c*x-b*y)/(a*c-b*b);
		rc->data[frametype].X2=(a*y-b*x)/(a*c-b*b);
	} 
}

/*!
 ****************************************************************************
 * \brief
 *
 * remove the bad point out of the set
 *
 ***************************************************************************
 */

void RemoveOutlier(RCQ2* rc,	/*<-- rc struct */
				   int frametype,/*<-- I or P frame type */
				   double X1,	/*<-- quadratic model param X1 */
				   double X2,	/*<-- quadratic model param X1 */
				   int Qp[],	/*<-- previous frame Qp */
				   double Rp[],	/*<-- previous frame complexity scale */
				   double Ec,	/*<-- current frame complexity */
				   int * w		/*<-->in: number of total points/out:number of usable points */
				   )
{
	
	int new_w, i;
	double threshold=0.0;
	double std=0.0;

	for (i=0; i<*w; i++) {
		std += (X1*Ec/Qp[i]+X2*Ec/(Qp[i]*Qp[i])-Rp[i]*Ec)*
			(X1*Ec/Qp[i]+X2*Ec/(Qp[i]*Qp[i])-Rp[i]*Ec);
		rc->rc_error[i] = X1*Ec/Qp[i]+X2*Ec/(Qp[i]*Qp[i])-Rp[i]*Ec;

	}
	
	/* When w is 2 the threshold should be 0, some implementation may resolve a small number due to precision problem. */
	threshold = sqrt(std/(*w));			/* Setup rejection threshold */
	
	new_w = 0;

	for (i=0; i<*w; i++){
		if(rc->rc_error[i]<0.0)
			rc->rc_error[i]=-rc->rc_error[i];
		if(rc->rc_error[i]<= threshold){
			rc->data[frametype].QpArray[new_w] = rc->data[frametype].QpArray[i];
			rc->data[frametype].RpArray[new_w] = rc->data[frametype].RpArray[i];
			new_w++;
		}
	}

	*w = new_w;
}

/*!
 ****************************************************************************
 * \brief
 *
 *  decide whether skip the frame according to the buffer fullness
 *	If the buffer has reached 80% of the buffer size, the encoder will skip the 
 *  upcoming frame to be encoded. Thus the buffer is reduced to prevent from the 
 *  buffer overflow. 
 ***************************************************************************
 */

BOOL IsSkipFrame(				/*==> return flag showing whether skip the frame */
				 RCQ2* rc       /*<-- rc struct */
				 )
{ 

	if(rc->B > 0.8 * rc->Bs){

		rc->Nr--;
		rc->N_Total++; 
		rc->B -= rc->Rp;
		return TRUE;
	}
	else
		return FALSE;
}



?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕人成不卡一区| 国产亚洲精品bt天堂精选| 亚洲一区二区不卡免费| 欧美性大战久久久久久久蜜臀| 一区二区高清视频在线观看| 欧美性大战久久久久久久蜜臀| 午夜一区二区三区视频| 日韩无一区二区| 国产99久久久久久免费看农村| 综合婷婷亚洲小说| 欧美日韩亚洲高清一区二区| 久久97超碰国产精品超碰| 国产蜜臀av在线一区二区三区| 色噜噜狠狠成人中文综合| 香蕉久久一区二区不卡无毒影院| 精品久久久久久无| eeuss影院一区二区三区| 午夜a成v人精品| 国产日韩亚洲欧美综合| 色婷婷久久久久swag精品 | 中文字幕在线不卡| 欧美日韩成人激情| 国产精品 日产精品 欧美精品| 亚洲欧洲精品一区二区三区| 欧美久久一区二区| 成人性生交大片免费看中文| 亚洲国产成人tv| 中文字幕不卡在线观看| 欧美一区二区大片| k8久久久一区二区三区| 青青草原综合久久大伊人精品| 日本一二三不卡| 欧美一级高清片在线观看| 91尤物视频在线观看| 美女视频免费一区| 亚洲人妖av一区二区| 日韩久久久久久| 欧美在线视频全部完| 国产一区二区毛片| 丝袜诱惑亚洲看片| 亚洲麻豆国产自偷在线| 久久久亚洲国产美女国产盗摄| 欧美日韩电影在线播放| 99在线精品视频| 国产一区二区三区| 日韩经典中文字幕一区| 一区二区在线观看视频| 国产亚洲精品aa午夜观看| 日韩精品一区二区三区视频| 欧美亚洲高清一区| 91在线丨porny丨国产| 国产精品亚洲一区二区三区妖精| 天堂资源在线中文精品| 亚洲图片欧美色图| 亚洲啪啪综合av一区二区三区| 久久久久久久av麻豆果冻| 91精品蜜臀在线一区尤物| 91国在线观看| 一本一道综合狠狠老| 99久久精品国产导航| 懂色av中文一区二区三区| 黑人巨大精品欧美黑白配亚洲| 日韩 欧美一区二区三区| 亚洲国产一区二区三区| 亚洲一区在线看| 一区二区三区国产| 一区二区三区小说| 亚洲激情自拍视频| 一区二区三区日韩精品| 亚洲综合成人网| 夜夜精品浪潮av一区二区三区| 亚洲欧美日韩人成在线播放| 亚洲欧美福利一区二区| 亚洲欧美欧美一区二区三区| 亚洲乱码中文字幕综合| 亚洲一区二区三区四区不卡| 亚洲一线二线三线视频| 午夜精品久久久久久久99樱桃| 日精品一区二区三区| 美女视频第一区二区三区免费观看网站| 日产精品久久久久久久性色| 伦理电影国产精品| 国产精品自拍网站| 99这里只有久久精品视频| 99riav一区二区三区| 在线影视一区二区三区| 69成人精品免费视频| 日韩精品一区二| 久久精品一区四区| 亚洲色大成网站www久久九九| 亚洲人成伊人成综合网小说| 亚洲午夜视频在线观看| 视频在线观看国产精品| 国产在线视频一区二区| 99久久综合狠狠综合久久| 在线观看日韩高清av| 91精品国产综合久久国产大片| 2023国产精品视频| 成人免费小视频| 日韩av高清在线观看| 国产成人精品在线看| 在线观看日韩电影| 亚洲精品一区二区三区福利 | 国产色91在线| 亚洲欧美日韩成人高清在线一区| 天天操天天色综合| 国产成a人亚洲精| 91久久精品日日躁夜夜躁欧美| 欧美一区二区二区| 国产精品三级电影| 日本美女一区二区| 成人激情校园春色| 91麻豆精品国产91久久久久| 国产日韩一级二级三级| 亚洲va国产va欧美va观看| 国产激情91久久精品导航| 欧美图区在线视频| 国产欧美日韩三级| 日本视频在线一区| av成人免费在线观看| 日韩精品一区二区三区蜜臀| 亚洲激情综合网| 国产电影一区二区三区| 欧美另类z0zxhd电影| 国产精品久久久久久久裸模| 日韩精品三区四区| 色偷偷88欧美精品久久久| 精品国产区一区| 亚洲国产日产av| 99久久久免费精品国产一区二区| 欧美一级日韩一级| 一区二区三区**美女毛片| 成人理论电影网| 精品人伦一区二区色婷婷| 亚洲国产视频一区二区| www.66久久| 国产欧美综合在线| 精品一区二区三区的国产在线播放 | 最新欧美精品一区二区三区| 久久9热精品视频| 欧美日韩国产免费一区二区| 亚洲精品日韩专区silk| 成人黄页在线观看| www久久久久| 狠狠色丁香久久婷婷综合_中| 这里只有精品视频在线观看| 一区二区三区毛片| 色94色欧美sute亚洲线路二| 国产精品欧美久久久久一区二区 | 综合在线观看色| 国产suv精品一区二区6| 久久伊人中文字幕| 麻豆免费精品视频| 日韩一区二区三区在线视频| 亚洲成av人片在线观看| 欧美图片一区二区三区| 一区二区三区免费| 91久久国产综合久久| 亚洲精品视频免费看| 一本大道av一区二区在线播放| 中文字幕乱码日本亚洲一区二区 | 欧洲精品视频在线观看| 一区二区三区欧美日韩| 91看片淫黄大片一级在线观看| 国产精品久久久久影院色老大 | 国产精品三级av在线播放| 成人午夜av在线| 中文字幕一区二区三区视频| 99re热视频精品| 亚洲美女电影在线| 欧美性淫爽ww久久久久无| 午夜精品久久一牛影视| 91麻豆精品国产无毒不卡在线观看| 日本午夜一本久久久综合| 精品国内二区三区| 国产成人在线视频播放| 亚洲欧美综合另类在线卡通| 91久色porny | 久久久精品免费免费| 成人毛片在线观看| 亚洲女女做受ⅹxx高潮| 欧美久久久久久久久| 另类综合日韩欧美亚洲| 久久精品夜色噜噜亚洲a∨| 成人h精品动漫一区二区三区| 亚洲欧洲国产日本综合| 欧美午夜一区二区三区免费大片| 午夜久久久久久久久| 久久婷婷久久一区二区三区| 99久久久免费精品国产一区二区| 亚洲高清在线精品| 精品国产一二三| 97aⅴ精品视频一二三区| 亚洲bt欧美bt精品777| 欧美电影免费提供在线观看| 波多野结衣在线aⅴ中文字幕不卡| 曰韩精品一区二区| 日韩一区二区三| 北条麻妃一区二区三区| 日韩国产在线观看一区|