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

📄 ratecontrol.c

📁 gm8120的video控制
💻 C
字号:
/* rate control */#include "ratecontrol.h"#define FRAMERATE_INCR		1001#define SMALL_EPS 1e-10//++ Fosterextern int fc_debug;#define DBG_MSG(fmt,args...) if(fc_debug) printf(fmt , ## args)//-- Fosterint 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;	//++ FosterDBG_MSG("%s:%d <bit=%d:%d, fps=%d, Q=%d\n>",__FUNCTION__,__LINE__,									rate_control->target_rate,									target_rate,									framerate,									initq);//-- Foster	rate_control->frames = 0;	rate_control->total_size = 0;	rate_control->framerate = (double) 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.0;	}	rate_control->target_framesize =		(double) target_rate / 8.0 / rate_control->framerate;	//printf("rate_control->target_framesize =%f\n", rate_control->target_framesize);		rate_control->sequence_quality = 2.0 / (double) rate_control->rtn_quant;//rate_control->sequence_quality =0.250000		rate_control->avg_framesize = 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;	double overflow, averaging_period, reaction_delay_factor;	double quality_scale, base_quality, target_quality;	int rtn_quant;	rate_control->frames++;	rate_control->total_size += frame_size;	deviation =		(long long) ((double) rate_control->total_size -				   ((double) ((double) rate_control->target_rate / 8.0 /					 (double) rate_control->framerate) * (double) rate_control->frames));//printf("deviation =%u\n", deviation);	/*deviation =83825deviation =213595
deviation =213233
deviation =211783
deviation =215849
deviation =210171
deviation =207269
deviation =209982
deviation =206073
deviation =207988*/	if (rate_control->rtn_quant >= 2) {		averaging_period = (double) rate_control->averaging_period;/*		printf("averaging_period =%f\n", averaging_period);	averaging_period =100.000000
averaging_period =100.000000
averaging_period =100.000000
averaging_period =100.000000*/		rate_control->sequence_quality -=			rate_control->sequence_quality / averaging_period;/*printf("rate_control->sequence_quality =%f\n", rate_control->sequence_quality);	rate_control->sequence_quality =0.279320
rate_control->sequence_quality =0.279827
rate_control->sequence_quality =0.280328
rate_control->sequence_quality =0.280825
rate_control->sequence_quality =0.281317
rate_control->sequence_quality =0.281804
rate_control->sequence_quality =0.282946
rate_control->sequence_quality =0.283416
rate_control->sequence_quality =0.284542
rate_control->sequence_quality =0.285657
rate_control->sequence_quality =0.286100
rate_control->sequence_quality =0.287199*/		rate_control->sequence_quality +=			2.0 / (double) rate_control->rtn_quant / averaging_period;		if (rate_control->sequence_quality < 0.1)			rate_control->sequence_quality = 0.1;		if (!keyframe) {			reaction_delay_factor =				(double) rate_control->reaction_delay_factor;			rate_control->avg_framesize -=				rate_control->avg_framesize / reaction_delay_factor;			rate_control->avg_framesize += frame_size / reaction_delay_factor;		}	}	quality_scale =		rate_control->target_framesize / rate_control->avg_framesize *		rate_control->target_framesize / rate_control->avg_framesize;	base_quality = rate_control->sequence_quality;	if (quality_scale >= 1.0) {		base_quality = 1.0 - (1.0 - base_quality) / quality_scale;	} else {		base_quality = 0.06452 + (base_quality - 0.06452) * quality_scale;	}	overflow = -((double) deviation / (double) rate_control->buffer);	target_quality =		base_quality + (base_quality -						0.06452) * overflow / rate_control->target_framesize;	if (target_quality > 2.0)		target_quality = 2.0;	else if (target_quality < 0.06452)		target_quality = 0.06452;	rtn_quant = (int) (2.0 / target_quality);	if (rtn_quant < 31) {		rate_control->quant_error[rtn_quant] +=			2.0 / target_quality - rtn_quant;		if (rate_control->quant_error[rtn_quant] >= 1.0) {			rate_control->quant_error[rtn_quant] -= 1.0;			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 + -