Add no_repeat_mask option, so that single-pulse vectors can also be
authorRonald S. Bultje <rsbultje@gmail.com>
Fri, 29 Jan 2010 16:49:06 +0000 (16:49 +0000)
committerRonald S. Bultje <rsbultje@gmail.com>
Fri, 29 Jan 2010 16:49:06 +0000 (16:49 +0000)
expressed in a AMRFixed structure and handled by ff_set_fixed_vector().

Originally committed as revision 21528 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/acelp_vectors.c
libavcodec/acelp_vectors.h

index c9a6f40..736987b 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;
@@ -243,14 +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;
 
         do {
             out[x] += y;
             y *= in->pitch_fac;
             x += in->pitch_lag;
-        } while (x < size);
+        } while (x < size && repeats);
     }
 }
 
@@ -259,11 +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];
+        int x  = in->x[i], repeats = !((in->no_repeat_mask >> i) & 1);
 
         do {
             out[x] = 0.0;
             x += in->pitch_lag;
-        } while (x < size);
+        } while (x < size && repeats);
     }
 }
index 3a72ef9..2cc5f36 100644 (file)
@@ -30,6 +30,7 @@ typedef struct {
     int      n;
     int      x[10];
     float    y[10];
+    int      no_repeat_mask;
     int      pitch_lag;
     float    pitch_fac;
 } AMRFixed;