]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/gsmdec_template.c
dvbsubdec: Fix function return type
[ffmpeg] / libavcodec / gsmdec_template.c
index 7e57c7183f9ee85151fbf6ec8160362a450831a3..0b54dc54ce09066967f2c703b516740bd68c2ce2 100644 (file)
  */
 
 #include "get_bits.h"
+#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)
@@ -117,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;
@@ -138,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));