Merge commit 'bbf6a4aa20bfe3d7869b2218e66063602dfb8aa7'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 10 Jul 2013 10:24:58 +0000 (12:24 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 10 Jul 2013 10:28:07 +0000 (12:28 +0200)
* commit 'bbf6a4aa20bfe3d7869b2218e66063602dfb8aa7':
  imc: Catch a division by zero
  atrac3: Error on impossible encoding/channel combinations

See: 13451f5520ce6b0afde861b2285dda659f8d4fb4

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

diff --combined libavcodec/atrac3.c
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2006-2008 Maxim Poliakovski
   * Copyright (c) 2006-2008 Benjamin Larsson
   *
 - * 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
   */
  
@@@ -38,7 -38,6 +38,7 @@@
  
  #include "libavutil/attributes.h"
  #include "libavutil/float_dsp.h"
 +#include "libavutil/libm.h"
  #include "avcodec.h"
  #include "bytestream.h"
  #include "fft.h"
@@@ -124,7 -123,7 +124,7 @@@ static float gain_tab1[16]
  static float gain_tab2[31];
  
  
 -/*
 +/**
   * Regular 512 points IMDCT without overlapping, with the exception of the
   * swapping of odd bands caused by the reverse spectra of the QMF.
   *
@@@ -206,7 -205,7 +206,7 @@@ static av_cold int atrac3_decode_close(
      return 0;
  }
  
 -/*
 +/**
   * Mantissa decoding
   *
   * @param selector     which table the output values are coded with
@@@ -268,7 -267,7 +268,7 @@@ static void read_quant_spectral_coeffs(
      }
  }
  
 -/*
 +/**
   * Restore the quantized band spectrum coefficients
   *
   * @return subband count, fix for broken specification/files
@@@ -325,7 -324,7 +325,7 @@@ static int decode_spectrum(GetBitContex
      return num_subbands;
  }
  
 -/*
 +/**
   * Restore the quantized tonal components
   *
   * @param components tonal components
@@@ -409,7 -408,7 +409,7 @@@ static int decode_tonal_components(GetB
      return component_count;
  }
  
 -/*
 +/**
   * Decode gain parameters for the coded bands
   *
   * @param block      the gainblock for the current band
@@@ -444,7 -443,7 +444,7 @@@ static int decode_gain_control(GetBitCo
      return 0;
  }
  
 -/*
 +/**
   * Apply gain parameters and perform the MDCT overlapping part
   *
   * @param input   input buffer
@@@ -501,7 -500,7 +501,7 @@@ static void gain_compensate_and_overlap
      memcpy(prev, &input[256], 256 * sizeof(*prev));
  }
  
 -/*
 +/**
   * Combine the tonal band spectrum and regular band spectrum
   *
   * @param spectrum        output spectrum buffer
@@@ -587,7 -586,7 +587,7 @@@ static void reverse_matrixing(float *su
              }
              break;
          default:
 -            assert(0);
 +            av_assert1(0);
          }
      }
  }
@@@ -628,7 -627,7 +628,7 @@@ static void channel_weighting(float *su
      }
  }
  
 -/*
 +/**
   * Decode a Sound Unit
   *
   * @param snd           the channel unit to be used
@@@ -743,7 -742,7 +743,7 @@@ static int decode_frame(AVCodecContext 
  
  
          /* set the bitstream reader at the start of the second Sound Unit*/
 -        init_get_bits(&q->gb, ptr1, (avctx->block_align - i) * 8);
 +        init_get_bits8(&q->gb, ptr1, q->decoded_bytes_buffer + avctx->block_align - ptr1);
  
          /* Fill the Weighting coeffs delay buffer */
          memmove(q->weighting_delay, &q->weighting_delay[2],
@@@ -817,8 -816,10 +817,8 @@@ static int atrac3_decode_frame(AVCodecC
  
      /* get output buffer */
      frame->nb_samples = SAMPLES_PER_FRAME;
 -    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;
 -    }
  
      /* Check if we need to descramble and what buffer to pass on. */
      if (q->scrambled_stream) {
      return avctx->block_align;
  }
  
 -static av_cold void atrac3_init_static_data(AVCodec *codec)
 +static av_cold void atrac3_init_static_data(void)
  {
      int i;
  
  
      /* Generate gain tables */
      for (i = 0; i < 16; i++)
 -        gain_tab1[i] = powf(2.0, (4 - i));
 +        gain_tab1[i] = exp2f (4 - i);
  
      for (i = -15; i < 16; i++)
 -        gain_tab2[i + 15] = powf(2.0, i * -0.125);
 +        gain_tab2[i + 15] = exp2f (i * -0.125);
  }
  
  static av_cold int atrac3_decode_init(AVCodecContext *avctx)
  {
 +    static int static_init_done;
      int i, ret;
      int version, delay, samples_per_frame, frame_factor;
      const uint8_t *edata_ptr = avctx->extradata;
          return AVERROR(EINVAL);
      }
  
 +    if (!static_init_done)
 +        atrac3_init_static_data();
 +    static_init_done = 1;
 +
      /* Take care of the codec-specific extradata. */
      if (avctx->extradata_size == 14) {
          /* Parse the extradata, WAV format */
                     avctx->channels, frame_factor);
              return AVERROR_INVALIDDATA;
          }
 -    } else if (avctx->extradata_size == 10) {
 +    } else if (avctx->extradata_size == 12 || avctx->extradata_size == 10) {
          /* Parse the extradata, RM format. */
          version                = bytestream_get_be32(&edata_ptr);
          samples_per_frame      = bytestream_get_be16(&edata_ptr);
          return AVERROR(EINVAL);
      }
  
-     if (q->coding_mode == JOINT_STEREO && avctx->channels < 2) {
-         av_log(avctx, AV_LOG_ERROR, "Invalid coding mode\n");
-         return AVERROR_INVALIDDATA;
-     }
      /* Check the extradata */
  
      if (version != 4) {
  
      if (q->coding_mode == STEREO)
          av_log(avctx, AV_LOG_DEBUG, "Normal stereo detected.\n");
-     else if (q->coding_mode == JOINT_STEREO)
+     else if (q->coding_mode == JOINT_STEREO) {
 -        if (avctx->channels != 2)
++        if (avctx->channels != 2) {
++            av_log(avctx, AV_LOG_ERROR, "Invalid coding mode\n");
+             return AVERROR_INVALIDDATA;
++        }
          av_log(avctx, AV_LOG_DEBUG, "Joint stereo detected.\n");
-     else {
+     else {
          av_log(avctx, AV_LOG_ERROR, "Unknown channel coding mode %x!\n",
                 q->coding_mode);
          return AVERROR_INVALIDDATA;
@@@ -1007,6 -1000,7 +1006,6 @@@ AVCodec ff_atrac3_decoder = 
      .id               = AV_CODEC_ID_ATRAC3,
      .priv_data_size   = sizeof(ATRAC3Context),
      .init             = atrac3_decode_init,
 -    .init_static_data = atrac3_init_static_data,
      .close            = atrac3_decode_close,
      .decode           = atrac3_decode_frame,
      .capabilities     = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,