diff mbox series

[FFmpeg-devel,3/4] avcodec/vp3: Unify initializing and freeing VLC tables

Message ID 20201020075356.185676-3-andreas.rheinhardt@gmail.com
State Accepted
Headers show
Series [FFmpeg-devel,1/4] avcodec/vp3: Fix memleak upon init failure
Related show

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished

Commit Message

Andreas Rheinhardt Oct. 20, 2020, 7:53 a.m. UTC
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavcodec/vp3.c     | 163 ++++++++++++-------------------------------
 libavcodec/vp3data.h |  22 ++----
 libavcodec/vp4data.h |  22 ++----
 3 files changed, 55 insertions(+), 152 deletions(-)

Comments

Peter Ross Oct. 20, 2020, 9:34 p.m. UTC | #1
On Tue, Oct 20, 2020 at 09:53:54AM +0200, Andreas Rheinhardt wrote:
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  libavcodec/vp3.c     | 163 ++++++++++++-------------------------------
>  libavcodec/vp3data.h |  22 ++----
>  libavcodec/vp4data.h |  22 ++----
>  3 files changed, 55 insertions(+), 152 deletions(-)
> 
> diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
> index 7ee65c8062..e629a18b8e 100644
> --- a/libavcodec/vp3.c
> +++ b/libavcodec/vp3.c
> @@ -257,11 +257,9 @@ typedef struct Vp3DecodeContext {
>      int *nkf_coded_fragment_list;
>      int num_kf_coded_fragment[3];
>  
> -    VLC dc_vlc[16];
> -    VLC ac_vlc_1[16];
> -    VLC ac_vlc_2[16];
> -    VLC ac_vlc_3[16];
> -    VLC ac_vlc_4[16];
> +    /* The first 16 of the following VLCs are for the dc coefficients;
> +       the others are four groups of 16 VLCs each for ac coefficients. */
> +    VLC xc_vlc[80];

personal choice: coeff_vlc[5 * 16] would make this clearer for me

all the activity happens in unpack_dct_coeffs

>  
>      VLC superblock_run_length_vlc; /* version < 2 */
>      VLC fragment_run_length_vlc; /* version < 2 */
> @@ -347,13 +345,8 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx)
>      av_frame_free(&s->last_frame.f);
>      av_frame_free(&s->golden_frame.f);
>  
> -    for (i = 0; i < 16; i++) {
> -        ff_free_vlc(&s->dc_vlc[i]);
> -        ff_free_vlc(&s->ac_vlc_1[i]);
> -        ff_free_vlc(&s->ac_vlc_2[i]);
> -        ff_free_vlc(&s->ac_vlc_3[i]);
> -        ff_free_vlc(&s->ac_vlc_4[i]);
> -    }
> +    for (i = 0; i < 80; i++)
> +        ff_free_vlc(&s->xc_vlc[i]);
>  
>      ff_free_vlc(&s->superblock_run_length_vlc);
>      ff_free_vlc(&s->fragment_run_length_vlc);
> @@ -1314,7 +1307,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
>      dc_c_table = get_bits(gb, 4);
>  
>      /* unpack the Y plane DC coefficients */
> -    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0,
> +    residual_eob_run = unpack_vlcs(s, gb, &s->xc_vlc[dc_y_table], 0,
>                                     0, residual_eob_run);
>      if (residual_eob_run < 0)
>          return residual_eob_run;
> @@ -1325,11 +1318,11 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
>      reverse_dc_prediction(s, 0, s->fragment_width[0], s->fragment_height[0]);
>  
>      /* unpack the C plane DC coefficients */
> -    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
> +    residual_eob_run = unpack_vlcs(s, gb, &s->xc_vlc[dc_c_table], 0,
>                                     1, residual_eob_run);
>      if (residual_eob_run < 0)
>          return residual_eob_run;
> -    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
> +    residual_eob_run = unpack_vlcs(s, gb, &s->xc_vlc[dc_c_table], 0,
>                                     2, residual_eob_run);
>      if (residual_eob_run < 0)
>          return residual_eob_run;
> @@ -1350,20 +1343,24 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
>  
>      /* build tables of AC VLC tables */
>      for (i = 1; i <= 5; i++) {
> -        y_tables[i] = &s->ac_vlc_1[ac_y_table];
> -        c_tables[i] = &s->ac_vlc_1[ac_c_table];
> +        /* AC VLC table group 1 */
> +        y_tables[i] = &s->xc_vlc[ac_y_table + 16];
> +        c_tables[i] = &s->xc_vlc[ac_c_table + 16];
>      }
>      for (i = 6; i <= 14; i++) {
> -        y_tables[i] = &s->ac_vlc_2[ac_y_table];
> -        c_tables[i] = &s->ac_vlc_2[ac_c_table];
> +        /* AC VLC table group 2 */
> +        y_tables[i] = &s->xc_vlc[ac_y_table + 32];
> +        c_tables[i] = &s->xc_vlc[ac_c_table + 32];
>      }
>      for (i = 15; i <= 27; i++) {
> -        y_tables[i] = &s->ac_vlc_3[ac_y_table];
> -        c_tables[i] = &s->ac_vlc_3[ac_c_table];
> +        /* AC VLC table group 3 */
> +        y_tables[i] = &s->xc_vlc[ac_y_table + 48];
> +        c_tables[i] = &s->xc_vlc[ac_c_table + 48];
>      }
>      for (i = 28; i <= 63; i++) {
> -        y_tables[i] = &s->ac_vlc_4[ac_y_table];
> -        c_tables[i] = &s->ac_vlc_4[ac_c_table];
> +        /* AC VLC table group 4 */
> +        y_tables[i] = &s->xc_vlc[ac_y_table + 64];
> +        c_tables[i] = &s->xc_vlc[ac_c_table + 64];
>      }
>  
>      /* decode all AC coefficients */
> @@ -1542,23 +1539,28 @@ static int vp4_unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
>  
>      /* build tables of DC/AC VLC tables */
>  
> -    tables[0][0] = &s->dc_vlc[dc_y_table];
> -    tables[1][0] = &s->dc_vlc[dc_c_table];
> +    /* DC table group */
> +    tables[0][0] = &s->xc_vlc[dc_y_table];
> +    tables[1][0] = &s->xc_vlc[dc_c_table];
>      for (i = 1; i <= 5; i++) {
> -        tables[0][i] = &s->ac_vlc_1[ac_y_table];
> -        tables[1][i] = &s->ac_vlc_1[ac_c_table];
> +        /* AC VLC table group 1 */
> +        tables[0][i] = &s->xc_vlc[ac_y_table + 16];
> +        tables[1][i] = &s->xc_vlc[ac_c_table + 16];
>      }
>      for (i = 6; i <= 14; i++) {
> -        tables[0][i] = &s->ac_vlc_2[ac_y_table];
> -        tables[1][i] = &s->ac_vlc_2[ac_c_table];
> +        /* AC VLC table group 2 */
> +        tables[0][i] = &s->xc_vlc[ac_y_table + 32];
> +        tables[1][i] = &s->xc_vlc[ac_c_table + 32];
>      }
>      for (i = 15; i <= 27; i++) {
> -        tables[0][i] = &s->ac_vlc_3[ac_y_table];
> -        tables[1][i] = &s->ac_vlc_3[ac_c_table];
> +        /* AC VLC table group 3 */
> +        tables[0][i] = &s->xc_vlc[ac_y_table + 48];
> +        tables[1][i] = &s->xc_vlc[ac_c_table + 48];
>      }
>      for (i = 28; i <= 63; i++) {
> -        tables[0][i] = &s->ac_vlc_4[ac_y_table];
> -        tables[1][i] = &s->ac_vlc_4[ac_c_table];
> +        /* AC VLC table group 4 */
> +        tables[0][i] = &s->xc_vlc[ac_y_table + 64];
> +        tables[1][i] = &s->xc_vlc[ac_c_table + 64];
>      }
>  
>      vp4_set_tokens_base(s);
> @@ -2412,103 +2414,28 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
>  
>          /* init VLC tables */
>          if (s->version < 2) {
> -            for (i = 0; i < 16; i++) {
> -                /* DC histograms */
> -                if ((ret = init_vlc(&s->dc_vlc[i], 11, 32,
> -                                    &dc_bias[i][0][1], 4, 2,
> -                                    &dc_bias[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 1 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_1[i], 11, 32,
> -                                    &ac_bias_0[i][0][1], 4, 2,
> -                                    &ac_bias_0[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 2 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_2[i], 11, 32,
> -                                    &ac_bias_1[i][0][1], 4, 2,
> -                                    &ac_bias_1[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 3 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_3[i], 11, 32,
> -                                    &ac_bias_2[i][0][1], 4, 2,
> -                                    &ac_bias_2[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 4 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_4[i], 11, 32,
> -                                    &ac_bias_3[i][0][1], 4, 2,
> -                                    &ac_bias_3[i][0][0], 4, 2, 0)) < 0)
> +            for (i = 0; i < 80; i++) {
> +                if ((ret = init_vlc(&s->xc_vlc[i], 11, 32,
> +                                    &vp3_bias[i][0][1], 4, 2,
> +                                    &vp3_bias[i][0][0], 4, 2, 0)) < 0)
>                      return ret;
>              }
>  #if CONFIG_VP4_DECODER
>          } else { /* version >= 2 */
> -            for (i = 0; i < 16; i++) {
> -                /* DC histograms */
> -                if ((ret = init_vlc(&s->dc_vlc[i], 11, 32,
> -                                    &vp4_dc_bias[i][0][1], 4, 2,
> -                                    &vp4_dc_bias[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 1 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_1[i], 11, 32,
> -                                    &vp4_ac_bias_0[i][0][1], 4, 2,
> -                                    &vp4_ac_bias_0[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 2 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_2[i], 11, 32,
> -                                    &vp4_ac_bias_1[i][0][1], 4, 2,
> -                                    &vp4_ac_bias_1[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 3 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_3[i], 11, 32,
> -                                    &vp4_ac_bias_2[i][0][1], 4, 2,
> -                                    &vp4_ac_bias_2[i][0][0], 4, 2, 0)) < 0)
> -                    return ret;
> -
> -                /* group 4 AC histograms */
> -                if ((ret = init_vlc(&s->ac_vlc_4[i], 11, 32,
> -                                    &vp4_ac_bias_3[i][0][1], 4, 2,
> -                                    &vp4_ac_bias_3[i][0][0], 4, 2, 0)) < 0)
> +            for (i = 0; i < 80; i++) {
> +                if ((ret = init_vlc(&s->xc_vlc[i], 11, 32,
> +                                    &vp4_bias[i][0][1], 4, 2,
> +                                    &vp4_bias[i][0][0], 4, 2, 0)) < 0)
>                      return ret;
>              }
>  #endif
>          }
>      } else {
> -        for (i = 0; i < 16; i++) {
> -            /* DC histograms */
> -            if (init_vlc(&s->dc_vlc[i], 11, 32,
> +        for (i = 0; i < 80; i++) {
> +            if (init_vlc(&s->xc_vlc[i], 11, 32,
>                           &s->huffman_table[i][0][1], 8, 4,
>                           &s->huffman_table[i][0][0], 8, 4, 0) < 0)
>                  goto vlc_fail;
> -
> -            /* group 1 AC histograms */
> -            if (init_vlc(&s->ac_vlc_1[i], 11, 32,
> -                         &s->huffman_table[i + 16][0][1], 8, 4,
> -                         &s->huffman_table[i + 16][0][0], 8, 4, 0) < 0)
> -                goto vlc_fail;
> -
> -            /* group 2 AC histograms */
> -            if (init_vlc(&s->ac_vlc_2[i], 11, 32,
> -                         &s->huffman_table[i + 16 * 2][0][1], 8, 4,
> -                         &s->huffman_table[i + 16 * 2][0][0], 8, 4, 0) < 0)
> -                goto vlc_fail;
> -
> -            /* group 3 AC histograms */
> -            if (init_vlc(&s->ac_vlc_3[i], 11, 32,
> -                         &s->huffman_table[i + 16 * 3][0][1], 8, 4,
> -                         &s->huffman_table[i + 16 * 3][0][0], 8, 4, 0) < 0)
> -                goto vlc_fail;
> -
> -            /* group 4 AC histograms */
> -            if (init_vlc(&s->ac_vlc_4[i], 11, 32,
> -                         &s->huffman_table[i + 16 * 4][0][1], 8, 4,
> -                         &s->huffman_table[i + 16 * 4][0][0], 8, 4, 0) < 0)
> -                goto vlc_fail;
>          }
>      }
>  
> diff --git a/libavcodec/vp3data.h b/libavcodec/vp3data.h
> index 3f24d5f7f6..060d4965cf 100644
> --- a/libavcodec/vp3data.h
> +++ b/libavcodec/vp3data.h
> @@ -442,7 +442,7 @@ static const int16_t *const coeff_tables[32] = {
>      coeff_table_token_31
>  };
>  
> -static const uint16_t dc_bias[16][32][2] = {
> +static const uint16_t vp3_bias[80][32][2] = {
>      { /* DC bias table 0 */
>          {   0x2D,  6 },
>          {   0x26,  7 },
> @@ -986,10 +986,7 @@ static const uint16_t dc_bias[16][32][2] = {
>          {  0x151,  9 },
>          {  0x150,  9 },
>          {  0x2A9, 10 }
> -    }
> -};
> -
> -static const uint16_t ac_bias_0[16][32][2] = {
> +    },
>      { /* AC bias group 1, table 0 */
>          {    0x8,  5 },
>          {   0x25,  7 },
> @@ -1533,10 +1530,7 @@ static const uint16_t ac_bias_0[16][32][2] = {
>          {   0x38,  7 },
>          {   0x3D,  6 },
>          {   0x79,  7 }
> -    }
> -};
> -
> -static const uint16_t ac_bias_1[16][32][2] = {
> +    },
>      { /* AC bias group 2, table 0 */
>          {    0xB,  5 },
>          {   0x2B,  7 },
> @@ -2080,10 +2074,7 @@ static const uint16_t ac_bias_1[16][32][2] = {
>          {    0xB,  6 },
>          {   0x5F,  7 },
>          {   0xBD,  8 }
> -    }
> -};
> -
> -static const uint16_t ac_bias_2[16][32][2] = {
> +    },
>      { /* AC bias group 3, table 0 */
>          {    0x3,  4 },
>          {    0x9,  6 },
> @@ -2627,10 +2618,7 @@ static const uint16_t ac_bias_2[16][32][2] = {
>          {   0x1B,  5 },
>          { 0x35B7, 14 },
>          { 0x35B6, 14 }
> -    }
> -};
> -
> -static const uint16_t ac_bias_3[16][32][2] = {
> +    },
>      { /* AC bias group 4, table 0 */
>          {    0x0,  3 },
>          {   0x10,  5 },
> diff --git a/libavcodec/vp4data.h b/libavcodec/vp4data.h
> index 69a009eff1..356fa25748 100644
> --- a/libavcodec/vp4data.h
> +++ b/libavcodec/vp4data.h
> @@ -368,7 +368,7 @@ static const uint16_t vp4_mv_vlc[2][7][63][2] = {
>      }
>  };
>  
> -static const uint16_t vp4_dc_bias[16][32][2] = {
> +static const uint16_t vp4_bias[80][32][2] = {
>      { /* DC bias table 0 */
>          {    0xC,  5 }, {   0x70,  7 }, {  0x1CA,  9 }, {  0x1CB,  9 },
>          {  0x391, 10 }, { 0x1C9B, 13 }, { 0x3935, 14 }, {   0x71,  7 },
> @@ -528,10 +528,7 @@ static const uint16_t vp4_dc_bias[16][32][2] = {
>          {   0xC4,  8 }, {  0x5B9, 11 }, {  0x5B8, 11 }, {   0x11,  5 },
>          {   0x36,  6 }, {   0x5F,  7 }, {   0x1E,  7 }, {   0x63,  7 },
>          {   0x6F,  7 }, {   0x1F,  7 }, {   0xB6,  8 }, {  0x16F,  9 }
> -    }
> -};
> -
> -static const uint16_t vp4_ac_bias_0[16][32][2] = {
> +    },
>      { /* AC bias group 1, table 0 */
>          {    0x6,  5 }, {   0x1E,  7 }, {  0x1CC,  9 }, {  0x1CE,  9 },
>          {  0x734, 11 }, { 0x1CD5, 13 }, { 0x1CD4, 13 }, {   0x18,  5 },
> @@ -691,10 +688,7 @@ static const uint16_t vp4_ac_bias_0[16][32][2] = {
>          {  0x3A0, 12 }, {  0x3A3, 12 }, {  0x3A2, 12 }, {    0x5,  3 },
>          {    0x2,  4 }, {   0x1F,  5 }, {   0x1D,  5 }, {   0x3C,  6 },
>          {   0x18,  5 }, {    0xF,  6 }, {    0x6,  5 }, {    0x5,  6 }
> -    }
> -};
> -
> -static const uint16_t vp4_ac_bias_1[16][32][2] = {
> +    },
>      { /* AC bias group 2, table 0 */
>          {    0x4,  5 }, {   0xF5,  8 }, {  0x182,  9 }, {  0x60F, 11 },
>          { 0x1839, 13 }, { 0x1838, 13 }, { 0x183B, 13 }, {   0x13,  5 },
> @@ -854,10 +848,7 @@ static const uint16_t vp4_ac_bias_1[16][32][2] = {
>          {  0x288, 13 }, {  0x28B, 13 }, {  0x28A, 13 }, {    0xF,  4 },
>          {   0x1D,  5 }, {   0x13,  5 }, {    0x1,  5 }, {    0x0,  5 },
>          {    0x3,  3 }, {   0x1A,  5 }, {   0x72,  7 }, {   0xE7,  8 }
> -    }
> -};
> -
> -static const uint16_t vp4_ac_bias_2[16][32][2] = {
> +    },
>      { /* AC bias group 3, table 0 */
>          {    0x9,  5 }, {   0x15,  7 }, {   0x28,  8 }, {   0x52,  9 },
>          {  0x29A, 12 }, {  0x537, 13 }, {  0x536, 13 }, {    0xA,  5 },
> @@ -1017,10 +1008,7 @@ static const uint16_t vp4_ac_bias_2[16][32][2] = {
>          { 0x3872, 14 }, { 0x3879, 14 }, { 0x3878, 14 }, {   0x3C,  6 },
>          {   0x73,  7 }, {   0x2A,  6 }, {   0x3D,  6 }, {   0x2B,  6 },
>          {   0x1F,  5 }, {    0xD,  4 }, { 0x1C3E, 13 }, { 0x1C3D, 13 }
> -    }
> -};
> -
> -static const uint16_t vp4_ac_bias_3[16][32][2] = {
> +    },
>      { /* AC bias group 4, table 0 */
>          {    0x7,  4 }, {    0xF,  6 }, {   0xBB,  8 }, {   0xBA,  8 },
>          {  0x5CF, 11 }, { 0x173A, 13 }, { 0x2E77, 14 }, {   0x29,  6 },
> -- 
> 2.25.1

this is a welcome improvement
looks good

-- Peter
(A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B)
Andreas Rheinhardt Oct. 21, 2020, 4:59 a.m. UTC | #2
Peter Ross:
> On Tue, Oct 20, 2020 at 09:53:54AM +0200, Andreas Rheinhardt wrote:
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
>> ---
>>  libavcodec/vp3.c     | 163 ++++++++++++-------------------------------
>>  libavcodec/vp3data.h |  22 ++----
>>  libavcodec/vp4data.h |  22 ++----
>>  3 files changed, 55 insertions(+), 152 deletions(-)
>>
>> diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
>> index 7ee65c8062..e629a18b8e 100644
>> --- a/libavcodec/vp3.c
>> +++ b/libavcodec/vp3.c
>> @@ -257,11 +257,9 @@ typedef struct Vp3DecodeContext {
>>      int *nkf_coded_fragment_list;
>>      int num_kf_coded_fragment[3];
>>  
>> -    VLC dc_vlc[16];
>> -    VLC ac_vlc_1[16];
>> -    VLC ac_vlc_2[16];
>> -    VLC ac_vlc_3[16];
>> -    VLC ac_vlc_4[16];
>> +    /* The first 16 of the following VLCs are for the dc coefficients;
>> +       the others are four groups of 16 VLCs each for ac coefficients. */
>> +    VLC xc_vlc[80];
> 
> personal choice: coeff_vlc[5 * 16] would make this clearer for me
> 

Changed and applied.

- Andreas
diff mbox series

Patch

diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index 7ee65c8062..e629a18b8e 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -257,11 +257,9 @@  typedef struct Vp3DecodeContext {
     int *nkf_coded_fragment_list;
     int num_kf_coded_fragment[3];
 
-    VLC dc_vlc[16];
-    VLC ac_vlc_1[16];
-    VLC ac_vlc_2[16];
-    VLC ac_vlc_3[16];
-    VLC ac_vlc_4[16];
+    /* The first 16 of the following VLCs are for the dc coefficients;
+       the others are four groups of 16 VLCs each for ac coefficients. */
+    VLC xc_vlc[80];
 
     VLC superblock_run_length_vlc; /* version < 2 */
     VLC fragment_run_length_vlc; /* version < 2 */
@@ -347,13 +345,8 @@  static av_cold int vp3_decode_end(AVCodecContext *avctx)
     av_frame_free(&s->last_frame.f);
     av_frame_free(&s->golden_frame.f);
 
-    for (i = 0; i < 16; i++) {
-        ff_free_vlc(&s->dc_vlc[i]);
-        ff_free_vlc(&s->ac_vlc_1[i]);
-        ff_free_vlc(&s->ac_vlc_2[i]);
-        ff_free_vlc(&s->ac_vlc_3[i]);
-        ff_free_vlc(&s->ac_vlc_4[i]);
-    }
+    for (i = 0; i < 80; i++)
+        ff_free_vlc(&s->xc_vlc[i]);
 
     ff_free_vlc(&s->superblock_run_length_vlc);
     ff_free_vlc(&s->fragment_run_length_vlc);
@@ -1314,7 +1307,7 @@  static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
     dc_c_table = get_bits(gb, 4);
 
     /* unpack the Y plane DC coefficients */
-    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0,
+    residual_eob_run = unpack_vlcs(s, gb, &s->xc_vlc[dc_y_table], 0,
                                    0, residual_eob_run);
     if (residual_eob_run < 0)
         return residual_eob_run;
@@ -1325,11 +1318,11 @@  static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
     reverse_dc_prediction(s, 0, s->fragment_width[0], s->fragment_height[0]);
 
     /* unpack the C plane DC coefficients */
-    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
+    residual_eob_run = unpack_vlcs(s, gb, &s->xc_vlc[dc_c_table], 0,
                                    1, residual_eob_run);
     if (residual_eob_run < 0)
         return residual_eob_run;
-    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
+    residual_eob_run = unpack_vlcs(s, gb, &s->xc_vlc[dc_c_table], 0,
                                    2, residual_eob_run);
     if (residual_eob_run < 0)
         return residual_eob_run;
@@ -1350,20 +1343,24 @@  static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
 
     /* build tables of AC VLC tables */
     for (i = 1; i <= 5; i++) {
-        y_tables[i] = &s->ac_vlc_1[ac_y_table];
-        c_tables[i] = &s->ac_vlc_1[ac_c_table];
+        /* AC VLC table group 1 */
+        y_tables[i] = &s->xc_vlc[ac_y_table + 16];
+        c_tables[i] = &s->xc_vlc[ac_c_table + 16];
     }
     for (i = 6; i <= 14; i++) {
-        y_tables[i] = &s->ac_vlc_2[ac_y_table];
-        c_tables[i] = &s->ac_vlc_2[ac_c_table];
+        /* AC VLC table group 2 */
+        y_tables[i] = &s->xc_vlc[ac_y_table + 32];
+        c_tables[i] = &s->xc_vlc[ac_c_table + 32];
     }
     for (i = 15; i <= 27; i++) {
-        y_tables[i] = &s->ac_vlc_3[ac_y_table];
-        c_tables[i] = &s->ac_vlc_3[ac_c_table];
+        /* AC VLC table group 3 */
+        y_tables[i] = &s->xc_vlc[ac_y_table + 48];
+        c_tables[i] = &s->xc_vlc[ac_c_table + 48];
     }
     for (i = 28; i <= 63; i++) {
-        y_tables[i] = &s->ac_vlc_4[ac_y_table];
-        c_tables[i] = &s->ac_vlc_4[ac_c_table];
+        /* AC VLC table group 4 */
+        y_tables[i] = &s->xc_vlc[ac_y_table + 64];
+        c_tables[i] = &s->xc_vlc[ac_c_table + 64];
     }
 
     /* decode all AC coefficients */
@@ -1542,23 +1539,28 @@  static int vp4_unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
 
     /* build tables of DC/AC VLC tables */
 
-    tables[0][0] = &s->dc_vlc[dc_y_table];
-    tables[1][0] = &s->dc_vlc[dc_c_table];
+    /* DC table group */
+    tables[0][0] = &s->xc_vlc[dc_y_table];
+    tables[1][0] = &s->xc_vlc[dc_c_table];
     for (i = 1; i <= 5; i++) {
-        tables[0][i] = &s->ac_vlc_1[ac_y_table];
-        tables[1][i] = &s->ac_vlc_1[ac_c_table];
+        /* AC VLC table group 1 */
+        tables[0][i] = &s->xc_vlc[ac_y_table + 16];
+        tables[1][i] = &s->xc_vlc[ac_c_table + 16];
     }
     for (i = 6; i <= 14; i++) {
-        tables[0][i] = &s->ac_vlc_2[ac_y_table];
-        tables[1][i] = &s->ac_vlc_2[ac_c_table];
+        /* AC VLC table group 2 */
+        tables[0][i] = &s->xc_vlc[ac_y_table + 32];
+        tables[1][i] = &s->xc_vlc[ac_c_table + 32];
     }
     for (i = 15; i <= 27; i++) {
-        tables[0][i] = &s->ac_vlc_3[ac_y_table];
-        tables[1][i] = &s->ac_vlc_3[ac_c_table];
+        /* AC VLC table group 3 */
+        tables[0][i] = &s->xc_vlc[ac_y_table + 48];
+        tables[1][i] = &s->xc_vlc[ac_c_table + 48];
     }
     for (i = 28; i <= 63; i++) {
-        tables[0][i] = &s->ac_vlc_4[ac_y_table];
-        tables[1][i] = &s->ac_vlc_4[ac_c_table];
+        /* AC VLC table group 4 */
+        tables[0][i] = &s->xc_vlc[ac_y_table + 64];
+        tables[1][i] = &s->xc_vlc[ac_c_table + 64];
     }
 
     vp4_set_tokens_base(s);
@@ -2412,103 +2414,28 @@  static av_cold int vp3_decode_init(AVCodecContext *avctx)
 
         /* init VLC tables */
         if (s->version < 2) {
-            for (i = 0; i < 16; i++) {
-                /* DC histograms */
-                if ((ret = init_vlc(&s->dc_vlc[i], 11, 32,
-                                    &dc_bias[i][0][1], 4, 2,
-                                    &dc_bias[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 1 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_1[i], 11, 32,
-                                    &ac_bias_0[i][0][1], 4, 2,
-                                    &ac_bias_0[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 2 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_2[i], 11, 32,
-                                    &ac_bias_1[i][0][1], 4, 2,
-                                    &ac_bias_1[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 3 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_3[i], 11, 32,
-                                    &ac_bias_2[i][0][1], 4, 2,
-                                    &ac_bias_2[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 4 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_4[i], 11, 32,
-                                    &ac_bias_3[i][0][1], 4, 2,
-                                    &ac_bias_3[i][0][0], 4, 2, 0)) < 0)
+            for (i = 0; i < 80; i++) {
+                if ((ret = init_vlc(&s->xc_vlc[i], 11, 32,
+                                    &vp3_bias[i][0][1], 4, 2,
+                                    &vp3_bias[i][0][0], 4, 2, 0)) < 0)
                     return ret;
             }
 #if CONFIG_VP4_DECODER
         } else { /* version >= 2 */
-            for (i = 0; i < 16; i++) {
-                /* DC histograms */
-                if ((ret = init_vlc(&s->dc_vlc[i], 11, 32,
-                                    &vp4_dc_bias[i][0][1], 4, 2,
-                                    &vp4_dc_bias[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 1 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_1[i], 11, 32,
-                                    &vp4_ac_bias_0[i][0][1], 4, 2,
-                                    &vp4_ac_bias_0[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 2 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_2[i], 11, 32,
-                                    &vp4_ac_bias_1[i][0][1], 4, 2,
-                                    &vp4_ac_bias_1[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 3 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_3[i], 11, 32,
-                                    &vp4_ac_bias_2[i][0][1], 4, 2,
-                                    &vp4_ac_bias_2[i][0][0], 4, 2, 0)) < 0)
-                    return ret;
-
-                /* group 4 AC histograms */
-                if ((ret = init_vlc(&s->ac_vlc_4[i], 11, 32,
-                                    &vp4_ac_bias_3[i][0][1], 4, 2,
-                                    &vp4_ac_bias_3[i][0][0], 4, 2, 0)) < 0)
+            for (i = 0; i < 80; i++) {
+                if ((ret = init_vlc(&s->xc_vlc[i], 11, 32,
+                                    &vp4_bias[i][0][1], 4, 2,
+                                    &vp4_bias[i][0][0], 4, 2, 0)) < 0)
                     return ret;
             }
 #endif
         }
     } else {
-        for (i = 0; i < 16; i++) {
-            /* DC histograms */
-            if (init_vlc(&s->dc_vlc[i], 11, 32,
+        for (i = 0; i < 80; i++) {
+            if (init_vlc(&s->xc_vlc[i], 11, 32,
                          &s->huffman_table[i][0][1], 8, 4,
                          &s->huffman_table[i][0][0], 8, 4, 0) < 0)
                 goto vlc_fail;
-
-            /* group 1 AC histograms */
-            if (init_vlc(&s->ac_vlc_1[i], 11, 32,
-                         &s->huffman_table[i + 16][0][1], 8, 4,
-                         &s->huffman_table[i + 16][0][0], 8, 4, 0) < 0)
-                goto vlc_fail;
-
-            /* group 2 AC histograms */
-            if (init_vlc(&s->ac_vlc_2[i], 11, 32,
-                         &s->huffman_table[i + 16 * 2][0][1], 8, 4,
-                         &s->huffman_table[i + 16 * 2][0][0], 8, 4, 0) < 0)
-                goto vlc_fail;
-
-            /* group 3 AC histograms */
-            if (init_vlc(&s->ac_vlc_3[i], 11, 32,
-                         &s->huffman_table[i + 16 * 3][0][1], 8, 4,
-                         &s->huffman_table[i + 16 * 3][0][0], 8, 4, 0) < 0)
-                goto vlc_fail;
-
-            /* group 4 AC histograms */
-            if (init_vlc(&s->ac_vlc_4[i], 11, 32,
-                         &s->huffman_table[i + 16 * 4][0][1], 8, 4,
-                         &s->huffman_table[i + 16 * 4][0][0], 8, 4, 0) < 0)
-                goto vlc_fail;
         }
     }
 
diff --git a/libavcodec/vp3data.h b/libavcodec/vp3data.h
index 3f24d5f7f6..060d4965cf 100644
--- a/libavcodec/vp3data.h
+++ b/libavcodec/vp3data.h
@@ -442,7 +442,7 @@  static const int16_t *const coeff_tables[32] = {
     coeff_table_token_31
 };
 
-static const uint16_t dc_bias[16][32][2] = {
+static const uint16_t vp3_bias[80][32][2] = {
     { /* DC bias table 0 */
         {   0x2D,  6 },
         {   0x26,  7 },
@@ -986,10 +986,7 @@  static const uint16_t dc_bias[16][32][2] = {
         {  0x151,  9 },
         {  0x150,  9 },
         {  0x2A9, 10 }
-    }
-};
-
-static const uint16_t ac_bias_0[16][32][2] = {
+    },
     { /* AC bias group 1, table 0 */
         {    0x8,  5 },
         {   0x25,  7 },
@@ -1533,10 +1530,7 @@  static const uint16_t ac_bias_0[16][32][2] = {
         {   0x38,  7 },
         {   0x3D,  6 },
         {   0x79,  7 }
-    }
-};
-
-static const uint16_t ac_bias_1[16][32][2] = {
+    },
     { /* AC bias group 2, table 0 */
         {    0xB,  5 },
         {   0x2B,  7 },
@@ -2080,10 +2074,7 @@  static const uint16_t ac_bias_1[16][32][2] = {
         {    0xB,  6 },
         {   0x5F,  7 },
         {   0xBD,  8 }
-    }
-};
-
-static const uint16_t ac_bias_2[16][32][2] = {
+    },
     { /* AC bias group 3, table 0 */
         {    0x3,  4 },
         {    0x9,  6 },
@@ -2627,10 +2618,7 @@  static const uint16_t ac_bias_2[16][32][2] = {
         {   0x1B,  5 },
         { 0x35B7, 14 },
         { 0x35B6, 14 }
-    }
-};
-
-static const uint16_t ac_bias_3[16][32][2] = {
+    },
     { /* AC bias group 4, table 0 */
         {    0x0,  3 },
         {   0x10,  5 },
diff --git a/libavcodec/vp4data.h b/libavcodec/vp4data.h
index 69a009eff1..356fa25748 100644
--- a/libavcodec/vp4data.h
+++ b/libavcodec/vp4data.h
@@ -368,7 +368,7 @@  static const uint16_t vp4_mv_vlc[2][7][63][2] = {
     }
 };
 
-static const uint16_t vp4_dc_bias[16][32][2] = {
+static const uint16_t vp4_bias[80][32][2] = {
     { /* DC bias table 0 */
         {    0xC,  5 }, {   0x70,  7 }, {  0x1CA,  9 }, {  0x1CB,  9 },
         {  0x391, 10 }, { 0x1C9B, 13 }, { 0x3935, 14 }, {   0x71,  7 },
@@ -528,10 +528,7 @@  static const uint16_t vp4_dc_bias[16][32][2] = {
         {   0xC4,  8 }, {  0x5B9, 11 }, {  0x5B8, 11 }, {   0x11,  5 },
         {   0x36,  6 }, {   0x5F,  7 }, {   0x1E,  7 }, {   0x63,  7 },
         {   0x6F,  7 }, {   0x1F,  7 }, {   0xB6,  8 }, {  0x16F,  9 }
-    }
-};
-
-static const uint16_t vp4_ac_bias_0[16][32][2] = {
+    },
     { /* AC bias group 1, table 0 */
         {    0x6,  5 }, {   0x1E,  7 }, {  0x1CC,  9 }, {  0x1CE,  9 },
         {  0x734, 11 }, { 0x1CD5, 13 }, { 0x1CD4, 13 }, {   0x18,  5 },
@@ -691,10 +688,7 @@  static const uint16_t vp4_ac_bias_0[16][32][2] = {
         {  0x3A0, 12 }, {  0x3A3, 12 }, {  0x3A2, 12 }, {    0x5,  3 },
         {    0x2,  4 }, {   0x1F,  5 }, {   0x1D,  5 }, {   0x3C,  6 },
         {   0x18,  5 }, {    0xF,  6 }, {    0x6,  5 }, {    0x5,  6 }
-    }
-};
-
-static const uint16_t vp4_ac_bias_1[16][32][2] = {
+    },
     { /* AC bias group 2, table 0 */
         {    0x4,  5 }, {   0xF5,  8 }, {  0x182,  9 }, {  0x60F, 11 },
         { 0x1839, 13 }, { 0x1838, 13 }, { 0x183B, 13 }, {   0x13,  5 },
@@ -854,10 +848,7 @@  static const uint16_t vp4_ac_bias_1[16][32][2] = {
         {  0x288, 13 }, {  0x28B, 13 }, {  0x28A, 13 }, {    0xF,  4 },
         {   0x1D,  5 }, {   0x13,  5 }, {    0x1,  5 }, {    0x0,  5 },
         {    0x3,  3 }, {   0x1A,  5 }, {   0x72,  7 }, {   0xE7,  8 }
-    }
-};
-
-static const uint16_t vp4_ac_bias_2[16][32][2] = {
+    },
     { /* AC bias group 3, table 0 */
         {    0x9,  5 }, {   0x15,  7 }, {   0x28,  8 }, {   0x52,  9 },
         {  0x29A, 12 }, {  0x537, 13 }, {  0x536, 13 }, {    0xA,  5 },
@@ -1017,10 +1008,7 @@  static const uint16_t vp4_ac_bias_2[16][32][2] = {
         { 0x3872, 14 }, { 0x3879, 14 }, { 0x3878, 14 }, {   0x3C,  6 },
         {   0x73,  7 }, {   0x2A,  6 }, {   0x3D,  6 }, {   0x2B,  6 },
         {   0x1F,  5 }, {    0xD,  4 }, { 0x1C3E, 13 }, { 0x1C3D, 13 }
-    }
-};
-
-static const uint16_t vp4_ac_bias_3[16][32][2] = {
+    },
     { /* AC bias group 4, table 0 */
         {    0x7,  4 }, {    0xF,  6 }, {   0xBB,  8 }, {   0xBA,  8 },
         {  0x5CF, 11 }, { 0x173A, 13 }, { 0x2E77, 14 }, {   0x29,  6 },