]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/gsmdec_template.c
Merge commit 'a097f0049b28dc3ed13625e4a42619292c92492f'
[ffmpeg] / libavcodec / gsmdec_template.c
index 0f559530ec38b9f99fd5a7f660c0972848f46473..0c60813a4ab9e148890cb6d0ed1ac9c3f68ac2de 100644 (file)
 #include "gsm.h"
 #include "gsmdec_data.h"
 
-static void apcm_dequant_add(GetBitContext *gb, int16_t *dst)
+static const int requant_tab[4][8] = {
+    { 0 },
+    { 0, 7 },
+    { 0, 2, 5, 7 },
+    { 0, 1, 2, 3, 4, 5, 6, 7 }
+};
+
+static void apcm_dequant_add(GetBitContext *gb, int16_t *dst, const int *frame_bits)
 {
-    int i;
+    int i, val;
     int maxidx = get_bits(gb, 6);
     const int16_t *tab = ff_gsm_dequant_tab[maxidx];
-    for (i = 0; i < 13; i++)
-        dst[3*i] += tab[get_bits(gb, 3)];
+    for (i = 0; i < 13; i++) {
+        val = get_bits(gb, frame_bits[i]);
+        dst[3*i] += tab[requant_tab[frame_bits[i]][val]];
+    }
 }
 
 static inline int gsm_mult(int a, int b)
@@ -118,7 +127,7 @@ static int postprocess(int16_t *data, int msr)
 }
 
 static int gsm_decode_block(AVCodecContext *avctx, int16_t *samples,
-                            GetBitContext *gb)
+                            GetBitContext *gb, int mode)
 {
     GSMContext *ctx = avctx->priv_data;
     int i;
@@ -139,7 +148,7 @@ static int gsm_decode_block(AVCodecContext *avctx, int16_t *samples,
         int offset   = get_bits(gb, 2);
         lag = av_clip(lag, 40, 120);
         long_term_synth(ref_dst, lag, gain_idx);
-        apcm_dequant_add(gb, ref_dst + offset);
+        apcm_dequant_add(gb, ref_dst + offset, ff_gsm_apcm_bits[mode][i]);
         ref_dst += 40;
     }
     memcpy(ctx->ref_buf, ctx->ref_buf + 160, 120 * sizeof(*ctx->ref_buf));