Merge commit 'b01a2204b5cff7bb920f42fda1bb0103f450fe93'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 17 Oct 2014 18:35:43 +0000 (20:35 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 17 Oct 2014 18:35:43 +0000 (20:35 +0200)
* commit 'b01a2204b5cff7bb920f42fda1bb0103f450fe93':
  libfdk-aacdec: Enable Decoder Downmix including Downmix Metadata Support

Conflicts:
libavcodec/libfdk-aacdec.c
libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/libfdk-aacdec.c
libavcodec/version.h

index 624d57959c8431ba39ad640ed86ad0a1b1ab30ae,216e1c8f7c12625825cf44bb39bceb80302e5056..65bd36a4482742d4b091711a54ae5e9a4f25a51e
@@@ -2,7 -2,7 +2,7 @@@
   * AAC decoder wrapper
   * Copyright (c) 2012 Martin Storsjo
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
   * Permission to use, copy, modify, and/or distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
@@@ -36,9 -36,16 +36,16 @@@ typedef struct FDKAACDecContext 
      const AVClass *class;
      HANDLE_AACDECODER handle;
      int initialized;
+     uint8_t *decoder_buffer;
+     uint8_t *anc_buffer;
      enum ConcealMethod conceal_method;
  } FDKAACDecContext;
  
+ #define DMX_ANC_BUFFSIZE       128
+ #define DECODER_MAX_CHANNELS     6
+ #define DECODER_BUFFSIZE      2048 * sizeof(INT_PCM)
  #define OFFSET(x) offsetof(FDKAACDecContext, x)
  #define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
  static const AVOption fdk_aac_dec_options[] = {
@@@ -170,6 -177,8 +177,8 @@@ static av_cold int fdk_aac_decode_close
  
      if (s->handle)
          aacDecoder_Close(s->handle);
+     av_free(s->decoder_buffer);
+     av_free(s->anc_buffer);
  
      return 0;
  }
@@@ -178,6 -187,7 +187,7 @@@ static av_cold int fdk_aac_decode_init(
  {
      FDKAACDecContext *s = avctx->priv_data;
      AAC_DECODER_ERROR err;
+     int ret;
  
      s->handle = aacDecoder_Open(avctx->extradata_size ? TT_MP4_RAW : TT_MP4_ADTS, 1);
      if (!s->handle) {
          return AVERROR_UNKNOWN;
      }
  
+     if (avctx->request_channel_layout > 0 &&
+         avctx->request_channel_layout != AV_CH_LAYOUT_NATIVE) {
+         int downmix_channels = -1;
+         switch (avctx->request_channel_layout) {
+         case AV_CH_LAYOUT_STEREO:
+         case AV_CH_LAYOUT_STEREO_DOWNMIX:
+             downmix_channels = 2;
+             break;
+         case AV_CH_LAYOUT_MONO:
+             downmix_channels = 1;
+             break;
+         default:
+             av_log(avctx, AV_LOG_WARNING, "Invalid request_channel_layout\n");
+             break;
+         }
+         if (downmix_channels != -1) {
+             if (aacDecoder_SetParam(s->handle, AAC_PCM_OUTPUT_CHANNELS,
+                                     downmix_channels) != AAC_DEC_OK) {
+                av_log(avctx, AV_LOG_WARNING, "Unable to set output channels in the decoder\n");
+             } else {
+                s->anc_buffer = av_malloc(DMX_ANC_BUFFSIZE);
+                if (!s->anc_buffer) {
+                    av_log(avctx, AV_LOG_ERROR, "Unable to allocate ancillary buffer for the decoder\n");
+                    ret = AVERROR(ENOMEM);
+                    goto fail;
+                }
+                if (aacDecoder_AncDataInit(s->handle, s->anc_buffer, DMX_ANC_BUFFSIZE)) {
+                    av_log(avctx, AV_LOG_ERROR, "Unable to register downmix ancillary buffer in the decoder\n");
+                    ret = AVERROR_UNKNOWN;
+                    goto fail;
+                }
+             }
+         }
+     }
      avctx->sample_fmt = AV_SAMPLE_FMT_S16;
  
      return 0;
+ fail:
+     fdk_aac_decode_close(avctx);
+     return ret;
  }
  
  static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
  
      if (s->initialized) {
          frame->nb_samples = avctx->frame_size;
 -        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
 -            av_log(avctx, AV_LOG_ERROR, "ff_get_buffer() failed\n");
 +        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
              return ret;
-         buf = frame->extended_data[0];
-         buf_size = avctx->channels * frame->nb_samples *
-                    av_get_bytes_per_sample(avctx->sample_fmt);
 -        }
+         if (s->anc_buffer) {
+             buf_size = DECODER_BUFFSIZE * DECODER_MAX_CHANNELS;
+             buf = s->decoder_buffer;
+         } else {
+             buf = frame->extended_data[0];
+             buf_size = avctx->channels * frame->nb_samples *
+                        av_get_bytes_per_sample(avctx->sample_fmt);
+         }
      } else {
-         buf_size = 50 * 1024;
-         buf = tmpptr = av_malloc(buf_size);
-         if (!buf)
+         buf_size = DECODER_BUFFSIZE * DECODER_MAX_CHANNELS;
+         if (!s->decoder_buffer)
+             s->decoder_buffer = av_malloc(buf_size);
+         if (!s->decoder_buffer)
              return AVERROR(ENOMEM);
+         buf = tmpptr = s->decoder_buffer;
      }
  
      err = aacDecoder_DecodeFrame(s->handle, (INT_PCM *) buf, buf_size, 0);
  
      if (tmpptr) {
          frame->nb_samples = avctx->frame_size;
 -        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
 -            av_log(avctx, AV_LOG_ERROR, "ff_get_buffer() failed\n");
 +        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
              goto end;
-         memcpy(frame->extended_data[0], tmpptr,
 -        }
+     }
+     if (s->decoder_buffer) {
+         memcpy(frame->extended_data[0], buf,
                 avctx->channels * avctx->frame_size *
                 av_get_bytes_per_sample(avctx->sample_fmt));
+         if (!s->anc_buffer)
+             av_freep(&s->decoder_buffer);
      }
  
      *got_frame_ptr = 1;
      ret = avpkt->size - valid;
  
  end:
-     av_free(tmpptr);
      return ret;
  }
  
diff --combined libavcodec/version.h
index 1efe55c6214b34c5ffa1bb07b40a15d3483a3e19,617b688dff23efabaf55b1013f3ae86c36445ea8..3e193e5d1b5f87a89055abe5325434e704abf991
@@@ -1,19 -1,19 +1,19 @@@
  /*
   *
 - * 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
   */
  
@@@ -29,8 -29,8 +29,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVCODEC_VERSION_MAJOR 56
 -#define LIBAVCODEC_VERSION_MINOR  5
 -#define LIBAVCODEC_VERSION_MICRO  1
 +#define LIBAVCODEC_VERSION_MINOR  8
- #define LIBAVCODEC_VERSION_MICRO 100
++#define LIBAVCODEC_VERSION_MICRO 101
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
  #ifndef FF_API_REQUEST_CHANNELS
  #define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 57)
  #endif
 +#ifndef FF_API_OLD_DECODE_AUDIO
 +#define FF_API_OLD_DECODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
 +#ifndef FF_API_OLD_ENCODE_AUDIO
 +#define FF_API_OLD_ENCODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
 +#ifndef FF_API_OLD_ENCODE_VIDEO
 +#define FF_API_OLD_ENCODE_VIDEO (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
 +#ifndef FF_API_CODEC_ID
 +#define FF_API_CODEC_ID          (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
 +#ifndef FF_API_AUDIO_CONVERT
 +#define FF_API_AUDIO_CONVERT     (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
 +#ifndef FF_API_AVCODEC_RESAMPLE
 +#define FF_API_AVCODEC_RESAMPLE  FF_API_AUDIO_CONVERT
 +#endif
  #ifndef FF_API_DEINTERLACE
  #define FF_API_DEINTERLACE       (LIBAVCODEC_VERSION_MAJOR < 57)
  #endif
  #ifndef FF_API_MAX_BFRAMES
  #define FF_API_MAX_BFRAMES       (LIBAVCODEC_VERSION_MAJOR < 57)
  #endif
 -#ifndef FF_API_FAST_MALLOC
 -#define FF_API_FAST_MALLOC       (LIBAVCODEC_VERSION_MAJOR < 57)
 -#endif
  #ifndef FF_API_NEG_LINESIZES
  #define FF_API_NEG_LINESIZES     (LIBAVCODEC_VERSION_MAJOR < 57)
  #endif
  #ifndef FF_API_AFD
  #define FF_API_AFD               (LIBAVCODEC_VERSION_MAJOR < 57)
  #endif
 +#ifndef FF_API_VISMV
 +/* XXX: don't forget to drop the -vismv documentation */
 +#define FF_API_VISMV             (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
 +#ifndef FF_API_DV_FRAME_PROFILE
 +#define FF_API_DV_FRAME_PROFILE  (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
  #ifndef FF_API_AUDIOENC_DELAY
  #define FF_API_AUDIOENC_DELAY    (LIBAVCODEC_VERSION_MAJOR < 58)
  #endif