]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/acelp_vectors.c
DCA: ARM/NEON optimised lfe_fir
[ffmpeg] / libavcodec / acelp_vectors.c
index 0b478b787b9b0e2748c80b1936a3bf02877b0248..a25011f4ff0facfec8f28c4226a5fd0cc5b8f9da 100644 (file)
@@ -164,6 +164,7 @@ void ff_decode_10_pulses_35bits(const int16_t *fixed_index,
     int i;
     int mask = (1 << bits) - 1;
 
+    fixed_sparse->no_repeat_mask = 0;
     fixed_sparse->n = 2 * half_pulse_count;
     for (i = 0; i < half_pulse_count; i++) {
         const int pos1   = gray_decode[fixed_index[2*i+1] & mask] + i;
@@ -206,8 +207,8 @@ void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b,
                + weight_coeff_b * in_b[i];
 }
 
-void ff_adaptative_gain_control(float *buf_out, float speech_energ,
-                                int size, float alpha, float *gain_mem)
+void ff_adaptive_gain_control(float *buf_out, float speech_energ,
+                              int size, float alpha, float *gain_mem)
 {
     int i;
     float postfilter_energ = ff_dot_productf(buf_out, buf_out, size);
@@ -243,16 +244,14 @@ void ff_set_fixed_vector(float *out, const AMRFixed *in, float scale, int size)
     int i;
 
     for (i=0; i < in->n; i++) {
-        int x   = in->x[i];
+        int x   = in->x[i], repeats = !((in->no_repeat_mask >> i) & 1);
         float y = in->y[i] * scale;
-        out[x] += y;
 
-        x += in->pitch_lag;
-        while (x < size) {
-            y *= in->pitch_fac;
+        do {
             out[x] += y;
+            y *= in->pitch_fac;
             x += in->pitch_lag;
-        }
+        } while (x < size && repeats);
     }
 }
 
@@ -261,13 +260,11 @@ void ff_clear_fixed_vector(float *out, const AMRFixed *in, int size)
     int i;
 
     for (i=0; i < in->n; i++) {
-        int x  = in->x[i];
-        out[x] = 0.0;
+        int x  = in->x[i], repeats = !((in->no_repeat_mask >> i) & 1);
 
-        x += in->pitch_lag;
-        while (x < size) {
+        do {
             out[x] = 0.0;
             x += in->pitch_lag;
-        }
+        } while (x < size && repeats);
     }
 }