]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/atrac9dec.c
avcodec/atrac9dec: Don't create VLCs that are never used
[ffmpeg] / libavcodec / atrac9dec.c
index a1af3c22efc6feec7c68163ff8a545ab8419e8c8..c7c6a12f010c564433c3ec81f162b0e7b5cd063b 100644 (file)
@@ -26,6 +26,8 @@
 #include "libavutil/lfg.h"
 #include "libavutil/float_dsp.h"
 
+#define ATRAC9_SF_VLC_BITS 8
+
 typedef struct ATRAC9ChannelData {
     int band_ext;
     int q_unit_cnt;
@@ -272,7 +274,8 @@ static inline int read_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b,
         c->scalefactors[0] = get_bits(gb, len);
 
         for (int i = 1; i < b->band_ext_q_unit; i++) {
-            int val = c->scalefactors[i - 1] + get_vlc2(gb, tab->table, 9, 2);
+            int val = c->scalefactors[i - 1] + get_vlc2(gb, tab->table,
+                                                        ATRAC9_SF_VLC_BITS, 1);
             c->scalefactors[i] = val & ((1 << len) - 1);
         }
 
@@ -302,7 +305,7 @@ static inline int read_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b,
         const VLC *tab = &s->sf_vlc[1][len];
 
         for (int i = 0; i < unit_cnt; i++) {
-            int dist = get_vlc2(gb, tab->table, 9, 2);
+            int dist = get_vlc2(gb, tab->table, ATRAC9_SF_VLC_BITS, 1);
             c->scalefactors[i] = baseline[i] + dist;
         }
 
@@ -325,7 +328,8 @@ static inline int read_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b,
         c->scalefactors[0] = get_bits(gb, len);
 
         for (int i = 1; i < unit_cnt; i++) {
-            int val = c->scalefactors[i - 1] + get_vlc2(gb, tab->table, 9, 2);
+            int val = c->scalefactors[i - 1] + get_vlc2(gb, tab->table,
+                                                        ATRAC9_SF_VLC_BITS, 1);
             c->scalefactors[i] = val & ((1 << len) - 1);
         }
 
@@ -834,7 +838,7 @@ static av_cold int atrac9_decode_close(AVCodecContext *avctx)
                 ff_free_vlc(&s->coeff_vlc[i][j][k]);
 
     ff_mdct_end(&s->imdct);
-    av_free(s->fdsp);
+    av_freep(&s->fdsp);
 
     return 0;
 }
@@ -844,6 +848,8 @@ static av_cold int atrac9_decode_init(AVCodecContext *avctx)
     GetBitContext gb;
     ATRAC9Context *s = avctx->priv_data;
     int version, block_config_idx, superframe_idx, alloc_c_len;
+    const uint8_t (*tab)[2];
+    int ret;
 
     s->avctx = avctx;
 
@@ -927,33 +933,46 @@ static av_cold int atrac9_decode_init(AVCodecContext *avctx)
             s->alloc_curve[i - 1][j] = at9_tab_b_dist[(j * alloc_c_len) / i];
 
     /* Unsigned scalefactor VLCs */
+    tab = at9_sfb_a_tab;
     for (int i = 1; i < 7; i++) {
         const HuffmanCodebook *hf = &at9_huffman_sf_unsigned[i];
 
-        init_vlc(&s->sf_vlc[0][i], 9, hf->size, hf->bits, 1, 1, hf->codes,
-                 2, 2, 0);
+        ret = ff_init_vlc_from_lengths(&s->sf_vlc[0][i], ATRAC9_SF_VLC_BITS,
+                                       hf->size, &tab[0][1], 2,
+                                       &tab[0][0], 2, 1, 0, 0, avctx);
+        if (ret < 0)
+            return ret;
+        tab += hf->size;
     }
 
     /* Signed scalefactor VLCs */
+    tab = at9_sfb_b_tab;
     for (int i = 2; i < 6; i++) {
         const HuffmanCodebook *hf = &at9_huffman_sf_signed[i];
 
-        int nums = hf->size;
-        int16_t sym[32];
-        for (int j = 0; j < nums; j++)
-            sym[j] = sign_extend(j, hf->value_bits);
-
-        ff_init_vlc_sparse(&s->sf_vlc[1][i], 9, hf->size, hf->bits, 1, 1,
-                           hf->codes, 2, 2, sym, sizeof(*sym), sizeof(*sym), 0);
+        /* The symbols are signed integers in the range -16..15;
+         * the values in the source table are offset by 16 to make
+         * them fit into an uint8_t; the -16 reverses this shift. */
+        ret = ff_init_vlc_from_lengths(&s->sf_vlc[1][i], ATRAC9_SF_VLC_BITS,
+                                       hf->size, &tab[0][1], 2,
+                                       &tab[0][0], 2, 1, -16, 0, avctx);
+        if (ret < 0)
+            return ret;
+        tab += hf->size;
     }
 
     /* Coefficient VLCs */
+    tab = at9_coeffs_tab;
     for (int i = 0; i < 2; i++) {
-        for (int j = 0; j < 8; j++) {
-            for (int k = 0; k < 4; k++) {
+        for (int j = 2; j < 8; j++) {
+            for (int k = i; k < 4; k++) {
                 const HuffmanCodebook *hf = &at9_huffman_coeffs[i][j][k];
-                init_vlc(&s->coeff_vlc[i][j][k], 9, hf->size, hf->bits, 1, 1,
-                         hf->codes, 2, 2, 0);
+                ret = ff_init_vlc_from_lengths(&s->coeff_vlc[i][j][k], 9,
+                                               hf->size, &tab[0][1], 2,
+                                               &tab[0][0], 2, 1, 0, 0, avctx);
+                if (ret < 0)
+                    return ret;
+                tab += hf->size;
             }
         }
     }