Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 12 Jul 2012 21:53:48 +0000 (23:53 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 12 Jul 2012 21:57:00 +0000 (23:57 +0200)
* qatar/master:
  build: Fix Ogg demuxer dependencies
  build: Fix FLAC demuxer dependencies
  flac: Move flac functions shared between libraries to flac common code
  build: Fix CAF demuxer dependencies
  build: Fix MP2 muxer dependencies
  build: Add missing build rules for the ISMV muxer
  configure: Drop redundant mxf_d10 test dependency declaration
  Support AAC encoding via the external library fdk-aac
  libavcodec: Add more AAC profiles
  dct/fft-test: use a replacement getopt() if the system has none present.

Conflicts:
Changelog
libavcodec/Makefile
libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
15 files changed:
1  2 
Changelog
compat/getopt.c
configure
doc/general.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/dct-test.c
libavcodec/fft-test.c
libavcodec/flac.c
libavcodec/flacdec.c
libavcodec/libfdk-aacenc.c
libavcodec/options_table.h
libavcodec/version.h
libavformat/Makefile

diff --cc Changelog
+++ b/Changelog
@@@ -17,105 -33,30 +17,106 @@@ version next
  - Microsoft ATC Screen decoder
  - RTSP listen mode
  - TechSmith Screen Codec 2 decoder
+ - AAC encoding via libfdk-aac
 +- showwaves filter
 +- LucasArts SMUSH playback support
 +- SAMI demuxer and decoder
 +- RealText demuxer and decoder
 +- Heart Of Darkness PAF playback support
 +- iec61883 device
 +- asettb filter
 +
 +
 +version 0.11:
 +
 +- Fixes: CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777,
 +         CVE-2012-2779, CVE-2012-2782, CVE-2012-2783, CVE-2012-2784, CVE-2012-2785,
 +         CVE-2012-2786, CVE-2012-2787, CVE-2012-2788, CVE-2012-2789, CVE-2012-2790,
 +         CVE-2012-2791, CVE-2012-2792, CVE-2012-2793, CVE-2012-2794, CVE-2012-2795,
 +         CVE-2012-2796, CVE-2012-2797, CVE-2012-2798, CVE-2012-2799, CVE-2012-2800,
 +         CVE-2012-2801, CVE-2012-2802, CVE-2012-2803, CVE-2012-2804,
 +- v408 Quicktime and Microsoft AYUV Uncompressed 4:4:4:4 encoder and decoder
 +- setfield filter
 +- CDXL demuxer and decoder
 +- Apple ProRes encoder
 +- ffprobe -count_packets and -count_frames options
 +- Sun Rasterfile Encoder
 +- ID3v2 attached pictures reading and writing
 +- WMA Lossless decoder
 +- bluray protocol
 +- blackdetect filter
 +- libutvideo encoder wrapper (--enable-libutvideo)
 +- swapuv filter
 +- bbox filter
 +- XBM encoder and decoder
 +- RealAudio Lossless decoder
 +- ZeroCodec decoder
 +- tile video filter
 +- Metal Gear Solid: The Twin Snakes demuxer
 +- OpenEXR image decoder
 +- removelogo filter
 +- drop support for ffmpeg without libavfilter
 +- drawtext video filter: fontconfig support
 +- ffmpeg -benchmark_all option
 +- super2xsai filter ported from libmpcodecs
 +- add libavresample audio conversion library for compatibility
 +- MicroDVD decoder
 +- Avid Meridien (AVUI) encoder and decoder
 +- accept + prefix to -pix_fmt option to disable automatic conversions.
 +- complete audio filtering in libavfilter and ffmpeg
 +- add fps filter
 +- vorbis parser
 +- png parser
 +- audio mix filter
  
  
 -version 0.8:
 +version 0.10:
  
 +- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
 +         CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944,
 +         CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949,
 +         CVE-2011-3950, CVE-2011-3951, CVE-2011-3952
 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder
 +- SBaGen (SBG) binaural beats script demuxer
 +- OpenMG Audio muxer
 +- Timecode extraction in DV and MOV
 +- thumbnail video filter
 +- XML output in ffprobe
 +- asplit audio filter
 +- tinterlace video filter
 +- astreamsync audio filter
 +- amerge audio filter
 +- ISMV (Smooth Streaming) muxer
  - GSM audio parser
  - SMJPEG muxer
 -
 -
 -version 0.8_beta2:
 -
 +- XWD encoder and decoder
  - Automatic thread count based on detection number of (available) CPU cores
 -- Deprecate libpostproc. If desired, the switch --enable-postproc will
 -  enable it but it may be removed in a later Libav release.
 +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder
 +- ffprobe -show_error option
 +- Avid 1:1 10-bit RGB Packer codec
 +- v308 Quicktime Uncompressed 4:4:4 encoder and decoder
 +- yuv4 libquicktime packed 4:2:0 encoder and decoder
 +- ffprobe -show_frames option
 +- silencedetect audio filter
 +- ffprobe -show_program_version, -show_library_versions, -show_versions options
  - rv34: frame-level multi-threading
  - optimized iMDCT transform on x86 using SSE for for mpegaudiodec
 +- Improved PGS subtitle decoder
 +- dumpgraph option to lavfi device
 +- r210 and r10k encoders
 +- ffwavesynth decoder
 +- aviocat tool
 +- ffeval tool
  
  
 -version 0.8_beta1:
 +version 0.9:
  
 +- openal input device added
 +- boxblur filter added
  - BWF muxer
  - Flash Screen Video 2 decoder
 -- ffplay/ffprobe/ffserver renamed to avplay/avprobe/avserver
 -- ffmpeg deprecated, added avconv, which is almost the same for now, except
 +- lavfi input device added
 +- added avconv, which is almost the same for now, except
  for a few incompatible changes in the options, which will hopefully make them
  easier to use. The changes are:
      * The options placement is now strictly enforced! While in theory the
diff --cc compat/getopt.c
index 0000000,3a873b2..4683647
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,84 +1,84 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * 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 FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ /*
+  * This file was copied from the following newsgroup posting:
+  *
+  * Newsgroups: mod.std.unix
+  * Subject: public domain AT&T getopt source
+  * Date: 3 Nov 85 19:34:15 GMT
+  *
+  * Here's something you've all been waiting for:  the AT&T public domain
+  * source for getopt(3).  It is the code which was given out at the 1985
+  * UNIFORUM conference in Dallas.  I obtained it by electronic mail
+  * directly from AT&T.  The people there assure me that it is indeed
+  * in the public domain.
+  */
+ #define EOF (-1)
+ static int opterr = 1;
+ static int optind = 1;
+ static int optopt;
+ static char *optarg;
+ #undef fprintf
+ static int getopt(int argc, char *argv[], char *opts)
+ {
+     static int sp = 1;
+     int c;
+     char *cp;
+     if (sp == 1)
+         if (optind >= argc ||
+             argv[optind][0] != '-' || argv[optind][1] == '\0')
+             return EOF;
+         else if (!strcmp(argv[optind], "--")) {
+             optind++;
+             return EOF;
+         }
+     optopt = c = argv[optind][sp];
+     if (c == ':' || (cp = strchr(opts, c)) == NULL) {
+         fprintf(stderr, ": illegal option -- %c\n", c);
+         if (argv[optind][++sp] == '\0') {
+             optind++;
+             sp = 1;
+         }
+         return '?';
+     }
+     if (*++cp == ':') {
+         if (argv[optind][sp+1] != '\0')
+             optarg = &argv[optind++][sp+1];
+         else if(++optind >= argc) {
+             fprintf(stderr, ": option requires an argument -- %c\n", c);
+             sp = 1;
+             return '?';
+         } else
+             optarg = argv[optind++];
+         sp = 1;
+     } else {
+         if (argv[optind][++sp] == '\0') {
+             sp = 1;
+             optind++;
+         }
+         optarg = NULL;
+     }
+     return c;
+ }
diff --cc configure
+++ b/configure
@@@ -178,14 -170,11 +178,15 @@@ External library support
    --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                             and libraw1394 [no]
    --enable-libfaac         enable FAAC support via libfaac [no]
+   --enable-libfdk-aac      enable AAC support via libfdk-aac [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM support via libgsm [no]
 +  --enable-libiec61883     enable iec61883 via libiec61883 [no]
    --enable-libilbc         enable iLBC de/encoding via libilbc [no]
 +  --enable-libmodplug      enable ModPlug via libmodplug [no]
    --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
 +  --enable-libnut          enable NUT (de)muxing via libnut,
 +                           native (de)muxer exists [no]
    --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
    --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
    --enable-libopencv       enable video filtering via libopencv [no]
@@@ -1046,20 -941,14 +1047,21 @@@ CONFIG_LIST=
      gpl
      gray
      hardcoded_tables
 +    libaacplus
 +    libass
 +    libbluray
      libcdio
 +    libcelt
      libdc1394
      libfaac
+     libfdk_aac
      libfreetype
      libgsm
 +    libiec61883
      libilbc
 +    libmodplug
      libmp3lame
 +    libnut
      libopencore_amrnb
      libopencore_amrwb
      libopencv
@@@ -1610,9 -1449,8 +1613,10 @@@ vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x
  h264_parser_select="golomb h264dsp h264pred"
  
  # external libraries
 +libaacplus_encoder_deps="libaacplus"
 +libcelt_decoder_deps="libcelt"
  libfaac_encoder_deps="libfaac"
+ libfdk_aac_encoder_deps="libfdk_aac"
  libgsm_decoder_deps="libgsm"
  libgsm_encoder_deps="libgsm"
  libgsm_ms_decoder_deps="libgsm"
@@@ -3297,17 -2967,10 +3301,18 @@@ check_mathfunc trunc
  
  # these are off by default, so fail if requested and not available
  enabled avisynth   && require2 vfw32 "windows.h vfw.h" AVIFileInit -lavifil32
 +enabled fontconfig && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
  enabled frei0r     && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
  enabled gnutls     && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
 +enabled libiec61883 && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
 +enabled libaacplus && require  "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus
 +enabled libass     && require_pkg_config libass ass/ass.h ass_library_init
 +enabled libbluray  && require libbluray libbluray/bluray.h bd_open -lbluray
 +enabled libcelt    && require libcelt celt/celt.h celt_decode -lcelt0 &&
 +                      { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
 +                        die "ERROR: libcelt version must be >= 0.11.0."; }
  enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
+ enabled libfdk_aac && require  libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
  enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
  enabled libgsm     && require  libgsm gsm/gsm.h gsm_create -lgsm
  enabled libilbc    && require  libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
@@@ -3678,18 -3259,13 +3683,19 @@@ echo "libvdpau enabled          ${vdpau
  echo "AVISynth enabled          ${avisynth-no}"
  echo "frei0r enabled            ${frei0r-no}"
  echo "gnutls enabled            ${gnutls-no}"
 +echo "libaacplus enabled        ${libaacplus-no}"
 +echo "libass enabled            ${libass-no}"
  echo "libcdio support           ${libcdio-no}"
 +echo "libcelt enabled           ${libcelt-no}"
  echo "libdc1394 support         ${libdc1394-no}"
  echo "libfaac enabled           ${libfaac-no}"
+ echo "libfdk-aac enabled        ${libfdk_aac-no}"
  echo "libgsm enabled            ${libgsm-no}"
 +echo "libiec61883 support       ${libiec61883-no}"
  echo "libilbc enabled           ${libilbc-no}"
 +echo "libmodplug enabled        ${libmodplug-no}"
  echo "libmp3lame enabled        ${libmp3lame-no}"
 +echo "libnut enabled            ${libnut-no}"
  echo "libopencore-amrnb support ${libopencore_amrnb-no}"
  echo "libopencore-amrwb support ${libopencore_amrwb-no}"
  echo "libopencv support         ${libopencv-no}"
@@@ -16,18 -16,10 +16,18 @@@ for more formats. None of them are use
  explicitly requested by passing the appropriate flags to
  @command{./configure}.
  
 +@section OpenJPEG
 +
 +FFmpeg can use the OpenJPEG libraries for encoding/decoding J2K videos.  Go to
 +@url{http://www.openjpeg.org/} to get the libraries and follow the installation
 +instructions.  To enable using OpenJPEG in FFmpeg, pass @code{--enable-libopenjpeg} to
 +@file{./configure}.
 +
 +
  @section OpenCORE and VisualOn libraries
  
- Spun off Google Android sources, OpenCore and VisualOn libraries provide
- encoders for a number of audio codecs.
+ Spun off Google Android sources, OpenCore, VisualOn and Fraunhofer
libraries provide encoders for a number of audio codecs.
  
  @float NOTE
  OpenCORE and VisualOn libraries are under the Apache License 2.0
@@@ -63,9 -55,17 +63,17 @@@ Go to @url{http://sourceforge.net/proje
  instructions for installing the library.
  Then pass @code{--enable-libvo-amrwbenc} to configure to enable it.
  
+ @subsection Fraunhofer AAC library
+ Libav can make use of the Fraunhofer AAC library for AAC encoding.
+ Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the
+ instructions for installing the library.
+ Then pass @code{--enable-libfdk-aac} to configure to enable it.
  @section LAME
  
 -Libav can make use of the LAME library for MP3 encoding.
 +FFmpeg can make use of the LAME library for MP3 encoding.
  
  Go to @url{http://lame.sourceforge.net/} and follow the
  instructions for installing the library.
@@@ -624,46 -562,43 +624,48 @@@ OBJS-$(CONFIG_VIMA_DECODER
  # libavformat dependencies
  OBJS-$(CONFIG_ADTS_MUXER)              += mpeg4audio.o
  OBJS-$(CONFIG_ADX_DEMUXER)             += adx.o
- OBJS-$(CONFIG_CAF_DEMUXER)             += mpeg4audio.o mpegaudiodata.o
+ OBJS-$(CONFIG_CAF_DEMUXER)             += mpeg4audio.o mpegaudiodata.o  \
+                                           ac3tab.o
  OBJS-$(CONFIG_DV_DEMUXER)              += dv_profile.o
 -OBJS-$(CONFIG_DV_MUXER)                += dv_profile.o
 -OBJS-$(CONFIG_FLAC_DEMUXER)            += flac.o flacdata.o             \
 +OBJS-$(CONFIG_DV_MUXER)                += dv_profile.o timecode.o
- OBJS-$(CONFIG_FLAC_DEMUXER)            += flacdec.o flacdata.o flac.o vorbis_data.o \
++OBJS-$(CONFIG_FLAC_DEMUXER)            += flac.o flacdata.o vorbis_data.o \
                                            vorbis_parser.o xiph.o
- OBJS-$(CONFIG_FLAC_MUXER)              += flacdec.o flacdata.o flac.o vorbis_data.o
 -OBJS-$(CONFIG_FLAC_MUXER)              += flac.o flacdata.o
++OBJS-$(CONFIG_FLAC_MUXER)              += flac.o flacdata.o vorbis_data.o
  OBJS-$(CONFIG_FLV_DEMUXER)             += mpeg4audio.o
  OBJS-$(CONFIG_GXF_DEMUXER)             += mpeg12data.o
  OBJS-$(CONFIG_IFF_DEMUXER)             += iff.o
+ OBJS-$(CONFIG_ISMV_MUXER)              += mpeg4audio.o mpegaudiodata.o
  OBJS-$(CONFIG_LATM_MUXER)              += mpeg4audio.o
 -OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    += xiph.o mpeg4audio.o           \
 +OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    += xiph.o mpeg4audio.o vorbis_data.o \
-                                           flacdec.o flacdata.o flac.o
+                                           flac.o flacdata.o
  OBJS-$(CONFIG_MATROSKA_DEMUXER)        += mpeg4audio.o mpegaudiodata.o
- OBJS-$(CONFIG_MATROSKA_MUXER)          += xiph.o mpeg4audio.o \
-                                           flacdec.o flacdata.o flac.o \
-                                           mpegaudiodata.o vorbis_data.o
+ OBJS-$(CONFIG_MATROSKA_MUXER)          += mpeg4audio.o mpegaudiodata.o  \
 -                                          flac.o flacdata.o xiph.o
++                                          flac.o flacdata.o vorbis_data.o xiph.o
  OBJS-$(CONFIG_MP2_MUXER)               += mpegaudiodata.o mpegaudiodecheader.o
  OBJS-$(CONFIG_MP3_MUXER)               += mpegaudiodata.o mpegaudiodecheader.o
 -OBJS-$(CONFIG_MOV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o ac3tab.o
 +OBJS-$(CONFIG_MOV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o ac3tab.o timecode.o
  OBJS-$(CONFIG_MOV_MUXER)               += mpeg4audio.o mpegaudiodata.o
  OBJS-$(CONFIG_MPEGTS_MUXER)            += mpegvideo.o mpeg4audio.o
  OBJS-$(CONFIG_MPEGTS_DEMUXER)          += mpeg4audio.o mpegaudiodata.o
 +OBJS-$(CONFIG_MXF_MUXER)               += timecode.o
  OBJS-$(CONFIG_NUT_MUXER)               += mpegaudiodata.o
- OBJS-$(CONFIG_OGG_DEMUXER)             += flacdec.o flacdata.o flac.o \
-                                           dirac.o mpeg12data.o vorbis_parser.o \
-                                           xiph.o vorbis_data.o
- OBJS-$(CONFIG_OGG_MUXER)               += xiph.o flacdec.o flacdata.o flac.o \
+ OBJS-$(CONFIG_OGG_DEMUXER)             += xiph.o flac.o flacdata.o     \
+                                           mpeg12data.o vorbis_parser.o \
 -                                          dirac.o
 -OBJS-$(CONFIG_OGG_MUXER)               += xiph.o flac.o flacdata.o
++                                          dirac.o vorbis_data.o
++OBJS-$(CONFIG_OGG_MUXER)               += xiph.o flac.o flacdata.o \
 +                                          vorbis_data.o
  OBJS-$(CONFIG_RTP_MUXER)               += mpeg4audio.o mpegvideo.o xiph.o
  OBJS-$(CONFIG_SPDIF_DEMUXER)           += aacadtsdec.o mpeg4audio.o
- OBJS-$(CONFIG_WEBM_MUXER)              += xiph.o mpeg4audio.o \
-                                           flacdec.o flacdata.o flac.o \
-                                           mpegaudiodata.o vorbis_data.o
+ OBJS-$(CONFIG_WEBM_MUXER)              += mpeg4audio.o mpegaudiodata.o  \
 -                                          xiph.o flac.o flacdata.o
++                                          xiph.o flac.o flacdata.o \
++                                          vorbis_data.o
  OBJS-$(CONFIG_WTV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o
  
  # external codec libraries
 +OBJS-$(CONFIG_LIBAACPLUS_ENCODER)         += libaacplus.o
 +OBJS-$(CONFIG_LIBCELT_DECODER)            += libcelt_dec.o
  OBJS-$(CONFIG_LIBFAAC_ENCODER)            += libfaac.o audio_frame_queue.o
+ OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)         += libfdk-aacenc.o audio_frame_queue.o
  OBJS-$(CONFIG_LIBGSM_DECODER)             += libgsm.o
  OBJS-$(CONFIG_LIBGSM_ENCODER)             += libgsm.o
  OBJS-$(CONFIG_LIBGSM_MS_DECODER)          += libgsm.o
@@@ -415,8 -379,8 +415,9 @@@ void avcodec_register_all(void
      REGISTER_ENCDEC  (XSUB, xsub);
  
      /* external libraries */
 +    REGISTER_DECODER (LIBCELT, libcelt);
      REGISTER_ENCODER (LIBFAAC, libfaac);
+     REGISTER_ENCODER (LIBFDK_AAC, libfdk_aac);
      REGISTER_ENCDEC  (LIBGSM, libgsm);
      REGISTER_ENCDEC  (LIBGSM_MS, libgsm_ms);
      REGISTER_ENCDEC  (LIBILBC, libilbc);
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,6fda53c..32d91e9
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,384 +1,384 @@@
 - * This file is part of Libav.
+ /*
+  * AAC encoder wrapper
+  * Copyright (c) 2012 Martin Storsjo
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * 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 FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <fdk-aac/aacenc_lib.h>
+ #include "avcodec.h"
+ #include "audio_frame_queue.h"
+ #include "internal.h"
+ #include "libavutil/audioconvert.h"
+ #include "libavutil/opt.h"
+ typedef struct AACContext {
+     const AVClass *class;
+     HANDLE_AACENCODER handle;
+     int afterburner;
+     int eld_sbr;
+     int signaling;
+     AudioFrameQueue afq;
+ } AACContext;
+ static const AVOption aac_enc_options[] = {
+     { "afterburner", "Afterburner (improved quality)", offsetof(AACContext, afterburner), AV_OPT_TYPE_INT, { 1 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
+     { "eld_sbr", "Enable SBR for ELD (for SBR in other configurations, use the -profile parameter)", offsetof(AACContext, eld_sbr), AV_OPT_TYPE_INT, { 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
+     { "signaling", "SBR/PS signaling style", offsetof(AACContext, signaling), AV_OPT_TYPE_INT, { -1 }, -1, 2, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
+     { "default", "Choose signaling implicitly (explicit hierarchical by default, implicit if global header is disabled)", 0, AV_OPT_TYPE_CONST, { -1 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
+     { "implicit", "Implicit backwards compatible signaling", 0, AV_OPT_TYPE_CONST, { 0 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
+     { "explicit_sbr", "Explicit SBR, implicit PS signaling", 0, AV_OPT_TYPE_CONST, { 1 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
+     { "explicit_hierarchical", "Explicit hierarchical signaling", 0, AV_OPT_TYPE_CONST, { 2 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
+     { NULL }
+ };
+ static const AVClass aac_enc_class = {
+     "libfdk_aac", av_default_item_name, aac_enc_options, LIBAVUTIL_VERSION_INT
+ };
+ static const char *aac_get_error(AACENC_ERROR err)
+ {
+     switch (err) {
+     case AACENC_OK:
+         return "No error";
+     case AACENC_INVALID_HANDLE:
+         return "Invalid handle";
+     case AACENC_MEMORY_ERROR:
+         return "Memory allocation error";
+     case AACENC_UNSUPPORTED_PARAMETER:
+         return "Unsupported parameter";
+     case AACENC_INVALID_CONFIG:
+         return "Invalid config";
+     case AACENC_INIT_ERROR:
+         return "Initialization error";
+     case AACENC_INIT_AAC_ERROR:
+         return "AAC library initialization error";
+     case AACENC_INIT_SBR_ERROR:
+         return "SBR library initialization error";
+     case AACENC_INIT_TP_ERROR:
+         return "Transport library initialization error";
+     case AACENC_INIT_META_ERROR:
+         return "Metadata library initialization error";
+     case AACENC_ENCODE_ERROR:
+         return "Encoding error";
+     case AACENC_ENCODE_EOF:
+         return "End of file";
+     default:
+         return "Unknown error";
+     }
+ }
+ static int aac_encode_close(AVCodecContext *avctx)
+ {
+     AACContext *s = avctx->priv_data;
+     if (s->handle)
+         aacEncClose(&s->handle);
+ #if FF_API_OLD_ENCODE_AUDIO
+     av_freep(&avctx->coded_frame);
+ #endif
+     av_freep(&avctx->extradata);
+     ff_af_queue_close(&s->afq);
+     return 0;
+ }
+ static av_cold int aac_encode_init(AVCodecContext *avctx)
+ {
+     AACContext *s = avctx->priv_data;
+     int ret = AVERROR(EINVAL);
+     AACENC_InfoStruct info = { 0 };
+     CHANNEL_MODE mode;
+     AACENC_ERROR err;
+     int aot = FF_PROFILE_AAC_LOW + 1;
+     int sce = 0, cpe = 0;
+     if ((err = aacEncOpen(&s->handle, 0, avctx->channels)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to open the encoder: %s\n",
+                aac_get_error(err));
+         goto error;
+     }
+     if (avctx->profile != FF_PROFILE_UNKNOWN)
+         aot = avctx->profile + 1;
+     if ((err = aacEncoder_SetParam(s->handle, AACENC_AOT, aot)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to set the AOT %d: %s\n",
+                aot, aac_get_error(err));
+         goto error;
+     }
+     if (aot == FF_PROFILE_AAC_ELD + 1 && s->eld_sbr) {
+         if ((err = aacEncoder_SetParam(s->handle, AACENC_SBR_MODE,
+                                        1)) != AACENC_OK) {
+             av_log(avctx, AV_LOG_ERROR, "Unable to enable SBR for ELD: %s\n",
+                    aac_get_error(err));
+             goto error;
+         }
+     }
+     if ((err = aacEncoder_SetParam(s->handle, AACENC_SAMPLERATE,
+                                    avctx->sample_rate)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to set the sample rate %d: %s\n",
+                avctx->sample_rate, aac_get_error(err));
+         goto error;
+     }
+     switch (avctx->channels) {
+     case 1: mode = MODE_1;       sce = 1; cpe = 0; break;
+     case 2: mode = MODE_2;       sce = 0; cpe = 1; break;
+     case 3: mode = MODE_1_2;     sce = 1; cpe = 1; break;
+     case 4: mode = MODE_1_2_1;   sce = 2; cpe = 1; break;
+     case 5: mode = MODE_1_2_2;   sce = 1; cpe = 2; break;
+     case 6: mode = MODE_1_2_2_1; sce = 2; cpe = 2; break;
+     default:
+         av_log(avctx, AV_LOG_ERROR,
+                "Unsupported number of channels %d\n", avctx->channels);
+         goto error;
+     }
+     if ((err = aacEncoder_SetParam(s->handle, AACENC_CHANNELMODE,
+                                    mode)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR,
+                "Unable to set channel mode %d: %s\n", mode, aac_get_error(err));
+         goto error;
+     }
+     if ((err = aacEncoder_SetParam(s->handle, AACENC_CHANNELORDER,
+                                    1)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR,
+                "Unable to set wav channel order %d: %s\n",
+                mode, aac_get_error(err));
+         goto error;
+     }
+     if (avctx->flags & CODEC_FLAG_QSCALE) {
+         int mode = avctx->global_quality;
+         if (mode <  1 || mode > 5) {
+             av_log(avctx, AV_LOG_WARNING,
+                    "VBR quality %d out of range, should be 1-5\n", mode);
+             mode = av_clip(mode, 1, 5);
+         }
+         if ((err = aacEncoder_SetParam(s->handle, AACENC_BITRATEMODE,
+                                        mode)) != AACENC_OK) {
+             av_log(avctx, AV_LOG_ERROR, "Unable to set the VBR bitrate mode %d: %s\n",
+                    mode, aac_get_error(err));
+             goto error;
+         }
+     } else {
+         if (avctx->bit_rate <= 0) {
+             if (avctx->profile == FF_PROFILE_AAC_HE_V2) {
+                 sce = 1;
+                 cpe = 0;
+             }
+             avctx->bit_rate = (96*sce + 128*cpe) * avctx->sample_rate / 44;
+             if (avctx->profile == FF_PROFILE_AAC_HE ||
+                 avctx->profile == FF_PROFILE_AAC_HE_V2 ||
+                 s->eld_sbr)
+                 avctx->bit_rate /= 2;
+         }
+         if ((err = aacEncoder_SetParam(s->handle, AACENC_BITRATE,
+                                        avctx->bit_rate)) != AACENC_OK) {
+             av_log(avctx, AV_LOG_ERROR, "Unable to set the bitrate %d: %s\n",
+                    avctx->bit_rate, aac_get_error(err));
+             goto error;
+         }
+     }
+     /* Choose bitstream format - if global header is requested, use
+      * raw access units, otherwise use ADTS. */
+     if ((err = aacEncoder_SetParam(s->handle, AACENC_TRANSMUX,
+                                    avctx->flags & CODEC_FLAG_GLOBAL_HEADER ? 0 : 2)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to set the transmux format: %s\n",
+                aac_get_error(err));
+         goto error;
+     }
+     /* If no signaling mode is chosen, use explicit hierarchical signaling
+      * if using mp4 mode (raw access units, with global header) and
+      * implicit signaling if using ADTS. */
+     if (s->signaling < 0)
+         s->signaling = avctx->flags & CODEC_FLAG_GLOBAL_HEADER ? 2 : 0;
+     if ((err = aacEncoder_SetParam(s->handle, AACENC_SIGNALING_MODE,
+                                    s->signaling)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to set signaling mode %d: %s\n",
+                s->signaling, aac_get_error(err));
+         goto error;
+     }
+     if ((err = aacEncoder_SetParam(s->handle, AACENC_AFTERBURNER,
+                                    s->afterburner)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to set afterburner to %d: %s\n",
+                s->afterburner, aac_get_error(err));
+         goto error;
+     }
+     if ((err = aacEncEncode(s->handle, NULL, NULL, NULL, NULL)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to initialize the encoder: %s\n",
+                aac_get_error(err));
+         return AVERROR(EINVAL);
+     }
+     if ((err = aacEncInfo(s->handle, &info)) != AACENC_OK) {
+         av_log(avctx, AV_LOG_ERROR, "Unable to get encoder info: %s\n",
+                aac_get_error(err));
+         goto error;
+     }
+ #if FF_API_OLD_ENCODE_AUDIO
+     avctx->coded_frame = avcodec_alloc_frame();
+     if (!avctx->coded_frame) {
+         ret = AVERROR(ENOMEM);
+         goto error;
+     }
+ #endif
+     avctx->frame_size = info.frameLength;
+     avctx->delay      = info.encoderDelay;
+     ff_af_queue_init(avctx, &s->afq);
+     if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) {
+         avctx->extradata_size = info.confSize;
+         avctx->extradata      = av_mallocz(avctx->extradata_size +
+                                            FF_INPUT_BUFFER_PADDING_SIZE);
+         if (!avctx->extradata) {
+             ret = AVERROR(ENOMEM);
+             goto error;
+         }
+         memcpy(avctx->extradata, info.confBuf, info.confSize);
+     }
+     return 0;
+ error:
+     aac_encode_close(avctx);
+     return ret;
+ }
+ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+                             const AVFrame *frame, int *got_packet_ptr)
+ {
+     AACContext    *s        = avctx->priv_data;
+     AACENC_BufDesc in_buf   = { 0 }, out_buf = { 0 };
+     AACENC_InArgs  in_args  = { 0 };
+     AACENC_OutArgs out_args = { 0 };
+     int in_buffer_identifier = IN_AUDIO_DATA;
+     int in_buffer_size, in_buffer_element_size;
+     int out_buffer_identifier = OUT_BITSTREAM_DATA;
+     int out_buffer_size, out_buffer_element_size;
+     void *in_ptr, *out_ptr;
+     int ret;
+     AACENC_ERROR err;
+     /* handle end-of-stream small frame and flushing */
+     if (!frame) {
+         in_args.numInSamples = -1;
+     } else {
+         in_ptr                   = frame->data[0];
+         in_buffer_size           = 2 * avctx->channels * frame->nb_samples;
+         in_buffer_element_size   = 2;
+         in_args.numInSamples     = avctx->channels * frame->nb_samples;
+         in_buf.numBufs           = 1;
+         in_buf.bufs              = &in_ptr;
+         in_buf.bufferIdentifiers = &in_buffer_identifier;
+         in_buf.bufSizes          = &in_buffer_size;
+         in_buf.bufElSizes        = &in_buffer_element_size;
+         /* add current frame to the queue */
+         if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+             return ret;
+     }
+     /* The maximum packet size is 6144 bits aka 768 bytes per channel. */
+     if ((ret = ff_alloc_packet(avpkt, FFMAX(8192, 768 * avctx->channels)))) {
+         av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
+         return ret;
+     }
+     out_ptr                   = avpkt->data;
+     out_buffer_size           = avpkt->size;
+     out_buffer_element_size   = 1;
+     out_buf.numBufs           = 1;
+     out_buf.bufs              = &out_ptr;
+     out_buf.bufferIdentifiers = &out_buffer_identifier;
+     out_buf.bufSizes          = &out_buffer_size;
+     out_buf.bufElSizes        = &out_buffer_element_size;
+     if ((err = aacEncEncode(s->handle, &in_buf, &out_buf, &in_args,
+                             &out_args)) != AACENC_OK) {
+         if (!frame && err == AACENC_ENCODE_EOF)
+             return 0;
+         av_log(avctx, AV_LOG_ERROR, "Unable to encode frame: %s\n",
+                aac_get_error(err));
+         return AVERROR(EINVAL);
+     }
+     if (!out_args.numOutBytes)
+         return 0;
+     /* Get the next frame pts & duration */
+     ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
+                        &avpkt->duration);
+     avpkt->size     = out_args.numOutBytes;
+     *got_packet_ptr = 1;
+     return 0;
+ }
+ static const AVProfile profiles[] = {
+     { FF_PROFILE_AAC_LOW,   "LC"       },
+     { FF_PROFILE_AAC_HE,    "HE-AAC"   },
+     { FF_PROFILE_AAC_HE_V2, "HE-AACv2" },
+     { FF_PROFILE_AAC_LD,    "LD"       },
+     { FF_PROFILE_AAC_ELD,   "ELD"      },
+     { FF_PROFILE_UNKNOWN },
+ };
+ static const AVCodecDefault aac_encode_defaults[] = {
+     { "b", "0" },
+     { NULL }
+ };
+ static const uint64_t aac_channel_layout[] = {
+     AV_CH_LAYOUT_MONO,
+     AV_CH_LAYOUT_STEREO,
+     AV_CH_LAYOUT_SURROUND,
+     AV_CH_LAYOUT_4POINT0,
+     AV_CH_LAYOUT_5POINT0_BACK,
+     AV_CH_LAYOUT_5POINT1_BACK,
+     0,
+ };
+ AVCodec ff_libfdk_aac_encoder = {
+     .name            = "libfdk_aac",
+     .type            = AVMEDIA_TYPE_AUDIO,
+     .id              = CODEC_ID_AAC,
+     .priv_data_size  = sizeof(AACContext),
+     .init            = aac_encode_init,
+     .encode2         = aac_encode_frame,
+     .close           = aac_encode_close,
+     .capabilities    = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY,
+     .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+                                                       AV_SAMPLE_FMT_NONE },
+     .long_name       = NULL_IF_CONFIG_SMALL("Fraunhofer FDK AAC"),
+     .priv_class      = &aac_enc_class,
+     .defaults        = aac_encode_defaults,
+     .profiles        = profiles,
+     .channel_layouts = aac_channel_layout,
+ };
Simple merge
@@@ -27,8 -27,8 +27,8 @@@
   */
  
  #define LIBAVCODEC_VERSION_MAJOR 54
- #define LIBAVCODEC_VERSION_MINOR  34
 -#define LIBAVCODEC_VERSION_MINOR 19
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR  35
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge