Index: src/libFLAC/lpc.c |
diff --git a/src/libFLAC/lpc.c b/src/libFLAC/lpc.c |
index 7806348f2bc6014340aff3bca6356ced61fe01a1..ca98c5cf8f3dbde1de470d18c8b2a7a561ec7e12 100644 |
--- a/src/libFLAC/lpc.c |
+++ b/src/libFLAC/lpc.c |
@@ -1,5 +1,6 @@ |
/* libFLAC - Free Lossless Audio Codec library |
- * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson |
+ * Copyright (C) 2000-2009 Josh Coalson |
+ * Copyright (C) 2011-2014 Xiph.Org Foundation |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
@@ -29,29 +30,39 @@ |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
-#if HAVE_CONFIG_H |
+#ifdef HAVE_CONFIG_H |
# include <config.h> |
#endif |
#include <math.h> |
+ |
#include "FLAC/assert.h" |
#include "FLAC/format.h" |
+#include "share/compat.h" |
#include "private/bitmath.h" |
#include "private/lpc.h" |
+#include "private/macros.h" |
#if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE |
#include <stdio.h> |
#endif |
-#ifndef FLAC__INTEGER_ONLY_LIBRARY |
- |
-#ifndef M_LN2 |
-/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ |
-#define M_LN2 0.69314718055994530942 |
-#endif |
- |
/* OPT: #undef'ing this may improve the speed on some architectures */ |
#define FLAC__LPC_UNROLLED_FILTER_LOOPS |
+#ifndef FLAC__INTEGER_ONLY_LIBRARY |
+ |
+#if !defined(HAVE_LROUND) |
+#if defined(_MSC_VER) |
+#include <float.h> |
+#define copysign _copysign |
+#elif defined(__GNUC__) |
+#define copysign __builtin_copysign |
+#endif |
+static inline long int lround(double x) { |
+ return (long)(x + copysign (0.5, x)); |
+} |
+/* If this fails, we are in the presence of a mid 90's compiler, move along... */ |
+#endif |
void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) |
{ |
@@ -112,7 +123,7 @@ void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_le |
void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]) |
{ |
unsigned i, j; |
- FLAC__double r, err, ref[FLAC__MAX_LPC_ORDER], lpc[FLAC__MAX_LPC_ORDER]; |
+ FLAC__double r, err, lpc[FLAC__MAX_LPC_ORDER]; |
FLAC__ASSERT(0 != max_order); |
FLAC__ASSERT(0 < *max_order); |
@@ -126,7 +137,7 @@ void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_o |
r = -autoc[i+1]; |
for(j = 0; j < i; j++) |
r -= lpc[j] * autoc[i-j]; |
- ref[i] = (r/=err); |
+ r /= err; |
/* Update LPC coefficients and total error. */ |
lpc[i]=r; |
@@ -145,7 +156,7 @@ void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_o |
lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ |
error[i] = err; |
- /* see SF bug #1601812 http://sourceforge.net/tracker/index.php?func=detail&aid=1601812&group_id=13478&atid=113478 */ |
+ /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ |
if(err == 0.0) { |
*max_order = i+1; |
return; |
@@ -200,14 +211,8 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, |
FLAC__int32 q; |
for(i = 0; i < order; i++) { |
error += lp_coeff[i] * (1 << *shift); |
-#if 1 /* unfortunately lround() is C99 */ |
- if(error >= 0.0) |
- q = (FLAC__int32)(error + 0.5); |
- else |
- q = (FLAC__int32)(error - 0.5); |
-#else |
q = lround(error); |
-#endif |
+ |
#ifdef FLAC__OVERFLOW_DETECT |
if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ |
fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); |
@@ -235,14 +240,7 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, |
#endif |
for(i = 0; i < order; i++) { |
error += lp_coeff[i] / (1 << nshift); |
-#if 1 /* unfortunately lround() is C99 */ |
- if(error >= 0.0) |
- q = (FLAC__int32)(error + 0.5); |
- else |
- q = (FLAC__int32)(error - 0.5); |
-#else |
q = lround(error); |
-#endif |
#ifdef FLAC__OVERFLOW_DETECT |
if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ |
fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); |
@@ -262,7 +260,12 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, |
return 0; |
} |
-void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) |
+#if defined(_MSC_VER) |
+// silence MSVC warnings about __restrict modifier |
+#pragma warning ( disable : 4028 ) |
+#endif |
+ |
+void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) |
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) |
{ |
FLAC__int64 sumo; |
@@ -285,13 +288,7 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, u |
for(j = 0; j < order; j++) { |
sum += qlp_coeff[j] * (*(--history)); |
sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); |
-#if defined _MSC_VER |
- if(sumo > 2147483647I64 || sumo < -2147483648I64) |
- fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%I64d\n",i,j,qlp_coeff[j],*history,sumo); |
-#else |
- if(sumo > 2147483647ll || sumo < -2147483648ll) |
- fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%lld\n",i,j,qlp_coeff[j],*history,(long long)sumo); |
-#endif |
+ fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); |
} |
*(residual++) = *(data++) - (sum >> lp_quantization); |
} |
@@ -528,7 +525,7 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, u |
} |
#endif |
-void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) |
+void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) |
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) |
{ |
unsigned i, j; |
@@ -549,19 +546,11 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *da |
for(j = 0; j < order; j++) |
sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); |
if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { |
-#if defined _MSC_VER |
- fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%I64d\n", i, sum >> lp_quantization); |
-#else |
- fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%lld\n", i, (long long)(sum >> lp_quantization)); |
-#endif |
+ fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); |
break; |
} |
if(FLAC__bitmath_silog2_wide((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { |
-#if defined _MSC_VER |
- fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%I64d, residual=%I64d\n", i, *data, sum >> lp_quantization, (FLAC__int64)(*data) - (sum >> lp_quantization)); |
-#else |
- fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%lld, residual=%lld\n", i, *data, (long long)(sum >> lp_quantization), (long long)((FLAC__int64)(*data) - (sum >> lp_quantization))); |
-#endif |
+ fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (int64_t)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization))); |
break; |
} |
*(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); |
@@ -792,7 +781,7 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *da |
#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ |
-void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) |
+void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) |
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) |
{ |
FLAC__int64 sumo; |
@@ -815,13 +804,8 @@ void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, c |
for(j = 0; j < order; j++) { |
sum += qlp_coeff[j] * (*(--history)); |
sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); |
-#if defined _MSC_VER |
- if(sumo > 2147483647I64 || sumo < -2147483648I64) |
- fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%I64d\n",i,j,qlp_coeff[j],*history,sumo); |
-#else |
if(sumo > 2147483647ll || sumo < -2147483648ll) |
- fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%lld\n",i,j,qlp_coeff[j],*history,(long long)sumo); |
-#endif |
+ fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); |
} |
*(data++) = *(r++) + (sum >> lp_quantization); |
} |
@@ -1058,7 +1042,7 @@ void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, c |
} |
#endif |
-void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) |
+void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) |
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) |
{ |
unsigned i, j; |
@@ -1079,19 +1063,11 @@ void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_l |
for(j = 0; j < order; j++) |
sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); |
if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { |
-#ifdef _MSC_VER |
- fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%I64d\n", i, sum >> lp_quantization); |
-#else |
- fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%lld\n", i, (long long)(sum >> lp_quantization)); |
-#endif |
+ fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); |
break; |
} |
if(FLAC__bitmath_silog2_wide((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { |
-#ifdef _MSC_VER |
- fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%I64d, data=%I64d\n", i, *r, sum >> lp_quantization, (FLAC__int64)(*r) + (sum >> lp_quantization)); |
-#else |
- fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%lld, data=%lld\n", i, *r, (long long)(sum >> lp_quantization), (long long)((FLAC__int64)(*r) + (sum >> lp_quantization))); |
-#endif |
+ fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization))); |
break; |
} |
*(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); |
@@ -1320,6 +1296,10 @@ void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_l |
} |
#endif |
+#if defined(_MSC_VER) |
+#pragma warning ( default : 4028 ) |
+#endif |
+ |
#ifndef FLAC__INTEGER_ONLY_LIBRARY |
FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) |
@@ -1352,7 +1332,7 @@ FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scal |
unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order) |
{ |
- unsigned order, index, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ |
+ unsigned order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ |
FLAC__double bits, best_bits, error_scale; |
FLAC__ASSERT(max_order > 0); |
@@ -1363,15 +1343,15 @@ unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned m |
best_index = 0; |
best_bits = (unsigned)(-1); |
- for(index = 0, order = 1; index < max_order; index++, order++) { |
- bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[index], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); |
+ for(indx = 0, order = 1; indx < max_order; indx++, order++) { |
+ bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); |
if(bits < best_bits) { |
- best_index = index; |
+ best_index = indx; |
best_bits = bits; |
} |
} |
- return best_index+1; /* +1 since index of lpc_error[] is order-1 */ |
+ return best_index+1; /* +1 since indx of lpc_error[] is order-1 */ |
} |
#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ |