FFmpeg input: Add support for libfdk-aac, which will be used to support USAC and AAC on 10.14.x and older

CQTexperiment
Christopher Snowhill 2022-01-13 04:11:38 -08:00
parent 73348b1616
commit bfa178f4e2
26 changed files with 5088 additions and 7 deletions

View File

@ -156,6 +156,7 @@
839DA7CF274A2D4C001B18E5 /* NSDictionary+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = 839DA7CE274A2D4C001B18E5 /* NSDictionary+Merge.m */; };
83A360B220E4E81D00192DAB /* Flac.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8303A30C20E4E3D000951EF8 /* Flac.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
83B06704180D579E008E3612 /* MIDI.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83B066A1180D5669008E3612 /* MIDI.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
83B72E3B279045B7006007A3 /* libfdk-aac.2.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83B72E2A279044F6006007A3 /* libfdk-aac.2.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
83BC5AB220E4C87100631CD4 /* DualWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BC5AB020E4C87100631CD4 /* DualWindow.m */; };
83BC5ABF20E4CE7A00631CD4 /* InfoInspector.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17D1B0D00F6320EA00694C57 /* InfoInspector.xib */; };
83BC5AC020E4CE7D00631CD4 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17342A980D5FD20B00E8D854 /* MainMenu.xib */; };
@ -730,6 +731,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
83B72E3B279045B7006007A3 /* libfdk-aac.2.dylib in CopyFiles */,
830596EE277F05EE00EBFAAE /* Vorbis.framework in CopyFiles */,
83059690277F04AB00EBFAAE /* Ogg.framework in CopyFiles */,
8305963C277F013200EBFAAE /* File_Extractor.framework in CopyFiles */,
@ -973,6 +975,7 @@
839DA7CE274A2D4C001B18E5 /* NSDictionary+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Merge.m"; sourceTree = "<group>"; };
83AB9031237CEFD300A433D5 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };
83B0669C180D5668008E3612 /* MIDI.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MIDI.xcodeproj; path = Plugins/MIDI/MIDI.xcodeproj; sourceTree = "<group>"; };
83B72E2A279044F6006007A3 /* libfdk-aac.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libfdk-aac.2.dylib"; path = "ThirdParty/fdk-aac/lib/libfdk-aac.2.dylib"; sourceTree = "<group>"; };
83BC5AB020E4C87100631CD4 /* DualWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DualWindow.m; path = Window/DualWindow.m; sourceTree = "<group>"; };
83BC5AB120E4C87100631CD4 /* DualWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DualWindow.h; path = Window/DualWindow.h; sourceTree = "<group>"; };
83BC5AB420E4C91100631CD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/InfoInspector.xib; sourceTree = "<group>"; };
@ -1093,6 +1096,7 @@
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
isa = PBXGroup;
children = (
83B72E2A279044F6006007A3 /* libfdk-aac.2.dylib */,
830596DA277F05E200EBFAAE /* Vorbis.xcodeproj */,
83059684277F049600EBFAAE /* Ogg.xcodeproj */,
83059634277F011100EBFAAE /* File_Extractor.xcodeproj */,

View File

@ -598,6 +598,7 @@
83AFABBE23795202002F3947 /* isb.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AFABBB23795202002F3947 /* isb.c */; };
83B46FD12707FB2100847FC9 /* at3plus_decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B46FCD2707FB2100847FC9 /* at3plus_decoder.h */; };
83B46FD52707FB9A00847FC9 /* endianness.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B46FD42707FB9A00847FC9 /* endianness.h */; };
83B72E3A27904589006007A3 /* libfdk-aac.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B72E342790452C006007A3 /* libfdk-aac.2.dylib */; };
83BAFB6C19F45EB3005DAB60 /* bfstm.c in Sources */ = {isa = PBXBuildFile; fileRef = 83BAFB6B19F45EB3005DAB60 /* bfstm.c */; };
83C7280F22BC893D00678B4A /* xwb_xsb.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C727FB22BC893800678B4A /* xwb_xsb.h */; };
83C7281022BC893D00678B4A /* nps.c in Sources */ = {isa = PBXBuildFile; fileRef = 83C727FC22BC893900678B4A /* nps.c */; };
@ -1416,6 +1417,7 @@
83AFABBB23795202002F3947 /* isb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = isb.c; sourceTree = "<group>"; };
83B46FCD2707FB2100847FC9 /* at3plus_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = at3plus_decoder.h; sourceTree = "<group>"; };
83B46FD42707FB9A00847FC9 /* endianness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = endianness.h; sourceTree = "<group>"; };
83B72E342790452C006007A3 /* libfdk-aac.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libfdk-aac.2.dylib"; path = "../../ThirdParty/fdk-aac/lib/libfdk-aac.2.dylib"; sourceTree = "<group>"; };
83BAFB6B19F45EB3005DAB60 /* bfstm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bfstm.c; sourceTree = "<group>"; };
83C727FB22BC893800678B4A /* xwb_xsb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xwb_xsb.h; sourceTree = "<group>"; };
83C727FC22BC893900678B4A /* nps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nps.c; sourceTree = "<group>"; };
@ -1498,6 +1500,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
83B72E3A27904589006007A3 /* libfdk-aac.2.dylib in Frameworks */,
83E22FC32772FD16000015EE /* AudioToolbox.framework in Frameworks */,
83E22FC12772FD06000015EE /* libbz2.tbd in Frameworks */,
838BDB7F1D3B1FD10022CA6F /* Cocoa.framework in Frameworks */,
@ -1584,6 +1587,7 @@
836F6B3E18BDB8880095E648 /* Other Frameworks */ = {
isa = PBXGroup;
children = (
83B72E342790452C006007A3 /* libfdk-aac.2.dylib */,
830595E1277EFE4E00EBFAAE /* libavcodec.58.dylib */,
830595E3277EFE4E00EBFAAE /* libavformat.58.dylib */,
830595E4277EFE4E00EBFAAE /* libavutil.56.dylib */,
@ -3267,6 +3271,7 @@
LIBRARY_SEARCH_PATHS = (
../../ThirdParty/ffmpeg/lib,
../../ThirdParty/speex,
"../../ThirdParty/fdk-aac/lib",
);
MACOSX_DEPLOYMENT_TARGET = 10.12;
ONLY_ACTIVE_ARCH = YES;
@ -3339,6 +3344,7 @@
LIBRARY_SEARCH_PATHS = (
../../ThirdParty/ffmpeg/lib,
../../ThirdParty/speex,
"../../ThirdParty/fdk-aac/lib",
);
MACOSX_DEPLOYMENT_TARGET = 10.12;
SDKROOT = macosx;

View File

@ -20,6 +20,7 @@
8352D49B1CDDB8B2009D16AA /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8352D49A1CDDB8B2009D16AA /* VideoToolbox.framework */; };
8352D49D1CDDB8C0009D16AA /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8352D49C1CDDB8C0009D16AA /* CoreMedia.framework */; };
8352D49F1CDDB8D7009D16AA /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8352D49E1CDDB8D7009D16AA /* CoreVideo.framework */; };
83B72E3927904557006007A3 /* libfdk-aac.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B72E3827904557006007A3 /* libfdk-aac.2.dylib */; };
83E22FC62772FD32000015EE /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 83E22FC52772FD32000015EE /* libbz2.tbd */; };
83E22FC82772FD3A000015EE /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83E22FC72772FD3A000015EE /* AudioToolbox.framework */; };
8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
@ -56,6 +57,7 @@
8352D49C1CDDB8C0009D16AA /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
8352D49E1CDDB8D7009D16AA /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; };
8384913818081F6C00E7332D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../Utils/Logging.h; sourceTree = "<group>"; };
83B72E3827904557006007A3 /* libfdk-aac.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libfdk-aac.2.dylib"; path = "../../ThirdParty/fdk-aac/lib/libfdk-aac.2.dylib"; sourceTree = "<group>"; };
83E22FC52772FD32000015EE /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; };
83E22FC72772FD3A000015EE /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
8D5B49B6048680CD000E48DA /* FFMPEG.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FFMPEG.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
@ -71,6 +73,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
83B72E3927904557006007A3 /* libfdk-aac.2.dylib in Frameworks */,
83E22FC82772FD3A000015EE /* AudioToolbox.framework in Frameworks */,
830595DE277EFDE000EBFAAE /* libavutil.56.dylib in Frameworks */,
83E22FC62772FD32000015EE /* libbz2.tbd in Frameworks */,
@ -108,6 +111,7 @@
089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
83B72E3827904557006007A3 /* libfdk-aac.2.dylib */,
830595DB277EFDE000EBFAAE /* libavcodec.58.dylib */,
830595DC277EFDE000EBFAAE /* libavformat.58.dylib */,
830595DA277EFDE000EBFAAE /* libavutil.56.dylib */,
@ -336,7 +340,10 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = ../../ThirdParty/ffmpeg/include;
LIBRARY_SEARCH_PATHS = ../../ThirdParty/ffmpeg/lib;
LIBRARY_SEARCH_PATHS = (
../../ThirdParty/ffmpeg/lib,
"../../ThirdParty/fdk-aac/lib",
);
MACOSX_DEPLOYMENT_TARGET = 10.12;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
@ -377,7 +384,10 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = ../../ThirdParty/ffmpeg/include;
LIBRARY_SEARCH_PATHS = ../../ThirdParty/ffmpeg/lib;
LIBRARY_SEARCH_PATHS = (
../../ThirdParty/ffmpeg/lib,
"../../ThirdParty/fdk-aac/lib",
);
MACOSX_DEPLOYMENT_TARGET = 10.12;
SDKROOT = macosx;
SYMROOT = ../../build;

View File

@ -191,6 +191,7 @@ int lockmgr_callback(void ** mutex, enum AVLockOp op)
enum AVCodecID codec_id = codecCtx->codec_id;
AVCodec * codec = NULL;
AVDictionary * dict = NULL;
if (@available(macOS 10.15, *))
{
@ -234,7 +235,8 @@ int lockmgr_callback(void ** mutex, enum AVLockOp op)
codec = avcodec_find_decoder_by_name("mp1float");
break;
case AV_CODEC_ID_AAC:
codec = avcodec_find_decoder_by_name("aac");
codec = avcodec_find_decoder_by_name("libfdk_aac");
av_dict_set_int(&dict, "drc_level", -2, 0); // disable DRC
break;
case AV_CODEC_ID_ALAC:
codec = avcodec_find_decoder_by_name("alac");
@ -272,16 +274,20 @@ int lockmgr_callback(void ** mutex, enum AVLockOp op)
if (!codec) {
ALog(@"codec not found");
av_dict_free(&dict);
return NO;
}
if ( (errcode = avcodec_open2(codecCtx, codec, NULL)) < 0) {
if ( (errcode = avcodec_open2(codecCtx, codec, &dict)) < 0) {
char errDescr[4096];
av_dict_free(&dict);
av_strerror(errcode, errDescr, 4096);
ALog(@"could not open codec, errcode = %d, error = %s", errcode, errDescr);
return NO;
}
av_dict_free(&dict);
lastDecodedFrame = av_frame_alloc();
av_frame_unref(lastDecodedFrame);
lastReadPacket = malloc(sizeof(AVPacket));

View File

@ -18,6 +18,7 @@ export PATH=/opt/homebrew/bin:$PATH
--incdir="$1/include"\
--datadir="$1/share"\
--pkgconfigdir="$1/pkgconfig"\
--enable-nonfree --enable-libfdk-aac\
--enable-pic --enable-gpl --disable-doc --disable-ffplay\
--disable-ffprobe --disable-avdevice --disable-ffmpeg\
--disable-postproc --disable-avfilter\
@ -26,7 +27,7 @@ export PATH=/opt/homebrew/bin:$PATH
--enable-swresample\
--enable-parser=ac3,mpegaudio,xma,vorbis,opus\
--enable-demuxer=ac3,asf,xwma,mov,oma,ogg,tak,dsf,wav,w64,aac,dts,dtshd,eac3,mp3,bink,flac,msf,xmv,caf,ape,smacker,pcm_s8,spdif,mpc,mpc8,rm,matroska\
--enable-decoder=ac3,ac3_t,eac3,eac3_at,wmapro,wmav1,wmav2,wmavoice,wmalossless,xma1,xma2,dca,tak,dsd_lsbf,dsd_lsbf_planar,dsd_mbf,dsd_msbf_planar,aac,aac_at,atrac3,atrac3p,mp3float,mp3_at,mp2float,mp2_at,mp1float,mp1_at,bink,binkaudio_dct,binkaudio_rdft,flac,pcm_s16be,pcm_s16be_planar,pcm_s16le,pcm_s16le_planar,vorbis,ape,adpcm_ima_qt,smackaud,opus,pcm_s8,pcm_s8_planar,mpc7,mpc8,alac,alac_at,adpcm_ima_dk3,adpcm_ima_dk4,cook\
--enable-decoder=ac3,ac3_t,eac3,eac3_at,wmapro,wmav1,wmav2,wmavoice,wmalossless,xma1,xma2,dca,tak,dsd_lsbf,dsd_lsbf_planar,dsd_mbf,dsd_msbf_planar,aac,aac_at,libfdk_aac,atrac3,atrac3p,mp3float,mp3_at,mp2float,mp2_at,mp1float,mp1_at,bink,binkaudio_dct,binkaudio_rdft,flac,pcm_s16be,pcm_s16be_planar,pcm_s16le,pcm_s16le_planar,vorbis,ape,adpcm_ima_qt,smackaud,opus,pcm_s8,pcm_s8_planar,mpc7,mpc8,alac,alac_at,adpcm_ima_dk3,adpcm_ima_dk4,cook\
--disable-parser=mpeg4video,h263\
--disable-decoder=mpeg2video,h263,h264,mpeg1video,mpeg2video,mpeg4,hevc,vp9\
--disable-version3

View File

@ -19,6 +19,8 @@ LIBS="libavcodec libavformat libavutil libswresample"
BASEDIR=$(dirname "$0")
COG_FFMPEG_PREFIX="$BASEDIR/../ThirdParty/ffmpeg"
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:"$BASEDIR/../ThirdParty/fdk-aac/lib/pkgconfig"
for arch in $ARCHS; do
info "Building FFmpeg for $arch"
$BASEDIR/ffmpeg-build-$arch.sh $COG_FFMPEG_PREFIX

View File

@ -16,6 +16,7 @@ export PATH=/usr/local/bin:$PATH
--incdir="$1/include"\
--datadir="$1/share"\
--pkgconfigdir="$1/pkgconfig"\
--enable-nonfree --enable-libfdk-aac\
--enable-pic --enable-gpl --disable-doc --disable-ffplay\
--disable-ffprobe --disable-avdevice --disable-ffmpeg\
--disable-postproc --disable-avfilter\
@ -24,7 +25,7 @@ export PATH=/usr/local/bin:$PATH
--enable-swresample\
--enable-parser=ac3,mpegaudio,xma,vorbis,opus\
--enable-demuxer=ac3,asf,xwma,mov,oma,ogg,tak,dsf,wav,w64,aac,dts,dtshd,eac3,mp3,bink,flac,msf,xmv,caf,ape,smacker,pcm_s8,spdif,mpc,mpc8,rm,matroska\
--enable-decoder=ac3,ac3_t,eac3,eac3_at,wmapro,wmav1,wmav2,wmavoice,wmalossless,xma1,xma2,dca,tak,dsd_lsbf,dsd_lsbf_planar,dsd_mbf,dsd_msbf_planar,aac,aac_at,atrac3,atrac3p,mp3float,mp3_at,mp2float,mp2_at,mp1float,mp1_at,bink,binkaudio_dct,binkaudio_rdft,flac,pcm_s16be,pcm_s16be_planar,pcm_s16le,pcm_s16le_planar,vorbis,ape,adpcm_ima_qt,smackaud,opus,pcm_s8,pcm_s8_planar,mpc7,mpc8,alac,alac_at,adpcm_ima_dk3,adpcm_ima_dk4,cook\
--enable-decoder=ac3,ac3_t,eac3,eac3_at,wmapro,wmav1,wmav2,wmavoice,wmalossless,xma1,xma2,dca,tak,dsd_lsbf,dsd_lsbf_planar,dsd_mbf,dsd_msbf_planar,aac,aac_at,libfdk_aac,atrac3,atrac3p,mp3float,mp3_at,mp2float,mp2_at,mp1float,mp1_at,bink,binkaudio_dct,binkaudio_rdft,flac,pcm_s16be,pcm_s16be_planar,pcm_s16le,pcm_s16le_planar,vorbis,ape,adpcm_ima_qt,smackaud,opus,pcm_s8,pcm_s8_planar,mpc7,mpc8,alac,alac_at,adpcm_ima_dk3,adpcm_ima_dk4,cook\
--disable-parser=mpeg4video,h263\
--disable-decoder=mpeg2video,h263,h264,mpeg1video,mpeg2video,mpeg4,hevc,vp9\
--disable-version3

12
ThirdParty/fdk-aac/README.md vendored Normal file
View File

@ -0,0 +1,12 @@
This was built with my modified FDK-AAC from:
https://gitlab.com/kode54/fdk-aac.git
Which was only slightly modified from upstream from here:
https://github.com/mstorsjo/fdk-aac.git
Using the following commandline:
env CFLAGS="-arch x86_64 -arch arm64 -fPIC -isysroot $(xcode-select -p)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -mmacosx-version-min=10.12" CXXFLAGS="-arch x86_64 -arch arm64 -fPIC -isysroot $(xcode-select -p)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -mmacosx-version-min=10.12" LDFLAGS="-arch x86_64 -arch arm64 -mmacosx-version-min=10.12" ./configure --prefix=$(COG_REPO_DIR)/ThirdParty/fdk-aac
make -j8

View File

@ -0,0 +1,813 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
scheme for digital audio. This FDK AAC Codec software is intended to be used on
a wide variety of Android devices.
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
general perceptual audio codecs. AAC-ELD is considered the best-performing
full-bandwidth communications codec by independent studies and is widely
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
specifications.
Patent licenses for necessary patent claims for the FDK AAC Codec (including
those of Fraunhofer) may be obtained through Via Licensing
(www.vialicensing.com) or through the respective patent owners individually for
the purpose of encoding or decoding bit streams in products that are compliant
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
Android devices already license these patent claims through Via Licensing or
directly from the patent owners, and therefore FDK AAC Codec software may
already be covered under those patent licenses when it is used for those
licensed purposes only.
Commercially-licensed AAC software libraries, including floating-point versions
with enhanced sound quality, are also available from Fraunhofer. Users are
encouraged to check the Fraunhofer website for additional applications
information and documentation.
2. COPYRIGHT LICENSE
Redistribution and use in source and binary forms, with or without modification,
are permitted without payment of copyright license fees provided that you
satisfy the following conditions:
You must retain the complete text of this software license in redistributions of
the FDK AAC Codec or your modifications thereto in source code form.
You must retain the complete text of this software license in the documentation
and/or other materials provided with redistributions of the FDK AAC Codec or
your modifications thereto in binary form. You must make available free of
charge copies of the complete source code of the FDK AAC Codec and your
modifications thereto to recipients of copies in binary form.
The name of Fraunhofer may not be used to endorse or promote products derived
from this library without prior written permission.
You may not charge copyright license fees for anyone to use, copy or distribute
the FDK AAC Codec software or your modifications thereto.
Your modified versions of the FDK AAC Codec must carry prominent notices stating
that you changed the software and the date of any change. For modified versions
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
AAC Codec Library for Android."
3. NO PATENT LICENSE
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
Fraunhofer provides no warranty of patent non-infringement with respect to this
software.
You may use this FDK AAC Codec software or modifications thereto only for
purposes that are authorized by appropriate patent licenses.
4. DISCLAIMER
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
including but not limited to the implied warranties of merchantability and
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
or consequential damages, including but not limited to procurement of substitute
goods or services; loss of use, data, or profits, or business interruption,
however caused and on any theory of liability, whether in contract, strict
liability, or tort (including negligence), arising in any way out of the use of
this software, even if advised of the possibility of such damage.
5. CONTACT INFORMATION
Fraunhofer Institute for Integrated Circuits IIS
Attention: Audio and Multimedia Departments - FDK AAC LL
Am Wolfsmantel 33
91058 Erlangen, Germany
www.iis.fraunhofer.de/amm
amm-info@iis.fraunhofer.de
----------------------------------------------------------------------------- */
/************************* System integration library **************************
Author(s): Manuel Jander
Description:
*******************************************************************************/
/** \file FDK_audio.h
* \brief Global audio struct and constant definitions.
*/
#ifndef FDK_AUDIO_H
#define FDK_AUDIO_H
#include "machine_type.h"
#include "genericStds.h"
#include "syslib_channelMapDescr.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* File format identifiers.
*/
typedef enum {
FF_UNKNOWN = -1, /**< Unknown format. */
FF_RAW = 0, /**< No container, bit stream data conveyed "as is". */
FF_MP4_3GPP = 3, /**< 3GPP file format. */
FF_MP4_MP4F = 4, /**< MPEG-4 File format. */
FF_RAWPACKETS = 5 /**< Proprietary raw packet file. */
} FILE_FORMAT;
/**
* Transport type identifiers.
*/
typedef enum {
TT_UNKNOWN = -1, /**< Unknown format. */
TT_MP4_RAW = 0, /**< "as is" access units (packet based since there is
obviously no sync layer) */
TT_MP4_ADIF = 1, /**< ADIF bitstream format. */
TT_MP4_ADTS = 2, /**< ADTS bitstream format. */
TT_MP4_LATM_MCP1 = 6, /**< Audio Mux Elements with muxConfigPresent = 1 */
TT_MP4_LATM_MCP0 = 7, /**< Audio Mux Elements with muxConfigPresent = 0, out
of band StreamMuxConfig */
TT_MP4_LOAS = 10, /**< Audio Sync Stream. */
TT_DRM = 12 /**< Digital Radio Mondial (DRM30/DRM+) bitstream format. */
} TRANSPORT_TYPE;
#define TT_IS_PACKET(x) \
(((x) == TT_MP4_RAW) || ((x) == TT_DRM) || ((x) == TT_MP4_LATM_MCP0) || \
((x) == TT_MP4_LATM_MCP1))
/**
* Audio Object Type definitions.
*/
typedef enum {
AOT_NONE = -1,
AOT_NULL_OBJECT = 0,
AOT_AAC_MAIN = 1, /**< Main profile */
AOT_AAC_LC = 2, /**< Low Complexity object */
AOT_AAC_SSR = 3,
AOT_AAC_LTP = 4,
AOT_SBR = 5,
AOT_AAC_SCAL = 6,
AOT_TWIN_VQ = 7,
AOT_CELP = 8,
AOT_HVXC = 9,
AOT_RSVD_10 = 10, /**< (reserved) */
AOT_RSVD_11 = 11, /**< (reserved) */
AOT_TTSI = 12, /**< TTSI Object */
AOT_MAIN_SYNTH = 13, /**< Main Synthetic object */
AOT_WAV_TAB_SYNTH = 14, /**< Wavetable Synthesis object */
AOT_GEN_MIDI = 15, /**< General MIDI object */
AOT_ALG_SYNTH_AUD_FX = 16, /**< Algorithmic Synthesis and Audio FX object */
AOT_ER_AAC_LC = 17, /**< Error Resilient(ER) AAC Low Complexity */
AOT_RSVD_18 = 18, /**< (reserved) */
AOT_ER_AAC_LTP = 19, /**< Error Resilient(ER) AAC LTP object */
AOT_ER_AAC_SCAL = 20, /**< Error Resilient(ER) AAC Scalable object */
AOT_ER_TWIN_VQ = 21, /**< Error Resilient(ER) TwinVQ object */
AOT_ER_BSAC = 22, /**< Error Resilient(ER) BSAC object */
AOT_ER_AAC_LD = 23, /**< Error Resilient(ER) AAC LowDelay object */
AOT_ER_CELP = 24, /**< Error Resilient(ER) CELP object */
AOT_ER_HVXC = 25, /**< Error Resilient(ER) HVXC object */
AOT_ER_HILN = 26, /**< Error Resilient(ER) HILN object */
AOT_ER_PARA = 27, /**< Error Resilient(ER) Parametric object */
AOT_RSVD_28 = 28, /**< might become SSC */
AOT_PS = 29, /**< PS, Parametric Stereo (includes SBR) */
AOT_MPEGS = 30, /**< MPEG Surround */
AOT_ESCAPE = 31, /**< Signal AOT uses more than 5 bits */
AOT_MP3ONMP4_L1 = 32, /**< MPEG-Layer1 in mp4 */
AOT_MP3ONMP4_L2 = 33, /**< MPEG-Layer2 in mp4 */
AOT_MP3ONMP4_L3 = 34, /**< MPEG-Layer3 in mp4 */
AOT_RSVD_35 = 35, /**< might become DST */
AOT_RSVD_36 = 36, /**< might become ALS */
AOT_AAC_SLS = 37, /**< AAC + SLS */
AOT_SLS = 38, /**< SLS */
AOT_ER_AAC_ELD = 39, /**< AAC Enhanced Low Delay */
AOT_USAC = 42, /**< USAC */
AOT_SAOC = 43, /**< SAOC */
AOT_LD_MPEGS = 44, /**< Low Delay MPEG Surround */
/* Pseudo AOTs */
AOT_MP2_AAC_LC = 129, /**< Virtual AOT MP2 Low Complexity profile */
AOT_MP2_SBR = 132, /**< Virtual AOT MP2 Low Complexity Profile with SBR */
AOT_DRM_AAC = 143, /**< Virtual AOT for DRM (ER-AAC-SCAL without SBR) */
AOT_DRM_SBR = 144, /**< Virtual AOT for DRM (ER-AAC-SCAL with SBR) */
AOT_DRM_MPEG_PS =
145, /**< Virtual AOT for DRM (ER-AAC-SCAL with SBR and MPEG-PS) */
AOT_DRM_SURROUND =
146, /**< Virtual AOT for DRM Surround (ER-AAC-SCAL (+SBR) +MPS) */
AOT_DRM_USAC = 147 /**< Virtual AOT for DRM with USAC */
} AUDIO_OBJECT_TYPE;
#define CAN_DO_PS(aot) \
((aot) == AOT_AAC_LC || (aot) == AOT_SBR || (aot) == AOT_PS || \
(aot) == AOT_ER_BSAC || (aot) == AOT_DRM_AAC)
#define IS_USAC(aot) ((aot) == AOT_USAC)
#define IS_LOWDELAY(aot) ((aot) == AOT_ER_AAC_LD || (aot) == AOT_ER_AAC_ELD)
/** Channel Mode ( 1-7 equals MPEG channel configurations, others are
* arbitrary). */
typedef enum {
MODE_INVALID = -1,
MODE_UNKNOWN = 0,
MODE_1 = 1, /**< C */
MODE_2 = 2, /**< L+R */
MODE_1_2 = 3, /**< C, L+R */
MODE_1_2_1 = 4, /**< C, L+R, Rear */
MODE_1_2_2 = 5, /**< C, L+R, LS+RS */
MODE_1_2_2_1 = 6, /**< C, L+R, LS+RS, LFE */
MODE_1_2_2_2_1 = 7, /**< C, LC+RC, L+R, LS+RS, LFE */
MODE_6_1 = 11, /**< C, L+R, LS+RS, Crear, LFE */
MODE_7_1_BACK = 12, /**< C, L+R, LS+RS, Lrear+Rrear, LFE */
MODE_7_1_TOP_FRONT = 14, /**< C, L+R, LS+RS, LFE, Ltop+Rtop */
MODE_7_1_REAR_SURROUND = 33, /**< C, L+R, LS+RS, Lrear+Rrear, LFE */
MODE_7_1_FRONT_CENTER = 34, /**< C, LC+RC, L+R, LS+RS, LFE */
MODE_212 = 128 /**< 212 configuration, used in ELDv2 */
} CHANNEL_MODE;
/**
* Speaker description tags.
* Do not change the enumeration values unless it keeps the following
* segmentation:
* - Bit 0-3: Horizontal postion (0: none, 1: front, 2: side, 3: back, 4: lfe)
* - Bit 4-7: Vertical position (0: normal, 1: top, 2: bottom)
*/
typedef enum {
ACT_NONE = 0x00,
ACT_FRONT = 0x01, /*!< Front speaker position (at normal height) */
ACT_SIDE = 0x02, /*!< Side speaker position (at normal height) */
ACT_BACK = 0x03, /*!< Back speaker position (at normal height) */
ACT_LFE = 0x04, /*!< Low frequency effect speaker postion (front) */
ACT_TOP =
0x10, /*!< Top speaker area (for combination with speaker positions) */
ACT_FRONT_TOP = 0x11, /*!< Top front speaker = (ACT_FRONT|ACT_TOP) */
ACT_SIDE_TOP = 0x12, /*!< Top side speaker = (ACT_SIDE |ACT_TOP) */
ACT_BACK_TOP = 0x13, /*!< Top back speaker = (ACT_BACK |ACT_TOP) */
ACT_BOTTOM =
0x20, /*!< Bottom speaker area (for combination with speaker positions) */
ACT_FRONT_BOTTOM = 0x21, /*!< Bottom front speaker = (ACT_FRONT|ACT_BOTTOM) */
ACT_SIDE_BOTTOM = 0x22, /*!< Bottom side speaker = (ACT_SIDE |ACT_BOTTOM) */
ACT_BACK_BOTTOM = 0x23 /*!< Bottom back speaker = (ACT_BACK |ACT_BOTTOM) */
} AUDIO_CHANNEL_TYPE;
typedef enum {
SIG_UNKNOWN = -1,
SIG_IMPLICIT = 0,
SIG_EXPLICIT_BW_COMPATIBLE = 1,
SIG_EXPLICIT_HIERARCHICAL = 2
} SBR_PS_SIGNALING;
/**
* Audio Codec flags.
*/
#define AC_ER_VCB11 \
0x000001 /*!< aacSectionDataResilienceFlag flag (from ASC): 1 means use \
virtual codebooks */
#define AC_ER_RVLC \
0x000002 /*!< aacSpectralDataResilienceFlag flag (from ASC): 1 means use \
huffman codeword reordering */
#define AC_ER_HCR \
0x000004 /*!< aacSectionDataResilienceFlag flag (from ASC): 1 means use \
virtual codebooks */
#define AC_SCALABLE 0x000008 /*!< AAC Scalable*/
#define AC_ELD 0x000010 /*!< AAC-ELD */
#define AC_LD 0x000020 /*!< AAC-LD */
#define AC_ER 0x000040 /*!< ER syntax */
#define AC_BSAC 0x000080 /*!< BSAC */
#define AC_USAC 0x000100 /*!< USAC */
#define AC_RSV603DA 0x000200 /*!< RSVD60 3D audio */
#define AC_HDAAC 0x000400 /*!< HD-AAC */
#define AC_RSVD50 0x004000 /*!< Rsvd50 */
#define AC_SBR_PRESENT 0x008000 /*!< SBR present flag (from ASC) */
#define AC_SBRCRC \
0x010000 /*!< SBR CRC present flag. Only relevant for AAC-ELD for now. */
#define AC_PS_PRESENT 0x020000 /*!< PS present flag (from ASC or implicit) */
#define AC_MPS_PRESENT \
0x040000 /*!< MPS present flag (from ASC or implicit) \
*/
#define AC_DRM 0x080000 /*!< DRM bit stream syntax */
#define AC_INDEP 0x100000 /*!< Independency flag */
#define AC_MPEGD_RES 0x200000 /*!< MPEG-D residual individual channel data. */
#define AC_SAOC_PRESENT 0x400000 /*!< SAOC Present Flag */
#define AC_DAB 0x800000 /*!< DAB bit stream syntax */
#define AC_ELD_DOWNSCALE 0x1000000 /*!< ELD Downscaled playout */
#define AC_LD_MPS 0x2000000 /*!< Low Delay MPS. */
#define AC_DRC_PRESENT \
0x4000000 /*!< Dynamic Range Control (DRC) data found. \
*/
#define AC_USAC_SCFGI3 \
0x8000000 /*!< USAC flag: If stereoConfigIndex is 3 the flag is set. */
/**
* Audio Codec flags (reconfiguration).
*/
#define AC_CM_DET_CFG_CHANGE \
0x000001 /*!< Config mode signalizes the callback to work in config change \
detection mode */
#define AC_CM_ALLOC_MEM \
0x000002 /*!< Config mode signalizes the callback to work in memory \
allocation mode */
/**
* Audio Codec flags (element specific).
*/
#define AC_EL_USAC_TW 0x000001 /*!< USAC time warped filter bank is active */
#define AC_EL_USAC_NOISE 0x000002 /*!< USAC noise filling is active */
#define AC_EL_USAC_ITES 0x000004 /*!< USAC SBR inter-TES tool is active */
#define AC_EL_USAC_PVC \
0x000008 /*!< USAC SBR predictive vector coding tool is active */
#define AC_EL_USAC_MPS212 0x000010 /*!< USAC MPS212 tool is active */
#define AC_EL_USAC_LFE 0x000020 /*!< USAC element is LFE */
#define AC_EL_USAC_CP_POSSIBLE \
0x000040 /*!< USAC may use Complex Stereo Prediction in this channel element \
*/
#define AC_EL_ENHANCED_NOISE 0x000080 /*!< Enhanced noise filling*/
#define AC_EL_IGF_AFTER_TNS 0x000100 /*!< IGF after TNS */
#define AC_EL_IGF_INDEP_TILING 0x000200 /*!< IGF independent tiling */
#define AC_EL_IGF_USE_ENF 0x000400 /*!< IGF use enhanced noise filling */
#define AC_EL_FULLBANDLPD 0x000800 /*!< enable fullband LPD tools */
#define AC_EL_LPDSTEREOIDX 0x001000 /*!< LPD-stereo-tool stereo index */
#define AC_EL_LFE 0x002000 /*!< The element is of type LFE. */
/* CODER_CONFIG::flags */
#define CC_MPEG_ID 0x00100000
#define CC_IS_BASELAYER 0x00200000
#define CC_PROTECTION 0x00400000
#define CC_SBR 0x00800000
#define CC_SBRCRC 0x00010000
#define CC_SAC 0x00020000
#define CC_RVLC 0x01000000
#define CC_VCB11 0x02000000
#define CC_HCR 0x04000000
#define CC_PSEUDO_SURROUND 0x08000000
#define CC_USAC_NOISE 0x10000000
#define CC_USAC_TW 0x20000000
#define CC_USAC_HBE 0x40000000
/** Generic audio coder configuration structure. */
typedef struct {
AUDIO_OBJECT_TYPE aot; /**< Audio Object Type (AOT). */
AUDIO_OBJECT_TYPE extAOT; /**< Extension Audio Object Type (SBR). */
CHANNEL_MODE channelMode; /**< Channel mode. */
UCHAR channelConfigZero; /**< Use channel config zero + pce although a
standard channel config could be signaled. */
INT samplingRate; /**< Sampling rate. */
INT extSamplingRate; /**< Extended samplerate (SBR). */
INT downscaleSamplingRate; /**< Downscale sampling rate (ELD downscaled mode)
*/
INT bitRate; /**< Average bitrate. */
int samplesPerFrame; /**< Number of PCM samples per codec frame and audio
channel. */
int noChannels; /**< Number of audio channels. */
int bitsFrame;
int nSubFrames; /**< Amount of encoder subframes. 1 means no subframing. */
int BSACnumOfSubFrame; /**< The number of the sub-frames which are grouped and
transmitted in a super-frame (BSAC). */
int BSAClayerLength; /**< The average length of the large-step layers in bytes
(BSAC). */
UINT flags; /**< flags */
UCHAR matrixMixdownA; /**< Matrix mixdown index to put into PCE. Default value
0 means no mixdown coefficient, valid values are 1-4
which correspond to matrix_mixdown_idx 0-3. */
UCHAR headerPeriod; /**< Frame period for sending in band configuration
buffers in the transport layer. */
UCHAR stereoConfigIndex; /**< USAC MPS stereo mode */
UCHAR sbrMode; /**< USAC SBR mode */
SBR_PS_SIGNALING sbrSignaling; /**< 0: implicit signaling, 1: backwards
compatible explicit signaling, 2:
hierarcical explicit signaling */
UCHAR rawConfig[64]; /**< raw codec specific config as bit stream */
int rawConfigBits; /**< Size of rawConfig in bits */
UCHAR sbrPresent;
UCHAR psPresent;
} CODER_CONFIG;
#define USAC_ID_BIT 16 /** USAC element IDs start at USAC_ID_BIT */
/** MP4 Element IDs. */
typedef enum {
/* mp4 element IDs */
ID_NONE = -1, /**< Invalid Element helper ID. */
ID_SCE = 0, /**< Single Channel Element. */
ID_CPE = 1, /**< Channel Pair Element. */
ID_CCE = 2, /**< Coupling Channel Element. */
ID_LFE = 3, /**< LFE Channel Element. */
ID_DSE = 4, /**< Currently one Data Stream Element for ancillary data is
supported. */
ID_PCE = 5, /**< Program Config Element. */
ID_FIL = 6, /**< Fill Element. */
ID_END = 7, /**< Arnie (End Element = Terminator). */
ID_EXT = 8, /**< Extension Payload (ER only). */
ID_SCAL = 9, /**< AAC scalable element (ER only). */
/* USAC element IDs */
ID_USAC_SCE = 0 + USAC_ID_BIT, /**< Single Channel Element. */
ID_USAC_CPE = 1 + USAC_ID_BIT, /**< Channel Pair Element. */
ID_USAC_LFE = 2 + USAC_ID_BIT, /**< LFE Channel Element. */
ID_USAC_EXT = 3 + USAC_ID_BIT, /**< Extension Element. */
ID_USAC_END = 4 + USAC_ID_BIT, /**< Arnie (End Element = Terminator). */
ID_LAST
} MP4_ELEMENT_ID;
/* usacConfigExtType q.v. ISO/IEC DIS 23008-3 Table 52 and ISO/IEC FDIS
* 23003-3:2011(E) Table 74*/
typedef enum {
/* USAC and RSVD60 3DA */
ID_CONFIG_EXT_FILL = 0,
/* RSVD60 3DA */
ID_CONFIG_EXT_DOWNMIX = 1,
ID_CONFIG_EXT_LOUDNESS_INFO = 2,
ID_CONFIG_EXT_AUDIOSCENE_INFO = 3,
ID_CONFIG_EXT_HOA_MATRIX = 4,
ID_CONFIG_EXT_SIG_GROUP_INFO = 6
/* 5-127 => reserved for ISO use */
/* > 128 => reserved for use outside of ISO scope */
} CONFIG_EXT_ID;
#define IS_CHANNEL_ELEMENT(elementId) \
((elementId) == ID_SCE || (elementId) == ID_CPE || (elementId) == ID_LFE || \
(elementId) == ID_USAC_SCE || (elementId) == ID_USAC_CPE || \
(elementId) == ID_USAC_LFE)
#define IS_MP4_CHANNEL_ELEMENT(elementId) \
((elementId) == ID_SCE || (elementId) == ID_CPE || (elementId) == ID_LFE)
#define EXT_ID_BITS 4 /**< Size in bits of extension payload type tags. */
/** Extension payload types. */
typedef enum {
EXT_FIL = 0x00,
EXT_FILL_DATA = 0x01,
EXT_DATA_ELEMENT = 0x02,
EXT_DATA_LENGTH = 0x03,
EXT_UNI_DRC = 0x04,
EXT_LDSAC_DATA = 0x09,
EXT_SAOC_DATA = 0x0a,
EXT_DYNAMIC_RANGE = 0x0b,
EXT_SAC_DATA = 0x0c,
EXT_SBR_DATA = 0x0d,
EXT_SBR_DATA_CRC = 0x0e
} EXT_PAYLOAD_TYPE;
#define IS_USAC_CHANNEL_ELEMENT(elementId) \
((elementId) == ID_USAC_SCE || (elementId) == ID_USAC_CPE || \
(elementId) == ID_USAC_LFE)
/** MPEG-D USAC & RSVD60 3D audio Extension Element Types. */
typedef enum {
/* usac */
ID_EXT_ELE_FILL = 0x00,
ID_EXT_ELE_MPEGS = 0x01,
ID_EXT_ELE_SAOC = 0x02,
ID_EXT_ELE_AUDIOPREROLL = 0x03,
ID_EXT_ELE_UNI_DRC = 0x04,
/* rsv603da */
ID_EXT_ELE_OBJ_METADATA = 0x05,
ID_EXT_ELE_SAOC_3D = 0x06,
ID_EXT_ELE_HOA = 0x07,
ID_EXT_ELE_FMT_CNVRTR = 0x08,
ID_EXT_ELE_MCT = 0x09,
ID_EXT_ELE_ENHANCED_OBJ_METADATA = 0x0d,
/* reserved for use outside of ISO scope */
ID_EXT_ELE_VR_METADATA = 0x81,
ID_EXT_ELE_UNKNOWN = 0xFF
} USAC_EXT_ELEMENT_TYPE;
/**
* Proprietary raw packet file configuration data type identifier.
*/
typedef enum {
TC_NOTHING = 0, /* No configuration available -> in-band configuration. */
TC_RAW_ADTS = 2, /* Transfer type is ADTS. */
TC_RAW_LATM_MCP1 = 6, /* Transfer type is LATM with SMC present. */
TC_RAW_SDC = 21 /* Configuration data field is Drm SDC. */
} TP_CONFIG_TYPE;
/*
* ##############################################################################################
* Library identification and error handling
* ##############################################################################################
*/
/* \cond */
typedef enum {
FDK_NONE = 0,
FDK_TOOLS = 1,
FDK_SYSLIB = 2,
FDK_AACDEC = 3,
FDK_AACENC = 4,
FDK_SBRDEC = 5,
FDK_SBRENC = 6,
FDK_TPDEC = 7,
FDK_TPENC = 8,
FDK_MPSDEC = 9,
FDK_MPEGFILEREAD = 10,
FDK_MPEGFILEWRITE = 11,
FDK_PCMDMX = 31,
FDK_MPSENC = 34,
FDK_TDLIMIT = 35,
FDK_UNIDRCDEC = 38,
FDK_MODULE_LAST
} FDK_MODULE_ID;
/* AAC capability flags */
#define CAPF_AAC_LC 0x00000001 /**< Support flag for AAC Low Complexity. */
#define CAPF_ER_AAC_LD \
0x00000002 /**< Support flag for AAC Low Delay with Error Resilience tools. \
*/
#define CAPF_ER_AAC_SCAL 0x00000004 /**< Support flag for AAC Scalable. */
#define CAPF_ER_AAC_LC \
0x00000008 /**< Support flag for AAC Low Complexity with Error Resilience \
tools. */
#define CAPF_AAC_480 \
0x00000010 /**< Support flag for AAC with 480 framelength. */
#define CAPF_AAC_512 \
0x00000020 /**< Support flag for AAC with 512 framelength. */
#define CAPF_AAC_960 \
0x00000040 /**< Support flag for AAC with 960 framelength. */
#define CAPF_AAC_1024 \
0x00000080 /**< Support flag for AAC with 1024 framelength. */
#define CAPF_AAC_HCR \
0x00000100 /**< Support flag for AAC with Huffman Codeword Reordering. */
#define CAPF_AAC_VCB11 \
0x00000200 /**< Support flag for AAC Virtual Codebook 11. */
#define CAPF_AAC_RVLC \
0x00000400 /**< Support flag for AAC Reversible Variable Length Coding. */
#define CAPF_AAC_MPEG4 0x00000800 /**< Support flag for MPEG file format. */
#define CAPF_AAC_DRC \
0x00001000 /**< Support flag for AAC Dynamic Range Control. */
#define CAPF_AAC_CONCEALMENT \
0x00002000 /**< Support flag for AAC concealment. */
#define CAPF_AAC_DRM_BSFORMAT \
0x00004000 /**< Support flag for AAC DRM bistream format. */
#define CAPF_ER_AAC_ELD \
0x00008000 /**< Support flag for AAC Enhanced Low Delay with Error \
Resilience tools. */
#define CAPF_ER_AAC_BSAC \
0x00010000 /**< Support flag for AAC BSAC. */
#define CAPF_AAC_ELD_DOWNSCALE \
0x00040000 /**< Support flag for AAC-ELD Downscaling */
#define CAPF_AAC_USAC_LP \
0x00100000 /**< Support flag for USAC low power mode. */
#define CAPF_AAC_USAC \
0x00200000 /**< Support flag for Unified Speech and Audio Coding (USAC). */
#define CAPF_ER_AAC_ELDV2 \
0x00800000 /**< Support flag for AAC Enhanced Low Delay with MPS 212. */
#define CAPF_AAC_UNIDRC \
0x01000000 /**< Support flag for MPEG-D Dynamic Range Control (uniDrc). */
/* Transport capability flags */
#define CAPF_ADTS \
0x00000001 /**< Support flag for ADTS transport format. */
#define CAPF_ADIF \
0x00000002 /**< Support flag for ADIF transport format. */
#define CAPF_LATM \
0x00000004 /**< Support flag for LATM transport format. */
#define CAPF_LOAS \
0x00000008 /**< Support flag for LOAS transport format. */
#define CAPF_RAWPACKETS \
0x00000010 /**< Support flag for RAW PACKETS transport format. */
#define CAPF_DRM \
0x00000020 /**< Support flag for DRM/DRM+ transport format. */
#define CAPF_RSVD50 \
0x00000040 /**< Support flag for RSVD50 transport format */
/* SBR capability flags */
#define CAPF_SBR_LP \
0x00000001 /**< Support flag for SBR Low Power mode. */
#define CAPF_SBR_HQ \
0x00000002 /**< Support flag for SBR High Quality mode. */
#define CAPF_SBR_DRM_BS \
0x00000004 /**< Support flag for */
#define CAPF_SBR_CONCEALMENT \
0x00000008 /**< Support flag for SBR concealment. */
#define CAPF_SBR_DRC \
0x00000010 /**< Support flag for SBR Dynamic Range Control. */
#define CAPF_SBR_PS_MPEG \
0x00000020 /**< Support flag for MPEG Parametric Stereo. */
#define CAPF_SBR_PS_DRM \
0x00000040 /**< Support flag for DRM Parametric Stereo. */
#define CAPF_SBR_ELD_DOWNSCALE \
0x00000080 /**< Support flag for ELD reduced delay mode */
#define CAPF_SBR_HBEHQ \
0x00000100 /**< Support flag for HQ HBE */
/* PCM utils capability flags */
#define CAPF_DMX_BLIND \
0x00000001 /**< Support flag for blind downmixing. */
#define CAPF_DMX_PCE \
0x00000002 /**< Support flag for guided downmix with data from MPEG-2/4 \
Program Config Elements (PCE). */
#define CAPF_DMX_ARIB \
0x00000004 /**< Support flag for PCE guided downmix with slightly different \
equations and levels to fulfill ARIB standard. */
#define CAPF_DMX_DVB \
0x00000008 /**< Support flag for guided downmix with data from DVB ancillary \
data fields. */
#define CAPF_DMX_CH_EXP \
0x00000010 /**< Support flag for simple upmixing by dublicating channels or \
adding zero channels. */
#define CAPF_DMX_6_CH \
0x00000020 /**< Support flag for 5.1 channel configuration (input and \
output). */
#define CAPF_DMX_8_CH \
0x00000040 /**< Support flag for 6 and 7.1 channel configurations (input and \
output). */
#define CAPF_DMX_24_CH \
0x00000080 /**< Support flag for 22.2 channel configuration (input and \
output). */
#define CAPF_LIMITER \
0x00002000 /**< Support flag for signal level limiting. \
*/
/* MPEG Surround capability flags */
#define CAPF_MPS_STD \
0x00000001 /**< Support flag for MPEG Surround. */
#define CAPF_MPS_LD \
0x00000002 /**< Support flag for Low Delay MPEG Surround. \
*/
#define CAPF_MPS_USAC \
0x00000004 /**< Support flag for USAC MPEG Surround. */
#define CAPF_MPS_HQ \
0x00000010 /**< Support flag indicating if high quality processing is \
supported */
#define CAPF_MPS_LP \
0x00000020 /**< Support flag indicating if partially complex (low power) \
processing is supported */
#define CAPF_MPS_BLIND \
0x00000040 /**< Support flag indicating if blind processing is supported */
#define CAPF_MPS_BINAURAL \
0x00000080 /**< Support flag indicating if binaural output is possible */
#define CAPF_MPS_2CH_OUT \
0x00000100 /**< Support flag indicating if 2ch output is possible */
#define CAPF_MPS_6CH_OUT \
0x00000200 /**< Support flag indicating if 6ch output is possible */
#define CAPF_MPS_8CH_OUT \
0x00000400 /**< Support flag indicating if 8ch output is possible */
#define CAPF_MPS_1CH_IN \
0x00001000 /**< Support flag indicating if 1ch dmx input is possible */
#define CAPF_MPS_2CH_IN \
0x00002000 /**< Support flag indicating if 2ch dmx input is possible */
#define CAPF_MPS_6CH_IN \
0x00004000 /**< Support flag indicating if 5ch dmx input is possible */
/* \endcond */
/*
* ##############################################################################################
* Library versioning
* ##############################################################################################
*/
/**
* Convert each member of version numbers to one single numeric version
* representation.
* \param lev0 1st level of version number.
* \param lev1 2nd level of version number.
* \param lev2 3rd level of version number.
*/
#define LIB_VERSION(lev0, lev1, lev2) \
((lev0 << 24 & 0xff000000) | (lev1 << 16 & 0x00ff0000) | \
(lev2 << 8 & 0x0000ff00))
/**
* Build text string of version.
*/
#define LIB_VERSION_STRING(info) \
FDKsprintf((info)->versionStr, "%d.%d.%d", (((info)->version >> 24) & 0xff), \
(((info)->version >> 16) & 0xff), \
(((info)->version >> 8) & 0xff))
/**
* Library information.
*/
typedef struct LIB_INFO {
const char* title;
const char* build_date;
const char* build_time;
FDK_MODULE_ID module_id;
INT version;
UINT flags;
char versionStr[32];
} LIB_INFO;
#ifdef __cplusplus
#define FDK_AUDIO_INLINE inline
#else
#define FDK_AUDIO_INLINE
#endif
/** Initialize library info. */
static FDK_AUDIO_INLINE void FDKinitLibInfo(LIB_INFO* info) {
int i;
for (i = 0; i < FDK_MODULE_LAST; i++) {
info[i].module_id = FDK_NONE;
}
}
/** Aquire supported features of library. */
static FDK_AUDIO_INLINE UINT
FDKlibInfo_getCapabilities(const LIB_INFO* info, FDK_MODULE_ID module_id) {
int i;
for (i = 0; i < FDK_MODULE_LAST; i++) {
if (info[i].module_id == module_id) {
return info[i].flags;
}
}
return 0;
}
/** Search for next free tab. */
static FDK_AUDIO_INLINE INT FDKlibInfo_lookup(const LIB_INFO* info,
FDK_MODULE_ID module_id) {
int i = -1;
for (i = 0; i < FDK_MODULE_LAST; i++) {
if (info[i].module_id == module_id) return -1;
if (info[i].module_id == FDK_NONE) break;
}
if (i == FDK_MODULE_LAST) return -1;
return i;
}
/*
* ##############################################################################################
* Buffer description
* ##############################################################################################
*/
/**
* I/O buffer descriptor.
*/
typedef struct FDK_bufDescr {
void** ppBase; /*!< Pointer to an array containing buffer base addresses.
Set to NULL for buffer requirement info. */
UINT* pBufSize; /*!< Pointer to an array containing the number of elements
that can be placed in the specific buffer. */
UINT* pEleSize; /*!< Pointer to an array containing the element size for each
buffer in bytes. That is mostly the number returned by the
sizeof() operator for the data type used for the specific
buffer. */
UINT*
pBufType; /*!< Pointer to an array of bit fields containing a description
for each buffer. See XXX below for more details. */
UINT numBufs; /*!< Total number of buffers. */
} FDK_bufDescr;
/**
* Buffer type description field.
*/
#define FDK_BUF_TYPE_MASK_IO ((UINT)0x03 << 30)
#define FDK_BUF_TYPE_MASK_DESCR ((UINT)0x3F << 16)
#define FDK_BUF_TYPE_MASK_ID ((UINT)0xFF)
#define FDK_BUF_TYPE_INPUT ((UINT)0x1 << 30)
#define FDK_BUF_TYPE_OUTPUT ((UINT)0x2 << 30)
#define FDK_BUF_TYPE_PCM_DATA ((UINT)0x1 << 16)
#define FDK_BUF_TYPE_ANC_DATA ((UINT)0x2 << 16)
#define FDK_BUF_TYPE_BS_DATA ((UINT)0x4 << 16)
#ifdef __cplusplus
}
#endif
#endif /* FDK_AUDIO_H */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,584 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
scheme for digital audio. This FDK AAC Codec software is intended to be used on
a wide variety of Android devices.
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
general perceptual audio codecs. AAC-ELD is considered the best-performing
full-bandwidth communications codec by independent studies and is widely
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
specifications.
Patent licenses for necessary patent claims for the FDK AAC Codec (including
those of Fraunhofer) may be obtained through Via Licensing
(www.vialicensing.com) or through the respective patent owners individually for
the purpose of encoding or decoding bit streams in products that are compliant
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
Android devices already license these patent claims through Via Licensing or
directly from the patent owners, and therefore FDK AAC Codec software may
already be covered under those patent licenses when it is used for those
licensed purposes only.
Commercially-licensed AAC software libraries, including floating-point versions
with enhanced sound quality, are also available from Fraunhofer. Users are
encouraged to check the Fraunhofer website for additional applications
information and documentation.
2. COPYRIGHT LICENSE
Redistribution and use in source and binary forms, with or without modification,
are permitted without payment of copyright license fees provided that you
satisfy the following conditions:
You must retain the complete text of this software license in redistributions of
the FDK AAC Codec or your modifications thereto in source code form.
You must retain the complete text of this software license in the documentation
and/or other materials provided with redistributions of the FDK AAC Codec or
your modifications thereto in binary form. You must make available free of
charge copies of the complete source code of the FDK AAC Codec and your
modifications thereto to recipients of copies in binary form.
The name of Fraunhofer may not be used to endorse or promote products derived
from this library without prior written permission.
You may not charge copyright license fees for anyone to use, copy or distribute
the FDK AAC Codec software or your modifications thereto.
Your modified versions of the FDK AAC Codec must carry prominent notices stating
that you changed the software and the date of any change. For modified versions
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
AAC Codec Library for Android."
3. NO PATENT LICENSE
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
Fraunhofer provides no warranty of patent non-infringement with respect to this
software.
You may use this FDK AAC Codec software or modifications thereto only for
purposes that are authorized by appropriate patent licenses.
4. DISCLAIMER
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
including but not limited to the implied warranties of merchantability and
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
or consequential damages, including but not limited to procurement of substitute
goods or services; loss of use, data, or profits, or business interruption,
however caused and on any theory of liability, whether in contract, strict
liability, or tort (including negligence), arising in any way out of the use of
this software, even if advised of the possibility of such damage.
5. CONTACT INFORMATION
Fraunhofer Institute for Integrated Circuits IIS
Attention: Audio and Multimedia Departments - FDK AAC LL
Am Wolfsmantel 33
91058 Erlangen, Germany
www.iis.fraunhofer.de/amm
amm-info@iis.fraunhofer.de
----------------------------------------------------------------------------- */
/************************* System integration library **************************
Author(s):
Description:
*******************************************************************************/
/** \file genericStds.h
\brief Generic Run-Time Support function wrappers and heap allocation
monitoring.
*/
#if !defined(GENERICSTDS_H)
#define GENERICSTDS_H
#include "machine_type.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846 /*!< Pi. Only used in example projects. */
#endif
/**
* Identifiers for various memory locations. They are used along with memory
* allocation functions like FDKcalloc_L() to specify the requested memory's
* location.
*/
typedef enum {
/* Internal */
SECT_DATA_L1 = 0x2000,
SECT_DATA_L2,
SECT_DATA_L1_A,
SECT_DATA_L1_B,
SECT_CONSTDATA_L1,
/* External */
SECT_DATA_EXTERN = 0x4000,
SECT_CONSTDATA_EXTERN
} MEMORY_SECTION;
/*! \addtogroup SYSLIB_MEMORY_MACROS FDK memory macros
*
* The \c H_ prefix indicates that the macro is to be used in a header file, the
* \c C_ prefix indicates that the macro is to be used in a source file.
*
* Declaring memory areas requires to specify a unique name and a data type.
*
* For defining a memory area you require additionally one or two sizes,
* depending if the memory should be organized into one or two dimensions.
*
* The macros containing the keyword \c AALLOC instead of \c ALLOC additionally
* take care of returning aligned memory addresses (beyond the natural alignment
* of its type). The preprocesor macro
* ::ALIGNMENT_DEFAULT indicates the aligment to be used (this is hardware
* specific).
*
* The \c _L suffix indicates that the memory will be located in a specific
* section. This is useful to allocate critical memory section into fast
* internal SRAM for example.
*
* @{
*/
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define H_ALLOC_MEM(name, type) \
type *Get##name(int n = 0); \
void Free##name(type **p); \
UINT GetRequiredMem##name(void);
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define H_ALLOC_MEM_OVERLAY(name, type) \
type *Get##name(int n = 0); \
void Free##name(type **p); \
UINT GetRequiredMem##name(void);
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_ALLOC_MEM(name, type, num) \
type *Get##name(int n) { \
FDK_ASSERT((n) == 0); \
return ((type *)FDKcalloc(num, sizeof(type))); \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKfree(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((num) * sizeof(type)); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_ALLOC_MEM2(name, type, n1, n2) \
type *Get##name(int n) { \
FDK_ASSERT((n) < (n2)); \
return ((type *)FDKcalloc(n1, sizeof(type))); \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKfree(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((n1) * sizeof(type)) * (n2); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_MEM(name, type, num) \
type *Get##name(int n) { \
type *ap; \
FDK_ASSERT((n) == 0); \
ap = ((type *)FDKaalloc((num) * sizeof(type), ALIGNMENT_DEFAULT)); \
return ap; \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKafree(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((num) * sizeof(type) + ALIGNMENT_DEFAULT + \
sizeof(void *)); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_MEM2(name, type, n1, n2) \
type *Get##name(int n) { \
type *ap; \
FDK_ASSERT((n) < (n2)); \
ap = ((type *)FDKaalloc((n1) * sizeof(type), ALIGNMENT_DEFAULT)); \
return ap; \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKafree(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((n1) * sizeof(type) + ALIGNMENT_DEFAULT + \
sizeof(void *)) * \
(n2); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_ALLOC_MEM_L(name, type, num, s) \
type *Get##name(int n) { \
FDK_ASSERT((n) == 0); \
return ((type *)FDKcalloc_L(num, sizeof(type), s)); \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKfree_L(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((num) * sizeof(type)); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_ALLOC_MEM2_L(name, type, n1, n2, s) \
type *Get##name(int n) { \
FDK_ASSERT((n) < (n2)); \
return (type *)FDKcalloc_L(n1, sizeof(type), s); \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKfree_L(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((n1) * sizeof(type)) * (n2); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_MEM_L(name, type, num, s) \
type *Get##name(int n) { \
type *ap; \
FDK_ASSERT((n) == 0); \
ap = ((type *)FDKaalloc_L((num) * sizeof(type), ALIGNMENT_DEFAULT, s)); \
return ap; \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKafree_L(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((num) * sizeof(type) + ALIGNMENT_DEFAULT + \
sizeof(void *)); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_MEM2_L(name, type, n1, n2, s) \
type *Get##name(int n) { \
type *ap; \
FDK_ASSERT((n) < (n2)); \
ap = ((type *)FDKaalloc_L((n1) * sizeof(type), ALIGNMENT_DEFAULT, s)); \
return ap; \
} \
void Free##name(type **p) { \
if (p != NULL) { \
FDKafree_L(*p); \
*p = NULL; \
} \
} \
UINT GetRequiredMem##name(void) { \
return ALGN_SIZE_EXTRES((n1) * sizeof(type) + ALIGNMENT_DEFAULT + \
sizeof(void *)) * \
(n2); \
}
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_ALLOC_MEM_OVERLAY(name, type, num, sect, tag) \
C_AALLOC_MEM_L(name, type, num, sect)
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_SCRATCH_START(name, type, n) \
type _##name[(n) + (ALIGNMENT_DEFAULT + sizeof(type) - 1)]; \
type *name = (type *)ALIGN_PTR(_##name); \
C_ALLOC_ALIGNED_REGISTER(name, (n) * sizeof(type));
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_ALLOC_SCRATCH_START(name, type, n) type name[n];
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_SCRATCH_END(name, type, n) C_ALLOC_ALIGNED_UNREGISTER(name);
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_ALLOC_SCRATCH_END(name, type, n)
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_STACK_START(name, type, n) \
type _##name[(n) + (ALIGNMENT_DEFAULT + sizeof(type) - 1)]; \
type *name = (type *)ALIGN_PTR(_##name); \
C_ALLOC_ALIGNED_REGISTER(name, (n) * sizeof(type));
/** See \ref SYSLIB_MEMORY_MACROS for description. */
#define C_AALLOC_STACK_END(name, type, n) C_ALLOC_ALIGNED_UNREGISTER(name);
/*! @} */
#define C_ALLOC_ALIGNED_REGISTER(x, size)
#define C_ALLOC_ALIGNED_UNREGISTER(x)
#define C_ALLOC_ALIGNED_CHECK(x)
#define C_ALLOC_ALIGNED_CHECK2(x, y)
#define FDK_showBacktrace(a, b)
/*! \addtogroup SYSLIB_EXITCODES Unified exit codes
* Exit codes to be used as return values of FDK software test and
* demonstration applications. Not as return values of product modules and/or
* libraries.
* @{
*/
#define FDK_EXITCODE_OK 0 /*!< Successful termination. No errors. */
#define FDK_EXITCODE_USAGE \
64 /*!< The command/application was used incorrectly, e.g. with the wrong \
number of arguments, a bad flag, a bad syntax in a parameter, or \
whatever. */
#define FDK_EXITCODE_DATAERROR \
65 /*!< The input data was incorrect in some way. This should only be used \
for user data and not system files. */
#define FDK_EXITCODE_NOINPUT \
66 /*!< An input file (not a system file) did not exist or was not readable. \
*/
#define FDK_EXITCODE_UNAVAILABLE \
69 /*!< A service is unavailable. This can occur if a support program or \
file does not exist. This can also be used as a catchall message when \
something you wanted to do doesn't work, but you don't know why. */
#define FDK_EXITCODE_SOFTWARE \
70 /*!< An internal software error has been detected. This should be limited \
to non- operating system related errors as possible. */
#define FDK_EXITCODE_CANTCREATE \
73 /*!< A (user specified) output file cannot be created. */
#define FDK_EXITCODE_IOERROR \
74 /*!< An error occurred while doing I/O on some file. */
/*! @} */
/*--------------------------------------------
* Runtime support declarations
*---------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
void FDKprintf(const char *szFmt, ...);
void FDKprintfErr(const char *szFmt, ...);
/** Wrapper for <stdio.h>'s getchar(). */
int FDKgetchar(void);
INT FDKfprintf(void *stream, const char *format, ...);
INT FDKsprintf(char *str, const char *format, ...);
char *FDKstrchr(char *s, INT c);
const char *FDKstrstr(const char *haystack, const char *needle);
char *FDKstrcpy(char *dest, const char *src);
char *FDKstrncpy(char *dest, const char *src, const UINT n);
#define FDK_MAX_OVERLAYS 8 /**< Maximum number of memory overlays. */
void *FDKcalloc(const UINT n, const UINT size);
void *FDKmalloc(const UINT size);
void FDKfree(void *ptr);
/**
* Allocate and clear an aligned memory area. Use FDKafree() instead of
* FDKfree() for these memory areas.
*
* \param size Size of requested memory in bytes.
* \param alignment Alignment of requested memory in bytes.
* \return Pointer to allocated memory.
*/
void *FDKaalloc(const UINT size, const UINT alignment);
/**
* Free an aligned memory area.
*
* \param ptr Pointer to be freed.
*/
void FDKafree(void *ptr);
/**
* Allocate memory in a specific memory section.
* Requests can be made for internal or external memory. If internal memory is
* requested, FDKcalloc_L() first tries to use L1 memory, which sizes are
* defined by ::DATA_L1_A_SIZE and ::DATA_L1_B_SIZE. If no L1 memory is
* available, then FDKcalloc_L() tries to use L2 memory. If that fails as well,
* the requested memory is allocated at an extern location using the fallback
* FDKcalloc().
*
* \param n See MSDN documentation on calloc().
* \param size See MSDN documentation on calloc().
* \param s Memory section.
* \return See MSDN documentation on calloc().
*/
void *FDKcalloc_L(const UINT n, const UINT size, MEMORY_SECTION s);
/**
* Allocate aligned memory in a specific memory section.
* See FDKcalloc_L() description for details - same applies here.
*/
void *FDKaalloc_L(const UINT size, const UINT alignment, MEMORY_SECTION s);
/**
* Free memory that was allocated in a specific memory section.
*/
void FDKfree_L(void *ptr);
/**
* Free aligned memory that was allocated in a specific memory section.
*/
void FDKafree_L(void *ptr);
/**
* Copy memory. Source and destination memory must not overlap.
* Either use implementation from a Standard Library, or, if no Standard Library
* is available, a generic implementation.
* The define ::USE_BUILTIN_MEM_FUNCTIONS in genericStds.cpp controls what to
* use. The function arguments correspond to the standard memcpy(). Please see
* MSDN documentation for details on how to use it.
*/
void FDKmemcpy(void *dst, const void *src, const UINT size);
/**
* Copy memory. Source and destination memory are allowed to overlap.
* Either use implementation from a Standard Library, or, if no Standard Library
* is available, a generic implementation.
* The define ::USE_BUILTIN_MEM_FUNCTIONS in genericStds.cpp controls what to
* use. The function arguments correspond to the standard memmove(). Please see
* MSDN documentation for details on how to use it.
*/
void FDKmemmove(void *dst, const void *src, const UINT size);
/**
* Clear memory.
* Either use implementation from a Standard Library, or, if no Standard Library
* is available, a generic implementation.
* The define ::USE_BUILTIN_MEM_FUNCTIONS in genericStds.cpp controls what to
* use. The function arguments correspond to the standard memclear(). Please see
* MSDN documentation for details on how to use it.
*/
void FDKmemclear(void *memPtr, const UINT size);
/**
* Fill memory with values.
* The function arguments correspond to the standard memset(). Please see MSDN
* documentation for details on how to use it.
*/
void FDKmemset(void *memPtr, const INT value, const UINT size);
/* Compare function wrappers */
INT FDKmemcmp(const void *s1, const void *s2, const UINT size);
INT FDKstrcmp(const char *s1, const char *s2);
INT FDKstrncmp(const char *s1, const char *s2, const UINT size);
UINT FDKstrlen(const char *s);
#define FDKmax(a, b) ((a) > (b) ? (a) : (b))
#define FDKmin(a, b) ((a) < (b) ? (a) : (b))
#define FDK_INT_MAX ((INT)0x7FFFFFFF)
#define FDK_INT_MIN ((INT)0x80000000)
/* FILE I/O */
/*!
* Check platform for endianess.
*
* \return 1 if platform is little endian, non-1 if platform is big endian.
*/
int IS_LITTLE_ENDIAN(void);
/*!
* Convert input value to little endian format.
*
* \param val Value to be converted. It may be in both big or little endian.
* \return Value in little endian format.
*/
UINT TO_LITTLE_ENDIAN(UINT val);
/*!
* \fn FDKFILE *FDKfopen(const char *filename, const char *mode);
* Standard fopen() wrapper.
* \fn INT FDKfclose(FDKFILE *FP);
* Standard fclose() wrapper.
* \fn INT FDKfseek(FDKFILE *FP, LONG OFFSET, int WHENCE);
* Standard fseek() wrapper.
* \fn INT FDKftell(FDKFILE *FP);
* Standard ftell() wrapper.
* \fn INT FDKfflush(FDKFILE *fp);
* Standard fflush() wrapper.
* \fn UINT FDKfwrite(const void *ptrf, INT size, UINT nmemb, FDKFILE *fp);
* Standard fwrite() wrapper.
* \fn UINT FDKfread(void *dst, INT size, UINT nmemb, FDKFILE *fp);
* Standard fread() wrapper.
*/
typedef void FDKFILE;
extern const INT FDKSEEK_SET, FDKSEEK_CUR, FDKSEEK_END;
FDKFILE *FDKfopen(const char *filename, const char *mode);
INT FDKfclose(FDKFILE *FP);
INT FDKfseek(FDKFILE *FP, LONG OFFSET, int WHENCE);
INT FDKftell(FDKFILE *FP);
INT FDKfflush(FDKFILE *fp);
UINT FDKfwrite(const void *ptrf, INT size, UINT nmemb, FDKFILE *fp);
UINT FDKfread(void *dst, INT size, UINT nmemb, FDKFILE *fp);
char *FDKfgets(void *dst, INT size, FDKFILE *fp);
void FDKrewind(FDKFILE *fp);
INT FDKfeof(FDKFILE *fp);
/**
* \brief Write each member in little endian order. Convert automatically
* to host endianess.
* \param ptrf Pointer to memory where to read data from.
* \param size Size of each item to be written.
* \param nmemb Number of items to be written.
* \param fp File pointer of type FDKFILE.
* \return Number of items read on success and fread() error on failure.
*/
UINT FDKfwrite_EL(const void *ptrf, INT size, UINT nmemb, FDKFILE *fp);
/**
* \brief Read variable of size "size" as little endian. Convert
* automatically to host endianess. 4-byte alignment is enforced for 24 bit
* data, at 32 bit full scale.
* \param dst Pointer to memory where to store data into.
* \param size Size of each item to be read.
* \param nmemb Number of items to be read.
* \param fp File pointer of type FDKFILE.
* \return Number of items read on success and fread() error on failure.
*/
UINT FDKfread_EL(void *dst, INT size, UINT nmemb, FDKFILE *fp);
/**
* \brief Print FDK software disclaimer.
*/
void FDKprintDisclaimer(void);
#ifdef __cplusplus
}
#endif
#endif /* GENERICSTDS_H */

View File

@ -0,0 +1,437 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
scheme for digital audio. This FDK AAC Codec software is intended to be used on
a wide variety of Android devices.
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
general perceptual audio codecs. AAC-ELD is considered the best-performing
full-bandwidth communications codec by independent studies and is widely
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
specifications.
Patent licenses for necessary patent claims for the FDK AAC Codec (including
those of Fraunhofer) may be obtained through Via Licensing
(www.vialicensing.com) or through the respective patent owners individually for
the purpose of encoding or decoding bit streams in products that are compliant
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
Android devices already license these patent claims through Via Licensing or
directly from the patent owners, and therefore FDK AAC Codec software may
already be covered under those patent licenses when it is used for those
licensed purposes only.
Commercially-licensed AAC software libraries, including floating-point versions
with enhanced sound quality, are also available from Fraunhofer. Users are
encouraged to check the Fraunhofer website for additional applications
information and documentation.
2. COPYRIGHT LICENSE
Redistribution and use in source and binary forms, with or without modification,
are permitted without payment of copyright license fees provided that you
satisfy the following conditions:
You must retain the complete text of this software license in redistributions of
the FDK AAC Codec or your modifications thereto in source code form.
You must retain the complete text of this software license in the documentation
and/or other materials provided with redistributions of the FDK AAC Codec or
your modifications thereto in binary form. You must make available free of
charge copies of the complete source code of the FDK AAC Codec and your
modifications thereto to recipients of copies in binary form.
The name of Fraunhofer may not be used to endorse or promote products derived
from this library without prior written permission.
You may not charge copyright license fees for anyone to use, copy or distribute
the FDK AAC Codec software or your modifications thereto.
Your modified versions of the FDK AAC Codec must carry prominent notices stating
that you changed the software and the date of any change. For modified versions
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
AAC Codec Library for Android."
3. NO PATENT LICENSE
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
Fraunhofer provides no warranty of patent non-infringement with respect to this
software.
You may use this FDK AAC Codec software or modifications thereto only for
purposes that are authorized by appropriate patent licenses.
4. DISCLAIMER
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
including but not limited to the implied warranties of merchantability and
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
or consequential damages, including but not limited to procurement of substitute
goods or services; loss of use, data, or profits, or business interruption,
however caused and on any theory of liability, whether in contract, strict
liability, or tort (including negligence), arising in any way out of the use of
this software, even if advised of the possibility of such damage.
5. CONTACT INFORMATION
Fraunhofer Institute for Integrated Circuits IIS
Attention: Audio and Multimedia Departments - FDK AAC LL
Am Wolfsmantel 33
91058 Erlangen, Germany
www.iis.fraunhofer.de/amm
amm-info@iis.fraunhofer.de
----------------------------------------------------------------------------- */
/************************* System integration library **************************
Author(s):
Description:
*******************************************************************************/
/** \file machine_type.h
* \brief Type defines for various processors and compiler tools.
*/
#if !defined(MACHINE_TYPE_H)
#define MACHINE_TYPE_H
#include <stddef.h> /* Needed to define size_t */
#if defined(__ANDROID__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 4) && \
(__GNUC_GNU_INLINE__ == 1)
typedef unsigned long long uint64_t;
#include <sys/types.h>
#endif
/* Library calling convention spec. __cdecl and friends might be added here as
* required. */
#if 0
#ifdef FDKAAC_EXPORTS
#define LINKSPEC_H __declspec(dllexport)
#define LINKSPEC_CPP __declspec(dllexport)
#else
#define LINKSPEC_H __declspec(dllimport)
#define LINKSPEC_CPP __declspec(dllimport)
#endif
#else
#define LINKSPEC_H
#define LINKSPEC_CPP
#endif
/* for doxygen the following docu parts must be separated */
/** \var SCHAR
* Data type representing at least 1 byte signed integer on all supported
* platforms.
*/
/** \var UCHAR
* Data type representing at least 1 byte unsigned integer on all
* supported platforms.
*/
/** \var INT
* Data type representing at least 4 byte signed integer on all supported
* platforms.
*/
/** \var UINT
* Data type representing at least 4 byte unsigned integer on all
* supported platforms.
*/
/** \var LONG
* Data type representing 4 byte signed integer on all supported
* platforms.
*/
/** \var ULONG
* Data type representing 4 byte unsigned integer on all supported
* platforms.
*/
/** \var SHORT
* Data type representing 2 byte signed integer on all supported
* platforms.
*/
/** \var USHORT
* Data type representing 2 byte unsigned integer on all supported
* platforms.
*/
/** \var INT64
* Data type representing 8 byte signed integer on all supported
* platforms.
*/
/** \var UINT64
* Data type representing 8 byte unsigned integer on all supported
* platforms.
*/
/** \def SHORT_BITS
* Number of bits the data type short represents. sizeof() is not suited
* to get this info, because a byte is not always defined as 8 bits.
*/
/** \def CHAR_BITS
* Number of bits the data type char represents. sizeof() is not suited
* to get this info, because a byte is not always defined as 8 bits.
*/
/** \var INT_PCM
* Data type representing the width of input and output PCM samples.
*/
typedef signed int INT;
typedef unsigned int UINT;
#ifdef __LP64__
/* force FDK long-datatypes to 4 byte */
/* Use defines to avoid type alias problems on 64 bit machines. */
#define LONG INT
#define ULONG UINT
#else /* __LP64__ */
typedef signed long LONG;
typedef unsigned long ULONG;
#endif /* __LP64__ */
typedef signed short SHORT;
typedef unsigned short USHORT;
typedef signed char SCHAR;
typedef unsigned char UCHAR;
#define SHORT_BITS 16
#define CHAR_BITS 8
/* Define 64 bit base integer type. */
#ifdef _MSC_VER
typedef __int64 INT64;
typedef unsigned __int64 UINT64;
#else
typedef long long INT64;
typedef unsigned long long UINT64;
#endif
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#if ((defined(__i686__) || defined(__i586__) || defined(__i386__) || \
defined(__x86_64__)) || \
(defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)))) && \
!defined(FDK_ASSERT_ENABLE)
#define FDK_ASSERT_ENABLE
#endif
#if defined(FDK_ASSERT_ENABLE)
#include <assert.h>
#define FDK_ASSERT(x) assert(x)
#else
#define FDK_ASSERT(ignore)
#endif
#if 0
//typedef SHORT INT_PCM;
typedef LONG INT_PCM;
#define MAXVAL_PCM MAXVAL_SGL
#define MINVAL_PCM MINVAL_SGL
#define WAV_BITS 16
//#define SAMPLE_BITS 16
#define SAMPLE_BITS 32
#define SAMPLE_MAX ((INT_PCM)(((ULONG)1 << (SAMPLE_BITS - 1)) - 1))
#define SAMPLE_MIN (~SAMPLE_MAX)
#endif
// foobar_pd:
typedef LONG INT_PCM;
#define MAXVAL_PCM MAXVAL_DBL
#define MINVAL_PCM MINVAL_DBL
#define WAV_BITS 32
//#define SAMPLE_BITS 16
#define SAMPLE_BITS 32
#define SAMPLE_MAX ((INT_PCM)(((ULONG)1 << (SAMPLE_BITS - 1)) - 1))
#define SAMPLE_MIN (~SAMPLE_MAX)
/*!
* \def RAM_ALIGN
* Used to align memory as prefix before memory declaration. For example:
\code
RAM_ALIGN
int myArray[16];
\endcode
Note, that not all platforms support this mechanism. For example with TI
compilers a preprocessor pragma is used, but to do something like
\code
#define RAM_ALIGN #pragma DATA_ALIGN(x)
\endcode
would require the preprocessor to process this line twice to fully resolve
it. Hence, a fully platform-independant way to use alignment is not supported.
* \def ALIGNMENT_DEFAULT
* Default alignment in bytes.
*/
#define ALIGNMENT_DEFAULT 8
/* RAM_ALIGN keyword causes memory alignment of global variables. */
#if defined(_MSC_VER)
#define RAM_ALIGN __declspec(align(ALIGNMENT_DEFAULT))
#elif defined(__GNUC__)
#define RAM_ALIGN __attribute__((aligned(ALIGNMENT_DEFAULT)))
#else
#define RAM_ALIGN
#endif
/*!
* \def RESTRICT
* The restrict keyword is supported by some platforms and RESTRICT maps
* to either the corresponding keyword on each platform or to void if the
* compiler does not provide such feature. It tells the compiler that a
* pointer points to memory that does not overlap with other memories pointed to
* by other pointers. If this keyword is used and the assumption of no
* overlap is not true the resulting code might crash.
*
* \def WORD_ALIGNED(x)
* Tells the compiler that pointer x is 16 bit aligned. It does not cause
* the address itself to be aligned, but serves as a hint to the optimizer. The
* alignment of the pointer must be guarranteed, if not the code might
* crash.
*
* \def DWORD_ALIGNED(x)
* Tells the compiler that pointer x is 32 bit aligned. It does not cause
* the address itself to be aligned, but serves as a hint to the optimizer. The
* alignment of the pointer must be guarranteed, if not the code might
* crash.
*
*/
#define RESTRICT
#define WORD_ALIGNED(x) C_ALLOC_ALIGNED_CHECK2((const void *)(x), 2);
#define DWORD_ALIGNED(x) C_ALLOC_ALIGNED_CHECK2((const void *)(x), 4);
/*-----------------------------------------------------------------------------------
* ALIGN_SIZE
*-----------------------------------------------------------------------------------*/
/*!
* \brief This macro aligns a given value depending on ::ALIGNMENT_DEFAULT.
*
* For example if #ALIGNMENT_DEFAULT equals 8, then:
* - ALIGN_SIZE(3) returns 8
* - ALIGN_SIZE(8) returns 8
* - ALIGN_SIZE(9) returns 16
*/
#define ALIGN_SIZE(a) \
((a) + (((INT)ALIGNMENT_DEFAULT - ((size_t)(a) & (ALIGNMENT_DEFAULT - 1))) & \
(ALIGNMENT_DEFAULT - 1)))
/*!
* \brief This macro aligns a given address depending on ::ALIGNMENT_DEFAULT.
*/
#define ALIGN_PTR(a) \
((void *)((unsigned char *)(a) + \
((((INT)ALIGNMENT_DEFAULT - \
((size_t)(a) & (ALIGNMENT_DEFAULT - 1))) & \
(ALIGNMENT_DEFAULT - 1)))))
/* Alignment macro for libSYS heap implementation */
#define ALIGNMENT_EXTRES (ALIGNMENT_DEFAULT)
#define ALGN_SIZE_EXTRES(a) \
((a) + (((INT)ALIGNMENT_EXTRES - ((INT)(a) & (ALIGNMENT_EXTRES - 1))) & \
(ALIGNMENT_EXTRES - 1)))
/*!
* \def FDK_FORCEINLINE
* Sometimes compiler do not do what they are told to do, and in case of
* inlining some additional command might be necessary depending on the
* platform.
*
* \def FDK_INLINE
* Defines how the compiler is told to inline stuff.
*/
#ifndef FDK_FORCEINLINE
#if defined(__GNUC__) && !defined(__SDE_MIPS__)
#define FDK_FORCEINLINE inline __attribute((always_inline))
#else
#define FDK_FORCEINLINE inline
#endif
#endif
#define FDK_INLINE static inline
/*!
* \def LNK_SECTION_DATA_L1
* The LNK_SECTION_* defines allow memory to be drawn from specific memory
* sections. Used as prefix before variable declaration.
*
* \def LNK_SECTION_DATA_L2
* See ::LNK_SECTION_DATA_L1
* \def LNK_SECTION_L1_DATA_A
* See ::LNK_SECTION_DATA_L1
* \def LNK_SECTION_L1_DATA_B
* See ::LNK_SECTION_DATA_L1
* \def LNK_SECTION_CONSTDATA_L1
* See ::LNK_SECTION_DATA_L1
* \def LNK_SECTION_CONSTDATA
* See ::LNK_SECTION_DATA_L1
* \def LNK_SECTION_CODE_L1
* See ::LNK_SECTION_DATA_L1
* \def LNK_SECTION_CODE_L2
* See ::LNK_SECTION_DATA_L1
* \def LNK_SECTION_INITCODE
* See ::LNK_SECTION_DATA_L1
*/
/**************************************************
* Code Section macros
**************************************************/
#define LNK_SECTION_CODE_L1
#define LNK_SECTION_CODE_L2
#define LNK_SECTION_INITCODE
/* Memory section macros. */
/* default fall back */
#define LNK_SECTION_DATA_L1
#define LNK_SECTION_DATA_L2
#define LNK_SECTION_CONSTDATA
#define LNK_SECTION_CONSTDATA_L1
#define LNK_SECTION_L1_DATA_A
#define LNK_SECTION_L1_DATA_B
/**************************************************
* Macros regarding static code analysis
**************************************************/
#ifdef __cplusplus
#if !defined(__has_cpp_attribute)
#define __has_cpp_attribute(x) 0
#endif
#if defined(__clang__) && __has_cpp_attribute(clang::fallthrough)
#define FDK_FALLTHROUGH [[clang::fallthrough]]
#endif
#endif
#ifndef FDK_FALLTHROUGH
#if defined(__GNUC__) && (__GNUC__ >= 7)
#define FDK_FALLTHROUGH __attribute__((fallthrough))
#else
#define FDK_FALLTHROUGH
#endif
#endif
#ifdef _MSC_VER
/*
* Sometimes certain features are excluded from compilation and therefore the
* warning 4065 may occur: "switch statement contains 'default' but no 'case'
* labels" We consider this warning irrelevant and disable it.
*/
#pragma warning(disable : 4065)
#endif
#endif /* MACHINE_TYPE_H */

View File

@ -0,0 +1,202 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
scheme for digital audio. This FDK AAC Codec software is intended to be used on
a wide variety of Android devices.
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
general perceptual audio codecs. AAC-ELD is considered the best-performing
full-bandwidth communications codec by independent studies and is widely
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
specifications.
Patent licenses for necessary patent claims for the FDK AAC Codec (including
those of Fraunhofer) may be obtained through Via Licensing
(www.vialicensing.com) or through the respective patent owners individually for
the purpose of encoding or decoding bit streams in products that are compliant
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
Android devices already license these patent claims through Via Licensing or
directly from the patent owners, and therefore FDK AAC Codec software may
already be covered under those patent licenses when it is used for those
licensed purposes only.
Commercially-licensed AAC software libraries, including floating-point versions
with enhanced sound quality, are also available from Fraunhofer. Users are
encouraged to check the Fraunhofer website for additional applications
information and documentation.
2. COPYRIGHT LICENSE
Redistribution and use in source and binary forms, with or without modification,
are permitted without payment of copyright license fees provided that you
satisfy the following conditions:
You must retain the complete text of this software license in redistributions of
the FDK AAC Codec or your modifications thereto in source code form.
You must retain the complete text of this software license in the documentation
and/or other materials provided with redistributions of the FDK AAC Codec or
your modifications thereto in binary form. You must make available free of
charge copies of the complete source code of the FDK AAC Codec and your
modifications thereto to recipients of copies in binary form.
The name of Fraunhofer may not be used to endorse or promote products derived
from this library without prior written permission.
You may not charge copyright license fees for anyone to use, copy or distribute
the FDK AAC Codec software or your modifications thereto.
Your modified versions of the FDK AAC Codec must carry prominent notices stating
that you changed the software and the date of any change. For modified versions
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
AAC Codec Library for Android."
3. NO PATENT LICENSE
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
Fraunhofer provides no warranty of patent non-infringement with respect to this
software.
You may use this FDK AAC Codec software or modifications thereto only for
purposes that are authorized by appropriate patent licenses.
4. DISCLAIMER
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
including but not limited to the implied warranties of merchantability and
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
or consequential damages, including but not limited to procurement of substitute
goods or services; loss of use, data, or profits, or business interruption,
however caused and on any theory of liability, whether in contract, strict
liability, or tort (including negligence), arising in any way out of the use of
this software, even if advised of the possibility of such damage.
5. CONTACT INFORMATION
Fraunhofer Institute for Integrated Circuits IIS
Attention: Audio and Multimedia Departments - FDK AAC LL
Am Wolfsmantel 33
91058 Erlangen, Germany
www.iis.fraunhofer.de/amm
amm-info@iis.fraunhofer.de
----------------------------------------------------------------------------- */
/************************* System integration library **************************
Author(s): Thomas Dietzen
Description:
*******************************************************************************/
/** \file syslib_channelMapDescr.h
* \brief Function and structure declarations for the channel map descriptor implementation.
*/
#ifndef SYSLIB_CHANNELMAPDESCR_H
#define SYSLIB_CHANNELMAPDESCR_H
#include "machine_type.h"
/**
* \brief Contains information needed for a single channel map.
*/
typedef struct {
const UCHAR*
pChannelMap; /*!< Actual channel mapping for one single configuration. */
UCHAR numChannels; /*!< The number of channels for the channel map which is
the maximum used channel index+1. */
} CHANNEL_MAP_INFO;
/**
* \brief This is the main data struct. It contains the mapping for all
* channel configurations such as administration information.
*
* CAUTION: Do not access this structure directly from a algorithm specific
* library. Always use one of the API access functions below!
*/
typedef struct {
const CHANNEL_MAP_INFO* pMapInfoTab; /*!< Table of channel maps. */
UINT mapInfoTabLen; /*!< Length of the channel map table array. */
UINT fPassThrough; /*!< Flag that defines whether the specified mapping shall
be applied (value: 0) or the input just gets passed
through (MPEG mapping). */
} FDK_channelMapDescr;
#ifdef __cplusplus
extern "C" {
#endif
/**
* \brief Initialize a given channel map descriptor.
*
* \param pMapDescr Pointer to a channel map descriptor to be initialized.
* \param pMapInfoTab Table of channel maps to initizalize the descriptor
with.
* If a NULL pointer is given a default table for
WAV-like mapping will be used.
* \param mapInfoTabLen Length of the channel map table array (pMapInfoTab).
If a zero length is given a default table for WAV-like mapping will be used.
* \param fPassThrough If the flag is set the reordering (given by
pMapInfoTab) will be bypassed.
*/
void FDK_chMapDescr_init(FDK_channelMapDescr* const pMapDescr,
const CHANNEL_MAP_INFO* const pMapInfoTab,
const UINT mapInfoTabLen, const UINT fPassThrough);
/**
* \brief Change the channel reordering state of a given channel map
* descriptor.
*
* \param pMapDescr Pointer to a (initialized) channel map descriptor.
* \param fPassThrough If the flag is set the reordering (given by
* pMapInfoTab) will be bypassed.
* \return Value unequal to zero if set operation was not
* successful. And zero on success.
*/
int FDK_chMapDescr_setPassThrough(FDK_channelMapDescr* const pMapDescr,
UINT fPassThrough);
/**
* \brief Get the mapping value for a specific channel and map index.
*
* \param pMapDescr Pointer to channel map descriptor.
* \param chIdx Channel index.
* \param mapIdx Mapping index (corresponding to the channel configuration
* index).
* \return Mapping value.
*/
UCHAR FDK_chMapDescr_getMapValue(const FDK_channelMapDescr* const pMapDescr,
const UCHAR chIdx, const UINT mapIdx);
/**
* \brief Evaluate whether channel map descriptor is reasonable or not.
*
* \param pMapDescr Pointer to channel map descriptor.
* \return Value unequal to zero if descriptor is valid, otherwise
* zero.
*/
int FDK_chMapDescr_isValid(const FDK_channelMapDescr* const pMapDescr);
/**
* Extra variables for setting up Wg4 channel mapping.
*/
extern const CHANNEL_MAP_INFO FDK_mapInfoTabWg4[];
extern const UINT FDK_mapInfoTabLenWg4;
#ifdef __cplusplus
}
#endif
#endif /* !defined(SYSLIB_CHANNELMAPDESCR_H) */

BIN
ThirdParty/fdk-aac/lib/libfdk-aac.2.dylib vendored Executable file

Binary file not shown.

BIN
ThirdParty/fdk-aac/lib/libfdk-aac.a vendored Normal file

Binary file not shown.

1
ThirdParty/fdk-aac/lib/libfdk-aac.dylib vendored Symbolic link
View File

@ -0,0 +1 @@
libfdk-aac.2.dylib

41
ThirdParty/fdk-aac/lib/libfdk-aac.la vendored Executable file
View File

@ -0,0 +1,41 @@
# libfdk-aac.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.6
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# The name that we can dlopen(3).
dlname='libfdk-aac.2.dylib'
# Names of this library.
library_names='libfdk-aac.2.dylib libfdk-aac.dylib'
# The name of the static archive.
old_library='libfdk-aac.a'
# Linker flags that cannot go in dependency_libs.
inherited_linker_flags=' '
# Libraries that this one depends upon.
dependency_libs=''
# Names of additional weak libraries provided by this library
weak_library_names=''
# Version information for libfdk-aac.
current=2
age=0
revision=2
# Is this an already installed library?
installed=yes
# Should we warn about portability when linking against -modules?
shouldnotlink=no
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
# Directory that this library needs to be installed in:
libdir='/usr/local/lib'

View File

@ -0,0 +1,11 @@
prefix=/Users/chris/Source/Repos/cog/ThirdParty/fdk-aac
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: Fraunhofer FDK AAC Codec Library
Description: AAC codec library
Version: 2.0.2
Libs: -L${libdir} -lfdk-aac
Libs.private:
Cflags: -I${includedir}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,38 @@
From 91a7dee45f53d3b7049520363e68573a27c951c6 Mon Sep 17 00:00:00 2001
From: Christopher Snowhill <kode54@gmail.com>
Date: Tue, 21 Dec 2021 20:51:44 -0800
Subject: [PATCH] avcodec/audiotoolboxdec: Properly fill out_format
X-Unsent: 1
To: ffmpeg-devel@ffmpeg.org
Monterey needs mBytesPerFrame and mBytesPerPacket to be set, and I'm
surprised this didn't break any previous system versions.
Fixes bug #9564: Cannot decode xHE-AAC with audiotoolbox (aac_at) on
Mac OS Monterey. Fixes likely bug that none of the AudioToolbox
decoders work on Monterey.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
---
libavcodec/audiotoolboxdec.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
index 9939fef218..4abcb63a03 100644
--- a/libavcodec/audiotoolboxdec.c
+++ b/libavcodec/audiotoolboxdec.c
@@ -370,6 +370,11 @@ static av_cold int ffat_create_decoder(AVCodecContext *avctx,
avctx->sample_rate = out_format.mSampleRate = in_format.mSampleRate;
avctx->channels = out_format.mChannelsPerFrame = in_format.mChannelsPerFrame;
+ out_format.mBytesPerFrame =
+ out_format.mChannelsPerFrame * (out_format.mBitsPerChannel / 8);
+ out_format.mBytesPerPacket =
+ out_format.mBytesPerFrame * out_format.mFramesPerPacket;
+
if (avctx->codec_id == AV_CODEC_ID_ADPCM_IMA_QT)
in_format.mFramesPerPacket = 64;
--
2.32.0 (Apple Git-132)

View File

@ -0,0 +1,87 @@
From 251fc6bc3cfa42947a3f72b69f1e517d2716d286 Mon Sep 17 00:00:00 2001
From: Christopher Snowhill <kode54@gmail.com>
Date: Tue, 21 Dec 2021 20:54:38 -0800
Subject: [PATCH] avcodec/audiotoolboxdec: Decode appropriate formats to float
X-Unsent: 1
To: ffmpeg-devel@ffmpeg.org
These candidate formats are likely already decoded in floating point
internally anyway, so request float output so that it's also possible
to clip or peak level as necessary.
Signed-off-by: Christopher Snowhill <kode54@gmail.com>
---
libavcodec/audiotoolboxdec.c | 36 ++++++++++++++++++++++++++++++++----
1 file changed, 32 insertions(+), 4 deletions(-)
diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
index 4abcb63a03..427f143468 100644
--- a/libavcodec/audiotoolboxdec.c
+++ b/libavcodec/audiotoolboxdec.c
@@ -297,6 +297,25 @@ static int ffat_set_extradata(AVCodecContext *avctx)
return 0;
}
+static bool ffat_get_format_is_float(enum AVCodecID codec)
+{
+ switch (codec) {
+ case AV_CODEC_ID_AAC:
+ case AV_CODEC_ID_AC3:
+ case AV_CODEC_ID_AMR_NB:
+ case AV_CODEC_ID_EAC3:
+ case AV_CODEC_ID_ILBC:
+ case AV_CODEC_ID_MP1:
+ case AV_CODEC_ID_MP2:
+ case AV_CODEC_ID_MP3:
+ case AV_CODEC_ID_QDMC:
+ case AV_CODEC_ID_QDM2:
+ return true;
+ default:
+ return false;
+ }
+}
+
static av_cold int ffat_create_decoder(AVCodecContext *avctx,
const AVPacket *pkt)
{
@@ -304,8 +323,12 @@ static av_cold int ffat_create_decoder(AVCodecContext *avctx,
OSStatus status;
int i;
- enum AVSampleFormat sample_fmt = (avctx->bits_per_raw_sample == 32) ?
- AV_SAMPLE_FMT_S32 : AV_SAMPLE_FMT_S16;
+ bool sample_fmt_is_float = ffat_get_format_is_float(avctx->codec_id);
+
+ enum AVSampleFormat sample_fmt = sample_fmt_is_float ?
+ AV_SAMPLE_FMT_FLT :
+ ((avctx->bits_per_raw_sample == 32) ?
+ AV_SAMPLE_FMT_S32 : AV_SAMPLE_FMT_S16);
AudioStreamBasicDescription in_format = {
.mFormatID = ffat_get_format_id(avctx->codec_id, avctx->profile),
@@ -313,7 +336,10 @@ static av_cold int ffat_create_decoder(AVCodecContext *avctx,
};
AudioStreamBasicDescription out_format = {
.mFormatID = kAudioFormatLinearPCM,
- .mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked,
+ .mFormatFlags = (sample_fmt_is_float ?
+ kAudioFormatFlagIsFloat :
+ kAudioFormatFlagIsSignedInteger) |
+ kAudioFormatFlagIsPacked,
.mFramesPerPacket = 1,
.mBitsPerChannel = av_get_bytes_per_sample(sample_fmt) * 8,
};
@@ -471,7 +497,9 @@ static OSStatus ffat_decode_callback(AudioConverterRef converter, UInt32 *nb_pac
static void ffat_copy_samples(AVCodecContext *avctx, AVFrame *frame)
{
ATDecodeContext *at = avctx->priv_data;
- if (avctx->sample_fmt == AV_SAMPLE_FMT_S32) {
+ if (avctx->sample_fmt == AV_SAMPLE_FMT_FLT) {
+ COPY_SAMPLES(float);
+ } else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32) {
COPY_SAMPLES(int32_t);
} else {
COPY_SAMPLES(int16_t);
--
2.32.0 (Apple Git-132)

View File

@ -0,0 +1,33 @@
diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
index 1a86dffe4b..565621b973 100644
--- a/libavcodec/libfdk-aacdec.c
+++ b/libavcodec/libfdk-aacdec.c
@@ -335,7 +335,7 @@ static av_cold int fdk_aac_decode_init(AVCodecContext *avctx)
}
#endif
- avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+ avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
s->decoder_buffer_size = DECODER_BUFFSIZE * DECODER_MAX_CHANNELS;
s->decoder_buffer = av_malloc(s->decoder_buffer_size);
@@ -384,9 +384,19 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
(AVRational){1, avctx->sample_rate},
avctx->time_base);
+#if 0
memcpy(frame->extended_data[0], s->decoder_buffer,
avctx->channels * avctx->frame_size *
av_get_bytes_per_sample(avctx->sample_fmt));
+#else
+ {
+ INT_PCM *in = (INT_PCM *) s->decoder_buffer;
+ float *out = (float *) frame->extended_data[0];
+ const float scale = 1.0f / (float)0x800000;
+ for (int i = 0, j = avctx->channels * avctx->frame_size; i < j; i++)
+ *out++ = (float)(*in++) * scale;
+ }
+#endif
*got_frame_ptr = 1;
ret = avpkt->size - valid;