[FFmpeg-cvslog] r25062 - in trunk/libavcodec: lsp.c lsp.h sipr.c

vitor subversion
Tue Sep 7 22:46:29 CEST 2010


Author: vitor
Date: Tue Sep  7 22:46:29 2010
New Revision: 25062

Log:
Move lsp2lpc_sipr() function to common code so it can be reused in a
AMRWB decoder.

Patch by Marcelo Galv?o P?voa.

Modified:
   trunk/libavcodec/lsp.c
   trunk/libavcodec/lsp.h
   trunk/libavcodec/sipr.c

Modified: trunk/libavcodec/lsp.c
==============================================================================
--- trunk/libavcodec/lsp.c	Tue Sep  7 22:44:41 2010	(r25061)
+++ trunk/libavcodec/lsp.c	Tue Sep  7 22:46:29 2010	(r25062)
@@ -117,6 +117,32 @@ void ff_acelp_lsp2lpc(int16_t* lp, const
     }
 }
 
+void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order)
+{
+    int lp_half_order = lp_order >> 1;
+    double buf[lp_half_order + 1];
+    double pa[lp_half_order + 1];
+    double *qa = buf + 1;
+    int i,j;
+
+    qa[-1] = 0.0;
+
+    ff_lsp2polyf(lsp    , pa, lp_half_order    );
+    ff_lsp2polyf(lsp + 1, qa, lp_half_order - 1);
+
+    for (i = 1, j = lp_order - 1; i < lp_half_order; i++, j--) {
+        double paf =  pa[i]            * (1 + lsp[lp_order - 1]);
+        double qaf = (qa[i] - qa[i-2]) * (1 - lsp[lp_order - 1]);
+        lp[i-1]  = (paf + qaf) * 0.5;
+        lp[j-1]  = (paf - qaf) * 0.5;
+    }
+
+    lp[lp_half_order - 1] = (1.0 + lsp[lp_order - 1]) *
+        pa[lp_half_order] * 0.5;
+
+    lp[lp_order - 1] = lsp[lp_order - 1];
+}
+
 void ff_acelp_lp_decode(int16_t* lp_1st, int16_t* lp_2nd, const int16_t* lsp_2nd, const int16_t* lsp_prev, int lp_order)
 {
     int16_t lsp_1st[MAX_LP_ORDER]; // (0.15)

Modified: trunk/libavcodec/lsp.h
==============================================================================
--- trunk/libavcodec/lsp.h	Tue Sep  7 22:44:41 2010	(r25061)
+++ trunk/libavcodec/lsp.h	Tue Sep  7 22:46:29 2010	(r25062)
@@ -76,6 +76,11 @@ void ff_acelp_lsf2lspd(double *lsp, cons
 void ff_acelp_lsp2lpc(int16_t* lp, const int16_t* lsp, int lp_half_order);
 
 /**
+ * LSP to LP conversion (5.2.4 of AMR-WB)
+ */
+void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order);
+
+/**
  * \brief Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3.2.5 and 3.2.6 of G.729)
  * \param[out] lp_1st decoded LP coefficients for first subframe  (-0x8000 <= (3.12) < 0x8000)
  * \param[out] lp_2nd decoded LP coefficients for second subframe (-0x8000 <= (3.12) < 0x8000)

Modified: trunk/libavcodec/sipr.c
==============================================================================
--- trunk/libavcodec/sipr.c	Tue Sep  7 22:44:41 2010	(r25061)
+++ trunk/libavcodec/sipr.c	Tue Sep  7 22:46:29 2010	(r25062)
@@ -209,32 +209,6 @@ static void decode_parameters(SiprParame
     }
 }
 
-static void lsp2lpc_sipr(const double *lsp, float *Az)
-{
-    int lp_half_order = LP_FILTER_ORDER >> 1;
-    double buf[(LP_FILTER_ORDER >> 1) + 1];
-    double pa[(LP_FILTER_ORDER >> 1) + 1];
-    double *qa = buf + 1;
-    int i,j;
-
-    qa[-1] = 0.0;
-
-    ff_lsp2polyf(lsp    , pa, lp_half_order    );
-    ff_lsp2polyf(lsp + 1, qa, lp_half_order - 1);
-
-    for (i = 1, j = LP_FILTER_ORDER - 1; i < lp_half_order; i++, j--) {
-        double paf =  pa[i]            * (1 + lsp[LP_FILTER_ORDER - 1]);
-        double qaf = (qa[i] - qa[i-2]) * (1 - lsp[LP_FILTER_ORDER - 1]);
-        Az[i-1]  = (paf + qaf) * 0.5;
-        Az[j-1]  = (paf - qaf) * 0.5;
-    }
-
-    Az[lp_half_order - 1] = (1.0 + lsp[LP_FILTER_ORDER - 1]) *
-        pa[lp_half_order] * 0.5;
-
-    Az[LP_FILTER_ORDER - 1] = lsp[LP_FILTER_ORDER - 1];
-}
-
 static void sipr_decode_lp(float *lsfnew, const float *lsfold, float *Az,
                            int num_subfr)
 {
@@ -247,7 +221,7 @@ static void sipr_decode_lp(float *lsfnew
         for (j = 0; j < LP_FILTER_ORDER; j++)
             lsfint[j] = lsfold[j] * (1 - t) + t * lsfnew[j];
 
-        lsp2lpc_sipr(lsfint, Az);
+        ff_amrwb_lsp2lpc(lsfint, Az, LP_FILTER_ORDER);
         Az += LP_FILTER_ORDER;
         t += t0;
     }



More information about the ffmpeg-cvslog mailing list