1 /* ----------------------------------------------------------------------------- 2 Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4 Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten 5 Forschung e.V. All rights reserved. 6 7 1. INTRODUCTION 8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10 scheme for digital audio. This FDK AAC Codec software is intended to be used on 11 a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14 general perceptual audio codecs. AAC-ELD is considered the best-performing 15 full-bandwidth communications codec by independent studies and is widely 16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17 specifications. 18 19 Patent licenses for necessary patent claims for the FDK AAC Codec (including 20 those of Fraunhofer) may be obtained through Via Licensing 21 (www.vialicensing.com) or through the respective patent owners individually for 22 the purpose of encoding or decoding bit streams in products that are compliant 23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24 Android devices already license these patent claims through Via Licensing or 25 directly from the patent owners, and therefore FDK AAC Codec software may 26 already be covered under those patent licenses when it is used for those 27 licensed purposes only. 28 29 Commercially-licensed AAC software libraries, including floating-point versions 30 with enhanced sound quality, are also available from Fraunhofer. Users are 31 encouraged to check the Fraunhofer website for additional applications 32 information and documentation. 33 34 2. COPYRIGHT LICENSE 35 36 Redistribution and use in source and binary forms, with or without modification, 37 are permitted without payment of copyright license fees provided that you 38 satisfy the following conditions: 39 40 You must retain the complete text of this software license in redistributions of 41 the FDK AAC Codec or your modifications thereto in source code form. 42 43 You must retain the complete text of this software license in the documentation 44 and/or other materials provided with redistributions of the FDK AAC Codec or 45 your modifications thereto in binary form. You must make available free of 46 charge copies of the complete source code of the FDK AAC Codec and your 47 modifications thereto to recipients of copies in binary form. 48 49 The name of Fraunhofer may not be used to endorse or promote products derived 50 from this library without prior written permission. 51 52 You may not charge copyright license fees for anyone to use, copy or distribute 53 the FDK AAC Codec software or your modifications thereto. 54 55 Your modified versions of the FDK AAC Codec must carry prominent notices stating 56 that you changed the software and the date of any change. For modified versions 57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59 AAC Codec Library for Android." 60 61 3. NO PATENT LICENSE 62 63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65 Fraunhofer provides no warranty of patent non-infringement with respect to this 66 software. 67 68 You may use this FDK AAC Codec software or modifications thereto only for 69 purposes that are authorized by appropriate patent licenses. 70 71 4. DISCLAIMER 72 73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75 including but not limited to the implied warranties of merchantability and 76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78 or consequential damages, including but not limited to procurement of substitute 79 goods or services; loss of use, data, or profits, or business interruption, 80 however caused and on any theory of liability, whether in contract, strict 81 liability, or tort (including negligence), arising in any way out of the use of 82 this software, even if advised of the possibility of such damage. 83 84 5. CONTACT INFORMATION 85 86 Fraunhofer Institute for Integrated Circuits IIS 87 Attention: Audio and Multimedia Departments - FDK AAC LL 88 Am Wolfsmantel 33 89 91058 Erlangen, Germany 90 91 www.iis.fraunhofer.de/amm 92 amm-info (at) iis.fraunhofer.de 93 ----------------------------------------------------------------------------- */ 94 95 /**************************** PCM utility library ****************************** 96 97 Author(s): Christian Griebel 98 99 Description: 100 101 *******************************************************************************/ 102 103 /** 104 * \file pcmdmx_lib.h 105 * \brief FDK PCM audio mixdown library interface header file. 106 107 \page INTRO Introduction 108 109 110 \section SCOPE Scope 111 112 This document describes the high-level application interface and usage of the 113 FDK PCM audio mixdown module library developed by the Fraunhofer Institute for 114 Integrated Circuits (IIS). Depending on the library configuration, the module 115 can manipulate the number of audio channels of a given PCM signal. It can 116 create for example a two channel stereo audio signal from a given multi-channel 117 configuration (e.g. 5.1 channels). 118 119 120 \page ABBREV List of abbreviations 121 122 \li \b AAC - Advanced Audio Coding\n 123 Is an audio coding standard for lossy digital audio compression standardized 124 by ISO and IEC, as part of the MPEG-2 (ISO/IEC 13818-7:2006) and MPEG-4 125 (ISO/IEC 14496-3:2009) specifications. 126 127 \li \b DSE - Data Stream Element\n 128 A syntactical element of the MPEG-2/4 Advanced Audio Coding bitstream 129 standardized in ISO/IEC 14496-3:2009. It can convey any kind of data associated 130 to one program. 131 132 \li \b PCE - Program Config Element\n 133 A syntactical element of the MPEG-2/4 Advanced Audio Coding bitstream 134 standardized in ISO/IEC 14496-3:2009 that can define the stream configuration 135 for a single program. In addition it can comprise simple downmix meta data. 136 137 */ 138 139 #ifndef PCMDMX_LIB_H 140 #define PCMDMX_LIB_H 141 142 #include "machine_type.h" 143 #include "common_fix.h" 144 #include "FDK_audio.h" 145 #include "FDK_bitstream.h" 146 147 /** 148 * \enum PCMDMX_ERROR 149 * 150 * Error codes that can be returned by module interface functions. 151 */ 152 typedef enum { 153 PCMDMX_OK = 0x0, /*!< No error happened. */ 154 PCMDMX_UNSUPPORTED = 155 0x1, /*!< The requested feature/service is unavailable. This can 156 occur if the module was built for a wrong configuration. */ 157 pcm_dmx_fatal_error_start, 158 PCMDMX_OUT_OF_MEMORY, /*!< Not enough memory to set up an instance of the 159 module. */ 160 pcm_dmx_fatal_error_end, 161 162 PCMDMX_INVALID_HANDLE, /*!< The given instance handle is not valid. */ 163 PCMDMX_INVALID_ARGUMENT, /*!< One of the parameters handed over is invalid. */ 164 PCMDMX_INVALID_CH_CONFIG, /*!< The given channel configuration is not 165 supported and thus no processing was performed. 166 */ 167 PCMDMX_INVALID_MODE, /*!< The set configuration/mode is not applicable. */ 168 PCMDMX_UNKNOWN_PARAM, /*!< The handed parameter is not known/supported. */ 169 PCMDMX_UNABLE_TO_SET_PARAM, /*!< Unable to set the specific parameter. Most 170 probably the value ist out of range. 171 */ 172 PCMDMX_CORRUPT_ANC_DATA, /*!< The read ancillary data was corrupt. */ 173 PCMDMX_OUTPUT_BUFFER_TOO_SMALL /*!< The size of pcm output buffer is too 174 small. */ 175 176 } PCMDMX_ERROR; 177 178 /** Macro to identify fatal errors. */ 179 #define PCMDMX_IS_FATAL_ERROR(err) \ 180 ((((err) >= pcm_dmx_fatal_error_start) && \ 181 ((err) <= pcm_dmx_fatal_error_end)) \ 182 ? 1 \ 183 : 0) 184 185 /** 186 * \enum PCMDMX_PARAM 187 * 188 * Modules dynamic runtime parameters that can be handed to function 189 * pcmDmx_SetParam() and pcmDmx_GetParam(). 190 */ 191 typedef enum { 192 DMX_PROFILE_SETTING = 193 0x01, /*!< Defines which equations, coefficients and default/ 194 fallback values used for downmixing. See 195 ::DMX_PROFILE_TYPE type for details. */ 196 DMX_BS_DATA_EXPIRY_FRAME = 197 0x10, /*!< The number of frames without new metadata that 198 have to go by before the bitstream data expires. 199 The value 0 disables expiry. */ 200 DMX_BS_DATA_DELAY = 201 0x11, /*!< The number of delay frames of the output samples 202 compared to the bitstream data. */ 203 MIN_NUMBER_OF_OUTPUT_CHANNELS = 204 0x20, /*!< The minimum number of output channels. For all 205 input configurations that have less than the given 206 channels the module will modify the output 207 automatically to obtain the given number of output 208 channels. Mono signals will be duplicated. If more 209 than two output channels are desired the module 210 just adds empty channels. The parameter value must 211 be either -1, 0, 1, 2, 6 or 8. If the value is 212 greater than zero and exceeds the value of 213 parameter ::MAX_NUMBER_OF_OUTPUT_CHANNELS the 214 latter will be set to the same value. Both values 215 -1 and 0 disable the feature. */ 216 MAX_NUMBER_OF_OUTPUT_CHANNELS = 217 0x21, /*!< The maximum number of output channels. For all 218 input configurations that have more than the given 219 channels the module will apply a mixdown 220 automatically to obtain the given number of output 221 channels. The value must be either -1, 0, 1, 2, 6 222 or 8. If it's greater than zero and lower or equal 223 than the value of ::MIN_NUMBER_OF_OUTPUT_CHANNELS 224 parameter the latter will be set to the same value. 225 The values -1 and 0 disable the feature. */ 226 DMX_DUAL_CHANNEL_MODE = 227 0x30, /*!< Downmix mode for two channel audio data. See type 228 ::DUAL_CHANNEL_MODE for details. */ 229 DMX_PSEUDO_SURROUND_MODE = 230 0x31 /*!< Defines how module handles pseudo surround 231 compatible signals. See ::PSEUDO_SURROUND_MODE 232 type for details. */ 233 } PCMDMX_PARAM; 234 235 /** 236 * \enum DMX_PROFILE_TYPE 237 * 238 * Valid value list for parameter ::DMX_PROFILE_SETTING. 239 */ 240 typedef enum { 241 DMX_PRFL_STANDARD = 242 0x0, /*!< The standard profile creates mixdown signals based on 243 the advanced downmix metadata (from a DSE), equations 244 and default values defined in ISO/IEC 14496:3 245 Ammendment 4. Any other (legacy) downmix metadata will 246 be ignored. */ 247 DMX_PRFL_MATRIX_MIX = 248 0x1, /*!< This profile behaves just as the standard profile if 249 advanced downmix metadata (from a DSE) is available. If 250 not, the matrix_mixdown information embedded in the 251 program configuration element (PCE) will be applied. If 252 neither is the case the module creates a mixdown using 253 the default coefficients defined in MPEG-4 Ammendment 4. 254 The profile can be used e.g. to support legacy digital 255 TV (e.g. DVB) streams. */ 256 DMX_PRFL_FORCE_MATRIX_MIX = 257 0x2, /*!< Similar to the ::DMX_PRFL_MATRIX_MIX profile but if both 258 the advanced (DSE) and the legacy (PCE) MPEG downmix 259 metadata are available the latter will be applied. */ 260 DMX_PRFL_ARIB_JAPAN = 261 0x3 /*!< Downmix creation as described in ABNT NBR 15602-2. But 262 if advanced downmix metadata is available it will be 263 prefered. */ 264 } DMX_PROFILE_TYPE; 265 266 /** 267 * \enum PSEUDO_SURROUND_MODE 268 * 269 * Valid value list for parameter ::DMX_PSEUDO_SURROUND_MODE. 270 */ 271 typedef enum { 272 NEVER_DO_PS_DMX = 273 -1, /*!< Ignore any metadata and do never create a pseudo surround 274 compatible downmix. (Default) */ 275 AUTO_PS_DMX = 0, /*!< Create a pseudo surround compatible downmix only if 276 signalled in bitstreams meta data. */ 277 FORCE_PS_DMX = 278 1 /*!< Always create a pseudo surround compatible downmix. 279 CAUTION: This can lead to excessive signal cancellations 280 and signal level differences for non-compatible signals. */ 281 } PSEUDO_SURROUND_MODE; 282 283 /** 284 * \enum DUAL_CHANNEL_MODE 285 * 286 * Valid value list for parameter ::DMX_DUAL_CHANNEL_MODE. 287 */ 288 typedef enum { 289 STEREO_MODE = 0x0, /*!< Leave stereo signals as they are. */ 290 CH1_MODE = 0x1, /*!< Create a dual mono output signal from channel 1. */ 291 CH2_MODE = 0x2, /*!< Create a dual mono output signal from channel 2. */ 292 MIXED_MODE = 0x3 /*!< Create a dual mono output signal by mixing the two 293 channels. */ 294 } DUAL_CHANNEL_MODE; 295 296 #define DMX_PCM FIXP_DBL 297 #define DMX_PCMF FIXP_DBL 298 #define DMX_PCM_BITS DFRACT_BITS 299 #define FX_DMX2FX_PCM(x) FX_DBL2FX_PCM((FIXP_DBL)(x)) 300 301 /* ------------------------ * 302 * MODULES INTERFACE: * 303 * ------------------------ */ 304 typedef struct PCM_DMX_INSTANCE *HANDLE_PCM_DOWNMIX; 305 306 /*! \addtogroup pcmDmxResetFlags Modules reset flags 307 * Macros that can be used as parameter for function pcmDmx_Reset() to specify 308 * which parts of the module shall be reset. 309 * @{ 310 * 311 * \def PCMDMX_RESET_PARAMS 312 * Only reset the user specific parameters that have been modified with 313 * pcmDmx_SetParam(). 314 * 315 * \def PCMDMX_RESET_BS_DATA 316 * Delete the meta data that has been fed with the appropriate interface 317 * functions. 318 * 319 * \def PCMDMX_RESET_FULL 320 * Reset the complete module instance to the state after pcmDmx_Open() had been 321 * called. 322 */ 323 #define PCMDMX_RESET_PARAMS (1) 324 #define PCMDMX_RESET_BS_DATA (2) 325 #define PCMDMX_RESET_FULL (PCMDMX_RESET_PARAMS | PCMDMX_RESET_BS_DATA) 326 /*! @} */ 327 328 #ifdef __cplusplus 329 extern "C" { 330 #endif 331 332 /** Open and initialize an instance of the PCM downmix module 333 * @param[out] pSelf Pointer to a buffer receiving the handle of the new 334 *instance. 335 * @returns Returns an error code of type ::PCMDMX_ERROR. 336 **/ 337 PCMDMX_ERROR pcmDmx_Open(HANDLE_PCM_DOWNMIX *pSelf); 338 339 /** Set one parameter for a single instance of the PCM downmix module. 340 * @param[in] self Handle of PCM downmix instance. 341 * @param[in] param Parameter to be set. Can be one from the ::PCMDMX_PARAM 342 *list. 343 * @param[in] value Parameter value. 344 * @returns Returns an error code of type ::PCMDMX_ERROR. 345 **/ 346 PCMDMX_ERROR pcmDmx_SetParam(HANDLE_PCM_DOWNMIX self, const PCMDMX_PARAM param, 347 const INT value); 348 349 /** Get one parameter value of a single PCM downmix module instance. 350 * @param[in] self Handle of PCM downmix module instance. 351 * @param[in] param Parameter to query. Can be one from the ::PCMDMX_PARAM 352 *list. 353 * @param[out] pValue Pointer to buffer receiving the parameter value. 354 * @returns Returns an error code of type ::PCMDMX_ERROR. 355 **/ 356 PCMDMX_ERROR pcmDmx_GetParam(HANDLE_PCM_DOWNMIX self, const PCMDMX_PARAM param, 357 INT *const pValue); 358 359 /** \cond 360 * Extract relevant downmix meta-data directly from a given bitstream. The 361 *function can handle both data specified in ETSI TS 101 154 or ISO/IEC 362 *14496-3:2009/Amd.4:2013. 363 * @param[in] self Handle of PCM downmix instance. 364 * @param[in] hBitStream Handle of FDK bitstream buffer. 365 * @param[in] ancDataBits Length of ancillary data in bits. 366 * @param[in] isMpeg2 Flag indicating wheter the ancillary data is from a 367 *MPEG-1/2 or a MPEG-4 stream. 368 * @returns Returns an error code of type ::PCMDMX_ERROR. 369 **/ 370 PCMDMX_ERROR pcmDmx_Parse(HANDLE_PCM_DOWNMIX self, 371 HANDLE_FDK_BITSTREAM hBitStream, UINT ancDataBits, 372 int isMpeg2); 373 /** \endcond */ 374 375 /** Read from a given ancillary data buffer and extract the relevant downmix 376 *meta-data. The function can handle both data specified in ETSI TS 101 154 or 377 *ISO/IEC 14496-3:2009/Amd.4:2013. 378 * @param[in] self Handle of PCM downmix instance. 379 * @param[in] pAncDataBuf Pointer to ancillary buffer holding the data. 380 * @param[in] ancDataBytes Size of ancillary data in bytes. 381 * @param[in] isMpeg2 Flag indicating wheter the ancillary data is from a 382 *MPEG-1/2 or a MPEG-4 stream. 383 * @returns Returns an error code of type ::PCMDMX_ERROR. 384 **/ 385 PCMDMX_ERROR pcmDmx_ReadDvbAncData(HANDLE_PCM_DOWNMIX self, UCHAR *pAncDataBuf, 386 UINT ancDataBytes, int isMpeg2); 387 388 /** Set the matrix mixdown information extracted from the PCE of an AAC 389 *bitstream. 390 * @param[in] self Handle of PCM downmix instance. 391 * @param[in] matrixMixdownPresent Matrix mixdown index present flag extracted 392 *from PCE. 393 * @param[in] matrixMixdownIdx The 2 bit matrix mixdown index extracted 394 *from PCE. 395 * @param[in] pseudoSurroundEnable The pseudo surround enable flag extracted 396 *from PCE. 397 * @returns Returns an error code of type 398 *::PCMDMX_ERROR. 399 **/ 400 PCMDMX_ERROR pcmDmx_SetMatrixMixdownFromPce(HANDLE_PCM_DOWNMIX self, 401 int matrixMixdownPresent, 402 int matrixMixdownIdx, 403 int pseudoSurroundEnable); 404 405 /** Reset the module. 406 * @param[in] self Handle of PCM downmix instance. 407 * @param[in] flags Flags telling which parts of the module shall be reset. 408 * See \ref pcmDmxResetFlags for details. 409 * @returns Returns an error code of type ::PCMDMX_ERROR. 410 **/ 411 PCMDMX_ERROR pcmDmx_Reset(HANDLE_PCM_DOWNMIX self, UINT flags); 412 413 /** Create a mixdown, bypass or extend the output signal depending on the 414 *modules settings and the respective given input configuration. 415 * 416 * \param[in] self Handle of PCM downmix module instance. 417 * \param[in,out] pPcmBuf Pointer to time buffer with PCM samples. 418 * \param[in] pcmBufSize Size of pPcmBuf buffer. 419 * \param[in] frameSize The I/O block size which is the number of samples per channel. 420 * \param[in,out] nChannels Pointer to buffer that holds the number of input channels and 421 * where the amount of output channels is written 422 *to. 423 * \param[in] fInterleaved Input and output samples are processed interleaved. 424 * \param[in,out] channelType Array were the corresponding channel type for each output audio 425 * channel is stored into. 426 * \param[in,out] channelIndices Array were the corresponding channel type index for each output 427 * audio channel is stored into. 428 * \param[in] mapDescr Pointer to a FDK channel mapping descriptor that contains the 429 * channel mapping to be used. 430 * \param[out] pDmxOutScale Pointer on a field receiving the scale factor that has to be 431 * applied on all samples afterwards. If the 432 *handed pointer is NULL the final scaling is done internally. 433 * @returns Returns an error code of type ::PCMDMX_ERROR. 434 **/ 435 PCMDMX_ERROR pcmDmx_ApplyFrame(HANDLE_PCM_DOWNMIX self, DMX_PCM *pPcmBuf, 436 const int pcmBufSize, UINT frameSize, 437 INT *nChannels, INT fInterleaved, 438 AUDIO_CHANNEL_TYPE channelType[], 439 UCHAR channelIndices[], 440 const FDK_channelMapDescr *const mapDescr, 441 INT *pDmxOutScale); 442 443 /** Close an instance of the PCM downmix module. 444 * @param[in,out] pSelf Pointer to a buffer containing the handle of the 445 *instance. 446 * @returns Returns an error code of type ::PCMDMX_ERROR. 447 **/ 448 PCMDMX_ERROR pcmDmx_Close(HANDLE_PCM_DOWNMIX *pSelf); 449 450 /** Get library info for this module. 451 * @param[out] info Pointer to an allocated LIB_INFO structure. 452 * @returns Returns an error code of type ::PCMDMX_ERROR. 453 */ 454 PCMDMX_ERROR pcmDmx_GetLibInfo(LIB_INFO *info); 455 456 #ifdef __cplusplus 457 } 458 #endif 459 460 #endif /* PCMDMX_LIB_H */ 461