Merge commit '1973079417e8701b52ba810a72cb6c7c6f7f9a56'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 27 Nov 2014 23:00:06 +0000 (00:00 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 27 Nov 2014 23:14:13 +0000 (00:14 +0100)
* commit '1973079417e8701b52ba810a72cb6c7c6f7f9a56':
  opusdec: make sure all substreams have the same number of coded samples

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

diff --combined libavcodec/opusdec.c
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2012 Andrew D'Addesio
   * Copyright (c) 2013-2014 Mozilla Corporation
   *
 - * 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
   */
  
@@@ -40,7 -40,7 +40,7 @@@
  #include "libavutil/channel_layout.h"
  #include "libavutil/opt.h"
  
 -#include "libavresample/avresample.h"
 +#include "libswresample/swresample.h"
  
  #include "avcodec.h"
  #include "celp_filters.h"
@@@ -114,9 -114,9 +114,9 @@@ static int opus_flush_resample(OpusStre
  {
      int celt_size = av_audio_fifo_size(s->celt_delay);
      int ret, i;
 -
 -    ret = avresample_convert(s->avr, (uint8_t**)s->out, s->out_size, nb_samples,
 -                             NULL, 0, 0);
 +    ret = swr_convert(s->swr,
 +                      (uint8_t**)s->out, nb_samples,
 +                      NULL, 0);
      if (ret < 0)
          return ret;
      else if (ret != nb_samples) {
  
  static int opus_init_resample(OpusStreamContext *s)
  {
 -    float delay[16] = { 0.0 };
 -    uint8_t *delayptr[2] = { (uint8_t*)delay, (uint8_t*)delay };
 +    static const float delay[16] = { 0.0 };
 +    const uint8_t *delayptr[2] = { (uint8_t*)delay, (uint8_t*)delay };
      int ret;
  
 -    av_opt_set_int(s->avr, "in_sample_rate", s->silk_samplerate, 0);
 -    ret = avresample_open(s->avr);
 +    av_opt_set_int(s->swr, "in_sample_rate", s->silk_samplerate, 0);
 +    ret = swr_init(s->swr);
      if (ret < 0) {
          av_log(s->avctx, AV_LOG_ERROR, "Error opening the resampler.\n");
          return ret;
      }
  
 -    ret = avresample_convert(s->avr, NULL, 0, 0, delayptr, sizeof(delay),
 -                             silk_resample_delay[s->packet.bandwidth]);
 +    ret = swr_convert(s->swr,
 +                      NULL, 0,
 +                      delayptr, silk_resample_delay[s->packet.bandwidth]);
      if (ret < 0) {
          av_log(s->avctx, AV_LOG_ERROR,
                 "Error feeding initial silence to the resampler.\n");
@@@ -219,7 -218,7 +219,7 @@@ static int opus_decode_frame(OpusStream
  
      /* decode the silk frame */
      if (s->packet.mode == OPUS_MODE_SILK || s->packet.mode == OPUS_MODE_HYBRID) {
 -        if (!avresample_is_open(s->avr)) {
 +        if (!swr_is_initialized(s->swr)) {
              ret = opus_init_resample(s);
              if (ret < 0)
                  return ret;
              av_log(s->avctx, AV_LOG_ERROR, "Error decoding a SILK frame.\n");
              return samples;
          }
 -
 -        samples = avresample_convert(s->avr, (uint8_t**)s->out, s->out_size,
 -                                     s->packet.frame_duration,
 -                                     (uint8_t**)s->silk_output,
 -                                     sizeof(s->silk_buf[0]),
 -                                     samples);
 +        samples = swr_convert(s->swr,
 +                              (uint8_t**)s->out, s->packet.frame_duration,
 +                              (const uint8_t**)s->silk_output, samples);
          if (samples < 0) {
              av_log(s->avctx, AV_LOG_ERROR, "Error resampling SILK data.\n");
              return samples;
          }
 +        av_assert2((samples & 7) == 0);
          s->delayed_samples += s->packet.frame_duration - samples;
      } else
          ff_silk_flush(s->silk);
@@@ -373,10 -374,10 +373,10 @@@ static int opus_decode_subpacket(OpusSt
      int i, j, ret;
  
      /* check if we need to flush the resampler */
 -    if (avresample_is_open(s->avr)) {
 +    if (swr_is_initialized(s->swr)) {
          if (buf) {
              int64_t cur_samplerate;
 -            av_opt_get_int(s->avr, "in_sample_rate", 0, &cur_samplerate);
 +            av_opt_get_int(s->swr, "in_sample_rate", 0, &cur_samplerate);
              flush_needed = (s->packet.mode == OPUS_MODE_CELT) || (cur_samplerate != s->silk_samplerate);
          } else {
              flush_needed = !!s->delayed_samples;
              av_log(s->avctx, AV_LOG_ERROR, "Error flushing the resampler.\n");
              return ret;
          }
 -        avresample_close(s->avr);
 +        swr_close(s->swr);
          output_samples += s->delayed_samples;
          s->delayed_samples = 0;
  
@@@ -499,6 -500,12 +499,12 @@@ static int opus_decode_packet(AVCodecCo
                  av_log(avctx, AV_LOG_ERROR, "Error parsing the packet header.\n");
                  return ret;
              }
+             if (coded_samples != s->packet.frame_count * s->packet.frame_duration) {
+                 av_log(avctx, AV_LOG_ERROR,
+                        "Mismatching coded sample count in substream %d.\n", i);
+                 return AVERROR_INVALIDDATA;
+             }
              s->silk_samplerate = get_silk_samplerate(s->packet.config);
          }
  
@@@ -554,7 -561,7 +560,7 @@@ static av_cold void opus_decode_flush(A
  
          if (s->celt_delay)
              av_audio_fifo_drain(s->celt_delay, av_audio_fifo_size(s->celt_delay));
 -        avresample_close(s->avr);
 +        swr_close(s->swr);
  
          ff_silk_flush(s->silk);
          ff_celt_flush(s->celt);
@@@ -576,7 -583,7 +582,7 @@@ static av_cold int opus_decode_close(AV
          s->out_dummy_allocated_size = 0;
  
          av_audio_fifo_free(s->celt_delay);
 -        avresample_free(&s->avr);
 +        swr_free(&s->swr);
      }
  
      av_freep(&c->streams);
@@@ -626,17 -633,16 +632,17 @@@ static av_cold int opus_decode_init(AVC
  
          s->fdsp = &c->fdsp;
  
 -        s->avr = avresample_alloc_context();
 -        if (!s->avr)
 +        s->swr =swr_alloc();
 +        if (!s->swr)
              goto fail;
  
          layout = (s->output_channels == 1) ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
 -        av_opt_set_int(s->avr, "in_sample_fmt",      avctx->sample_fmt,  0);
 -        av_opt_set_int(s->avr, "out_sample_fmt",     avctx->sample_fmt,  0);
 -        av_opt_set_int(s->avr, "in_channel_layout",  layout,             0);
 -        av_opt_set_int(s->avr, "out_channel_layout", layout,             0);
 -        av_opt_set_int(s->avr, "out_sample_rate",    avctx->sample_rate, 0);
 +        av_opt_set_int(s->swr, "in_sample_fmt",      avctx->sample_fmt,  0);
 +        av_opt_set_int(s->swr, "out_sample_fmt",     avctx->sample_fmt,  0);
 +        av_opt_set_int(s->swr, "in_channel_layout",  layout,             0);
 +        av_opt_set_int(s->swr, "out_channel_layout", layout,             0);
 +        av_opt_set_int(s->swr, "out_sample_rate",    avctx->sample_rate, 0);
 +        av_opt_set_int(s->swr, "filter_size",        16,                 0);
  
          ret = ff_silk_init(avctx, &s->silk, s->output_channels);
          if (ret < 0)