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

📄 ratecontrol.c

📁 网络MPEG4IP流媒体开发源代码
💻 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 + -