📄 ratecontrol.c
字号:
#include "ratecontrol.h"#include <math.h> /* fabs */#define ABS(X) (X < 0) ? (-X) : (X)typedef struct { int64_t size; int32_t count;} QuantInfo;typedef struct{ int32_t rtn_quant; int64_t frames; int64_t total_size; double framerate; int32_t target_rate; int16_t max_quant; int16_t min_quant; int64_t last_change; int64_t quant_sum; double quant_error[32]; double avg_framesize; double target_framesize; int32_t reaction_delay_factor;} RateControl;RateControl rate_control;int get_initial_quant(int bpp) { return 5;}void RateControlInit(uint32_t target_rate, uint32_t reaction_delay_factor, int framerate, int max_quant, int min_quant){ int i; rate_control.frames = 0; rate_control.total_size = 0; rate_control.framerate = framerate / 1000.0; rate_control.target_rate = target_rate; rate_control.rtn_quant = get_initial_quant(0); rate_control.max_quant = max_quant; rate_control.min_quant = min_quant; for (i=0 ; i<32 ; ++i) { rate_control.quant_error[i] = 0.0; } rate_control.target_framesize = target_rate / rate_control.framerate; rate_control.avg_framesize = target_rate / rate_control.framerate; rate_control.reaction_delay_factor = reaction_delay_factor;}int RateControlGetQ(int keyframe){ return rate_control.rtn_quant;}void RateControlUpdate(int16_t quant, int frame_size, int keyframe){ int64_t deviation; double overflow, cur_target; int32_t rtn_quant; rate_control.frames++; rate_control.total_size += frame_size; deviation = (int64_t) ((double) rate_control.total_size - ((double) ((double) rate_control.target_rate / 8.0 / (double) rate_control.framerate) * (double) rate_control.frames)); DEBUGCBR((int32_t)(rate_control.frames - 1), rate_control.rtn_quant, (int32_t)deviation); rate_control.avg_framesize -= rate_control.avg_framesize / (double)rate_control.reaction_delay_factor; rate_control.avg_framesize += frame_size * rate_control.rtn_quant * 0.5 / (double)rate_control.reaction_delay_factor; if (rate_control.target_framesize > rate_control.avg_framesize) cur_target = rate_control.avg_framesize; else cur_target = rate_control.target_framesize; deviation /= -rate_control.reaction_delay_factor; overflow = (double)deviation * rate_control.avg_framesize / rate_control.target_framesize; if (overflow > cur_target) overflow = cur_target; else if (overflow < cur_target * -0.935) overflow = cur_target * -0.935; rtn_quant = (int32_t)(rate_control.avg_framesize * 2.0 / (cur_target + overflow)); if (rtn_quant < 31) { rate_control.quant_error[rtn_quant] += rate_control.avg_framesize * 2.0 / (cur_target + overflow) - 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 + -