📄 ratecontrol_new.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 + -