Merge commit 'd9cdb7d8d6d828bb5497ea3f0fd7edd2f3f6cc30'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 13 Sep 2013 11:41:38 +0000 (13:41 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 13 Sep 2013 11:43:13 +0000 (13:43 +0200)
* commit 'd9cdb7d8d6d828bb5497ea3f0fd7edd2f3f6cc30':
  pcm-dvd: Support channel configuration changes

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

diff --combined libavcodec/pcm-dvd.c
@@@ -2,20 -2,20 +2,20 @@@
   * LPCM codecs for PCM formats found in Video DVD streams
   * Copyright (c) 2009-2013 Christian Schmidt
   *
 - * 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
   */
  
@@@ -31,7 -31,6 +31,7 @@@
  typedef struct PCMDVDContext {
      uint32_t last_header;    // Cached header to see if parsing is needed
      int block_size;          // Size of a block of samples in bytes
 +    int last_block_size;     // Size of the last block of samples in bytes
      int samples_per_block;   // Number of samples per channel per block
      int groups_per_block;    // Number of 20/24bit sample groups per block
      uint8_t *extra_samples;  // Pointer to leftover samples from a frame
@@@ -47,7 -46,6 +47,6 @@@ static av_cold int pcm_dvd_decode_init(
      /* reserve space for 8 channels, 3 bytes/sample, 4 samples/block */
      if (!(s->extra_samples = av_malloc(8 * 3 * 4)))
          return AVERROR(ENOMEM);
-     s->extra_sample_count = 0;
  
      return 0;
  }
@@@ -56,7 -54,8 +55,7 @@@ static av_cold int pcm_dvd_decode_unini
  {
      PCMDVDContext *s = avctx->priv_data;
  
 -    if (s->extra_samples)
 -        av_free(s->extra_samples);
 +    av_freep(&s->extra_samples);
  
      return 0;
  }
@@@ -81,12 -80,13 +80,15 @@@ static int pcm_dvd_parse_header(AVCodec
       * header[2] dynamic range control (0x80 = off)
       */
  
+     /* Discard potentially existing leftover samples from old channel layout */
+     s->extra_sample_count = 0;
      /* get the sample depth and derive the sample format from it */
      avctx->bits_per_coded_sample = 16 + (header[1] >> 6 & 3) * 4;
      if (avctx->bits_per_coded_sample == 28) {
 -        av_log(avctx, AV_LOG_ERROR, "PCM DVD unsupported sample depth\n");
 +        av_log(avctx, AV_LOG_ERROR,
 +               "PCM DVD unsupported sample depth %i\n",
 +               avctx->bits_per_coded_sample);
          return AVERROR_INVALIDDATA;
      }
      avctx->sample_fmt = avctx->bits_per_coded_sample == 16 ? AV_SAMPLE_FMT_S16
@@@ -223,11 -223,6 +225,11 @@@ static int pcm_dvd_decode_frame(AVCodec
  
      if ((retval = pcm_dvd_parse_header(avctx, src)))
          return retval;
 +    if (s->last_block_size != s->block_size) {
 +        av_log(avctx, AV_LOG_WARNING, "block_size has changed\n");
 +        s->extra_sample_count = 0;
 +    }
 +    s->last_block_size = s->block_size;
      src      += 3;
      buf_size -= 3;
  
  
      /* get output buffer */
      frame->nb_samples = blocks * s->samples_per_block;
 -    if ((retval = ff_get_buffer(avctx, frame, 0)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +    if ((retval = ff_get_buffer(avctx, frame, 0)) < 0)
          return retval;
 -    }
      dst = frame->data[0];
  
      /* consume leftover samples from last packet */