Merge commit 'f054e309c58894450a5d18cce9799ef58aab9f14'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 8 Jul 2013 03:02:52 +0000 (05:02 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 8 Jul 2013 03:02:52 +0000 (05:02 +0200)
* commit 'f054e309c58894450a5d18cce9799ef58aab9f14':
  qdm2: use init_static_data
  westwood_vqa: do not free extradata on error in read_header

Conflicts:
libavformat/westwood_vqa.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/qdm2.c
libavformat/westwood_vqa.c

diff --combined libavcodec/qdm2.c
@@@ -5,20 -5,20 +5,20 @@@
   * Copyright (c) 2005 Alex Beregszaszi
   * Copyright (c) 2005 Roberto Togni
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -168,7 -168,7 +168,7 @@@ typedef struct 
      /// I/O data
      const uint8_t *compressed_data;
      int compressed_size;
 -    float output_buffer[QDM2_MAX_FRAME_SIZE * 2];
 +    float output_buffer[QDM2_MAX_FRAME_SIZE * MPA_MAX_CHANNELS * 2];
  
      /// Synthesis filter
      MPADSPContext mpadsp;
@@@ -218,116 -218,145 +218,145 @@@ static const uint16_t qdm2_vlc_offs[] 
  
  static av_cold void qdm2_init_vlc(void)
  {
-     static int vlcs_initialized = 0;
      static VLC_TYPE qdm2_table[3838][2];
  
-     if (!vlcs_initialized) {
-         vlc_tab_level.table = &qdm2_table[qdm2_vlc_offs[0]];
-         vlc_tab_level.table_allocated = qdm2_vlc_offs[1] - qdm2_vlc_offs[0];
-         init_vlc (&vlc_tab_level, 8, 24,
-             vlc_tab_level_huffbits, 1, 1,
-             vlc_tab_level_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_diff.table = &qdm2_table[qdm2_vlc_offs[1]];
-         vlc_tab_diff.table_allocated = qdm2_vlc_offs[2] - qdm2_vlc_offs[1];
-         init_vlc (&vlc_tab_diff, 8, 37,
-             vlc_tab_diff_huffbits, 1, 1,
-             vlc_tab_diff_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_run.table = &qdm2_table[qdm2_vlc_offs[2]];
-         vlc_tab_run.table_allocated = qdm2_vlc_offs[3] - qdm2_vlc_offs[2];
-         init_vlc (&vlc_tab_run, 5, 6,
-             vlc_tab_run_huffbits, 1, 1,
-             vlc_tab_run_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         fft_level_exp_alt_vlc.table = &qdm2_table[qdm2_vlc_offs[3]];
-         fft_level_exp_alt_vlc.table_allocated = qdm2_vlc_offs[4] - qdm2_vlc_offs[3];
-         init_vlc (&fft_level_exp_alt_vlc, 8, 28,
-             fft_level_exp_alt_huffbits, 1, 1,
-             fft_level_exp_alt_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         fft_level_exp_vlc.table = &qdm2_table[qdm2_vlc_offs[4]];
-         fft_level_exp_vlc.table_allocated = qdm2_vlc_offs[5] - qdm2_vlc_offs[4];
-         init_vlc (&fft_level_exp_vlc, 8, 20,
-             fft_level_exp_huffbits, 1, 1,
-             fft_level_exp_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         fft_stereo_exp_vlc.table = &qdm2_table[qdm2_vlc_offs[5]];
-         fft_stereo_exp_vlc.table_allocated = qdm2_vlc_offs[6] - qdm2_vlc_offs[5];
-         init_vlc (&fft_stereo_exp_vlc, 6, 7,
-             fft_stereo_exp_huffbits, 1, 1,
-             fft_stereo_exp_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         fft_stereo_phase_vlc.table = &qdm2_table[qdm2_vlc_offs[6]];
-         fft_stereo_phase_vlc.table_allocated = qdm2_vlc_offs[7] - qdm2_vlc_offs[6];
-         init_vlc (&fft_stereo_phase_vlc, 6, 9,
-             fft_stereo_phase_huffbits, 1, 1,
-             fft_stereo_phase_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_tone_level_idx_hi1.table = &qdm2_table[qdm2_vlc_offs[7]];
-         vlc_tab_tone_level_idx_hi1.table_allocated = qdm2_vlc_offs[8] - qdm2_vlc_offs[7];
-         init_vlc (&vlc_tab_tone_level_idx_hi1, 8, 20,
-             vlc_tab_tone_level_idx_hi1_huffbits, 1, 1,
-             vlc_tab_tone_level_idx_hi1_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_tone_level_idx_mid.table = &qdm2_table[qdm2_vlc_offs[8]];
-         vlc_tab_tone_level_idx_mid.table_allocated = qdm2_vlc_offs[9] - qdm2_vlc_offs[8];
-         init_vlc (&vlc_tab_tone_level_idx_mid, 8, 24,
-             vlc_tab_tone_level_idx_mid_huffbits, 1, 1,
-             vlc_tab_tone_level_idx_mid_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_tone_level_idx_hi2.table = &qdm2_table[qdm2_vlc_offs[9]];
-         vlc_tab_tone_level_idx_hi2.table_allocated = qdm2_vlc_offs[10] - qdm2_vlc_offs[9];
-         init_vlc (&vlc_tab_tone_level_idx_hi2, 8, 24,
-             vlc_tab_tone_level_idx_hi2_huffbits, 1, 1,
-             vlc_tab_tone_level_idx_hi2_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_type30.table = &qdm2_table[qdm2_vlc_offs[10]];
-         vlc_tab_type30.table_allocated = qdm2_vlc_offs[11] - qdm2_vlc_offs[10];
-         init_vlc (&vlc_tab_type30, 6, 9,
-             vlc_tab_type30_huffbits, 1, 1,
-             vlc_tab_type30_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_type34.table = &qdm2_table[qdm2_vlc_offs[11]];
-         vlc_tab_type34.table_allocated = qdm2_vlc_offs[12] - qdm2_vlc_offs[11];
-         init_vlc (&vlc_tab_type34, 5, 10,
-             vlc_tab_type34_huffbits, 1, 1,
-             vlc_tab_type34_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_fft_tone_offset[0].table = &qdm2_table[qdm2_vlc_offs[12]];
-         vlc_tab_fft_tone_offset[0].table_allocated = qdm2_vlc_offs[13] - qdm2_vlc_offs[12];
-         init_vlc (&vlc_tab_fft_tone_offset[0], 8, 23,
-             vlc_tab_fft_tone_offset_0_huffbits, 1, 1,
-             vlc_tab_fft_tone_offset_0_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_fft_tone_offset[1].table = &qdm2_table[qdm2_vlc_offs[13]];
-         vlc_tab_fft_tone_offset[1].table_allocated = qdm2_vlc_offs[14] - qdm2_vlc_offs[13];
-         init_vlc (&vlc_tab_fft_tone_offset[1], 8, 28,
-             vlc_tab_fft_tone_offset_1_huffbits, 1, 1,
-             vlc_tab_fft_tone_offset_1_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_fft_tone_offset[2].table = &qdm2_table[qdm2_vlc_offs[14]];
-         vlc_tab_fft_tone_offset[2].table_allocated = qdm2_vlc_offs[15] - qdm2_vlc_offs[14];
-         init_vlc (&vlc_tab_fft_tone_offset[2], 8, 32,
-             vlc_tab_fft_tone_offset_2_huffbits, 1, 1,
-             vlc_tab_fft_tone_offset_2_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_fft_tone_offset[3].table = &qdm2_table[qdm2_vlc_offs[15]];
-         vlc_tab_fft_tone_offset[3].table_allocated = qdm2_vlc_offs[16] - qdm2_vlc_offs[15];
-         init_vlc (&vlc_tab_fft_tone_offset[3], 8, 35,
-             vlc_tab_fft_tone_offset_3_huffbits, 1, 1,
-             vlc_tab_fft_tone_offset_3_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlc_tab_fft_tone_offset[4].table = &qdm2_table[qdm2_vlc_offs[16]];
-         vlc_tab_fft_tone_offset[4].table_allocated = qdm2_vlc_offs[17] - qdm2_vlc_offs[16];
-         init_vlc (&vlc_tab_fft_tone_offset[4], 8, 38,
-             vlc_tab_fft_tone_offset_4_huffbits, 1, 1,
-             vlc_tab_fft_tone_offset_4_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
-         vlcs_initialized=1;
-     }
+     vlc_tab_level.table           = &qdm2_table[qdm2_vlc_offs[0]];
+     vlc_tab_level.table_allocated = qdm2_vlc_offs[1] - qdm2_vlc_offs[0];
+     init_vlc(&vlc_tab_level, 8, 24,
+              vlc_tab_level_huffbits, 1, 1,
+              vlc_tab_level_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_diff.table           = &qdm2_table[qdm2_vlc_offs[1]];
+     vlc_tab_diff.table_allocated = qdm2_vlc_offs[2] - qdm2_vlc_offs[1];
+     init_vlc(&vlc_tab_diff, 8, 37,
+              vlc_tab_diff_huffbits, 1, 1,
+              vlc_tab_diff_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_run.table           = &qdm2_table[qdm2_vlc_offs[2]];
+     vlc_tab_run.table_allocated = qdm2_vlc_offs[3] - qdm2_vlc_offs[2];
+     init_vlc(&vlc_tab_run, 5, 6,
+              vlc_tab_run_huffbits, 1, 1,
+              vlc_tab_run_huffcodes, 1, 1,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     fft_level_exp_alt_vlc.table           = &qdm2_table[qdm2_vlc_offs[3]];
+     fft_level_exp_alt_vlc.table_allocated = qdm2_vlc_offs[4] -
+                                             qdm2_vlc_offs[3];
+     init_vlc(&fft_level_exp_alt_vlc, 8, 28,
+              fft_level_exp_alt_huffbits, 1, 1,
+              fft_level_exp_alt_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     fft_level_exp_vlc.table           = &qdm2_table[qdm2_vlc_offs[4]];
+     fft_level_exp_vlc.table_allocated = qdm2_vlc_offs[5] - qdm2_vlc_offs[4];
+     init_vlc(&fft_level_exp_vlc, 8, 20,
+              fft_level_exp_huffbits, 1, 1,
+              fft_level_exp_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     fft_stereo_exp_vlc.table           = &qdm2_table[qdm2_vlc_offs[5]];
+     fft_stereo_exp_vlc.table_allocated = qdm2_vlc_offs[6] -
+                                          qdm2_vlc_offs[5];
+     init_vlc(&fft_stereo_exp_vlc, 6, 7,
+              fft_stereo_exp_huffbits, 1, 1,
+              fft_stereo_exp_huffcodes, 1, 1,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     fft_stereo_phase_vlc.table           = &qdm2_table[qdm2_vlc_offs[6]];
+     fft_stereo_phase_vlc.table_allocated = qdm2_vlc_offs[7] -
+                                            qdm2_vlc_offs[6];
+     init_vlc(&fft_stereo_phase_vlc, 6, 9,
+              fft_stereo_phase_huffbits, 1, 1,
+              fft_stereo_phase_huffcodes, 1, 1,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_tone_level_idx_hi1.table =
+         &qdm2_table[qdm2_vlc_offs[7]];
+     vlc_tab_tone_level_idx_hi1.table_allocated = qdm2_vlc_offs[8] -
+                                                  qdm2_vlc_offs[7];
+     init_vlc(&vlc_tab_tone_level_idx_hi1, 8, 20,
+              vlc_tab_tone_level_idx_hi1_huffbits, 1, 1,
+              vlc_tab_tone_level_idx_hi1_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_tone_level_idx_mid.table =
+         &qdm2_table[qdm2_vlc_offs[8]];
+     vlc_tab_tone_level_idx_mid.table_allocated = qdm2_vlc_offs[9] -
+                                                  qdm2_vlc_offs[8];
+     init_vlc(&vlc_tab_tone_level_idx_mid, 8, 24,
+              vlc_tab_tone_level_idx_mid_huffbits, 1, 1,
+              vlc_tab_tone_level_idx_mid_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_tone_level_idx_hi2.table =
+         &qdm2_table[qdm2_vlc_offs[9]];
+     vlc_tab_tone_level_idx_hi2.table_allocated = qdm2_vlc_offs[10] -
+                                                  qdm2_vlc_offs[9];
+     init_vlc(&vlc_tab_tone_level_idx_hi2, 8, 24,
+              vlc_tab_tone_level_idx_hi2_huffbits, 1, 1,
+              vlc_tab_tone_level_idx_hi2_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_type30.table           = &qdm2_table[qdm2_vlc_offs[10]];
+     vlc_tab_type30.table_allocated = qdm2_vlc_offs[11] - qdm2_vlc_offs[10];
+     init_vlc(&vlc_tab_type30, 6, 9,
+              vlc_tab_type30_huffbits, 1, 1,
+              vlc_tab_type30_huffcodes, 1, 1,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_type34.table           = &qdm2_table[qdm2_vlc_offs[11]];
+     vlc_tab_type34.table_allocated = qdm2_vlc_offs[12] - qdm2_vlc_offs[11];
+     init_vlc(&vlc_tab_type34, 5, 10,
+              vlc_tab_type34_huffbits, 1, 1,
+              vlc_tab_type34_huffcodes, 1, 1,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_fft_tone_offset[0].table =
+         &qdm2_table[qdm2_vlc_offs[12]];
+     vlc_tab_fft_tone_offset[0].table_allocated = qdm2_vlc_offs[13] -
+                                                  qdm2_vlc_offs[12];
+     init_vlc(&vlc_tab_fft_tone_offset[0], 8, 23,
+              vlc_tab_fft_tone_offset_0_huffbits, 1, 1,
+              vlc_tab_fft_tone_offset_0_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_fft_tone_offset[1].table =
+         &qdm2_table[qdm2_vlc_offs[13]];
+     vlc_tab_fft_tone_offset[1].table_allocated = qdm2_vlc_offs[14] -
+                                                  qdm2_vlc_offs[13];
+     init_vlc(&vlc_tab_fft_tone_offset[1], 8, 28,
+              vlc_tab_fft_tone_offset_1_huffbits, 1, 1,
+              vlc_tab_fft_tone_offset_1_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_fft_tone_offset[2].table =
+         &qdm2_table[qdm2_vlc_offs[14]];
+     vlc_tab_fft_tone_offset[2].table_allocated = qdm2_vlc_offs[15] -
+                                                  qdm2_vlc_offs[14];
+     init_vlc(&vlc_tab_fft_tone_offset[2], 8, 32,
+              vlc_tab_fft_tone_offset_2_huffbits, 1, 1,
+              vlc_tab_fft_tone_offset_2_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_fft_tone_offset[3].table =
+         &qdm2_table[qdm2_vlc_offs[15]];
+     vlc_tab_fft_tone_offset[3].table_allocated = qdm2_vlc_offs[16] -
+                                                  qdm2_vlc_offs[15];
+     init_vlc(&vlc_tab_fft_tone_offset[3], 8, 35,
+              vlc_tab_fft_tone_offset_3_huffbits, 1, 1,
+              vlc_tab_fft_tone_offset_3_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
+     vlc_tab_fft_tone_offset[4].table =
+         &qdm2_table[qdm2_vlc_offs[16]];
+     vlc_tab_fft_tone_offset[4].table_allocated = qdm2_vlc_offs[17] -
+                                                  qdm2_vlc_offs[16];
+     init_vlc(&vlc_tab_fft_tone_offset[4], 8, 38,
+              vlc_tab_fft_tone_offset_4_huffbits, 1, 1,
+              vlc_tab_fft_tone_offset_4_huffcodes, 2, 2,
+              INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
  }
  
  static int qdm2_get_vlc (GetBitContext *gb, VLC *vlc, int flag, int depth)
  
      /* stage-3, optional */
      if (flag) {
 -        int tmp = vlc_stage3_values[value];
 +        int tmp;
 +
 +        if (value >= 60) {
 +            av_log(NULL, AV_LOG_ERROR, "value %d in qdm2_get_vlc too large\n", value);
 +            return 0;
 +        }
 +
 +        tmp= vlc_stage3_values[value];
  
          if ((value & ~3) > 0)
              tmp += get_bits (gb, (value >> 2));
@@@ -646,8 -668,7 +675,8 @@@ static void fill_coding_method_array (s
  
      if (!superblocktype_2_3) {
          /* This case is untested, no samples available */
 -        SAMPLES_NEEDED
 +        avpriv_request_sample(NULL, "!superblocktype_2_3");
 +        return;
          for (ch = 0; ch < nb_channels; ch++)
              for (sb = 0; sb < 30; sb++) {
                  for (j = 1; j < 63; j++) {  // The loop only iterates to 63 so the code doesn't overflow the buffer
                      for (j = 0; j < 64; j++)
                          acc += tone_level_idx_temp[ch][sb][j];
  
 -            multres = 0x66666667 * (acc * 10);
 +            multres = 0x66666667LL * (acc * 10);
              esp_40 = (multres >> 32) / 8 + ((multres & 0xffffffff) >> 31);
              for (ch = 0;  ch < nb_channels; ch++)
                  for (sb = 0; sb < 30; sb++)
   * @param sb_min    lower subband processed (sb_min included)
   * @param sb_max    higher subband processed (sb_max excluded)
   */
 -static void synthfilt_build_sb_samples (QDM2Context *q, GetBitContext *gb, int length, int sb_min, int sb_max)
 +static int synthfilt_build_sb_samples (QDM2Context *q, GetBitContext *gb, int length, int sb_min, int sb_max)
  {
      int sb, j, k, n, ch, run, channels;
      int joined_stereo, zero_encoding, chs;
          for (sb=sb_min; sb < sb_max; sb++)
              build_sb_samples_from_noise (q, sb);
  
 -        return;
 +        return 0;
      }
  
      for (sb = sb_min; sb < sb_max; sb++) {
                  for (j = 0; j < 16; j++)
                      sign_bits[j] = get_bits1 (gb);
  
 +            if (q->coding_method[0][sb][0] <= 0) {
 +                av_log(NULL, AV_LOG_ERROR, "coding method invalid\n");
 +                return AVERROR_INVALIDDATA;
 +            }
 +
              for (j = 0; j < 64; j++)
                  if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j])
                      q->coding_method[0][sb][j] = q->coding_method[1][sb][j];
                                  }
                              } else {
                                  n = get_bits(gb, 8);
 +                                if (n >= 243) {
 +                                    av_log(NULL, AV_LOG_ERROR, "Invalid 8bit codeword\n");
 +                                    return AVERROR_INVALIDDATA;
 +                                }
 +
                                  for (k = 0; k < 5; k++)
                                      samples[2 * k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
                              }
                                  }
                              } else {
                                  n = get_bits (gb, 8);
 +                                if (n >= 243) {
 +                                    av_log(NULL, AV_LOG_ERROR, "Invalid 8bit codeword\n");
 +                                    return AVERROR_INVALIDDATA;
 +                                }
 +
                                  for (k = 0; k < 5; k++)
                                      samples[k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
                              }
                      case 24:
                          if (get_bits_left(gb) >= 7) {
                              n = get_bits(gb, 7);
 +                            if (n >= 125) {
 +                                av_log(NULL, AV_LOG_ERROR, "Invalid 7bit codeword\n");
 +                                return AVERROR_INVALIDDATA;
 +                            }
 +
                              for (k = 0; k < 3; k++)
                                  samples[k] = (random_dequant_type24[n][k] - 2.0) * 0.5;
                          } else {
                      case 30:
                          if (get_bits_left(gb) >= 4) {
                              unsigned index = qdm2_get_vlc(gb, &vlc_tab_type30, 0, 1);
 -                            if (index < FF_ARRAY_ELEMS(type30_dequant)) {
 -                                samples[0] = type30_dequant[index];
 -                            } else
 -                                samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
 +                            if (index >= FF_ARRAY_ELEMS(type30_dequant)) {
 +                                av_log(NULL, AV_LOG_ERROR, "index %d out of type30_dequant array\n", index);
 +                                return AVERROR_INVALIDDATA;
 +                            }
 +                            samples[0] = type30_dequant[index];
                          } else
                              samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
  
                                  type34_first = 0;
                              } else {
                                  unsigned index = qdm2_get_vlc(gb, &vlc_tab_type34, 0, 1);
 -                                if (index < FF_ARRAY_ELEMS(type34_delta)) {
 -                                    samples[0] = type34_delta[index] / type34_div + type34_predictor;
 -                                    type34_predictor = samples[0];
 -                                } else
 -                                    samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
 +                                if (index >= FF_ARRAY_ELEMS(type34_delta)) {
 +                                    av_log(NULL, AV_LOG_ERROR, "index %d out of type34_delta array\n", index);
 +                                    return AVERROR_INVALIDDATA;
 +                                }
 +                                samples[0] = type34_delta[index] / type34_div + type34_predictor;
 +                                type34_predictor = samples[0];
                              }
                          } else {
                              samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
  
                  if (joined_stereo) {
                      float tmp[10][MPA_MAX_CHANNELS];
 -
                      for (k = 0; k < run; k++) {
                          tmp[k][0] = samples[k];
 -                        tmp[k][1] = (sign_bits[(j + k) / 8]) ? -samples[k] : samples[k];
 +                        if ((j + k) < 128)
 +                            tmp[k][1] = (sign_bits[(j + k) / 8]) ? -samples[k] : samples[k];
                      }
                      for (chs = 0; chs < q->nb_channels; chs++)
                          for (k = 0; k < run; k++)
              } // j loop
          } // channel loop
      } // subband loop
 +    return 0;
  }
  
  
   * @param quantized_coeffs    pointer to quantized_coeffs[ch][0]
   * @param gb        bitreader context
   */
 -static void init_quantized_coeffs_elem0 (int8_t *quantized_coeffs, GetBitContext *gb)
 +static int init_quantized_coeffs_elem0 (int8_t *quantized_coeffs, GetBitContext *gb)
  {
      int i, k, run, level, diff;
  
      if (get_bits_left(gb) < 16)
 -        return;
 +        return -1;
      level = qdm2_get_vlc(gb, &vlc_tab_level, 0, 2);
  
      quantized_coeffs[0] = level;
  
      for (i = 0; i < 7; ) {
          if (get_bits_left(gb) < 16)
 -            break;
 +            return -1;
          run = qdm2_get_vlc(gb, &vlc_tab_run, 0, 1) + 1;
  
 +        if (i + run >= 8)
 +            return -1;
 +
          if (get_bits_left(gb) < 16)
 -            break;
 +            return -1;
          diff = qdm2_get_se_vlc(&vlc_tab_diff, gb, 2);
  
          for (k = 1; k <= run; k++)
          level += diff;
          i += run;
      }
 +    return 0;
  }
  
  
@@@ -1075,7 -1069,7 +1104,7 @@@ static void init_tone_level_dequantizat
   * @param q       context
   * @param node    pointer to node with packet
   */
 -static void process_subpacket_9 (QDM2Context *q, QDM2SubPNode *node)
 +static int process_subpacket_9 (QDM2Context *q, QDM2SubPNode *node)
  {
      GetBitContext gb;
      int i, j, k, n, ch, run, level, diff;
                  run = qdm2_get_vlc(&gb, &vlc_tab_run, 0, 1) + 1;
                  diff = qdm2_get_se_vlc(&vlc_tab_diff, &gb, 2);
  
 +                if (j + run >= 8)
 +                    return -1;
 +
                  for (k = 1; k <= run; k++)
                      q->quantized_coeffs[ch][i][j + k] = (level + ((k*diff) / run));
  
      for (ch = 0; ch < q->nb_channels; ch++)
          for (i = 0; i < 8; i++)
              q->quantized_coeffs[ch][0][i] = 0;
 +
 +    return 0;
  }
  
  
@@@ -1179,7 -1168,7 +1208,7 @@@ static void process_subpacket_12 (QDM2C
      synthfilt_build_sb_samples(q, &gb, length, 8, QDM2_SB_USED(q->sub_sampling));
  }
  
 -/*
 +/**
   * Process new subpackets for synthesis filter
   *
   * @param q       context
@@@ -1213,7 -1202,7 +1242,7 @@@ static void process_synthesis_subpacket
  }
  
  
 -/*
 +/**
   * Decode superblock, fill packet lists.
   *
   * @param q    context
@@@ -1374,14 -1363,9 +1403,14 @@@ static void qdm2_fft_decode_tones (QDM2
      local_int_10 = 1 << (q->group_order - duration - 1);
      offset = 1;
  
 -    while (1) {
 +    while (get_bits_left(gb)>0) {
          if (q->superblocktype_2_3) {
              while ((n = qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2)) < 2) {
 +                if (get_bits_left(gb)<0) {
 +                    if(local_int_4 < q->group_size)
 +                        av_log(NULL, AV_LOG_ERROR, "overread in qdm2_fft_decode_tones()\n");
 +                    return;
 +                }
                  offset = 1;
                  if (n == 0) {
                      local_int_4 += local_int_10;
@@@ -1694,20 -1678,12 +1723,12 @@@ static void qdm2_synthesis_filter (QDM2
   *
   * @param q    context
   */
- static av_cold void qdm2_init(QDM2Context *q) {
-     static int initialized = 0;
-     if (initialized != 0)
-         return;
-     initialized = 1;
+ static av_cold void qdm2_init_static_data(AVCodec *codec) {
      qdm2_init_vlc();
      ff_mpa_synth_init_float(ff_mpa_synth_window_float);
      softclip_table_init();
      rnd_table_init();
      init_noise_samples();
-     av_log(NULL, AV_LOG_DEBUG, "init done\n");
  }
  
  
@@@ -1809,10 -1785,8 +1830,10 @@@ static av_cold int qdm2_decode_init(AVC
  
      avctx->channels = s->nb_channels = s->channels = AV_RB32(extradata);
      extradata += 4;
 -    if (s->channels <= 0 || s->channels > MPA_MAX_CHANNELS)
 +    if (s->channels <= 0 || s->channels > MPA_MAX_CHANNELS) {
 +        av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
          return AVERROR_INVALIDDATA;
 +    }
      avctx->channel_layout = avctx->channels == 2 ? AV_CH_LAYOUT_STEREO :
                                                     AV_CH_LAYOUT_MONO;
  
      // something like max decodable tones
      s->group_order = av_log2(s->group_size) + 1;
      s->frame_size = s->group_size / 16; // 16 iterations per super block
 +
      if (s->frame_size > QDM2_MAX_FRAME_SIZE)
          return AVERROR_INVALIDDATA;
  
      if ((tmp * 2240) < avctx->bit_rate)  tmp_val = 4;
      s->cm_table_select = tmp_val;
  
 -    if (s->sub_sampling == 0)
 -        tmp = 7999;
 -    else
 -        tmp = ((-(s->sub_sampling -1)) & 8000) + 20000;
 -    /*
 -    0: 7999 -> 0
 -    1: 20000 -> 2
 -    2: 28000 -> 2
 -    */
 -    if (tmp < 8000)
 +    if (avctx->bit_rate <= 8000)
          s->coeff_per_sb_select = 0;
 -    else if (tmp <= 16000)
 +    else if (avctx->bit_rate < 16000)
          s->coeff_per_sb_select = 1;
      else
          s->coeff_per_sb_select = 2;
      ff_rdft_init(&s->rdft_ctx, s->fft_order, IDFT_C2R);
      ff_mpadsp_init(&s->mpadsp);
  
-     qdm2_init(s);
      avctx->sample_fmt = AV_SAMPLE_FMT_S16;
  
      return 0;
@@@ -1905,9 -1885,6 +1924,9 @@@ static int qdm2_decode (QDM2Context *q
      int ch, i;
      const int frame_size = (q->frame_size * q->channels);
  
 +    if((unsigned)frame_size > FF_ARRAY_ELEMS(q->output_buffer)/2)
 +        return -1;
 +
      /* select input buffer */
      q->compressed_data = in;
      q->compressed_size = q->checksum_size;
@@@ -1980,8 -1957,10 +1999,8 @@@ static int qdm2_decode_frame(AVCodecCon
  
      /* get output buffer */
      frame->nb_samples = 16 * s->frame_size;
 -    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
          return ret;
 -    }
      out = (int16_t *)frame->data[0];
  
      for (i = 0; i < 16; i++) {
  
  AVCodec ff_qdm2_decoder =
  {
-     .name           = "qdm2",
-     .type           = AVMEDIA_TYPE_AUDIO,
-     .id             = AV_CODEC_ID_QDM2,
-     .priv_data_size = sizeof(QDM2Context),
-     .init           = qdm2_decode_init,
-     .close          = qdm2_decode_close,
-     .decode         = qdm2_decode_frame,
-     .capabilities   = CODEC_CAP_DR1,
-     .long_name      = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
+     .name             = "qdm2",
+     .type             = AVMEDIA_TYPE_AUDIO,
+     .id               = AV_CODEC_ID_QDM2,
+     .priv_data_size   = sizeof(QDM2Context),
+     .init             = qdm2_decode_init,
+     .init_static_data = qdm2_init_static_data,
+     .close            = qdm2_decode_close,
+     .decode           = qdm2_decode_frame,
+     .capabilities     = CODEC_CAP_DR1,
+     .long_name        = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
  };
@@@ -2,20 -2,20 +2,20 @@@
   * Westwood Studios VQA Format Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -101,14 -101,11 +101,13 @@@ static int wsvqa_read_header(AVFormatCo
      avio_seek(pb, 20, SEEK_SET);
  
      /* the VQA header needs to go to the decoder */
 -    st->codec->extradata_size = VQA_HEADER_SIZE;
      st->codec->extradata = av_mallocz(VQA_HEADER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
 +    if (!st->codec->extradata)
 +        return AVERROR(ENOMEM);
 +    st->codec->extradata_size = VQA_HEADER_SIZE;
      header = (unsigned char *)st->codec->extradata;
      if (avio_read(pb, st->codec->extradata, VQA_HEADER_SIZE) !=
          VQA_HEADER_SIZE) {
-         av_free(st->codec->extradata);
          return AVERROR(EIO);
      }
      st->codec->width = AV_RL16(&header[6]);
      /* there are 0 or more chunks before the FINF chunk; iterate until
       * FINF has been skipped and the file will be ready to be demuxed */
      do {
 -        if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) {
 +        if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE)
              return AVERROR(EIO);
 -        }
          chunk_tag = AV_RB32(&scratch[0]);
          chunk_size = AV_RB32(&scratch[4]);
  
@@@ -177,15 -175,18 +176,15 @@@ static int wsvqa_read_packet(AVFormatCo
      while (avio_read(pb, preamble, VQA_PREAMBLE_SIZE) == VQA_PREAMBLE_SIZE) {
          chunk_type = AV_RB32(&preamble[0]);
          chunk_size = AV_RB32(&preamble[4]);
 +
          skip_byte = chunk_size & 0x01;
  
          if ((chunk_type == SND0_TAG) || (chunk_type == SND1_TAG) ||
              (chunk_type == SND2_TAG) || (chunk_type == VQFR_TAG)) {
  
 -            if (av_new_packet(pkt, chunk_size))
 -                return AVERROR(EIO);
 -            ret = avio_read(pb, pkt->data, chunk_size);
 -            if (ret != chunk_size) {
 -                av_free_packet(pkt);
 +            ret= av_get_packet(pb, pkt, chunk_size);
 +            if (ret<0)
                  return AVERROR(EIO);
 -            }
  
              switch (chunk_type) {
              case SND0_TAG:
                  switch (chunk_type) {
                  case SND1_TAG:
                      /* unpacked size is stored in header */
 -                    pkt->duration = AV_RL16(pkt->data) / wsvqa->channels;
 +                    if(pkt->data)
 +                        pkt->duration = AV_RL16(pkt->data) / wsvqa->channels;
                      break;
                  case SND2_TAG:
                      /* 2 samples/byte, 1 or 2 samples per frame depending on stereo */