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

📄 ratecontrol_new.c

📁 gm8120的video控制
💻 C
字号:
/* rate control */#include "ratecontrol.h"#define FRAMERATE_INCR		1001#define SMALL_EPS 1e-10int get_framerate(float fFrameRate){    int fincr,fbase,i;	if ((fFrameRate - (int)fFrameRate) < SMALL_EPS) {		fincr = 1;		fbase = (int)fFrameRate;	}	else {		fincr = FRAMERATE_INCR;		fbase = (int)(FRAMERATE_INCR * fFrameRate);	}	if (fincr <= 0 || fbase <= 0) {		fincr = 1;		fbase = 25;	}	i = fincr; //i = pParam->fincr;	while (i > 1) {		if (fincr % i == 0 && fbase % i == 0) {			fincr /= i;			fbase /= i;			i = fincr;			continue;		}		i--;	}	if (fbase > 65535) {		float div = (float) fbase / 65535;		fbase = (int) (fbase / div);		fincr = (int) (fincr / div);	}	if (fbase > 65535) {		float div = (float) fbase / 65535;		fbase = (int) (fbase / div);		fincr = (int) (fincr / div);	}   	//printf("get_framerate =%d\n",fbase*1000/fincr);	return (fbase*1000/fincr);}void RateControlInit(RateControl * rate_control,				unsigned int target_rate,				unsigned int reaction_delay_factor,				unsigned int averaging_period,				unsigned int buffer,				int framerate,				int max_quant,				int min_quant,				unsigned int initq){	int i;	rate_control->frames = 0;	rate_control->total_size = 0;	rate_control->framerate = framerate / 1000.0;	//printf("framerate=%f\n",  rate_control->framerate);	rate_control->target_rate = (int) target_rate;//	rate_control->rtn_quant = get_initial_quant(target_rate);	rate_control->rtn_quant = initq;	rate_control->max_quant = (short) max_quant;	rate_control->min_quant = (short) min_quant;	for (i = 0; i < 32; ++i) {		rate_control->quant_error[i] = 0;	}	rate_control->target_framesize =		target_rate / 8.0 / rate_control->framerate;	rate_control->sequence_quality = 2000 / rate_control->rtn_quant;	rate_control->avg_framesize = (int)rate_control->target_framesize;	rate_control->reaction_delay_factor = (int) reaction_delay_factor;	rate_control->averaging_period = (int) averaging_period;	rate_control->buffer = (int) buffer;}void RateControlUpdate(RateControl *rate_control,				  short quant,				  int frame_size,				  int keyframe){	long long deviation;	int overflow, averaging_period, reaction_delay_factor, base_quality;	int quality_scale, target_quality;	int rtn_quant;	rate_control->frames++;	rate_control->total_size += frame_size;	deviation =		(long long) ( rate_control->total_size -				   ((rate_control->target_rate / 8.0 /					  rate_control->framerate) *  rate_control->frames));	if (rate_control->rtn_quant >= 2) {		averaging_period = rate_control->averaging_period;		//printf("averaging_period = %f\n", averaging_period);		rate_control->sequence_quality -=			rate_control->sequence_quality / averaging_period;		//printf("sequence_quality = %f\n", rate_control->sequence_quality);			rate_control->sequence_quality +=			2000 / rate_control->rtn_quant / averaging_period;		if (rate_control->sequence_quality < 100)			rate_control->sequence_quality = 100;		if (!keyframe) {			reaction_delay_factor =				rate_control->reaction_delay_factor;			rate_control->avg_framesize -=				(int)(rate_control->avg_framesize / reaction_delay_factor);			rate_control->avg_framesize += (int)(frame_size / reaction_delay_factor);						//printf("avg_framesize =%d\n", rate_control->avg_framesize);		}	}	quality_scale =		( 1000 * rate_control->target_framesize * rate_control->target_framesize) / (rate_control->avg_framesize * rate_control->avg_framesize);	//printf("quality_scale = %d\n", quality_scale);		base_quality = rate_control->sequence_quality;	if (quality_scale >= 1000) {		base_quality = 1000 - 1000 * (1000 - base_quality) / quality_scale;	} else {		base_quality = 65 + ((base_quality - 65) * quality_scale) / 1000 ;	}	overflow = -(deviation /rate_control->buffer);	//printf("overflow =%d\n", overflow);	target_quality =		base_quality + (base_quality - 64) * overflow / rate_control->target_framesize;	if (target_quality > 2000)		target_quality = 2000;	else if (target_quality < 65)		target_quality = 65;	rtn_quant = (int) (2000 / target_quality);	if (rtn_quant < 31) {		rate_control->quant_error[rtn_quant] +=			2000000 / target_quality - 1000 * rtn_quant;		if (rate_control->quant_error[rtn_quant] >= 1000) {			rate_control->quant_error[rtn_quant] -= 1000;			rtn_quant++;		}		//printf("quant = %d\n", rate_control->quant_error[rtn_quant]);	}	if (rtn_quant > rate_control->rtn_quant + 1)		rtn_quant = rate_control->rtn_quant + 1;	else if (rtn_quant < rate_control->rtn_quant - 1)		rtn_quant = rate_control->rtn_quant - 1;	if (rtn_quant > rate_control->max_quant)		rtn_quant = rate_control->max_quant;	else if (rtn_quant < rate_control->min_quant)		rtn_quant = rate_control->min_quant;	rate_control->rtn_quant = rtn_quant;}

⌨️ 快捷键说明

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