Merge commit '9e7b62f0fb7462a902330fcc82cf596388f0187b'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 26 Aug 2013 12:46:56 +0000 (14:46 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 26 Aug 2013 12:47:15 +0000 (14:47 +0200)
* commit '9e7b62f0fb7462a902330fcc82cf596388f0187b':
  twinvq: set block align for codecs and use it in size checks

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/metasound.c
libavcodec/twinvq.c
libavcodec/twinvqdec.c

diff --combined libavcodec/metasound.c
@@@ -4,20 -4,20 +4,20 @@@
   * based on TwinVQ decoder
   * Copyright (c) 2009 Vitor Sessak
   *
 - * 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
   */
  
@@@ -170,12 -170,6 +170,6 @@@ static int metasound_read_bitstream(AVC
      GetBitContext gb;
      int i, j, k;
  
-     if (buf_size * 8 < avctx->bit_rate * mtab->size / avctx->sample_rate) {
-         av_log(avctx, AV_LOG_ERROR,
-                "Frame too small (%d bytes). Truncated file?\n", buf_size);
-         return AVERROR(EINVAL);
-     }
      init_get_bits(&gb, buf, buf_size * 8);
  
      bits->window_type = get_bits(&gb, TWINVQ_WINDOW_TYPE_BITS);
@@@ -323,6 -317,9 +317,9 @@@ static av_cold int metasound_decode_ini
          return AVERROR(ENOSYS);
      }
  
+     avctx->block_align = (avctx->bit_rate * tctx->mtab->size
+                                           / avctx->sample_rate + 7) / 8;
      tctx->codec          = TWINVQ_CODEC_METASOUND;
      tctx->read_bitstream = metasound_read_bitstream;
      tctx->dec_bark_env   = dec_bark_env;
diff --combined libavcodec/twinvq.c
@@@ -2,20 -2,20 +2,20 @@@
   * TwinVQ decoder
   * Copyright (c) 2009 Vitor Sessak
   *
 - * 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
   */
  
@@@ -484,11 -484,19 +484,17 @@@ int ff_twinvq_decode_frame(AVCodecConte
      /* get output buffer */
      if (tctx->discarded_packets >= 2) {
          frame->nb_samples = mtab->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 = (float **)frame->extended_data;
      }
  
+     if (buf_size < avctx->block_align) {
+         av_log(avctx, AV_LOG_ERROR,
+                "Frame too small (%d bytes). Truncated file?\n", buf_size);
+         return AVERROR(EINVAL);
+     }
      if ((ret = tctx->read_bitstream(avctx, tctx, buf, buf_size)) < 0)
          return ret;
  
  
      *got_frame_ptr = 1;
  
-     return buf_size;
+     return avctx->block_align;
  }
  
  /**
diff --combined libavcodec/twinvqdec.c
@@@ -2,20 -2,20 +2,20 @@@
   * TwinVQ decoder
   * Copyright (c) 2009 Vitor Sessak
   *
 - * 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
   */
  
@@@ -258,12 -258,6 +258,6 @@@ static int twinvq_read_bitstream(AVCode
      GetBitContext gb;
      int i, j, k;
  
-     if (buf_size * 8 < avctx->bit_rate * mtab->size / avctx->sample_rate + 8) {
-         av_log(avctx, AV_LOG_ERROR,
-                "Frame too small (%d bytes). Truncated file?\n", buf_size);
-         return AVERROR(EINVAL);
-     }
      init_get_bits(&gb, buf, buf_size * 8);
      skip_bits(&gb, get_bits(&gb, 8));
  
@@@ -363,11 -357,6 +357,11 @@@ static av_cold int twinvq_decode_init(A
  
      ibps = avctx->bit_rate / (1000 * avctx->channels);
  
 +    if (ibps > 255U) {
 +        av_log(avctx, AV_LOG_ERROR, "unsupported per channel bitrate %dkbps\n", ibps);
 +        return AVERROR_INVALIDDATA;
 +    }
 +
      switch ((isampf << 8) + ibps) {
      case (8 << 8) + 8:
          tctx->mtab = &mode_08_08;
          return -1;
      }
  
+     avctx->block_align = (avctx->bit_rate * tctx->mtab->size
+                                           / avctx->sample_rate + 15) / 8;
      tctx->codec          = TWINVQ_CODEC_VQF;
      tctx->read_bitstream = twinvq_read_bitstream;
      tctx->dec_bark_env   = dec_bark_env;