Merge commit '5cdefc02079a5b899bdec09e15e2bb099cb01734'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 19 Sep 2013 10:44:06 +0000 (12:44 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 19 Sep 2013 10:44:06 +0000 (12:44 +0200)
* commit '5cdefc02079a5b899bdec09e15e2bb099cb01734':
  aacdec: Add support for Error Resilience syntax.

Conflicts:
Changelog
libavcodec/aacdec.c

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

diff --combined Changelog
+++ b/Changelog
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 -version 10:
 -- av_strnstr
 -- support ID3v2 tags in ASF files
 +version <next>
 +
 +- aecho filter
 +- perspective filter ported from libmpcodecs
 +- ffprobe -show_programs option
 +- compand filter
 +- RTMP seek support
 +- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate
 +  even when used as an input option. Previous behavior can be restored with
 +  the -noaccurate_seek option.
 +- ffmpeg -t option can now be used for inputs, to limit the duration of
 +  data read from an input file
 +- incomplete Voxware MetaSound decoder
 +- read EXIF metadata from JPEG
 +- DVB teletext decoder
 +- phase filter ported from libmpcodecs
 +- w3fdif filter
 +- Opus support in Matroska
 +- FFV1 version 1.3 is stable and no longer experimental
 +- FFV1: YUVA(444,422,420) 9, 10 and 16 bit support
 +- changed DTS stream id in lavf mpeg ps muxer from 0x8a to 0x88, to be
 +  more consistent with other muxers.
 +- adelay filter
 +- pullup filter ported from libmpcodecs
 +- ffprobe -read_intervals option
 +- Lossless and alpha support for WebP decoder
++- Error Resilient AAC syntax (ER AAC LC) decoding
 +
 +
 +version 2.0:
 +
 +- curves filter
  - reference-counting for AVFrame and AVPacket data
 -- avconv now fails when input options are used for output file
 +- ffmpeg now fails when input options are used for output file
    or vice versa
 -- new avconv options -filter_script and -filter_complex_script, which allow a
 +- support for Monkey's Audio versions from 3.93
 +- perms and aperms filters
 +- audio filtering support in ffplay
 +- 10% faster aac encoding on x86 and MIPS
 +- sine audio filter source
 +- WebP demuxing and decoding support
 +- new ffmpeg options -filter_script and -filter_complex_script, which allow a
    filtergraph description to be read from a file
 +- OpenCL support
 +- audio phaser filter
 +- separatefields filter
 +- libquvi demuxer
  - uniform options syntax across all filters
 +- telecine filter
  - new interlace filter
 -- JPEG 2000 decoder
 -- new asetpts filter (same as setpts, but for audio)
 -- new trim and atrim filters
 -- avconv -t and -ss (output-only) options are now sample-accurate when
 +- smptehdbars source
 +- inverse telecine filters (fieldmatch and decimate)
 +- colorbalance filter
 +- colorchannelmixer filter
 +- The matroska demuxer can now output proper verbatim ASS packets. It will
 +  become the default at the next libavformat major bump.
 +- decent native animated GIF encoding
 +- asetrate filter
 +- interleave filter
 +- timeline editing with filters
 +- vidstabdetect and vidstabtransform filters for video stabilization using
 +  the vid.stab library
 +- astats filter
 +- trim and atrim filters
 +- ffmpeg -t and -ss (output-only) options are now sample-accurate when
    transcoding audio
  - Matroska muxer can now put the index at the beginning of the file.
 -- avconv -deinterlace option removed, the yadif filter should be used instead
 +- extractplanes filter
 +- avectorscope filter
 +- ADPCM DTK decoder
 +- ADP demuxer
 +- RSD demuxer
 +- RedSpark demuxer
 +- ADPCM IMA Radical decoder
 +- zmq filters
 +- DCT denoiser filter (dctdnoiz)
 +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow")
  - Apple Intermediate Codec decoder
  - Escape 130 video decoder
 +- FTP protocol support
 +- V4L2 output device
 +- 3D LUT filter (lut3d)
 +- SMPTE 302M audio encoder
  - support for slice multithreading in libavfilter
 +- Hald CLUT support (generation and filtering)
  - VC-1 interlaced B-frame support
  - support for WavPack muxing (raw and in Matroska)
 +- XVideo output device
 +- vignette filter
 +- True Audio (TTA) encoder
  - Go2Webinar decoder
 +- mcdeint filter ported from libmpcodecs
 +- sab filter ported from libmpcodecs
 +- ffprobe -show_chapters option
  - WavPack encoding through libwavpack
 -- Added the -n parameter to avconv
 -- RTMP seek support
 -- when transcoding with avconv (i.e. not streamcopying), -ss is now accurate
 -  even when used as an input option. Previous behavior can be restored with
 -  the -noaccurate_seek option.
 -- avconv -t option can now be used for inputs, to limit the duration of
 -  data read from an input file
 -- incomplete Voxware MetaSound decoder
 -- WebP decoder
 -- Error Resilient AAC syntax (ER AAC LC) decoding
 +- rotate filter
 +- spp filter ported from libmpcodecs
 +- libgme support
 +- psnr filter
  
  
 -version 9:
 -- av_basename and av_dirname
 -- adobe and limelight publisher authentication in RTMP
 +version 1.2:
 +
  - VDPAU hardware acceleration through normal hwaccel
  - SRTP support
 +- Error diffusion dither in Swscale
 +- Chained Ogg support
 +- Theora Midstream reconfiguration support
 +- EVRC decoder
 +- audio fade filter
 +- filtering audio with unknown channel layout
 +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass
 +  and treble audio filter
 +- improved showspectrum filter, with multichannel support and sox-like colors
 +- histogram filter
 +- tee muxer
 +- il filter ported from libmpcodecs
 +- support ID3v2 tags in ASF files
 +- encrypted TTA stream decoding support
 +- RF64 support in WAV muxer
 +- noise filter ported from libmpcodecs
 +- Subtitles character encoding conversion
 +- blend filter
 +- stereo3d filter ported from libmpcodecs
 +
  
 +version 1.1:
  
 -version 9_beta3:
 -- ashowinfo audio filter
 +- stream disposition information printing in ffprobe
 +- filter for loudness analysis following EBU R128
 +- Opus encoder using libopus
 +- ffprobe -select_streams option
 +- Pinnacle TARGA CineWave YUV16 decoder
 +- TAK demuxer, decoder and parser
 +- DTS-HD demuxer
 +- remove -same_quant, it hasn't worked for years
 +- FFM2 support
 +- X-Face image encoder and decoder
  - 24-bit FLAC encoding
 -- audio volume filter
 -- deprecated the avconv -vol option. the volume filter is to be used instead.
  - multi-channel ALAC encoding up to 7.1
 -- TAK demuxer, parser, and decoder
 -- adaptive frame-level multithreading for H.264
 -
 -
 -version 9_beta2:
  - metadata (INFO tag) support in WAV muxer
 +- subtitles raw text decoder
  - support for building DLLs using MSVC
 -- remove avserver daemon mode
 +- LVF demuxer
 +- ffescape tool
 +- metadata (info chunk) support in CAF muxer
 +- field filter ported from libmpcodecs
 +- AVR demuxer
 +- geq filter ported from libmpcodecs
 +- remove ffserver daemon mode
 +- AST muxer/demuxer
 +- new expansion syntax for drawtext
 +- BRender PIX image decoder
 +- ffprobe -show_entries option
 +- ffprobe -sections option
 +- ADPCM IMA Dialogic decoder
 +- BRSTM demuxer
 +- animated GIF decoder and demuxer
 +- PVF demuxer
 +- subtitles filter
 +- IRCAM muxer/demuxer
 +- Paris Audio File demuxer
 +- Virtual concatenation demuxer
 +- VobSub demuxer
 +- JSON captions for TED talks decoding support
 +- SOX Resampler support in libswresample
 +- aselect filter
 +- SGI RLE 8-bit decoder
 +- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 +- Silicon Graphics Movie demuxer
 +- apad filter
 +- Resolution & pixel format change support with multithreading for H.264
 +- documentation split into per-component manuals
 +- pp (postproc) filter ported from MPlayer
 +- NIST Sphere demuxer
 +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders
 +- Sony Wave64 muxer
 +- adobe and limelight publisher authentication in RTMP
 +- data: URI scheme
  - support building on the Plan 9 operating system
 -- ffv1: support version 1.3
 +- kerndeint filter ported from MPlayer
 +- histeq filter ported from VirtualDub
 +- Megalux Frame demuxer
 +- 012v decoder
 +- Improved AVC Intra decoding support
  
  
 -version 9_beta1:
 +version 1.0:
  
 -- XWD encoder and decoder
 -- Support for fragmentation in the mov/mp4 muxer
 -- ISMV (Smooth Streaming) muxer
 -- CDXL demuxer and decoder
 -- Apple ProRes encoder
 -- Sun Rasterfile Encoder
 -- remove libpostproc
 -- ID3v2 attached pictures reading and writing
 -- WMA Lossless decoder
 -- XBM encoder
 -- RealAudio Lossless decoder
 -- ZeroCodec decoder
 -- drop support for avconv without libavfilter
 -- add libavresample audio conversion library
 -- audio filters support in libavfilter and avconv
 -- add fps filter
 -- audio split filter
 -- audio mix filter
 -- avprobe output is now standard INI or JSON. The old format can still
 -  be used with -of old.
 +- INI and flat output in ffprobe
 +- Scene detection in libavfilter
  - Indeo Audio decoder
  - channelsplit audio filter
 +- setnsamples audio filter
 +- atempo filter
 +- ffprobe -show_data option
  - RTMPT protocol support
  - iLBC encoding/decoding via libilbc
  - Microsoft Screen 1 decoder
  - Microsoft Expression Encoder Screen decoder
  - RTMPS protocol support
  - RTMPTS protocol support
 -- JPEG 2000 encoding support through OpenJPEG
 -- G.723.1 demuxer and decoder
  - RTMPE protocol support
  - RTMPTE protocol support
 +- showwaves and showspectrum filter
 +- LucasArts SMUSH playback support
 +- SAMI, RealText and SubViewer demuxers and decoders
 +- Heart Of Darkness PAF playback support
 +- iec61883 device
 +- asettb filter
 +- new option: -progress
 +- 3GPP Timed Text encoder/decoder
 +- GeoTIFF decoder support
 +- ffmpeg -(no)stdin option
 +- Opus decoder using libopus
 +- caca output device using libcaca
 +- alphaextract and alphamerge filters
 +- concat filter
 +- flite filter
  - Canopus Lossless Codec decoder
 -- avconv -shortest option is now per-output file,
 +- bitmap subtitles in filters (experimental and temporary)
 +- MP2 encoding via TwoLAME
 +- bmp parser
 +- smptebars source
 +- asetpts filter
 +- hue filter
 +- ICO muxer
 +- SubRip encoder and decoder without embedded timing
 +- edge detection filter
 +- framestep filter
 +- ffmpeg -shortest option is now per-output file
    -pass and -passlogfile are now per-output stream
 +- volume measurement filter
  - Ut Video encoder
  - Microsoft Screen 2 decoder
 +- smartblur filter ported from MPlayer
 +- CPiA decoder
 +- decimate filter ported from MPlayer
  - RTP depacketization of JPEG
  - Smooth Streaming live segmenter muxer
 +- F4V muxer
 +- sendcmd and asendcmd filters
 +- WebVTT demuxer and decoder (simple tags supported)
  - RTP packetization of JPEG
 -- Opus decoder and encoder using libopus
 -- remove -same_quant, it hasn't worked for years
 +- faststart option in the MOV/MP4 muxer
  - support for building with MSVC
  
  
 -version 0.8:
 +version 0.11:
  
 -- GSM audio parser
 -- SMJPEG muxer
 +- 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
 +- ffv1: support (draft) version 1.3
  
  
 -version 0.8_beta2:
 +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
 +- 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
      * -vframes/-aframes/-dframes options are now aliases to the new -frames option.
      * -vtag/-atag/-stag options are now aliases to the new -tag option.
  - XMV demuxer
 +- LOAS demuxer
 +- ashowinfo filter added
  - Windows Media Image decoder
 +- amovie source added
  - LATM muxer/demuxer
 -- showinfo filter
 -- split filter
 +- Speex encoder via libspeex
 +- JSON output in ffprobe
 +- WTV muxer
 +- Optional C++ Support (needed for libstagefright)
 +- H.264 Decoding on Android via Stagefright
 +- Prores decoder
 +- BIN/XBIN/ADF/IDF text file decoder
 +- aconvert audio filter added
 +- audio support to lavfi input device added
  - libcdio-paranoia input device for audio CD grabbing
 -- select filter
  - Apple ProRes decoder
  - CELT in Ogg demuxing
 +- G.723.1 demuxer and decoder
 +- libmodplug support (--enable-libmodplug)
  - VC-1 interlaced decoding
 -- lut, lutrgb, and lutyuv filters
 -- boxblur filter
 +- libutvideo wrapper (--enable-libutvideo)
 +- aevalsrc audio source added
  - Ut Video decoder
  - Speex encoding via libspeex
  - 4:2:2 H.264 decoding support
  - 4:2:2 and 4:4:4 H.264 encoding with libx264
  - Pulseaudio input device
 +- Prores encoder
 +- Video Decoder Acceleration (VDA) HWAccel module.
  - replacement Indeo 3 decoder
 +- new ffmpeg option: -map_channel
 +- volume audio filter added
 +- earwax audio filter added
 +- libv4l2 support (--enable-libv4l2)
  - TLS/SSL and HTTPS protocol support
  - AVOptions API rewritten and documented
  - most of CODEC_FLAG2_*, some CODEC_FLAG_* and many codec-specific fields in
  - Discworld II BMV decoding support
  - VBLE Decoder
  - OS X Video Decoder Acceleration (VDA) support
 +- compact and csv output in ffprobe
 +- pan audio filter
 +- IFF Amiga Continuous Bitmap (ACBM) decoder
 +- ass filter
  - CRI ADX audio format muxer and demuxer
  - Playstation Portable PMP format demuxer
 +- Microsoft Windows ICO demuxer
 +- life source
  - PCM format support in OMA demuxer
  - CLJR encoder
 +- new option: -report
  - Dxtory capture format decoder
 -- v410 QuickTime uncompressed 4:4:4 10-bit encoder and decoder
 -- OpenMG Audio muxer
 +- cellauto source
  - Simple segmenting muxer
  - Indeo 4 decoder
  - SMJPEG demuxer
  
  
 -version 0.7:
 -
 -- E-AC-3 audio encoder
 -- ac3enc: add channel coupling support
 -- floating-point sample format support for (E-)AC-3, DCA, AAC, Vorbis decoders
 -- H.264/MPEG frame-level multithreading
 -- av_metadata_* functions renamed to av_dict_* and moved to libavutil
 -- 4:4:4 H.264 decoding support
 -- 10-bit H.264 optimizations for x86
 -- bump libswscale for recently reported ABI break
 -
 -
 -version 0.7_beta2:
 -
 -- VP8 frame-level multithreading
 -- NEON optimizations for VP8
 -- removed a lot of deprecated API cruft
 -- FFT and IMDCT optimizations for AVX (Sandy Bridge) processors
 -- DPX image encoder
 -- SMPTE 302M AES3 audio decoder
 -- ffmpeg no longer quits after the 'q' key is pressed; use 'ctrl+c' instead
 -- 9bit and 10bit per sample support in the H.264 decoder
 -
 -
 -version 0.7_beta1:
 +version 0.8:
  
 +- many many things we forgot because we rather write code than changelogs
  - WebM support in Matroska de/muxer
  - low overhead Ogg muxing
  - MMS-TCP support
  - Demuxer for On2's IVF format
  - Pictor/PC Paint decoder
  - HE-AAC v2 decoder
 +- HE-AAC v2 encoding with libaacplus
  - libfaad2 wrapper removed
  - DTS-ES extension (XCh) decoding support
  - native VP8 decoder
  - RTP depacketization of QDM2
  - ANSI/ASCII art playback system
  - Lego Mindstorms RSO de/muxer
 +- libavcore added (and subsequently removed)
  - SubRip subtitle file muxer and demuxer
  - Chinese AVS encoding via libxavs
  - ffprobe -show_packets option added
  - replace the ocv_smooth filter with a more generic ocv filter
  - Windows Televison (WTV) demuxer
  - FFmpeg metadata format muxer and demuxer
 -- SubRip (srt) subtitle decoder
 +- SubRip (srt) subtitle encoder and decoder
  - floating-point AC-3 encoder added
  - Lagarith decoder
  - ffmpeg -copytb option added
  - sndio support for playback and record
  - Linux framebuffer input device added
  - Chronomaster DFA decoder
 -- Mobotix MxPEG decoder
 +- DPX image encoder
 +- MicroDVD subtitle file muxer and demuxer
 +- Playstation Portable PMP format demuxer
 +- fieldorder video filter added
  - AAC encoding via libvo-aacenc
  - AMR-WB encoding via libvo-amrwbenc
  - xWMA demuxer
 -- fieldorder video filter added
 +- Mobotix MxPEG decoder
 +- VP8 frame-multithreading
 +- NEON optimizations for VP8
 +- Lots of deprecated API cruft removed
 +- fft and imdct optimizations for AVX (Sandy Bridge) processors
 +- showinfo filter added
 +- SMPTE 302M AES3 audio decoder
 +- Apple Core Audio Format muxer
 +- 9bit and 10bit per sample support in the H.264 decoder
 +- 9bit and 10bit FFV1 encoding / decoding
 +- split filter added
 +- select filter added
 +- sdl output device added
 +- libmpcodecs video filter support (3 times as many filters than before)
 +- mpeg2 aspect ratio dection fixed
 +- libxvid aspect pickiness fixed
 +- Frame multithreaded decoding
 +- E-AC-3 audio encoder
 +- ac3enc: add channel coupling support
 +- floating-point sample format support to the ac3, eac3, dca, aac, and vorbis decoders.
 +- H264/MPEG frame-level multi-threading
 +- All av_metadata_* functions renamed to av_dict_* and moved to libavutil
 +- 4:4:4 H.264 decoding support
 +- 10-bit H.264 optimizations for x86
 +- lut, lutrgb, and lutyuv filters added
 +- buffersink libavfilter sink added
 +- Bump libswscale for recently reported ABI break
 +- New J2K encoder (via OpenJPEG)
 +
 +
 +version 0.7:
 +
 +- all the changes for 0.8, but keeping API/ABI compatibility with the 0.6 release
  
  
  version 0.6:
@@@ -837,7 -591,6 +838,7 @@@ version 0.5
  - Gopher client support
  - MXF D-10 muxer
  - generic metadata API
 +- flash ScreenVideo2 encoder
  
  
  version 0.4.9-pre1:
@@@ -1040,7 -793,7 +1041,7 @@@ version 0.4.5
  - MPEG-4 vol header fixes (Jonathan Marsden <snmjbm at pacbell.net>)
  - ARM optimizations (Lionel Ulmer <lionel.ulmer at free.fr>).
  - Windows porting of file converter
 -- added MJPEG raw format (input/ouput)
 +- added MJPEG raw format (input/output)
  - added JPEG image format support (input/output)
  
  
diff --combined libavcodec/aacdec.c
@@@ -7,20 -7,20 +7,20 @@@
   * Copyright (c) 2008-2010 Paul Kendall <paul@kcbbs.gen.nz>
   * Copyright (c) 2010      Janne Grunau <janne-libav@jannau.net>
   *
 - * 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
   */
  
@@@ -80,7 -80,6 +80,7 @@@
   */
  
  #include "libavutil/float_dsp.h"
 +#include "libavutil/opt.h"
  #include "avcodec.h"
  #include "internal.h"
  #include "get_bits.h"
  
  #if ARCH_ARM
  #   include "arm/aac.h"
 +#elif ARCH_MIPS
 +#   include "mips/aacdec_mips.h"
  #endif
  
  static VLC vlc_scalefactors;
  static VLC vlc_spectral[11];
  
 -static const char overread_err[] = "Input buffer exhausted before END element found\n";
 +static int output_configure(AACContext *ac,
 +                            uint8_t layout_map[MAX_ELEM_ID*4][3], int tags,
 +                            enum OCStatus oc_type, int get_new_frame);
 +
 +#define overread_err "Input buffer exhausted before END element found\n"
  
  static int count_channels(uint8_t (*layout)[3], int tags)
  {
  /**
   * Check for the channel element in the current channel position configuration.
   * If it exists, make sure the appropriate element is allocated and map the
 - * channel order to match the internal Libav channel layout.
 + * channel order to match the internal FFmpeg channel layout.
   *
   * @param   che_pos current channel position configuration
   * @param   type channel element type
@@@ -157,10 -150,6 +157,10 @@@ static av_cold int che_configure(AACCon
              ff_aac_sbr_ctx_init(ac, &ac->che[type][id]->sbr);
          }
          if (type != TYPE_CCE) {
 +            if (*channels >= MAX_CHANNELS - (type == TYPE_CPE || (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1))) {
 +                av_log(ac->avctx, AV_LOG_ERROR, "Too many channels\n");
 +                return AVERROR_INVALIDDATA;
 +            }
              ac->output_element[(*channels)++] = &ac->che[type][id]->ch[0];
              if (type == TYPE_CPE ||
                  (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1)) {
@@@ -194,8 -183,10 +194,8 @@@ static int frame_configure_elements(AVC
      /* get output buffer */
      av_frame_unref(ac->frame);
      ac->frame->nb_samples = 2048;
 -    if ((ret = ff_get_buffer(avctx, ac->frame, 0)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +    if ((ret = ff_get_buffer(avctx, ac->frame, 0)) < 0)
          return ret;
 -    }
  
      /* map output channel pointers to AVFrame data */
      for (ch = 0; ch < avctx->channels; ch++) {
@@@ -434,8 -425,6 +434,8 @@@ static void pop_output_configuration(AA
          ac->oc[1] = ac->oc[0];
          ac->avctx->channels = ac->oc[1].channels;
          ac->avctx->channel_layout = ac->oc[1].channel_layout;
 +        output_configure(ac, ac->oc[1].layout_map, ac->oc[1].layout_map_tags,
 +                         ac->oc[1].status, 0);
      }
  }
  
@@@ -481,8 -470,7 +481,8 @@@ static int output_configure(AACContext 
      }
  
      memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
 -    avctx->channel_layout = ac->oc[1].channel_layout = layout;
 +    if (layout) avctx->channel_layout = layout;
 +                            ac->oc[1].channel_layout = layout;
      avctx->channels       = ac->oc[1].channels       = channels;
      ac->oc[1].status = oc_type;
  
      return 0;
  }
  
 +static void flush(AVCodecContext *avctx)
 +{
 +    AACContext *ac= avctx->priv_data;
 +    int type, i, j;
 +
 +    for (type = 3; type >= 0; type--) {
 +        for (i = 0; i < MAX_ELEM_ID; i++) {
 +            ChannelElement *che = ac->che[type][i];
 +            if (che) {
 +                for (j = 0; j <= 1; j++) {
 +                    memset(che->ch[j].saved, 0, sizeof(che->ch[j].saved));
 +                }
 +            }
 +        }
 +    }
 +}
 +
  /**
   * Set up channel positions based on a default channel configuration
   * as specified in table 1.17.
@@@ -548,8 -519,6 +548,8 @@@ static ChannelElement *get_che(AACConte
          int layout_map_tags;
          push_output_configuration(ac);
  
 +        av_log(ac->avctx, AV_LOG_DEBUG, "mono with CPE\n");
 +
          if (set_default_channel_config(ac->avctx, layout_map,
                                         &layout_map_tags, 2) < 0)
              return NULL;
          int layout_map_tags;
          push_output_configuration(ac);
  
 +        av_log(ac->avctx, AV_LOG_DEBUG, "stereo with SCE\n");
 +
          if (set_default_channel_config(ac->avctx, layout_map,
                                         &layout_map_tags, 1) < 0)
              return NULL;
@@@ -655,8 -622,6 +655,8 @@@ static void decode_channel_map(uint8_t 
          case AAC_CHANNEL_LFE:
              syn_ele = TYPE_LFE;
              break;
 +        default:
 +            av_assert0(0);
          }
          layout_map[0][0] = syn_ele;
          layout_map[0][1] = get_bits(gb, 4);
@@@ -702,10 -667,6 +702,10 @@@ static int decode_pce(AVCodecContext *a
      if (get_bits1(gb))
          skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround
  
 +    if (get_bits_left(gb) < 4 * (num_front + num_side + num_back + num_lfe + num_assoc_data + num_cc)) {
 +        av_log(avctx, AV_LOG_ERROR, "decode_pce: " overread_err);
 +        return -1;
 +    }
      decode_channel_map(layout_map       , AAC_CHANNEL_FRONT, gb, num_front);
      tags = num_front;
      decode_channel_map(layout_map + tags, AAC_CHANNEL_SIDE,  gb, num_side);
      /* comment field, first byte is length */
      comment_len = get_bits(gb, 8) * 8;
      if (get_bits_left(gb) < comment_len) {
 -        av_log(avctx, AV_LOG_ERROR, overread_err);
 +        av_log(avctx, AV_LOG_ERROR, "decode_pce: " overread_err);
          return AVERROR_INVALIDDATA;
      }
      skip_bits_long(gb, comment_len);
@@@ -745,7 -706,7 +745,7 @@@ static int decode_ga_specific_config(AA
                                       MPEG4AudioConfig *m4ac,
                                       int channel_config)
  {
-     int extension_flag, ret;
+     int extension_flag, ret, ep_config, res_flags;
      uint8_t layout_map[MAX_ELEM_ID*4][3];
      int tags = 0;
  
          case AOT_ER_AAC_LTP:
          case AOT_ER_AAC_SCALABLE:
          case AOT_ER_AAC_LD:
-             skip_bits(gb, 3);      /* aacSectionDataResilienceFlag
-                                     * aacScalefactorDataResilienceFlag
-                                     * aacSpectralDataResilienceFlag
-                                     */
+             res_flags = get_bits(gb, 3);
+             if (res_flags) {
+                 av_log(avctx, AV_LOG_ERROR,
+                        "AAC data resilience not supported (flags %x)\n",
+                        res_flags);
+                 return AVERROR_PATCHWELCOME;
+             }
              break;
          }
          skip_bits1(gb);    // extensionFlag3 (TBD in version 3)
      }
+     switch (m4ac->object_type) {
+     case AOT_ER_AAC_LC:
+     case AOT_ER_AAC_LTP:
+     case AOT_ER_AAC_SCALABLE:
+     case AOT_ER_AAC_LD:
+         ep_config = get_bits(gb, 2);
+         if (ep_config) {
+             av_log(avctx, AV_LOG_ERROR,
+                    "epConfig %d is not supported.\n",
+                    ep_config);
+             return AVERROR_PATCHWELCOME;
+         }
+     }
      return 0;
  }
  
@@@ -823,9 -800,9 +839,9 @@@ static int decode_audio_specific_config
      GetBitContext gb;
      int i, ret;
  
 -    av_dlog(avctx, "extradata size %d\n", avctx->extradata_size);
 -    for (i = 0; i < avctx->extradata_size; i++)
 -        av_dlog(avctx, "%02x ", avctx->extradata[i]);
 +    av_dlog(avctx, "audio specific config size %d\n", bit_size >> 3);
 +    for (i = 0; i < bit_size >> 3; i++)
 +        av_dlog(avctx, "%02x ", data[i]);
      av_dlog(avctx, "\n");
  
      if ((ret = init_get_bits(&gb, data, bit_size)) < 0)
      case AOT_AAC_MAIN:
      case AOT_AAC_LC:
      case AOT_AAC_LTP:
+     case AOT_ER_AAC_LC:
          if ((ret = decode_ga_specific_config(ac, avctx, &gb,
                                              m4ac, m4ac->chan_config)) < 0)
              return ret;
   *
   * @return  Returns a 32-bit pseudorandom integer
   */
 -static av_always_inline int lcg_random(int previous_val)
 +static av_always_inline int lcg_random(unsigned previous_val)
  {
      union { unsigned u; int s; } v = { previous_val * 1664525u + 1013904223 };
      return v.s;
@@@ -929,8 -907,6 +946,8 @@@ static void reset_predictor_group(Predi
                                      sizeof(ff_aac_spectral_codes[num][0]), \
          size);
  
 +static void aacdec_init(AACContext *ac);
 +
  static av_cold int aac_decode_init(AVCodecContext *avctx)
  {
      AACContext *ac = avctx->priv_data;
      ac->avctx = avctx;
      ac->oc[1].m4ac.sample_rate = avctx->sample_rate;
  
 +    aacdec_init(ac);
 +
      avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
  
      if (avctx->extradata_size > 0) {
          }
      }
  
 +    if (avctx->channels > MAX_CHANNELS) {
 +        av_log(avctx, AV_LOG_ERROR, "Too many channels\n");
 +        return AVERROR_INVALIDDATA;
 +    }
 +
      AAC_INIT_VLC_STATIC( 0, 304);
      AAC_INIT_VLC_STATIC( 1, 270);
      AAC_INIT_VLC_STATIC( 2, 550);
@@@ -1042,7 -1011,7 +1059,7 @@@ static int skip_data_stream_element(AAC
          align_get_bits(gb);
  
      if (get_bits_left(gb) < 8 * count) {
 -        av_log(ac->avctx, AV_LOG_ERROR, overread_err);
 +        av_log(ac->avctx, AV_LOG_ERROR, "skip_data_stream_element: "overread_err);
          return AVERROR_INVALIDDATA;
      }
      skip_bits_long(gb, 8 * count);
@@@ -1125,12 -1094,13 +1142,13 @@@ static int decode_ics_info(AACContext *
          if (ics->predictor_present) {
              if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN) {
                  if (decode_prediction(ac, ics, gb)) {
 -                    return AVERROR_INVALIDDATA;
 +                    goto fail;
                  }
-             } else if (ac->oc[1].m4ac.object_type == AOT_AAC_LC) {
+             } else if (ac->oc[1].m4ac.object_type == AOT_AAC_LC ||
+                        ac->oc[1].m4ac.object_type == AOT_ER_AAC_LC) {
                  av_log(ac->avctx, AV_LOG_ERROR,
                         "Prediction is not allowed in AAC-LC.\n");
 -                return AVERROR_INVALIDDATA;
 +                goto fail;
              } else {
                  if ((ics->ltp.present = get_bits(gb, 1)))
                      decode_ltp(&ics->ltp, gb, ics->max_sfb);
                 "Number of scalefactor bands in group (%d) "
                 "exceeds limit (%d).\n",
                 ics->max_sfb, ics->num_swb);
 -        return AVERROR_INVALIDDATA;
 +        goto fail;
      }
  
      return 0;
 +fail:
 +    ics->max_sfb = 0;
 +    return AVERROR_INVALIDDATA;
  }
  
  /**
@@@ -1180,7 -1147,7 +1198,7 @@@ static int decode_band_types(AACContex
                  sect_len_incr = get_bits(gb, bits);
                  sect_end += sect_len_incr;
                  if (get_bits_left(gb) < 0) {
 -                    av_log(ac->avctx, AV_LOG_ERROR, overread_err);
 +                    av_log(ac->avctx, AV_LOG_ERROR, "decode_band_types: "overread_err);
                      return AVERROR_INVALIDDATA;
                  }
                  if (sect_end > ics->max_sfb) {
@@@ -1352,7 -1319,7 +1370,7 @@@ static void decode_mid_side_stereo(Chan
               idx++)
              cpe->ms_mask[idx] = get_bits1(gb);
      } else if (ms_present == 2) {
 -        memset(cpe->ms_mask, 1, cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb * sizeof(cpe->ms_mask[0]));
 +        memset(cpe->ms_mask, 1,  sizeof(cpe->ms_mask[0]) * cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb);
      }
  }
  
@@@ -1752,7 -1719,7 +1770,7 @@@ static int decode_ics(AACContext *ac, S
      TemporalNoiseShaping    *tns = &sce->tns;
      IndividualChannelStream *ics = &sce->ics;
      float *out = sce->coeffs;
-     int global_gain, pulse_present = 0;
+     int global_gain, er_syntax, pulse_present = 0;
      int ret;
  
      /* This assignment is to silence a GCC warning about the variable being used
          return ret;
  
      pulse_present = 0;
+     er_syntax = ac->oc[1].m4ac.object_type == AOT_ER_AAC_LC ||
+                 ac->oc[1].m4ac.object_type == AOT_ER_AAC_LTP ||
+                 ac->oc[1].m4ac.object_type == AOT_ER_AAC_LD;
      if (!scale_flag) {
          if ((pulse_present = get_bits1(gb))) {
              if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
                  return AVERROR_INVALIDDATA;
              }
          }
-         if ((tns->present = get_bits1(gb)) && decode_tns(ac, tns, gb, ics))
-             return AVERROR_INVALIDDATA;
+         tns->present = get_bits1(gb);
+         if (tns->present && !er_syntax)
+             if (decode_tns(ac, tns, gb, ics) < 0)
+                 return AVERROR_INVALIDDATA;
          if (get_bits1(gb)) {
              avpriv_request_sample(ac->avctx, "SSR");
              return AVERROR_PATCHWELCOME;
          }
+         // I see no textual basis in the spec for this occuring after SSR gain
+         // control, but this is what both reference and real implmentations do
+         if (tns->present && er_syntax)
+             if (decode_tns(ac, tns, gb, ics) < 0)
+                 return AVERROR_INVALIDDATA;
      }
  
      if (decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present,
@@@ -2072,32 -2049,6 +2100,32 @@@ static int decode_dynamic_range(Dynamic
      return n;
  }
  
 +static int decode_fill(AACContext *ac, GetBitContext *gb, int len) {
 +    uint8_t buf[256];
 +    int i, major, minor;
 +
 +    if (len < 13+7*8)
 +        goto unknown;
 +
 +    get_bits(gb, 13); len -= 13;
 +
 +    for(i=0; i+1<sizeof(buf) && len>=8; i++, len-=8)
 +        buf[i] = get_bits(gb, 8);
 +
 +    buf[i] = 0;
 +    if (ac->avctx->debug & FF_DEBUG_PICT_INFO)
 +        av_log(ac->avctx, AV_LOG_DEBUG, "FILL:%s\n", buf);
 +
 +    if (sscanf(buf, "libfaac %d.%d", &major, &minor) == 2){
 +        ac->avctx->internal->skip_samples = 1024;
 +    }
 +
 +unknown:
 +    skip_bits_long(gb, len);
 +
 +    return 0;
 +}
 +
  /**
   * Decode extension data (incomplete); reference: table 4.51.
   *
@@@ -2139,8 -2090,6 +2167,8 @@@ static int decode_extension_payload(AAC
          res = decode_dynamic_range(&ac->che_drc, gb);
          break;
      case EXT_FILL:
 +        decode_fill(ac, gb, 8 * cnt - 4);
 +        break;
      case EXT_FILL_DATA:
      case EXT_DATA_ELEMENT:
      default:
@@@ -2163,7 -2112,7 +2191,7 @@@ static void apply_tns(float coef[1024]
      int w, filt, m, i;
      int bottom, top, order, start, end, size, inc;
      float lpc[TNS_MAX_ORDER];
 -    float tmp[TNS_MAX_ORDER + 1];
 +    float tmp[TNS_MAX_ORDER+1];
  
      for (w = 0; w < ics->num_windows; w++) {
          bottom = ics->num_swb;
@@@ -2255,10 -2204,10 +2283,10 @@@ static void apply_ltp(AACContext *ac, S
              predTime[i] = sce->ltp_state[i + 2048 - ltp->lag] * ltp->coef;
          memset(&predTime[i], 0, (2048 - i) * sizeof(float));
  
 -        windowing_and_mdct_ltp(ac, predFreq, predTime, &sce->ics);
 +        ac->windowing_and_mdct_ltp(ac, predFreq, predTime, &sce->ics);
  
          if (sce->tns.present)
 -            apply_tns(predFreq, &sce->tns, &sce->ics, 0);
 +            ac->apply_tns(predFreq, &sce->tns, &sce->ics, 0);
  
          for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++)
              if (ltp->used[sfb])
@@@ -2470,25 -2419,25 +2498,25 @@@ static void spectral_to_sample(AACConte
                  if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
                      if (che->ch[0].ics.predictor_present) {
                          if (che->ch[0].ics.ltp.present)
 -                            apply_ltp(ac, &che->ch[0]);
 +                            ac->apply_ltp(ac, &che->ch[0]);
                          if (che->ch[1].ics.ltp.present && type == TYPE_CPE)
 -                            apply_ltp(ac, &che->ch[1]);
 +                            ac->apply_ltp(ac, &che->ch[1]);
                      }
                  }
                  if (che->ch[0].tns.present)
 -                    apply_tns(che->ch[0].coeffs, &che->ch[0].tns, &che->ch[0].ics, 1);
 +                    ac->apply_tns(che->ch[0].coeffs, &che->ch[0].tns, &che->ch[0].ics, 1);
                  if (che->ch[1].tns.present)
 -                    apply_tns(che->ch[1].coeffs, &che->ch[1].tns, &che->ch[1].ics, 1);
 +                    ac->apply_tns(che->ch[1].coeffs, &che->ch[1].tns, &che->ch[1].ics, 1);
                  if (type <= TYPE_CPE)
                      apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, apply_dependent_coupling);
                  if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) {
 -                    imdct_and_windowing(ac, &che->ch[0]);
 +                    ac->imdct_and_windowing(ac, &che->ch[0]);
                      if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP)
 -                        update_ltp(ac, &che->ch[0]);
 +                        ac->update_ltp(ac, &che->ch[0]);
                      if (type == TYPE_CPE) {
 -                        imdct_and_windowing(ac, &che->ch[1]);
 +                        ac->imdct_and_windowing(ac, &che->ch[1]);
                          if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP)
 -                            update_ltp(ac, &che->ch[1]);
 +                            ac->update_ltp(ac, &che->ch[1]);
                      }
                      if (ac->oc[1].m4ac.sbr > 0) {
                          ff_sbr_apply(ac, &che->sbr, type, che->ch[0].ret, che->ch[1].ret);
@@@ -2510,12 -2459,10 +2538,12 @@@ static int parse_adts_frame_header(AACC
  
      size = avpriv_aac_parse_header(gb, &hdr_info);
      if (size > 0) {
 -        if (hdr_info.num_aac_frames != 1) {
 +        if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) {
 +            // This is 2 for "VLB " audio in NSV files.
 +            // See samples/nsv/vlb_audio.
              avpriv_report_missing_feature(ac->avctx,
                                            "More than one AAC RDB per ADTS frame");
 -            return AVERROR_PATCHWELCOME;
 +            ac->warned_num_aac_frames = 1;
          }
          push_output_configuration(ac);
          if (hdr_info.chan_config) {
                  return ret;
          } else {
              ac->oc[1].m4ac.chan_config = 0;
 +            /**
 +             * dual mono frames in Japanese DTV can have chan_config 0
 +             * WITHOUT specifying PCE.
 +             *  thus, set dual mono as default.
 +             */
 +            if (ac->dmono_mode && ac->oc[0].status == OC_NONE) {
 +                layout_map_tags = 2;
 +                layout_map[0][0] = layout_map[1][0] = TYPE_SCE;
 +                layout_map[0][2] = layout_map[1][2] = AAC_CHANNEL_FRONT;
 +                layout_map[0][1] = 0;
 +                layout_map[1][1] = 1;
 +                if (output_configure(ac, layout_map, layout_map_tags,
 +                                     OC_TRIAL_FRAME, 0))
 +                    return -7;
 +            }
          }
          ac->oc[1].m4ac.sample_rate     = hdr_info.sample_rate;
          ac->oc[1].m4ac.sampling_index  = hdr_info.sampling_index;
      return size;
  }
  
+ static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
+                                int *got_frame_ptr, GetBitContext *gb)
+ {
+     AACContext *ac = avctx->priv_data;
+     ChannelElement *che;
+     int err, i;
+     int samples = 1024;
+     int chan_config = ac->oc[1].m4ac.chan_config;
+     ac->frame = data;
+     if ((err = frame_configure_elements(avctx)) < 0)
+         return err;
+     ac->tags_mapped = 0;
+     if (chan_config < 0 || chan_config >= 8) {
+         avpriv_request_sample(avctx, "Unknown ER channel configuration %d",
+                               ac->oc[1].m4ac.chan_config);
+         return AVERROR_INVALIDDATA;
+     }
+     for (i = 0; i < tags_per_config[chan_config]; i++) {
+         const int elem_type = aac_channel_layout_map[chan_config-1][i][0];
+         const int elem_id   = aac_channel_layout_map[chan_config-1][i][1];
+         if (!(che=get_che(ac, elem_type, elem_id))) {
+             av_log(ac->avctx, AV_LOG_ERROR,
+                    "channel element %d.%d is not allocated\n",
+                    elem_type, elem_id);
+             return AVERROR_INVALIDDATA;
+         }
+         skip_bits(gb, 4);
+         switch (elem_type) {
+         case TYPE_SCE:
+             err = decode_ics(ac, &che->ch[0], gb, 0, 0);
+             break;
+         case TYPE_CPE:
+             err = decode_cpe(ac, gb, che);
+             break;
+         case TYPE_LFE:
+             err = decode_ics(ac, &che->ch[0], gb, 0, 0);
+             break;
+         }
+         if (err < 0)
+             return err;
+     }
+     spectral_to_sample(ac);
+     ac->frame->nb_samples = samples;
+     *got_frame_ptr = 1;
+     skip_bits_long(gb, get_bits_left(gb));
+     return 0;
+ }
  static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
 -                                int *got_frame_ptr, GetBitContext *gb)
 +                                int *got_frame_ptr, GetBitContext *gb, AVPacket *avpkt)
  {
      AACContext *ac = avctx->priv_data;
      ChannelElement *che = NULL, *che_prev = NULL;
      enum RawDataBlockType elem_type, elem_type_prev = TYPE_END;
      int err, elem_id;
      int samples = 0, multiplier, audio_found = 0, pce_found = 0;
 +    int is_dmono, sce_count = 0;
  
      ac->frame = data;
  
          case TYPE_SCE:
              err = decode_ics(ac, &che->ch[0], gb, 0, 0);
              audio_found = 1;
 +            sce_count++;
              break;
  
          case TYPE_CPE:
              if (pce_found) {
                  av_log(avctx, AV_LOG_ERROR,
                         "Not evaluating a further program_config_element as this construct is dubious at best.\n");
 -                pop_output_configuration(ac);
              } else {
                  err = output_configure(ac, layout_map, tags, OC_TRIAL_PCE, 1);
 +                if (!err)
 +                    ac->oc[1].m4ac.chan_config = 0;
                  pce_found = 1;
              }
              break;
              if (elem_id == 15)
                  elem_id += get_bits(gb, 8) - 1;
              if (get_bits_left(gb) < 8 * elem_id) {
 -                    av_log(avctx, AV_LOG_ERROR, overread_err);
 +                    av_log(avctx, AV_LOG_ERROR, "TYPE_FIL: "overread_err);
                      err = AVERROR_INVALIDDATA;
                      goto fail;
              }
  
      multiplier = (ac->oc[1].m4ac.sbr == 1) ? ac->oc[1].m4ac.ext_sample_rate > ac->oc[1].m4ac.sample_rate : 0;
      samples <<= multiplier;
 +    /* for dual-mono audio (SCE + SCE) */
 +    is_dmono = ac->dmono_mode && sce_count == 2 &&
 +               ac->oc[1].channel_layout == (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT);
  
      if (samples)
          ac->frame->nb_samples = samples;
 +    else
 +        av_frame_unref(ac->frame);
      *got_frame_ptr = !!samples;
  
 +    if (is_dmono) {
 +        if (ac->dmono_mode == 1)
 +            ((AVFrame *)data)->data[1] =((AVFrame *)data)->data[0];
 +        else if (ac->dmono_mode == 2)
 +            ((AVFrame *)data)->data[0] =((AVFrame *)data)->data[1];
 +    }
 +
      if (ac->oc[1].status && audio_found) {
          avctx->sample_rate = ac->oc[1].m4ac.sample_rate << multiplier;
          avctx->frame_size = samples;
          ac->oc[1].status = OC_LOCKED;
      }
  
 +    if (multiplier) {
 +        int side_size;
 +        const uint8_t *side = av_packet_get_side_data(avpkt, AV_PKT_DATA_SKIP_SAMPLES, &side_size);
 +        if (side && side_size>=4)
 +            AV_WL32(side, 2*AV_RL32(side));
 +    }
      return 0;
  fail:
      pop_output_configuration(ac);
@@@ -2735,12 -2701,8 +2818,12 @@@ static int aac_decode_frame(AVCodecCont
      const uint8_t *new_extradata = av_packet_get_side_data(avpkt,
                                         AV_PKT_DATA_NEW_EXTRADATA,
                                         &new_extradata_size);
 +    int jp_dualmono_size;
 +    const uint8_t *jp_dualmono   = av_packet_get_side_data(avpkt,
 +                                       AV_PKT_DATA_JP_DUALMONO,
 +                                       &jp_dualmono_size);
  
 -    if (new_extradata) {
 +    if (new_extradata && 0) {
          av_free(avctx->extradata);
          avctx->extradata = av_mallocz(new_extradata_size +
                                        FF_INPUT_BUFFER_PADDING_SIZE);
          }
      }
  
 +    ac->dmono_mode = 0;
 +    if (jp_dualmono && jp_dualmono_size > 0)
 +        ac->dmono_mode =  1 + *jp_dualmono;
 +    if (ac->force_dmono_mode >= 0)
 +        ac->dmono_mode = ac->force_dmono_mode;
 +
 +    if (INT_MAX / 8 <= buf_size)
 +        return AVERROR_INVALIDDATA;
 +
      if ((err = init_get_bits(&gb, buf, buf_size * 8)) < 0)
          return err;
  
-     if ((err = aac_decode_frame_int(avctx, data, got_frame_ptr, &gb, avpkt)) < 0)
+     switch (ac->oc[1].m4ac.object_type) {
+     case AOT_ER_AAC_LC:
+     case AOT_ER_AAC_LTP:
+     case AOT_ER_AAC_LD:
+         err = aac_decode_er_frame(avctx, data, got_frame_ptr, &gb);
+         break;
+     default:
 -        err = aac_decode_frame_int(avctx, data, got_frame_ptr, &gb);
++        err = aac_decode_frame_int(avctx, data, got_frame_ptr, &gb, avpkt);
+     }
+     if (err < 0)
          return err;
  
      buf_consumed = (get_bits_count(&gb) + 7) >> 3;
@@@ -2804,7 -2766,7 +2896,7 @@@ static av_cold int aac_decode_close(AVC
  
  struct LATMContext {
      AACContext aac_ctx;     ///< containing AACContext
 -    int initialized;        ///< initilized after a valid extradata was seen
 +    int initialized;        ///< initialized after a valid extradata was seen
  
      // parser data
      int audio_mux_version_A; ///< LATM syntax version
@@@ -2849,15 -2811,10 +2941,15 @@@ static int latm_decode_audio_specific_c
      if (bits_consumed < 0)
          return AVERROR_INVALIDDATA;
  
 -    if (ac->oc[1].m4ac.sample_rate != m4ac.sample_rate ||
 +    if (!latmctx->initialized ||
 +        ac->oc[1].m4ac.sample_rate != m4ac.sample_rate ||
          ac->oc[1].m4ac.chan_config != m4ac.chan_config) {
  
 -        av_log(avctx, AV_LOG_INFO, "audio config changed\n");
 +        if(latmctx->initialized) {
 +            av_log(avctx, AV_LOG_INFO, "audio config changed\n");
 +        } else {
 +            av_log(avctx, AV_LOG_DEBUG, "initializing latmctx\n");
 +        }
          latmctx->initialized = 0;
  
          esize = (bits_consumed+7) / 8;
@@@ -2900,9 -2857,9 +2992,9 @@@ static int read_stream_mux_config(struc
              return AVERROR_PATCHWELCOME;
          }
  
 -        // for each program (which there is only on in DVB)
 +        // for each program (which there is only one in DVB)
  
 -        // for each layer (which there is only on in DVB)
 +        // for each layer (which there is only one in DVB)
          if (get_bits(gb, 3)) {                   // numLayer
              avpriv_request_sample(latmctx->aac_ctx.avctx, "Multiple layers");
              return AVERROR_PATCHWELCOME;
@@@ -3015,7 -2972,7 +3107,7 @@@ static int latm_decode_frame(AVCodecCon
      int                 muxlength, err;
      GetBitContext       gb;
  
 -    if ((err = init_get_bits(&gb, avpkt->data, avpkt->size * 8)) < 0)
 +    if ((err = init_get_bits8(&gb, avpkt->data, avpkt->size)) < 0)
          return err;
  
      // check for LOAS sync word
          return AVERROR_INVALIDDATA;
  
      muxlength = get_bits(&gb, 13) + 3;
 -    // not enough data, the parser should have sorted this
 +    // not enough data, the parser should have sorted this out
      if (muxlength > avpkt->size)
          return AVERROR_INVALIDDATA;
  
          return AVERROR_INVALIDDATA;
      }
  
 -    if ((err = aac_decode_frame_int(avctx, out, got_frame_ptr, &gb)) < 0)
 +    if ((err = aac_decode_frame_int(avctx, out, got_frame_ptr, &gb, avpkt)) < 0)
          return err;
  
      return muxlength;
@@@ -3070,40 -3027,6 +3162,40 @@@ static av_cold int latm_decode_init(AVC
      return ret;
  }
  
 +static void aacdec_init(AACContext *c)
 +{
 +    c->imdct_and_windowing                      = imdct_and_windowing;
 +    c->apply_ltp                                = apply_ltp;
 +    c->apply_tns                                = apply_tns;
 +    c->windowing_and_mdct_ltp                   = windowing_and_mdct_ltp;
 +    c->update_ltp                               = update_ltp;
 +
 +    if(ARCH_MIPS)
 +        ff_aacdec_init_mips(c);
 +}
 +/**
 + * AVOptions for Japanese DTV specific extensions (ADTS only)
 + */
 +#define AACDEC_FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
 +static const AVOption options[] = {
 +    {"dual_mono_mode", "Select the channel to decode for dual mono",
 +     offsetof(AACContext, force_dmono_mode), AV_OPT_TYPE_INT, {.i64=-1}, -1, 2,
 +     AACDEC_FLAGS, "dual_mono_mode"},
 +
 +    {"auto", "autoselection",            0, AV_OPT_TYPE_CONST, {.i64=-1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
 +    {"main", "Select Main/Left channel", 0, AV_OPT_TYPE_CONST, {.i64= 1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
 +    {"sub" , "Select Sub/Right channel", 0, AV_OPT_TYPE_CONST, {.i64= 2}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
 +    {"both", "Select both channels",     0, AV_OPT_TYPE_CONST, {.i64= 0}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
 +
 +    {NULL},
 +};
 +
 +static const AVClass aac_decoder_class = {
 +    .class_name = "AAC decoder",
 +    .item_name  = av_default_item_name,
 +    .option     = options,
 +    .version    = LIBAVUTIL_VERSION_INT,
 +};
  
  AVCodec ff_aac_decoder = {
      .name            = "aac",
      },
      .capabilities    = CODEC_CAP_CHANNEL_CONF | CODEC_CAP_DR1,
      .channel_layouts = aac_channel_layout,
 +    .flush = flush,
 +    .priv_class      = &aac_decoder_class,
  };
  
  /*
@@@ -3142,5 -3063,4 +3234,5 @@@ AVCodec ff_aac_latm_decoder = 
      },
      .capabilities    = CODEC_CAP_CHANNEL_CONF | CODEC_CAP_DR1,
      .channel_layouts = aac_channel_layout,
 +    .flush = flush,
  };