aacdecoder_lib.h 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. /* -----------------------------------------------------------------------------------------------------------
  2. Software License for The Fraunhofer FDK AAC Codec Library for Android
  3. © Copyright 1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
  4. All rights reserved.
  5. 1. INTRODUCTION
  6. The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
  7. the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
  8. This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
  9. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
  10. audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
  11. independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
  12. of the MPEG specifications.
  13. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
  14. may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
  15. individually for the purpose of encoding or decoding bit streams in products that are compliant with
  16. the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
  17. these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
  18. software may already be covered under those patent licenses when it is used for those licensed purposes only.
  19. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
  20. are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
  21. applications information and documentation.
  22. 2. COPYRIGHT LICENSE
  23. Redistribution and use in source and binary forms, with or without modification, are permitted without
  24. payment of copyright license fees provided that you satisfy the following conditions:
  25. You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
  26. your modifications thereto in source code form.
  27. You must retain the complete text of this software license in the documentation and/or other materials
  28. provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
  29. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
  30. modifications thereto to recipients of copies in binary form.
  31. The name of Fraunhofer may not be used to endorse or promote products derived from this library without
  32. prior written permission.
  33. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
  34. software or your modifications thereto.
  35. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
  36. and the date of any change. For modified versions of the FDK AAC Codec, the term
  37. "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
  38. "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
  39. 3. NO PATENT LICENSE
  40. NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
  41. ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
  42. respect to this software.
  43. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
  44. by appropriate patent licenses.
  45. 4. DISCLAIMER
  46. This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
  47. "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
  48. of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  49. CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
  50. including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
  51. or business interruption, however caused and on any theory of liability, whether in contract, strict
  52. liability, or tort (including negligence), arising in any way out of the use of this software, even if
  53. advised of the possibility of such damage.
  54. 5. CONTACT INFORMATION
  55. Fraunhofer Institute for Integrated Circuits IIS
  56. Attention: Audio and Multimedia Departments - FDK AAC LL
  57. Am Wolfsmantel 33
  58. 91058 Erlangen, Germany
  59. www.iis.fraunhofer.de/amm
  60. [email protected]
  61. ----------------------------------------------------------------------------------------------------------- */
  62. /***************************** MPEG-4 AAC Decoder **************************
  63. Author(s): Manuel Jander
  64. ******************************************************************************/
  65. /**
  66. * \file aacdecoder_lib.h
  67. * \brief FDK AAC decoder library interface header file.
  68. *
  69. \page INTRO Introduction
  70. \section SCOPE Scope
  71. This document describes the high-level interface and usage of the ISO/MPEG-2/4 AAC Decoder
  72. library developed by the Fraunhofer Institute for Integrated Circuits (IIS).
  73. Depending on the library configuration, it implements decoding of AAC-LC (Low-Complexity),
  74. HE-AAC (High-Efficiency AAC, v1 and v2), AAC-LD (Low-Delay) and AAC-ELD (Enhanced Low-Delay).
  75. All references to SBR (Spectral Band Replication) are only applicable to HE-AAC and AAC-ELD
  76. versions of the library. All references to PS (Parametric Stereo) are only applicable to
  77. HE-AAC v2 versions of the library.
  78. \section DecoderBasics Decoder Basics
  79. This document can only give a rough overview about the ISO/MPEG-2 and ISO/MPEG-4 AAC audio
  80. coding standard. To understand all the terms in this document, you are encouraged to read
  81. the following documents.
  82. - ISO/IEC 13818-7 (MPEG-2 AAC), which defines the syntax of MPEG-2 AAC audio bitstreams.
  83. - ISO/IEC 14496-3 (MPEG-4 AAC, subpart 1 and 4), which defines the syntax of MPEG-4 AAC audio bitstreams.
  84. - Lutzky, Schuller, Gayer, Krämer, Wabnik, "A guideline to audio codec delay", 116th AES Convention, May 8, 2004
  85. MPEG Advanced Audio Coding is based on a time-to-frequency mapping of the signal. The signal
  86. is partitioned into overlapping portions and transformed into frequency domain. The spectral
  87. components are then quantized and coded.\n
  88. An MPEG2 or MPEG4 AAC audio bitstream is composed of frames. Contrary to MPEG-1/2 Layer-3 (mp3),
  89. the length of individual frames is not restricted to a fixed number of bytes, but can take on
  90. any length between 1 and 768 bytes.
  91. \page LIBUSE Library Usage
  92. \section InterfaceDescritpion API Description
  93. All API header files are located in the folder /include of the release package. They are described in
  94. detail in this document. All header files are provided for usage in C/C++ programs. The AAC decoder library
  95. API functions are located at aacdecoder_lib.h.
  96. In binary releases the decoder core resides in statically linkable libraries called for example libAACdec.a,
  97. (Linux) or FDK_aacDec_lib (Microsoft Visual C++).
  98. \section Calling_Sequence Calling Sequence
  99. For decoding of ISO/MPEG-2/4 AAC or HE-AAC v2 bitstreams the following sequence is mandatory. Input read
  100. and output write functions as well as the corresponding open and close functions are left out, since they
  101. may be implemented differently according to the user's specific requirements. The example implementation in
  102. main.cpp uses file-based input/output, and in such case call mpegFileRead_Open() to open an input file and
  103. to allocate memory for the required structures, and the corresponding mpegFileRead_Close() to close opened
  104. files and to de-allocate associated structures. mpegFileRead_Open() tries to detect the bitstream format and
  105. in case of MPEG-4 file format or Raw Packets file format (a Fraunhofer IIS proprietary format) reads the Audio
  106. Specific Config data (ASC). An unsuccessful attempt to recognize the bitstream format requires the user to
  107. provide this information manually. For any other bitstream formats that are usually applicable in streaming
  108. applications, the decoder itself will try to synchronize and parse the given bitstream fragment using the
  109. FDK transport library. Hence, for streaming applications (without file access) this step is not necessary.
  110. -# Call aacDecoder_Open() to open and retrieve a handle to a new AAC decoder instance.
  111. \dontinclude main.cpp
  112. \skipline aacDecoder_Open
  113. -# If out-of-band config data (Audio Specific Config (ASC) or Stream Mux Config (SMC)) is available, call
  114. aacDecoder_ConfigRaw() to pass it to the decoder and before the decoding process starts. If this data is
  115. not available in advance, the decoder will get it from the bitstream and configure itself while decoding
  116. with aacDecoder_DecodeFrame().
  117. -# Begin decoding loop.
  118. \skipline do {
  119. -# Read data from bitstream file or stream into a client-supplied input buffer ("inBuffer" in main.cpp).
  120. If it is very small like just 4, aacDecoder_DecodeFrame() will
  121. repeatedly return ::AAC_DEC_NOT_ENOUGH_BITS until enough bits were fed by aacDecoder_Fill(). Only read data
  122. when this buffer has completely been processed and is then empty. For file-based input execute
  123. mpegFileRead_Read() or any other implementation with similar functionality.
  124. -# Call aacDecoder_Fill() to fill the decoder's internal bitstream input buffer with the client-supplied
  125. external bitstream input buffer.
  126. \skipline aacDecoder_Fill
  127. -# Call aacDecoder_DecodeFrame() which writes decoded PCM audio data to a client-supplied buffer. It is the
  128. client's responsibility to allocate a buffer which is large enough to hold this output data.
  129. \skipline aacDecoder_DecodeFrame
  130. If the bitstream's configuration (number of channels, sample rate, frame size) is not known in advance, you may
  131. call aacDecoder_GetStreamInfo() to retrieve a structure containing this information and then initialize an audio
  132. output device. In the example main.cpp, if the number of channels or the sample rate has changed since program
  133. start or since the previously decoded frame, the audio output device will be re-initialized. If WAVE file output
  134. is chosen, a new WAVE file for each new configuration will be created.
  135. \skipline aacDecoder_GetStreamInfo
  136. -# Repeat steps 5 to 7 until no data to decode is available anymore, or if an error occured.
  137. \skipline } while
  138. -# Call aacDecoder_Close() to de-allocate all AAC decoder and transport layer structures.
  139. \skipline aacDecoder_Close
  140. \section BufferSystem Buffer System
  141. There are three main buffers in an AAC decoder application. One external input buffer to hold bitstream
  142. data from file I/O or elsewhere, one decoder-internal input buffer, and one to hold the decoded output
  143. PCM sample data, whereas this output buffer may overlap with the external input buffer.
  144. The external input buffer is set in the example framework main.cpp and its size is defined by ::IN_BUF_SIZE.
  145. You may freely choose different sizes here. To feed the data to the decoder-internal input buffer, use the
  146. function aacDecoder_Fill(). This function returns important information about how many bytes in the
  147. external input buffer have not yet been copied into the internal input buffer (variable bytesValid).
  148. Once the external buffer has been fully copied, it can be re-filled again.
  149. In case you want to re-fill it when there are still unprocessed bytes (bytesValid is unequal 0), you
  150. would have to additionally perform a memcpy(), so that just means unnecessary computational overhead
  151. and therefore we recommend to re-fill the buffer only when bytesValid is 0.
  152. \image latex dec_buffer.png "Lifecycle of the external input buffer" width=9cm
  153. The size of the decoder-internal input buffer is set in tpdec_lib.h (see define ::TRANSPORTDEC_INBUF_SIZE).
  154. You may choose a smaller size under the following considerations:
  155. - each input channel requires 768 bytes
  156. - the whole buffer must be of size 2^n
  157. So for example a stereo decoder:
  158. \f[
  159. TRANSPORTDEC\_INBUF\_SIZE = 2 * 768 = 1536 => 2048
  160. \f]
  161. tpdec_lib.h and TRANSPORTDEC_INBUF_SIZE are not part of the decoder's library interface. Therefore
  162. only source-code clients may change this setting. If you received a library release, please ask us and
  163. we can change this in order to meet your memory requirements.
  164. \page OutputFormat Decoder audio output
  165. \section OutputFormatObtaining Obtaining channel mapping information
  166. The decoded audio output format is indicated by a set of variables of the CStreamInfo structure.
  167. While the members sampleRate, frameSize and numChannels might be quite self explaining,
  168. pChannelType and pChannelIndices might require some more detailed explanation.
  169. These two arrays indicate what is each output channel supposed to be. Both array have
  170. CStreamInfo::numChannels cells. Each cell of pChannelType indicates the channel type, described in
  171. the enum ::AUDIO_CHANNEL_TYPE defined in FDK_audio.h. The cells of pChannelIndices indicate the sub index
  172. among the channels starting with 0 among all channels of the same audio channel type.
  173. The indexing scheme is the same as for MPEG-2/4. Thus indices are counted upwards starting from the front
  174. direction (thus a center channel if any, will always be index 0). Then the indices count up, starting always
  175. with the left side, pairwise from front toward back. For detailed explanation, please refer to
  176. ISO/IEC 13818-7:2005(E), chapter 8.5.3.2.
  177. In case a Program Config is included in the audio configuration, the channel mapping described within
  178. it will be adopted.
  179. In case of MPEG-D Surround the channel mapping will follow the same criteria described in ISO/IEC 13818-7:2005(E),
  180. but adding corresponding top channels to the channel types front, side and back, in order to avoid any
  181. loss of information.
  182. \section OutputFormatChange Changing the audio output format
  183. The channel interleaving scheme and the actual channel order can be changed at runtime through the
  184. parameters ::AAC_PCM_OUTPUT_INTERLEAVED and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING. See the description of those
  185. parameters and the decoder library function aacDecoder_SetParam() for more detail.
  186. \section OutputFormatExample Channel mapping examples
  187. The following examples illustrate the location of individual audio samples in the audio buffer that
  188. is passed to aacDecoder_DecodeFrame() and the expected data in the CStreamInfo structure which can be obtained
  189. by calling aacDecoder_GetStreamInfo().
  190. \subsection ExamplesStereo Stereo
  191. In case of ::AAC_PCM_OUTPUT_INTERLEAVED set to 0 and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING set to 1,
  192. a AAC-LC bit stream which has channelConfiguration = 2 in its audio specific config would lead
  193. to the following values in CStreamInfo:
  194. CStreamInfo::numChannels = 2
  195. CStreamInfo::pChannelType = { ::ACT_FRONT, ::ACT_FRONT }
  196. CStreamInfo::pChannelIndices = { 0, 1 }
  197. Since ::AAC_PCM_OUTPUT_INTERLEAVED is set to 0, the audio channels will be located as contiguous blocks
  198. in the output buffer as follows:
  199. \verbatim
  200. <left sample 0> <left sample 1> <left sample 2> ... <left sample N>
  201. <right sample 0> <right sample 1> <right sample 2> ... <right sample N>
  202. \endverbatim
  203. Where N equals to CStreamInfo::frameSize .
  204. \subsection ExamplesSurround Surround 5.1
  205. In case of ::AAC_PCM_OUTPUT_INTERLEAVED set to 1 and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING set to 1,
  206. a AAC-LC bit stream which has channelConfiguration = 6 in its audio specific config, would lead
  207. to the following values in CStreamInfo:
  208. CStreamInfo::numChannels = 6
  209. CStreamInfo::pChannelType = { ::ACT_FRONT, ::ACT_FRONT, ::ACT_FRONT, ::ACT_LFE, ::ACT_BACK, ::ACT_BACK }
  210. CStreamInfo::pChannelIndices = { 1, 2, 0, 0, 0, 1 }
  211. Since ::AAC_PCM_OUTPUT_CHANNEL_MAPPING is 1, WAV file channel ordering will be used. For a 5.1 channel
  212. scheme, thus the channels would be: front left, front right, center, LFE, surround left, surround right.
  213. Thus the third channel is the center channel, receiving the index 0. The other front channels are
  214. front left, front right being placed as first and second channels with indices 1 and 2 correspondingly.
  215. There is only one LFE, placed as the fourth channel and index 0. Finally both surround
  216. channels get the type definition ACT_BACK, and the indices 0 and 1.
  217. Since ::AAC_PCM_OUTPUT_INTERLEAVED is set to 1, the audio channels will be placed in the output buffer
  218. as follows:
  219. \verbatim
  220. <front left sample 0> <front right sample 0>
  221. <center sample 0> <LFE sample 0>
  222. <surround left sample 0> <surround right sample 0>
  223. <front left sample 1> <front right sample 1>
  224. <center sample 1> <LFE sample 1>
  225. <surround left sample 1> <surround right sample 1>
  226. ...
  227. <front left sample N> <front right sample N>
  228. <center sample N> <LFE sample N>
  229. <surround left sample N> <surround right sample N>
  230. \endverbatim
  231. Where N equals to CStreamInfo::frameSize .
  232. \subsection ExamplesArib ARIB coding mode 2/1
  233. In case of ::AAC_PCM_OUTPUT_INTERLEAVED set to 1 and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING set to 1,
  234. in case of a ARIB bit stream using coding mode 2/1 as described in ARIB STD-B32 Part 2 Version 2.1-E1, page 61,
  235. would lead to the following values in CStreamInfo:
  236. CStreamInfo::numChannels = 3
  237. CStreamInfo::pChannelType = { ::ACT_FRONT, ::ACT_FRONT,:: ACT_BACK }
  238. CStreamInfo::pChannelIndices = { 0, 1, 0 }
  239. The audio channels will be placed as follows in the audio output buffer:
  240. \verbatim
  241. <front left sample 0> <front right sample 0> <mid surround sample 0>
  242. <front left sample 1> <front right sample 1> <mid surround sample 1>
  243. ...
  244. <front left sample N> <front right sample N> <mid surround sample N>
  245. Where N equals to CStreamInfo::frameSize .
  246. \endverbatim
  247. */
  248. #ifndef AACDECODER_LIB_H
  249. #define AACDECODER_LIB_H
  250. #include "machine_type.h"
  251. #include "FDK_audio.h"
  252. #include "genericStds.h"
  253. #define AACDECODER_LIB_VL0 2
  254. #define AACDECODER_LIB_VL1 5
  255. #define AACDECODER_LIB_VL2 17
  256. /**
  257. * \brief AAC decoder error codes.
  258. */
  259. typedef enum {
  260. AAC_DEC_OK = 0x0000, /*!< No error occured. Output buffer is valid and error free. */
  261. AAC_DEC_OUT_OF_MEMORY = 0x0002, /*!< Heap returned NULL pointer. Output buffer is invalid. */
  262. AAC_DEC_UNKNOWN = 0x0005, /*!< Error condition is of unknown reason, or from a another module. Output buffer is invalid. */
  263. /* Synchronization errors. Output buffer is invalid. */
  264. aac_dec_sync_error_start = 0x1000,
  265. AAC_DEC_TRANSPORT_SYNC_ERROR = 0x1001, /*!< The transport decoder had syncronisation problems. Do not exit decoding. Just feed new
  266. bitstream data. */
  267. AAC_DEC_NOT_ENOUGH_BITS = 0x1002, /*!< The input buffer ran out of bits. */
  268. aac_dec_sync_error_end = 0x1FFF,
  269. /* Initialization errors. Output buffer is invalid. */
  270. aac_dec_init_error_start = 0x2000,
  271. AAC_DEC_INVALID_HANDLE = 0x2001, /*!< The handle passed to the function call was invalid (NULL). */
  272. AAC_DEC_UNSUPPORTED_AOT = 0x2002, /*!< The AOT found in the configuration is not supported. */
  273. AAC_DEC_UNSUPPORTED_FORMAT = 0x2003, /*!< The bitstream format is not supported. */
  274. AAC_DEC_UNSUPPORTED_ER_FORMAT = 0x2004, /*!< The error resilience tool format is not supported. */
  275. AAC_DEC_UNSUPPORTED_EPCONFIG = 0x2005, /*!< The error protection format is not supported. */
  276. AAC_DEC_UNSUPPORTED_MULTILAYER = 0x2006, /*!< More than one layer for AAC scalable is not supported. */
  277. AAC_DEC_UNSUPPORTED_CHANNELCONFIG = 0x2007, /*!< The channel configuration (either number or arrangement) is not supported. */
  278. AAC_DEC_UNSUPPORTED_SAMPLINGRATE = 0x2008, /*!< The sample rate specified in the configuration is not supported. */
  279. AAC_DEC_INVALID_SBR_CONFIG = 0x2009, /*!< The SBR configuration is not supported. */
  280. AAC_DEC_SET_PARAM_FAIL = 0x200A, /*!< The parameter could not be set. Either the value was out of range or the parameter does
  281. not exist. */
  282. AAC_DEC_NEED_TO_RESTART = 0x200B, /*!< The decoder needs to be restarted, since the requiered configuration change cannot be
  283. performed. */
  284. AAC_DEC_OUTPUT_BUFFER_TOO_SMALL = 0x200C, /*!< The provided output buffer is too small. */
  285. aac_dec_init_error_end = 0x2FFF,
  286. /* Decode errors. Output buffer is valid but concealed. */
  287. aac_dec_decode_error_start = 0x4000,
  288. AAC_DEC_TRANSPORT_ERROR = 0x4001, /*!< The transport decoder encountered an unexpected error. */
  289. AAC_DEC_PARSE_ERROR = 0x4002, /*!< Error while parsing the bitstream. Most probably it is corrupted, or the system crashed. */
  290. AAC_DEC_UNSUPPORTED_EXTENSION_PAYLOAD = 0x4003, /*!< Error while parsing the extension payload of the bitstream. The extension payload type
  291. found is not supported. */
  292. AAC_DEC_DECODE_FRAME_ERROR = 0x4004, /*!< The parsed bitstream value is out of range. Most probably the bitstream is corrupt, or
  293. the system crashed. */
  294. AAC_DEC_CRC_ERROR = 0x4005, /*!< The embedded CRC did not match. */
  295. AAC_DEC_INVALID_CODE_BOOK = 0x4006, /*!< An invalid codebook was signalled. Most probably the bitstream is corrupt, or the system
  296. crashed. */
  297. AAC_DEC_UNSUPPORTED_PREDICTION = 0x4007, /*!< Predictor found, but not supported in the AAC Low Complexity profile. Most probably the
  298. bitstream is corrupt, or has a wrong format. */
  299. AAC_DEC_UNSUPPORTED_CCE = 0x4008, /*!< A CCE element was found which is not supported. Most probably the bitstream is corrupt, or
  300. has a wrong format. */
  301. AAC_DEC_UNSUPPORTED_LFE = 0x4009, /*!< A LFE element was found which is not supported. Most probably the bitstream is corrupt, or
  302. has a wrong format. */
  303. AAC_DEC_UNSUPPORTED_GAIN_CONTROL_DATA = 0x400A, /*!< Gain control data found but not supported. Most probably the bitstream is corrupt, or has
  304. a wrong format. */
  305. AAC_DEC_UNSUPPORTED_SBA = 0x400B, /*!< SBA found, but currently not supported in the BSAC profile. */
  306. AAC_DEC_TNS_READ_ERROR = 0x400C, /*!< Error while reading TNS data. Most probably the bitstream is corrupt or the system
  307. crashed. */
  308. AAC_DEC_RVLC_ERROR = 0x400D, /*!< Error while decoding error resillient data. */
  309. aac_dec_decode_error_end = 0x4FFF,
  310. /* Ancillary data errors. Output buffer is valid. */
  311. aac_dec_anc_data_error_start = 0x8000,
  312. AAC_DEC_ANC_DATA_ERROR = 0x8001, /*!< Non severe error concerning the ancillary data handling. */
  313. AAC_DEC_TOO_SMALL_ANC_BUFFER = 0x8002, /*!< The registered ancillary data buffer is too small to receive the parsed data. */
  314. AAC_DEC_TOO_MANY_ANC_ELEMENTS = 0x8003, /*!< More than the allowed number of ancillary data elements should be written to buffer. */
  315. aac_dec_anc_data_error_end = 0x8FFF
  316. } AAC_DECODER_ERROR;
  317. /** Macro to identify initialization errors. */
  318. #define IS_INIT_ERROR(err) ( (((err)>=aac_dec_init_error_start) && ((err)<=aac_dec_init_error_end)) ? 1 : 0)
  319. /** Macro to identify decode errors. */
  320. #define IS_DECODE_ERROR(err) ( (((err)>=aac_dec_decode_error_start) && ((err)<=aac_dec_decode_error_end)) ? 1 : 0)
  321. /** Macro to identify if the audio output buffer contains valid samples after calling aacDecoder_DecodeFrame(). */
  322. #define IS_OUTPUT_VALID(err) ( ((err) == AAC_DEC_OK) || IS_DECODE_ERROR(err) )
  323. /**
  324. * \brief AAC decoder setting parameters
  325. */
  326. typedef enum
  327. {
  328. AAC_PCM_OUTPUT_INTERLEAVED = 0x0000, /*!< PCM output mode (1: interleaved (default); 0: not interleaved). */
  329. AAC_PCM_DUAL_CHANNEL_OUTPUT_MODE = 0x0002, /*!< Defines how the decoder processes two channel signals: \n
  330. 0: Leave both signals as they are (default). \n
  331. 1: Create a dual mono output signal from channel 1. \n
  332. 2: Create a dual mono output signal from channel 2. \n
  333. 3: Create a dual mono output signal by mixing both channels (L' = R' = 0.5*Ch1 + 0.5*Ch2). */
  334. AAC_PCM_OUTPUT_CHANNEL_MAPPING = 0x0003, /*!< Output buffer channel ordering. 0: MPEG PCE style order, 1: WAV file channel order (default). */
  335. AAC_PCM_LIMITER_ENABLE = 0x0004, /*!< Enable signal level limiting. \n
  336. -1: Auto-config. Enable limiter for all non-lowdelay configurations by default. \n
  337. 0: Disable limiter in general. \n
  338. 1: Enable limiter always.
  339. It is recommended to call the decoder with a AACDEC_CLRHIST flag to reset all states when
  340. the limiter switch is changed explicitly. */
  341. AAC_PCM_LIMITER_ATTACK_TIME = 0x0005, /*!< Signal level limiting attack time in ms.
  342. Default confguration is 15 ms. Adjustable range from 1 ms to 15 ms. */
  343. AAC_PCM_LIMITER_RELEAS_TIME = 0x0006, /*!< Signal level limiting release time in ms.
  344. Default configuration is 50 ms. Adjustable time must be larger than 0 ms. */
  345. AAC_PCM_MIN_OUTPUT_CHANNELS = 0x0011, /*!< Minimum number of PCM output channels. If higher than the number of encoded audio channels,
  346. a simple channel extension is applied. \n
  347. -1, 0: Disable channel extenstion feature. The decoder output contains the same number of
  348. channels as the encoded bitstream. \n
  349. 1: This value is currently needed only together with the mix-down feature. See
  350. ::AAC_PCM_MAX_OUTPUT_CHANNELS and note 2 below. \n
  351. 2: Encoded mono signals will be duplicated to achieve a 2/0/0.0 channel output
  352. configuration. \n
  353. 6: The decoder trys to reorder encoded signals with less than six channels to achieve
  354. a 3/0/2.1 channel output signal. Missing channels will be filled with a zero signal.
  355. If reordering is not possible the empty channels will simply be appended. Only
  356. available if instance is configured to support multichannel output. \n
  357. 8: The decoder trys to reorder encoded signals with less than eight channels to
  358. achieve a 3/0/4.1 channel output signal. Missing channels will be filled with a
  359. zero signal. If reordering is not possible the empty channels will simply be
  360. appended. Only available if instance is configured to support multichannel output.\n
  361. NOTE: \n
  362. 1. The channel signalling (CStreamInfo::pChannelType and CStreamInfo::pChannelIndices)
  363. will not be modified. Added empty channels will be signalled with channel type
  364. AUDIO_CHANNEL_TYPE::ACT_NONE. \n
  365. 2. If the parameter value is greater than that of ::AAC_PCM_MAX_OUTPUT_CHANNELS both will
  366. be set to the same value. \n
  367. 3. This parameter does not affect MPEG Surround processing. */
  368. AAC_PCM_MAX_OUTPUT_CHANNELS = 0x0012, /*!< Maximum number of PCM output channels. If lower than the number of encoded audio channels,
  369. downmixing is applied accordingly. If dedicated metadata is available in the stream it
  370. will be used to achieve better mixing results. \n
  371. -1, 0: Disable downmixing feature. The decoder output contains the same number of channels
  372. as the encoded bitstream. \n
  373. 1: All encoded audio configurations with more than one channel will be mixed down to
  374. one mono output signal. \n
  375. 2: The decoder performs a stereo mix-down if the number encoded audio channels is
  376. greater than two. \n
  377. 6: If the number of encoded audio channels is greater than six the decoder performs a
  378. mix-down to meet the target output configuration of 3/0/2.1 channels. Only
  379. available if instance is configured to support multichannel output. \n
  380. 8: This value is currently needed only together with the channel extension feature.
  381. See ::AAC_PCM_MIN_OUTPUT_CHANNELS and note 2 below. Only available if instance is
  382. configured to support multichannel output. \n
  383. NOTE: \n
  384. 1. Down-mixing of any seven or eight channel configuration not defined in ISO/IEC 14496-3
  385. PDAM 4 is not supported by this software version. \n
  386. 2. If the parameter value is greater than zero but smaller than ::AAC_PCM_MIN_OUTPUT_CHANNELS
  387. both will be set to same value. \n
  388. 3. The operating mode of the MPEG Surround module will be set accordingly. \n
  389. 4. Setting this param with any value will disable the binaural processing of the MPEG
  390. Surround module (::AAC_MPEGS_BINAURAL_ENABLE=0). */
  391. AAC_CONCEAL_METHOD = 0x0100, /*!< Error concealment: Processing method. \n
  392. 0: Spectral muting. \n
  393. 1: Noise substitution (see ::CONCEAL_NOISE). \n
  394. 2: Energy interpolation (adds additional signal delay of one frame, see ::CONCEAL_INTER). \n */
  395. AAC_DRC_BOOST_FACTOR = 0x0200, /*!< Dynamic Range Control: Scaling factor for boosting gain values.
  396. Defines how the boosting DRC factors (conveyed in the bitstream) will be applied to the
  397. decoded signal. The valid values range from 0 (don't apply boost factors) to 127 (fully
  398. apply all boosting factors). */
  399. AAC_DRC_ATTENUATION_FACTOR = 0x0201, /*!< Dynamic Range Control: Scaling factor for attenuating gain values. Same as
  400. AAC_DRC_BOOST_FACTOR but for attenuating DRC factors. */
  401. AAC_DRC_REFERENCE_LEVEL = 0x0202, /*!< Dynamic Range Control: Target reference level. Defines the level below full-scale
  402. (quantized in steps of 0.25dB) to which the output audio signal will be normalized to by
  403. the DRC module. The valid values range from 0 (full-scale) to 127 (31.75 dB below
  404. full-scale). The value smaller than 0 switches off normalization. */
  405. AAC_DRC_HEAVY_COMPRESSION = 0x0203, /*!< Dynamic Range Control: En-/Disable DVB specific heavy compression (aka RF mode).
  406. If set to 1, the decoder will apply the compression values from the DVB specific ancillary
  407. data field. At the same time the MPEG-4 Dynamic Range Control tool will be disabled. By
  408. default heavy compression is disabled. */
  409. AAC_QMF_LOWPOWER = 0x0300, /*!< Quadrature Mirror Filter (QMF) Bank processing mode. \n
  410. -1: Use internal default. Implies MPEG Surround partially complex accordingly. \n
  411. 0: Use complex QMF data mode. \n
  412. 1: Use real (low power) QMF data mode. \n */
  413. AAC_MPEGS_ENABLE = 0x0500, /*!< MPEG Surround: Allow/Disable decoding of MPS content. Available only for decoders with MPEG
  414. Surround support. */
  415. AAC_TPDEC_CLEAR_BUFFER = 0x0603 /*!< Clear internal bit stream buffer of transport layers. The decoder will start decoding
  416. at new data passed after this event and any previous data is discarded. */
  417. } AACDEC_PARAM;
  418. /**
  419. * \brief This structure gives information about the currently decoded audio data.
  420. * All fields are read-only.
  421. */
  422. typedef struct
  423. {
  424. /* These five members are the only really relevant ones for the user. */
  425. INT sampleRate; /*!< The samplerate in Hz of the fully decoded PCM audio signal (after SBR processing). */
  426. INT frameSize; /*!< The frame size of the decoded PCM audio signal. \n
  427. 1024 or 960 for AAC-LC \n
  428. 2048 or 1920 for HE-AAC (v2) \n
  429. 512 or 480 for AAC-LD and AAC-ELD */
  430. INT numChannels; /*!< The number of output audio channels in the decoded and interleaved PCM audio signal. */
  431. AUDIO_CHANNEL_TYPE *pChannelType; /*!< Audio channel type of each output audio channel. */
  432. UCHAR *pChannelIndices; /*!< Audio channel index for each output audio channel.
  433. See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a program_config_element() */
  434. /* Decoder internal members. */
  435. INT aacSampleRate; /*!< Sampling rate in Hz without SBR (from configuration info). */
  436. INT profile; /*!< MPEG-2 profile (from file header) (-1: not applicable (e. g. MPEG-4)). */
  437. AUDIO_OBJECT_TYPE aot; /*!< Audio Object Type (from ASC): is set to the appropriate value for MPEG-2 bitstreams (e. g. 2 for AAC-LC). */
  438. INT channelConfig; /*!< Channel configuration (0: PCE defined, 1: mono, 2: stereo, ... */
  439. INT bitRate; /*!< Instantaneous bit rate. */
  440. INT aacSamplesPerFrame; /*!< Samples per frame for the AAC core (from ASC). \n
  441. 1024 or 960 for AAC-LC \n
  442. 512 or 480 for AAC-LD and AAC-ELD */
  443. INT aacNumChannels; /*!< The number of audio channels after AAC core processing (before PS or MPS processing).
  444. CAUTION: This are not the final number of output channels! */
  445. AUDIO_OBJECT_TYPE extAot; /*!< Extension Audio Object Type (from ASC) */
  446. INT extSamplingRate; /*!< Extension sampling rate in Hz (from ASC) */
  447. UINT outputDelay; /*!< The number of samples the output is additionally delayed by the decoder. */
  448. UINT flags; /*!< Copy of internal flags. Only to be written by the decoder, and only to be read externally. */
  449. SCHAR epConfig; /*!< epConfig level (from ASC): only level 0 supported, -1 means no ER (e. g. AOT=2, MPEG-2 AAC, etc.) */
  450. /* Statistics */
  451. INT numLostAccessUnits; /*!< This integer will reflect the estimated amount of lost access units in case aacDecoder_DecodeFrame()
  452. returns AAC_DEC_TRANSPORT_SYNC_ERROR. It will be < 0 if the estimation failed. */
  453. UINT numTotalBytes; /*!< This is the number of total bytes that have passed through the decoder. */
  454. UINT numBadBytes; /*!< This is the number of total bytes that were considered with errors from numTotalBytes. */
  455. UINT numTotalAccessUnits; /*!< This is the number of total access units that have passed through the decoder. */
  456. UINT numBadAccessUnits; /*!< This is the number of total access units that were considered with errors from numTotalBytes. */
  457. /* Metadata */
  458. SCHAR drcProgRefLev; /*!< DRC program reference level. Defines the reference level below full-scale.
  459. It is quantized in steps of 0.25dB. The valid values range from 0 (0 dBFS) to 127 (-31.75 dBFS).
  460. It is used to reflect the average loudness of the audio in LKFS accoring to ITU-R BS 1770.
  461. If no level has been found in the bitstream the value is -1. */
  462. SCHAR drcPresMode; /*!< DRC presentation mode. According to ETSI TS 101 154, this field indicates whether
  463. light (MPEG-4 Dynamic Range Control tool) or heavy compression (DVB heavy compression)
  464. dynamic range control shall take priority on the outputs.
  465. For details, see ETSI TS 101 154, table C.33. Possible values are: \n
  466. -1: No corresponding metadata found in the bitstream \n
  467. 0: DRC presentation mode not indicated \n
  468. 1: DRC presentation mode 1 \n
  469. 2: DRC presentation mode 2 \n
  470. 3: Reserved */
  471. } CStreamInfo;
  472. typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER; /*!< Pointer to a AAC decoder instance. */
  473. #ifdef __cplusplus
  474. extern "C"
  475. {
  476. #endif
  477. /**
  478. * \brief Initialize ancillary data buffer.
  479. *
  480. * \param self AAC decoder handle.
  481. * \param buffer Pointer to (external) ancillary data buffer.
  482. * \param size Size of the buffer pointed to by buffer.
  483. * \return Error code.
  484. */
  485. LINKSPEC_H AAC_DECODER_ERROR
  486. aacDecoder_AncDataInit ( HANDLE_AACDECODER self,
  487. UCHAR *buffer,
  488. int size );
  489. /**
  490. * \brief Get one ancillary data element.
  491. *
  492. * \param self AAC decoder handle.
  493. * \param index Index of the ancillary data element to get.
  494. * \param ptr Pointer to a buffer receiving a pointer to the requested ancillary data element.
  495. * \param size Pointer to a buffer receiving the length of the requested ancillary data element.
  496. * \return Error code.
  497. */
  498. LINKSPEC_H AAC_DECODER_ERROR
  499. aacDecoder_AncDataGet ( HANDLE_AACDECODER self,
  500. int index,
  501. UCHAR **ptr,
  502. int *size );
  503. /**
  504. * \brief Set one single decoder parameter.
  505. *
  506. * \param self AAC decoder handle.
  507. * \param param Parameter to be set.
  508. * \param value Parameter value.
  509. * \return Error code.
  510. */
  511. LINKSPEC_H AAC_DECODER_ERROR
  512. aacDecoder_SetParam ( const HANDLE_AACDECODER self,
  513. const AACDEC_PARAM param,
  514. const INT value );
  515. /**
  516. * \brief Get free bytes inside decoder internal buffer
  517. * \param self Handle of AAC decoder instance
  518. * \param pFreeBytes Pointer to variable receving amount of free bytes inside decoder internal buffer
  519. * \return Error code
  520. */
  521. LINKSPEC_H AAC_DECODER_ERROR
  522. aacDecoder_GetFreeBytes ( const HANDLE_AACDECODER self,
  523. UINT *pFreeBytes);
  524. /**
  525. * \brief Open an AAC decoder instance
  526. * \param transportFmt The transport type to be used
  527. * \return AAC decoder handle
  528. */
  529. LINKSPEC_H HANDLE_AACDECODER
  530. aacDecoder_Open ( TRANSPORT_TYPE transportFmt, UINT nrOfLayers );
  531. /**
  532. * \brief Explicitly configure the decoder by passing a raw AudioSpecificConfig (ASC) or a StreamMuxConfig (SMC),
  533. * contained in a binary buffer. This is required for MPEG-4 and Raw Packets file format bitstreams
  534. * as well as for LATM bitstreams with no in-band SMC. If the transport format is LATM with or without
  535. * LOAS, configuration is assumed to be an SMC, for all other file formats an ASC.
  536. *
  537. * \param self AAC decoder handle.
  538. * \param conf Pointer to an unsigned char buffer containing the binary configuration buffer (either ASC or SMC).
  539. * \param length Length of the configuration buffer in bytes.
  540. * \return Error code.
  541. */
  542. LINKSPEC_H AAC_DECODER_ERROR
  543. aacDecoder_ConfigRaw ( HANDLE_AACDECODER self,
  544. UCHAR *conf[],
  545. const UINT length[] );
  546. /**
  547. * \brief Fill AAC decoder's internal input buffer with bitstream data from the external input buffer.
  548. * The function only copies such data as long as the decoder-internal input buffer is not full.
  549. * So it grabs whatever it can from pBuffer and returns information (bytesValid) so that at a
  550. * subsequent call of %aacDecoder_Fill(), the right position in pBuffer can be determined to
  551. * grab the next data.
  552. *
  553. * \param self AAC decoder handle.
  554. * \param pBuffer Pointer to external input buffer.
  555. * \param bufferSize Size of external input buffer. This argument is required because decoder-internally
  556. * we need the information to calculate the offset to pBuffer, where the next
  557. * available data is, which is then fed into the decoder-internal buffer (as much
  558. * as possible). Our example framework implementation fills the buffer at pBuffer
  559. * again, once it contains no available valid bytes anymore (meaning bytesValid equal 0).
  560. * \param bytesValid Number of bitstream bytes in the external bitstream buffer that have not yet been
  561. * copied into the decoder's internal bitstream buffer by calling this function.
  562. * The value is updated according to the amount of newly copied bytes.
  563. * \return Error code.
  564. */
  565. LINKSPEC_H AAC_DECODER_ERROR
  566. aacDecoder_Fill ( HANDLE_AACDECODER self,
  567. UCHAR *pBuffer[],
  568. const UINT bufferSize[],
  569. UINT *bytesValid );
  570. #define AACDEC_CONCEAL 1 /*!< Flag for aacDecoder_DecodeFrame(): Trigger the built-in error concealment module \
  571. to generate a substitute signal for one lost frame. New input data will not be
  572. considered. */
  573. #define AACDEC_FLUSH 2 /*!< Flag for aacDecoder_DecodeFrame(): Flush all filterbanks to get all delayed audio \
  574. without having new input data. Thus new input data will not be considered.*/
  575. #define AACDEC_INTR 4 /*!< Flag for aacDecoder_DecodeFrame(): Signal an input bit stream data discontinuity. \
  576. Resync any internals as necessary. */
  577. #define AACDEC_CLRHIST 8 /*!< Flag for aacDecoder_DecodeFrame(): Clear all signal delay lines and history buffers.\
  578. CAUTION: This can cause discontinuities in the output signal. */
  579. /**
  580. * \brief Decode one audio frame
  581. *
  582. * \param self AAC decoder handle.
  583. * \param pTimeData Pointer to external output buffer where the decoded PCM samples will be stored into.
  584. * \param flags Bit field with flags for the decoder: \n
  585. * (flags & AACDEC_CONCEAL) == 1: Do concealment. \n
  586. * (flags & AACDEC_FLUSH) == 2: Discard input data. Flush filter banks (output delayed audio). \n
  587. * (flags & AACDEC_INTR) == 4: Input data is discontinuous. Resynchronize any internals as necessary.
  588. * \return Error code.
  589. */
  590. LINKSPEC_H AAC_DECODER_ERROR
  591. aacDecoder_DecodeFrame ( HANDLE_AACDECODER self,
  592. INT_PCM *pTimeData,
  593. const INT timeDataSize,
  594. const UINT flags );
  595. /**
  596. * \brief De-allocate all resources of an AAC decoder instance.
  597. *
  598. * \param self AAC decoder handle.
  599. * \return void
  600. */
  601. LINKSPEC_H void aacDecoder_Close ( HANDLE_AACDECODER self );
  602. /**
  603. * \brief Get CStreamInfo handle from decoder.
  604. *
  605. * \param self AAC decoder handle.
  606. * \return Reference to requested CStreamInfo.
  607. */
  608. LINKSPEC_H CStreamInfo* aacDecoder_GetStreamInfo( HANDLE_AACDECODER self );
  609. /**
  610. * \brief Get decoder library info.
  611. *
  612. * \param info Pointer to an allocated LIB_INFO structure.
  613. * \return 0 on success
  614. */
  615. LINKSPEC_H INT aacDecoder_GetLibInfo( LIB_INFO *info );
  616. #ifdef __cplusplus
  617. }
  618. #endif
  619. #endif /* AACDECODER_LIB_H */