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

📄 fixed.c

📁 tcpmp.src.0.72RC1 优秀的多媒体播放器TCPMP的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	else		return rbps;}#endif#ifndef FLAC__INTEGER_ONLY_LIBRARYunsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])#elseunsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])#endif{	FLAC__int32 last_error_0 = data[-1];	FLAC__int32 last_error_1 = data[-1] - data[-2];	FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]);	FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]);	FLAC__int32 error, save;	FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0;	unsigned i, order;	for(i = 0; i < data_len; i++) {		error  = data[i]     ; total_error_0 += local_abs(error);                      save = error;		error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error;		error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error;		error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error;		error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save;	}	if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4))		order = 0;	else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4))		order = 1;	else if(total_error_2 < min(total_error_3, total_error_4))		order = 2;	else if(total_error_3 < total_error_4)		order = 3;	else		order = 4;	/* Estimate the expected number of bits per residual signal sample. */	/* 'total_error*' is linearly related to the variance of the residual */	/* signal, so we use it directly to compute E(|x|) */	FLAC__ASSERT(data_len > 0 || total_error_0 == 0);	FLAC__ASSERT(data_len > 0 || total_error_1 == 0);	FLAC__ASSERT(data_len > 0 || total_error_2 == 0);	FLAC__ASSERT(data_len > 0 || total_error_3 == 0);	FLAC__ASSERT(data_len > 0 || total_error_4 == 0);#ifndef FLAC__INTEGER_ONLY_LIBRARY	residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0);#else	residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0;	residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0;	residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0;	residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0;	residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0;#endif	return order;}#ifndef FLAC__INTEGER_ONLY_LIBRARYunsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])#elseunsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])#endif{	FLAC__int32 last_error_0 = data[-1];	FLAC__int32 last_error_1 = data[-1] - data[-2];	FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]);	FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]);	FLAC__int32 error, save;	/* total_error_* are 64-bits to avoid overflow when encoding	 * erratic signals when the bits-per-sample and blocksize are	 * large.	 */	FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0;	unsigned i, order;	for(i = 0; i < data_len; i++) {		error  = data[i]     ; total_error_0 += local_abs(error);                      save = error;		error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error;		error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error;		error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error;		error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save;	}	if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4))		order = 0;	else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4))		order = 1;	else if(total_error_2 < min(total_error_3, total_error_4))		order = 2;	else if(total_error_3 < total_error_4)		order = 3;	else		order = 4;	/* Estimate the expected number of bits per residual signal sample. */	/* 'total_error*' is linearly related to the variance of the residual */	/* signal, so we use it directly to compute E(|x|) */	FLAC__ASSERT(data_len > 0 || total_error_0 == 0);	FLAC__ASSERT(data_len > 0 || total_error_1 == 0);	FLAC__ASSERT(data_len > 0 || total_error_2 == 0);	FLAC__ASSERT(data_len > 0 || total_error_3 == 0);	FLAC__ASSERT(data_len > 0 || total_error_4 == 0);#ifndef FLAC__INTEGER_ONLY_LIBRARY#if defined _MSC_VER || defined __MINGW32__	/* with MSVC you have to spoon feed it the casting */	residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0);#else	residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0);	residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0);#endif#else	residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0;	residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0;	residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0;	residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0;	residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0;#endif	return order;}void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]){	const int idata_len = (int)data_len;	int i;	switch(order) {		case 0:			for(i = 0; i < idata_len; i++) {				residual[i] = data[i];			}			break;		case 1:			for(i = 0; i < idata_len; i++) {				residual[i] = data[i] - data[i-1];			}			break;		case 2:			for(i = 0; i < idata_len; i++) {				/* == data[i] - 2*data[i-1] + data[i-2] */				residual[i] = data[i] - (data[i-1] << 1) + data[i-2];			}			break;		case 3:			for(i = 0; i < idata_len; i++) {				/* == data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3] */				residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3];			}			break;		case 4:			for(i = 0; i < idata_len; i++) {				/* == data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4] */				residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4];			}			break;		default:			FLAC__ASSERT(0);	}}void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]){	int i, idata_len = (int)data_len;	switch(order) {		case 0:			for(i = 0; i < idata_len; i++) {				data[i] = residual[i];			}			break;		case 1:			for(i = 0; i < idata_len; i++) {				data[i] = residual[i] + data[i-1];			}			break;		case 2:			for(i = 0; i < idata_len; i++) {				/* == residual[i] + 2*data[i-1] - data[i-2] */				data[i] = residual[i] + (data[i-1]<<1) - data[i-2];			}			break;		case 3:			for(i = 0; i < idata_len; i++) {				/* residual[i] + 3*data[i-1] - 3*data[i-2]) + data[i-3] */				data[i] = residual[i] + (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) + data[i-3];			}			break;		case 4:			for(i = 0; i < idata_len; i++) {				/* == residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4] */				data[i] = residual[i] + ((data[i-1]+data[i-3])<<2) - ((data[i-2]<<2) + (data[i-2]<<1)) - data[i-4];			}			break;		default:			FLAC__ASSERT(0);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -