summaryrefslogtreecommitdiff
path: root/libavcodec/lpc.h
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2008-09-04 11:03:14 +0000
committerVitor Sessak <vitor1001@gmail.com>2008-09-04 11:03:14 +0000
commit1be0fc2909fbcefd800d20cfff1420234fd0715b (patch)
tree5e947eaeb7845f55f3c6f09b81e67393d8fb74be /libavcodec/lpc.h
parent287ba997b5a4df061a0f6efb1cc7e2ae67831f7e (diff)
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
Originally committed as revision 15193 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/lpc.h')
-rw-r--r--libavcodec/lpc.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/libavcodec/lpc.h b/libavcodec/lpc.h
index 96f9f856f2..9b584c8ee2 100644
--- a/libavcodec/lpc.h
+++ b/libavcodec/lpc.h
@@ -45,4 +45,58 @@ int ff_lpc_calc_coefs(DSPContext *s,
int32_t coefs[][MAX_LPC_ORDER], int *shift, int use_lpc,
int omethod, int max_shift, int zero_shift);
+#ifdef LPC_USE_DOUBLE
+#define LPC_type double
+#else
+#define LPC_type float
+#endif
+
+/**
+ * Levinson-Durbin recursion.
+ * Produces LPC coefficients from autocorrelation data.
+ */
+static inline int compute_lpc_coefs(const LPC_type *autoc, int max_order,
+ LPC_type *lpc, int lpc_stride, int fail,
+ int normalize)
+{
+ int i, j;
+ LPC_type err;
+ LPC_type *lpc_last = lpc;
+
+ if (normalize)
+ err = *autoc++;
+
+ if (fail && (autoc[max_order - 1] == 0 || err <= 0))
+ return -1;
+
+ for(i=0; i<max_order; i++) {
+ LPC_type r = -autoc[i];
+
+ if (normalize) {
+ for(j=0; j<i; j++)
+ r -= lpc_last[j] * autoc[i-j-1];
+
+ r /= err;
+ err *= 1.0 - (r * r);
+ }
+
+ lpc[i] = r;
+
+ for(j=0; j < (i+1)>>1; j++) {
+ LPC_type f = lpc_last[ j];
+ LPC_type b = lpc_last[i-1-j];
+ lpc[ j] = f + r * b;
+ lpc[i-1-j] = b + r * f;
+ }
+
+ if (fail && err < 0)
+ return -1;
+
+ lpc_last = lpc;
+ lpc += lpc_stride;
+ }
+
+ return 0;
+}
+
#endif /* AVCODEC_LPC_H */