Release History & ChangeLog
Review the complete version history, library ABI updates, feature additions, and bug fixes for FAAC, FAAD, FAAM, and FAAR.
Unreleased
Unreleased15 changes Pending
- New libraries and tools: libfaad and faad (decoder), libfaam and faam (MP4 muxer, demuxer and tag editor) and libfaar and faar (sample rate converter); faac writes MP4 through libfaam and resamples through libfaar
- HE-AAC v2 encoding with Parametric Stereo behind -Dencoder-ps; stereo AUTO picks it for explicit bitrates up to the sample-rate dependent ceiling; -Dencoder-sbr=false builds an LC-only encoder
- libfaac ABI 3: faac_params takes a whole-stream bitrate with explicit ABR, VBR and CBR modes, channels, stereo_mode, stream_format (including MPEG-2 ADTS) and channel layouts; faac_encoder_info carries the AudioSpecificConfig; float input is unity full scale; faac_library_info reports SBR and PS through flags. Each shared library now has its own ABI version, separate from the release
- Dynamic range control: faac --drc <profile> writes dynamic_range_info from the input's K-weighted loudness (profiles: film, film-light, music, music-light, speech; --drc-ref-level sets the program level); libfaac gains drc_profile and drc_ref_level and FAAC_LIB_DRC, off with -Dencoder-drc=false. faad takes --drc-cut and --drc-boost in percent and --drc-target-level in dBFS; libfaad uses dBFS for drc_target_level and drc_ref_level, and faad -i prints the stream's reference level
- Eight-channel streams are signalled with a program config element in the AudioSpecificConfig and in every 32nd ADTS frame; faad and faam read them
- frontend: record active encoding settings (rate, cutoff, profile, M/S, TNS) in the MP4 encoder tag (©too) with --no-encoder-info to omit it; record resampling and HE profile in the tag; initialize console code page to UTF-8 on Windows; align option help columns; handle 5.0 and 7.1 channel ordering
- frontend tags: added generic typed metadata entries (faam_metadata_entry) to faam and faac, supporting lyrics (--lyrics, --lyrics-file), grouping (--grouping), copyright (--copyright), description (--description), work (--work), movement (--movement), and BPM (--bpm) tags, with ID3v1 genre text mapping
- frontend I/O & pipes: incremental WAV and RF64 header reading, float PCM support in either byte order, --faststart for MP4 moov positioning, hardened MP4 pipe handling, and error reporting on stream failure
- frontend CLI alignment: unified -v <level> verbosity control (-v0 quiet mode, -v1 progress updates, -v2 completion summaries) and aligned usage display across faac, faad, faam and faar; progress callbacks throttled to ~30 Hz with %7.1f bitrate formatting; name build options when compiled-out features are requested
- Win32 GUI (faacgui): ported to shared encoding engine with libfaam MP4 output, quality and stereo mode labels, and conditional HE-AAC options
- faad reports DAB+ support in FAAD_LIB_DAB; faac and faad name the build option when a stream or request needs a feature that was compiled out
- Encoder retunes: stereo masking and M/S selection, short-window onset targets, SBR envelopes and transient borders, and HE-AAC auto ceiling
- Documentation and man pages rewritten for libfaac, libfaad, libfaar and libfaam, with comprehensive tables for parameters, defaults, errors, and flags
- Build & tests: detect host byte order without config.h; add unit, integration, ABI, link and fuzz test coverage
- libfaad: pair and enhance SBR channels only for the element that filled them, so a change of element layout no longer reads uninitialized envelopes
2.2 (Sep 29, 2026)
2.2Sep 29, 202629 changes Released
- build: honor an explicit b_lto=false; drop __stdcall on x86 Windows
- Bump the ABI to 2: faac_params_init() takes the caller's struct size
- HE-AAC auto range 8-32 kbps per channel at 44.1 and 48 kHz (was 12-28), narrowing to 8-12 at 32 kHz; VBR up to -q 75 (was 60); HE-AAC v1 for multichannel layouts up to 8 channels, with one SBR fill element per SCE/CPE instead of one per frame
- CLI: faac gains
--profile,--bandwidth,--stereo-mode,--block-type,--mpeg-version,--stream-formatand--raw-pcm,--raw-rate,--raw-bits,--raw-channels,--raw-endian; faad gains--bit-depth/--sample-depth,--seek/--start-timeand--extract-adts. The old names remain as aliases.--stereo-modeand--block-typenow reject unknown values instead of reading them as 0 - Rate control: signed bit account for ABR; a real bit reservoir for CBR behind
--cbr - Refit the ABR bandwidth curve from a sweep: a wider core at 24-56 kbps stereo and every cutoff on the band grid reachable, where a double snap had left seven
- VBR codes at the top of the bandwidth curve (18750 Hz) instead of the full band;
-qand-bare exclusive;-qdocumented as a constant quantizer quality, 1..5000, without bitrate anchors that drift - SBR: reconstruction toward 20 kHz; noise floor -18 dB; log-spaced band table by rate; bs_stop_freq signals a k2 decoders actually accept; envelopes measured over the slots the decoder applies them to, coded in 3 dB steps, with two per frame without a transient from 17 kbps per channel
- Stereo: joint-stereo policy by rate; intensity on long windows below 40 kbps per channel, L/R on short windows below the crossover from 80; short-window grouping and masking targets reworked; the sparsity mute that zeroed a quiet unjoined channel's bands is gone; M/S codes the side channel instead of dropping it and quantizes both halves against the L/R level; long windows take it on every band from 32 kbps per channel (24 on HE-AAC), short windows and HE-AAC at 20-24 kbps per channel only below 1-2 kHz
- A right-channel intensity band over a left PNS band is coded as PNS, so decoders that apply intensity first don't play it silent
- TNS on by default; frames screened before LPC analysis
- Block switching: the HE core runs its own transient detector instead of following SBR's, and both cores judge a sub-block's attack against a running level instead of only its neighbour, so dense stationary material stops defaulting to short windows
- Quantizer: short blocks take the same loudness target as long ones instead of 0.45x coarser, so transient frames stop losing bands to PNS; from 56 kbps per channel the treble de-emphasis is steeper, so the low bands get the margin; bands far below the frame's energy are allowed coarser targets; kernels take band widths in quads and vectorize fully, and grouping band energy is summed in four lanes
- HUFF2: choose section codebooks jointly across each window group, accounting for both codeword and section-header costs
- Enforce the ISO/IEC 14496-3 per-channel frame ceiling and bitrate limits; map channel counts to the standard AudioSpecificConfig/ADTS channel configurations and reject non-standard counts
- PNS and the MPEG version are now resolved by the encoder instead of the caller:
faac_paramsdropspns_levelfor ause_pnsflag,faac_encoder_inforeports the resolvedmpeg_version, and an explicit MPEG-2 request silently upgrades to MPEG-4 for HE-AAC;faactakes--no-pnsin place of--pns <0..10> - frontend: MP4 output by default with detection from the extension; 24-bit packed PCM input; 64-bit mdat and duration; track language; UTF-8 and wide-character paths on CLI and Win32 GUI; iTunes gapless metadata (iTunSMPB); shared encoding engine and MP4 output in the GUI; GUI opens on ABR at 128 kbps; optional end-of-encode diagnostics; a PCM WAV could be read as float from an uninitialised header field; endian conversion utilities unified, fixing a WORDS_BIGENDIAN check that only worked because the macro happened to be undefined rather than 0; help text and the man page corrected throughout
- mp4write: container timing, HE-AAC sample rate declaration and gapless fixes; GUI PCM clipping fix
- HE-AAC: pad the pipeline delay to an even multiple of the core frame, so gapless-aware decoders trim the right sample count at both ends
- SBR: parameter resolution in VBR, tail drained on flush, psPresentFlag for mono, less per-frame work in the writer
- Pipeline draining during flush on short streams
- Fix a 64 kHz short-window scalefactor band width table that summed to 124 spectral lines instead of 128
- Build the lookup tables and FFT twiddle factors shared between encoder handles once per process instead of per open, so independent handles can be opened concurrently without racing each other's tables
- fft: replace the bit-reversed DIF kernel and its reorder pass with a self-sorting Stockham kernel that lands in natural order directly
- filtbank/channels: inline the window dispatch and simplify grouping bit accounting for vectorization
- Drop the never-selected KBD window from the filter bank
- Drop dead count mode from bitstream writer
- build: force-include config.h instead of per-file guards; drop the cold/noinline hints on the HE-AAC frame path so PGO and -Os/-O3 make the call instead of a fixed attribute
- frontend: show the git commit hash in
-h, the GUI, verbose logging, and the MP4 tag;-hreports the runtime libfaac version, not the compile-time one
2.1 (Aug 18, 2026)
2.1Aug 18, 20264 changes Released
- Honor ABI backward compatibility for faac_params
- SBR: align payload timing with core audio frames
- Add optional hard per-frame peak-bitrate limiter (
--cap-rate) - HUFF2: size both books of a codebook pair in one pass
2.0 (Jul 20, 2026)
2.0Jul 20, 202621 changes Released
- Remove obsolete pkg-config template
- Restrict LTO to the shared library only
- filtbank: Fix an out-of-bounds
memcpyinFilterBank()that usedFRAME_LENinstead ofBLOCK_LEN_LONGfor the overlap buffer copies
- Harden input parsing and guard against allocation failures.
- Replace the classic
faacEnc*C API with a newfaac_*API infaac.h: parameters supplied once tofaac_encoder_open(), uniformfaac_statuserror reporting, resolved-property queries, and library-owned AudioSpecificConfig. The legacyfaacEnc*surface andfaaccfg.hare removed; the encoder core they exposed is now internal. SONAME bumped to 1 (libfaac.so.1).faac.hnow definesFAAC_VERSION_MAJOR/MINOR/PATCH, tracking the SONAME, so callers can detect the new API at compile time (FAAC_VERSION_MAJOR >= 1). - frontend: Port
faacand the Win32 GUI to the new API; this fixes the AudioSpecificConfig memory leak on the MP4 output path. - Add HE-AAC v1 (AAC-LC core + Spectral Band Replication) encoding via
FAAC_OBJ_HE_AAC_V1, orFAAC_OBJ_AUTO, which picks LC or HE-AAC from the bitrate. The SBR core runs dual-rate (half-rate core, 2048-sample frame);faac_encoder_get_info()reports the full output rate and frame size so callers need no SBR-specific handling. CLI:--object-type lc|he-aac-v1|auto. - stereo: Add Mixed Mode joint stereo (
--joint 3) as the new default: per scale-factor band, picks IS above 5.5 kHz, M/S where channels are correlated, or L/R otherwise. Fix a midside band-silencing bug that produced L=R=0 on decode, guard against negative rounding before sqrt, and keep IS available at low sample rates. - quantize: Restore short-window masking penalty, floor masking targets in quiet bands, drop stale tonal scaling in bmask, and keep
global_gaina valid regular scalefactor -- fixing energy drops, quiet-band artifacts, and a decoder out-of-range error. - tns: Cap TNS filter order to 12 to fix AAC-LC decoder rejections and audio dropouts in FFmpeg/FAAD.
- Retire the never-implemented MAIN/SSR/LTP object types across filtbank, frame, and the frontend, and collapse the single-model psychoacoustic vtable into direct calls.
- Fix a lookahead regression that had truncated the encoder's lookahead to an effective 1-frame delay, causing pre-echo artifacts and broken stereo coherence; then simplify the lookahead into a unified per-channel FIFO and energy timeline, replacing the ad hoc sampleBuff/next*SampleBuff/overlapBuff/prevSamples buffers.
- Relicense: rewrite stereo, quantize, channels, bitstream, filtbank, tns, huffdata, huff2, and the MP4 output code as original work under LGPL-2.1-or-later, and drop the matching MPEG reference-code preamble from README.md, --license, and docs/. Every source file is now free software. Update the license header itself from GNU Library GPL to Lesser GPL wording.
- fft: Replace the radix-2 FFT with radix-4 decimation-in-frequency as the sole implementation and precompute MDCT twiddles, for ~18% faster encode versus the radix-2 baseline.
- Standardize libfaac on single-precision floating point: drop the
floating-pointMeson build option andfaac_real.h, and usefloat/sinf/cosf/sqrtfdirectly throughout the per-sample hot path. One-time init-time table generators (FFT/MDCT/SBR twiddles, window shapes, quantizer limits) keepdoubleprecision, where it's free. Benchmarked MOS-neutral versus the prior double-precision path. - blockswitch: Move short-window detection to the time domain.
- Performance passes: reuse a shared work buffer for filtbank's MDCT scratch, and optimize TNS and stereo IS-gate hot paths.
- frame: Buffer encoder input so any input chunk size works.
- bitstream: Stop embedding the libfaac version string.
- build: Fix compiler warnings and transition to C11.
- frontend: Add a
--creation-timeflag for configurable MP4 timestamps, vendor mingw-w64 wingetopt as a minimal-diff getopt fallback for MSVC builds, and keep TNS off by default in the GUI to match the CLI.
1.50 (Apr 16, 2026)
1.50Apr 16, 202622 changes Released
- Build quantize_sse library with hidden symbols
- Don't call
exit()from the library - Define some more
default_optionsin Meson build - Fix some warnings in
frontend/maingui.c - Default to
buildtype=releasein Meson build - Initialize
datavariable inhuffcode() - Remove the faulty
HAVE_STRCASECMPcheck and other pointless header checks - CI: Let Meson build set
CFLAGS
- Disallow PNS in MPEG-2 mode to match spec
- frontend: Change default to MPEG-4 as MPEG-2 is obsolete
- Add
max-channelsoption to changeMAX_CHANNELSfrom 64 - Fix PNS to stay on in
JOINT_MSfor low-bitrate accuracy - Replace redundant
cpe,sce, andlfeboolean flags inChannelInfowith anenum - Reduce
MAX_CHANNELSto 8 for ADTS compliance - tns: Prevent division-by-zero or instability on highly correlated signals
- Implement MOS-optimized bandwidth calculation
- Fine-tune rate controller to restore bitrate accuracy
- Fix channel-specific group metadata in joint-stereo
- Enable link-time optimization (LTO) in Meson build
- stereo: Fix undefined behaviour in intensity stereo for degenerate bands
- Fix scalefactor delta overflows to comply with AAC spec (ISO 14496-3)
- quantize: Pre-clamp scalefactor deltas to fix encoder/decoder mismatch
1.40 (Mar 17, 2026)
1.40Mar 17, 202627 changes Released
- Fix compilation with Visual Studio
- Fix SIMD calls
- Add meson as build system
- Meson: Install faac executable
- CI: fix artifact path
- Remove autoconf/automake build system
- Remove plugins stuff, unmaintained for decades
- Remove MSVC projects, deprecated in favour of meson
- Do not check for unused headers
- Generalize OS check in CI rule
- Remove redundant defines
- Make
faacguiusable again - Report library version on version mismatch
- Maintain library SONAME version 0.0.0
- Build both static and shared library by default
- Properly declare symbol visibility as hidden
- Add options to disable DRM and opt for single floating-point precision
- CI: add native MSVC build and fix Windows compatibility
- Remove dead code
- Optimize FFT reordering by combining real and imaginary passes
- Optimize FFT performance
- CI: update GitHub Actions and add Dependabot configuration
- Refactor quantizer for portable C and extensible SIMD dispatch
- Optimize memory allocation and unify MDCT implementation
- Optimize MDCT by removing conditional branches and hoisting logic
- Rrefactor the hot path for writing bits to the output stream
- Remove Digital Radio Mondiale (DRM) support
1.31.1 (Mar 03, 2025)
1.31.1Mar 03, 20253 changes Released
- Reduce autoconf requirement back down to 2.69
- Reformat configure.ac for the ac2ver.exe hack to work
- Upload Windows artifacts
1.31 (Feb 28, 2025)
1.31Feb 28, 202520 changes Released
- updated Visual Studio projects to VS 2019
- main.c : progress report keeps alignment when encoding a large file
- project/msvc : cleanup, fixes and changes
- frontend: fix out-of-root build
- add a pkg-config file
- avoid division by zero
- Remove #pragma pack from faacEncStruct (thanks Locutus of Borg)
- Reduce memory (thanks xnvi)
- Remove
BwpInfo bwpInfofromstruct CoderInfo - Remove
nextSampleBuff[]andnext2SampleBuff[]fromstruct faacEncStruct
- Remove
- tns: Initialize
rArray[]variable - update autoconf.ac and friends
- do not pass add-stdcall-alias option to clang
- always build both the regular and the DRM library
- fix cppcheck warnings
- add some basic CI
- fix compilation with clang on Windows
- Append INSTALL to README
- Add album artist and various sort order MP4 tags
- set libfaac library name to "faac" rather than "libfaac"
- Error C2065 (add #define _USE_MATH_DEFINES)
- Allow genre-id up to 255
1.30 (Oct 16, 2019)
1.30Oct 16, 201919 changes Released
- Fix Joint Stereo coding
- Code cleanup and compilation fixes
- Fix endianness conversion functions
- Fix compilation with GCC < 4.6
- Fix compilation on big endian systems
- Fix division by zero errors
- Fix compilation with GCC <= 4.7.3
- Change pointer type for proper arithmetics
- Fix logic error in compiler detection
- Revert back to some more generic SSE2 code
- Fix a memory leak
- Fix some cppcheck warnings in the Cfaac code
- Check index ranges before dereferencing book arrays (CVE-2018-19886)
- Clean up stdint.h header inclusions
- Consistently use stdint.h types
- Update Visual Studio 2017 projects
- Add stdint.h header inclusions
- Port over ac2ver tool from faad2 to generate PACKAGE_VERSION when compiling with Visual Studio
- Memory allocations redefined
1.29.9.2 (Nov 14, 2017)
1.29.9.2Nov 14, 20171 change Released
- fixed max MP4 bitrate calculation
1.29.9 (Nov 2, 2017)
1.29.9Nov 2, 20177 changes Released
- initial version of PNS coding
- Intensity Stereo coding
- more speed improvements
- finer bandwidth/cutoff setting (doesn't work with PNS)
- fixed more bugs
- rewritten mid/side coding
- fixed bug in blockswitch
1.29.8 (Oct 15, 2017)
1.29.8Oct 15, 201711 changes Released
- changed default mode to ABR 64kbps/channel
- implemented short windows grouping
- new huffman coder
- SSE quantizer
- modified functioning of ABR mode (-b option)
- improved autotools support
- allowed even higher bitrates, including ADTS
- framebuffer size bug fixed
- removed broken object types: Main and LTP
- some mp4 atoms fixed for better compalibility
- stdin seek bug fixed
1.29.7 (Aug 22, 2017)
1.29.7Aug 22, 20176 changes Released
- quantizer tweaked to better support high bitrates
- allow higher quality for mp4 files (-q 5000 max)
- removed mid frequency boost (it turned out useless)
- cutoff frequency adjusted to fully utilize upper band
- --help-long option removed, it was just an alias for -H
- -b option bug fixed
1.29.6 (Aug 18, 2017)
1.29.6Aug 18, 20171 change Released
- quality related bug fixed
1.29.5 (Aug 17, 2017)
1.29.5Aug 17, 20176 changes Released
- updated manpage
- check if output file exists; --overwrite option added
- help/usage options reorganized
- block switching is now tuned to match quality/bitrate
- give more quality to lower frequancies (less to highs)
- quantizer updated again
1.29.4 (Aug 14, 2017)
1.29.4Aug 14, 20176 changes Released
- rewritten quantizer: faster, diffrerent quality, different bitrates
- ftyp atom: set brands like itunes does, shoud be more compatible with picky tools
- new option(--tag) to add named tags (iTunes '----')
- faster and better short/long window type switch
- Don't build DRM(Digital Radio Mondiale) by default. Use ./configure --enable-drm to build DRM version.
- fixed bugs
- rounding in QuantizeReflectionCoeffs (tns.c)
- use +60 value for scalefactor.
- use clipped diff instead of original value (huffman.c)
1.29.3 (Jul 21, 2017)
1.29.3Jul 21, 20173 changes Released
- MP4 tag options improved
- fixed MP4 'meta' atom bug
- new option to set verbosity (-v0 to silence output)
1.29.2 (Jul 17, 2017)
1.29.2Jul 17, 20171 change Released
- new mp4 output code
1.29 (Jul 4, 2017)
1.29Jul 4, 20171 change Released
- various patches applied and bugs fixed
1.28 (Feb 5, 2009)
1.28Feb 5, 20095 changes Released
- Prevent out of range scalefactors
- Updated to latest mpeg4ip mp4 file format library
- Added -s option to make the encoder output optimized mp4 layout
- Improved JPEG detection for album art
- Lot's of compilation issues solved