Add a shift parameter to celp_lp_synthesis_filter for reuse by the G.723.1 decoder
authorMohamed Naufal Basheer <naufal11@gmail.com>
Thu, 17 Mar 2011 22:56:47 +0000 (23:56 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 29 Sep 2011 19:43:52 +0000 (21:43 +0200)
libavcodec/celp_filters.c
libavcodec/celp_filters.h
libavcodec/g729dec.c
libavcodec/g729postfilter.c
libavcodec/ra144.c

index 8b68c2f..1535060 100644 (file)
@@ -58,7 +58,7 @@ void ff_celp_circ_addf(float *out, const float *in,
 int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs,
                                 const int16_t *in, int buffer_length,
                                 int filter_length, int stop_on_overflow,
-                                int rounder)
+                                int shift, int rounder)
 {
     int i,n;
 
@@ -67,7 +67,7 @@ int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs,
         for (i = 1; i <= filter_length; i++)
             sum -= filter_coeffs[i-1] * out[n-i];
 
-        sum = (sum >> 12) + in[n];
+        sum = ((sum >> 12) + in[n]) >> shift;
 
         if (sum + 0x8000 > 0xFFFFU) {
             if (stop_on_overflow)
index 2fb2b03..f7e8fbd 100644 (file)
@@ -63,6 +63,7 @@ void ff_celp_circ_addf(float *out, const float *in,
  * @param filter_length filter length (10 for 10th order LP filter)
  * @param stop_on_overflow   1 - return immediately if overflow occurs
  *                           0 - ignore overflows
+ * @param shift the result is shifted right by this value
  * @param rounder the amount to add for rounding (usually 0x800 or 0xfff)
  *
  * @return 1 if overflow occurred, 0 - otherwise
@@ -75,7 +76,7 @@ void ff_celp_circ_addf(float *out, const float *in,
 int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs,
                                 const int16_t *in, int buffer_length,
                                 int filter_length, int stop_on_overflow,
-                                int rounder);
+                                int shift, int rounder);
 
 /**
  * LP synthesis filter.
index de384dd..cd2eec8 100644 (file)
@@ -604,6 +604,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
             SUBFRAME_SIZE,
             10,
             1,
+            0,
             0x800))
             /* Overflow occured, downscale excitation signal... */
             for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++)
@@ -625,6 +626,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
                     SUBFRAME_SIZE,
                     10,
                     0,
+                    0,
                     0x800);
         } else {
             ff_celp_lp_synthesis_filter(
@@ -634,6 +636,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
                     SUBFRAME_SIZE,
                     10,
                     0,
+                    0,
                     0x800);
         }
         /* Save data (without postfilter) for use in next subframe. */
index 6bd7f64..2b66bde 100644 (file)
@@ -433,7 +433,7 @@ static int16_t get_tilt_comp(DSPContext *dsp, int16_t *lp_gn,
     lp_gn[10] = 4096; //1.0 in (3.12)
 
     /* Apply 1/A(z/FORMANT_PP_FACTOR_DEN) filter to hf. */
-    ff_celp_lp_synthesis_filter(lp_gn + 11, lp_gd + 1, lp_gn + 11, 22, 10, 0, 0x800);
+    ff_celp_lp_synthesis_filter(lp_gn + 11, lp_gd + 1, lp_gn + 11, 22, 10, 0, 0, 0x800);
     /* Now lp_gn (starting with 10) contains impulse response
        of A(z/FORMANT_PP_FACTOR_NUM)/A(z/FORMANT_PP_FACTOR_DEN) filter. */
 
@@ -554,7 +554,7 @@ void ff_g729_postfilter(DSPContext *dsp, int16_t* ht_prev_data, int* voicing,
     /* Apply second half of short-term postfilter: 1/A(z/FORMANT_PP_FACTOR_DEN) */
     ff_celp_lp_synthesis_filter(pos_filter_data + 10, lp_gd + 1,
                                 residual_filt_buf + 10,
-                                subframe_size, 10, 0, 0x800);
+                                subframe_size, 10, 0, 0, 0x800);
     memcpy(pos_filter_data, pos_filter_data + subframe_size, 10 * sizeof(int16_t));
 
     *ht_prev_data = apply_tilt_comp(speech, pos_filter_data + 10, tilt_comp_coeff,
index 9baa068..3f1e6f7 100644 (file)
@@ -1715,6 +1715,6 @@ void ff_subblock_synthesis(RA144Context *ractx, const uint16_t *lpc_coefs,
            10*sizeof(*ractx->curr_sblock));
 
     if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs,
-                                    block, BLOCKSIZE, 10, 1, 0xfff))
+                                    block, BLOCKSIZE, 10, 1, 0, 0xfff))
         memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
 }