Merge commit 'b97f6ef956293fe06ae1e99bd295f42613081f37'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 26 Sep 2014 10:29:41 +0000 (12:29 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 26 Sep 2014 10:30:02 +0000 (12:30 +0200)
* commit 'b97f6ef956293fe06ae1e99bd295f42613081f37':
  pcm-dvd: Move a variable to a smaller scope

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) 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
@@@ -70,7 -69,6 +70,7 @@@ static int pcm_dvd_parse_header(AVCodec
      /* early exit if the header didn't change apart from the frame number */
      if (s->last_header == header_int)
          return 0;
 +    s->last_header = -1;
  
      if (avctx->debug & FF_DEBUG_PICT_INFO)
          av_dlog(avctx, "pcm_dvd_parse_header: header = %02x%02x%02x\n",
@@@ -87,9 -85,7 +87,9 @@@
      /* 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
@@@ -158,33 -154,22 +158,33 @@@ static void *pcm_dvd_decode_samples(AVC
      GetByteContext gb;
      int i;
      uint8_t t;
-     int samples;
  
      bytestream2_init(&gb, src, blocks * s->block_size);
      switch (avctx->bits_per_coded_sample) {
-     case 16:
+     case 16: {
  #if HAVE_BIGENDIAN
          bytestream2_get_buffer(&gb, dst16, blocks * s->block_size);
          dst16 += blocks * s->block_size / 2;
  #else
-         samples = blocks * avctx->channels;
+         int samples = blocks * avctx->channels;
          do {
              *dst16++ = bytestream2_get_be16u(&gb);
          } while (--samples);
  #endif
          return dst16;
+     }
      case 20:
 +        if (avctx->channels == 1) {
 +            do {
 +                for (i = 2; i; i--) {
 +                    dst32[0] = bytestream2_get_be16u(&gb) << 16;
 +                    dst32[1] = bytestream2_get_be16u(&gb) << 16;
 +                    t = bytestream2_get_byteu(&gb);
 +                    *dst32++ += (t & 0xf0) << 8;
 +                    *dst32++ += (t & 0x0f) << 12;
 +                }
 +            } while (--blocks);
 +        } else {
          do {
              for (i = s->groups_per_block; i; i--) {
                  dst32[0] = bytestream2_get_be16u(&gb) << 16;
                  *dst32++ += (t & 0x0f) << 12;
              }
          } while (--blocks);
 +        }
          return dst32;
      case 24:
 +        if (avctx->channels == 1) {
 +            do {
 +                for (i = 2; i; i--) {
 +                    dst32[0] = bytestream2_get_be16u(&gb) << 16;
 +                    dst32[1] = bytestream2_get_be16u(&gb) << 16;
 +                    *dst32++ += bytestream2_get_byteu(&gb) << 8;
 +                    *dst32++ += bytestream2_get_byteu(&gb) << 8;
 +                }
 +            } while (--blocks);
 +        } else {
          do {
              for (i = s->groups_per_block; i; i--) {
                  dst32[0] = bytestream2_get_be16u(&gb) << 16;
                  *dst32++ += bytestream2_get_byteu(&gb) << 8;
              }
          } while (--blocks);
 +        }
          return dst32;
      default:
          return NULL;
@@@ -249,11 -222,6 +249,11 @@@ static int pcm_dvd_decode_frame(AVCodec
  
      if ((retval = pcm_dvd_parse_header(avctx, src)))
          return retval;
 +    if (s->last_block_size && s->last_block_size != s->block_size) {
 +        av_log(avctx, AV_LOG_WARNING, "block_size has changed %d != %d\n", s->last_block_size, s->block_size);
 +        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 */