- uint8_t huff_size[256] = { 0 };
- uint16_t huff_code[256];
- uint16_t huff_sym[256];
- int i;
-
- av_assert0(nb_codes <= 256);
-
- ff_mjpeg_build_huffman_codes(huff_size, huff_code, bits_table, val_table);
-
- for (i = 0; i < 256; i++)
- huff_sym[i] = i + 16 * is_ac;
-
- if (is_ac)
- huff_sym[0] = 16 * 256;
-
- return ff_init_vlc_sparse(vlc, 9, nb_codes, huff_size, 1, 1,
- huff_code, 2, 2, huff_sym, 2, 2, use_static);
-}
-
-static int build_basic_mjpeg_vlc(MJpegDecodeContext *s)
-{
- int ret;
-
- if ((ret = build_vlc(&s->vlcs[0][0], avpriv_mjpeg_bits_dc_luminance,
- avpriv_mjpeg_val_dc, 12, 0, 0)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[0][1], avpriv_mjpeg_bits_dc_chrominance,
- avpriv_mjpeg_val_dc, 12, 0, 0)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[1][0], avpriv_mjpeg_bits_ac_luminance,
- avpriv_mjpeg_val_ac_luminance, 251, 0, 1)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[1][1], avpriv_mjpeg_bits_ac_chrominance,
- avpriv_mjpeg_val_ac_chrominance, 251, 0, 1)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[2][0], avpriv_mjpeg_bits_ac_luminance,
- avpriv_mjpeg_val_ac_luminance, 251, 0, 0)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[2][1], avpriv_mjpeg_bits_ac_chrominance,
- avpriv_mjpeg_val_ac_chrominance, 251, 0, 0)) < 0)
- return ret;
+ static const struct {
+ int class;
+ int index;
+ const uint8_t *bits;
+ const uint8_t *values;
+ int length;
+ } ht[] = {
+ { 0, 0, avpriv_mjpeg_bits_dc_luminance,
+ avpriv_mjpeg_val_dc, 12 },
+ { 0, 1, avpriv_mjpeg_bits_dc_chrominance,
+ avpriv_mjpeg_val_dc, 12 },
+ { 1, 0, avpriv_mjpeg_bits_ac_luminance,
+ avpriv_mjpeg_val_ac_luminance, 162 },
+ { 1, 1, avpriv_mjpeg_bits_ac_chrominance,
+ avpriv_mjpeg_val_ac_chrominance, 162 },
+ { 2, 0, avpriv_mjpeg_bits_ac_luminance,
+ avpriv_mjpeg_val_ac_luminance, 162 },
+ { 2, 1, avpriv_mjpeg_bits_ac_chrominance,
+ avpriv_mjpeg_val_ac_chrominance, 162 },
+ };
+ int i, ret;
+
+ for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
+ ff_free_vlc(&s->vlcs[ht[i].class][ht[i].index]);
+ ret = ff_mjpeg_build_vlc(&s->vlcs[ht[i].class][ht[i].index],
+ ht[i].bits, ht[i].values,
+ ht[i].class == 1, s->avctx);
+ if (ret < 0)
+ return ret;