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

📄 ratecontrol.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 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 + -