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 /******************* MPEG transport format encoder library ********************* 96 97 Author(s): 98 99 Description: 100 101 *******************************************************************************/ 102 103 #include "tp_data.h" 104 105 #include "tpenc_lib.h" 106 #include "tpenc_asc.h" 107 #include "FDK_bitstream.h" 108 #include "genericStds.h" 109 110 #include "FDK_crc.h" 111 112 #define PCE_HEIGHT_EXT_SYNC (0xAC) 113 #define HEIGHT_NORMAL 0 114 #define HEIGHT_TOP 1 115 #define HEIGHT_BOTTOM 2 116 #define MAX_FRONT_ELEMENTS 8 117 #define MAX_SIDE_ELEMENTS 3 118 #define MAX_BACK_ELEMENTS 4 119 120 /** 121 * Describe additional PCE height information for front, side and back channel 122 * elements. 123 */ 124 typedef struct { 125 UCHAR 126 num_front_height_channel_elements[2]; /*!< Number of front channel 127 elements in top [0] and bottom 128 [1] plane. */ 129 UCHAR num_side_height_channel_elements[2]; /*!< Number of side channel 130 elements in top [0] and bottom 131 [1] plane. */ 132 UCHAR num_back_height_channel_elements[2]; /*!< Number of back channel 133 elements in top [0] and bottom 134 [1] plane. */ 135 } PCE_HEIGHT_NUM; 136 137 /** 138 * Describe a PCE based on placed channel elements and element type sequence. 139 */ 140 typedef struct { 141 UCHAR num_front_channel_elements; /*!< Number of front channel elements. */ 142 UCHAR num_side_channel_elements; /*!< Number of side channel elements. */ 143 UCHAR num_back_channel_elements; /*!< Number of back channel elements. */ 144 UCHAR num_lfe_channel_elements; /*!< Number of lfe channel elements. */ 145 const MP4_ELEMENT_ID 146 *pEl_type; /*!< List contains sequence describing the elements 147 in present channel mode. (MPEG order) */ 148 const PCE_HEIGHT_NUM *pHeight_num; 149 } PCE_CONFIGURATION; 150 151 /** 152 * Map an incoming channel mode to a existing PCE configuration entry. 153 */ 154 typedef struct { 155 CHANNEL_MODE channel_mode; /*!< Present channel mode. */ 156 PCE_CONFIGURATION 157 pce_configuration; /*!< Program config element description. */ 158 159 } CHANNEL_CONFIGURATION; 160 161 /** 162 * The following arrays provide the IDs of the consecutive elements for each 163 * mode. 164 */ 165 static const MP4_ELEMENT_ID elType_1[] = {ID_SCE}; 166 static const MP4_ELEMENT_ID elType_2[] = {ID_CPE}; 167 static const MP4_ELEMENT_ID elType_1_2[] = {ID_SCE, ID_CPE}; 168 static const MP4_ELEMENT_ID elType_1_2_1[] = {ID_SCE, ID_CPE, ID_SCE}; 169 static const MP4_ELEMENT_ID elType_1_2_2[] = {ID_SCE, ID_CPE, ID_CPE}; 170 static const MP4_ELEMENT_ID elType_1_2_2_1[] = {ID_SCE, ID_CPE, ID_CPE, ID_LFE}; 171 static const MP4_ELEMENT_ID elType_1_2_2_2_1[] = {ID_SCE, ID_CPE, ID_CPE, 172 ID_CPE, ID_LFE}; 173 static const MP4_ELEMENT_ID elType_6_1[] = {ID_SCE, ID_CPE, ID_CPE, ID_SCE, 174 ID_LFE}; 175 static const MP4_ELEMENT_ID elType_7_1_back[] = {ID_SCE, ID_CPE, ID_CPE, ID_CPE, 176 ID_LFE}; 177 static const MP4_ELEMENT_ID elType_7_1_top_front[] = {ID_SCE, ID_CPE, ID_CPE, 178 ID_LFE, ID_CPE}; 179 static const MP4_ELEMENT_ID elType_7_1_rear_surround[] = { 180 ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE}; 181 static const MP4_ELEMENT_ID elType_7_1_front_center[] = {ID_SCE, ID_CPE, ID_CPE, 182 ID_CPE, ID_LFE}; 183 184 /** 185 * The following arrays provide information on how many front, side and back 186 * elements are assigned to the top or bottom plane for each mode that comprises 187 * height information. 188 */ 189 static const PCE_HEIGHT_NUM heightNum_7_1_top_front = {{1, 0}, {0, 0}, {0, 0}}; 190 191 /** 192 * \brief Table contains all supported channel modes and according PCE 193 configuration description. 194 * 195 * The mode identifier is followed by the number of front, side, back, and LFE 196 elements. 197 * These are followed by a pointer to the IDs of the consecutive elements 198 (ID_SCE, ID_CPE, ID_LFE). 199 * 200 * For some modes (MODE_7_1_TOP_FRONT and MODE_22_2) additional height 201 information is transmitted. 202 * In this case the additional pointer provides information on how many front, 203 side and back elements 204 * are assigned to the top or bottom plane.The elements are arranged in the 205 following order: normal height (front, side, back, LFE), top height (front, 206 side, back), bottom height (front, side, back). 207 * 208 * 209 * E.g. MODE_7_1_TOP_FRONT means: 210 * - 3 elements are front channel elements. 211 * - 0 elements are side channel elements. 212 * - 1 element is back channel element. 213 * - 1 element is an LFE channel element. 214 * - the element order is ID_SCE, ID_CPE, ID_CPE, 215 ID_LFE, ID_CPE. 216 * - 1 of the front elements is in the top plane. 217 * 218 * This leads to the following mapping for the cconsecutive elements in the 219 MODE_7_1_TOP_FRONT bitstream: 220 * - ID_SCE -> normal height front, 221 - ID_CPE -> normal height front, 222 - ID_CPE -> normal height back, 223 - ID_LFE -> normal height LFE, 224 - ID_CPE -> top height front. 225 */ 226 static const CHANNEL_CONFIGURATION pceConfigTab[] = { 227 {MODE_1, 228 {1, 0, 0, 0, elType_1, 229 NULL}}, /* don't transmit height information in this mode */ 230 {MODE_2, 231 {1, 0, 0, 0, elType_2, 232 NULL}}, /* don't transmit height information in this mode */ 233 {MODE_1_2, 234 {2, 0, 0, 0, elType_1_2, 235 NULL}}, /* don't transmit height information in this mode */ 236 {MODE_1_2_1, 237 {2, 0, 1, 0, elType_1_2_1, 238 NULL}}, /* don't transmit height information in this mode */ 239 {MODE_1_2_2, 240 {2, 0, 1, 0, elType_1_2_2, 241 NULL}}, /* don't transmit height information in this mode */ 242 {MODE_1_2_2_1, 243 {2, 0, 1, 1, elType_1_2_2_1, 244 NULL}}, /* don't transmit height information in this mode */ 245 {MODE_1_2_2_2_1, 246 {3, 0, 1, 1, elType_1_2_2_2_1, 247 NULL}}, /* don't transmit height information in this mode */ 248 249 {MODE_6_1, 250 {2, 0, 2, 1, elType_6_1, 251 NULL}}, /* don't transmit height information in this mode */ 252 {MODE_7_1_BACK, 253 {2, 0, 2, 1, elType_7_1_back, 254 NULL}}, /* don't transmit height information in this mode */ 255 {MODE_7_1_TOP_FRONT, 256 {3, 0, 1, 1, elType_7_1_top_front, &heightNum_7_1_top_front}}, 257 258 {MODE_7_1_REAR_SURROUND, 259 {2, 0, 2, 1, elType_7_1_rear_surround, 260 NULL}}, /* don't transmit height information in this mode */ 261 {MODE_7_1_FRONT_CENTER, 262 {3, 0, 1, 1, elType_7_1_front_center, 263 NULL}} /* don't transmit height information in this mode */ 264 }; 265 266 /** 267 * \brief Get program config element description for existing channel mode. 268 * 269 * \param channel_mode Current channel mode. 270 * 271 * \return 272 * - Pointer to PCE_CONFIGURATION entry, on success. 273 * - NULL, on failure. 274 */ 275 static const PCE_CONFIGURATION *getPceEntry(const CHANNEL_MODE channel_mode) { 276 UINT i; 277 const PCE_CONFIGURATION *pce_config = NULL; 278 279 for (i = 0; i < (sizeof(pceConfigTab) / sizeof(CHANNEL_CONFIGURATION)); i++) { 280 if (pceConfigTab[i].channel_mode == channel_mode) { 281 pce_config = &pceConfigTab[i].pce_configuration; 282 break; 283 } 284 } 285 286 return pce_config; 287 } 288 289 int getChannelConfig(const CHANNEL_MODE channel_mode, 290 const UCHAR channel_config_zero) { 291 INT chan_config = 0; 292 293 if (channel_config_zero != 0) { 294 chan_config = 0; 295 } else { 296 switch (channel_mode) { 297 case MODE_1: 298 chan_config = 1; 299 break; 300 case MODE_2: 301 chan_config = 2; 302 break; 303 case MODE_1_2: 304 chan_config = 3; 305 break; 306 case MODE_1_2_1: 307 chan_config = 4; 308 break; 309 case MODE_1_2_2: 310 chan_config = 5; 311 break; 312 case MODE_1_2_2_1: 313 chan_config = 6; 314 break; 315 case MODE_1_2_2_2_1: 316 chan_config = 7; 317 break; 318 case MODE_6_1: 319 chan_config = 11; 320 break; 321 case MODE_7_1_BACK: 322 chan_config = 12; 323 break; 324 case MODE_7_1_TOP_FRONT: 325 chan_config = 14; 326 break; 327 default: 328 chan_config = 0; 329 } 330 } 331 332 return chan_config; 333 } 334 335 CHANNEL_MODE transportEnc_GetChannelMode(int noChannels) { 336 CHANNEL_MODE chMode; 337 338 if (noChannels <= 8 && noChannels > 0) 339 chMode = (CHANNEL_MODE)( 340 (noChannels == 8) ? 7 341 : noChannels); /* see : iso/mpeg4 v1 audio subpart1*/ 342 else 343 chMode = MODE_UNKNOWN; 344 345 return chMode; 346 } 347 348 int transportEnc_writePCE(HANDLE_FDK_BITSTREAM hBs, CHANNEL_MODE channelMode, 349 INT sampleRate, int instanceTagPCE, int profile, 350 int matrixMixdownA, int pseudoSurroundEnable, 351 UINT alignAnchor) { 352 int sampleRateIndex, i; 353 const PCE_CONFIGURATION *config = NULL; 354 const MP4_ELEMENT_ID *pEl_list = NULL; 355 UCHAR cpeCnt = 0, sceCnt = 0, lfeCnt = 0, frntCnt = 0, sdCnt = 0, bckCnt = 0, 356 isCpe = 0, tag = 0, normalFrontEnd = 0, normalSideEnd = 0, 357 normalBackEnd = 0, topFrontEnd = 0, topSideEnd = 0, topBackEnd = 0, 358 bottomFrontEnd = 0, bottomSideEnd = 0; 359 #ifdef FDK_ASSERT_ENABLE 360 UCHAR bottomBackEnd = 0; 361 #endif 362 enum elementDepth { FRONT, SIDE, BACK } elDepth; 363 364 sampleRateIndex = getSamplingRateIndex(sampleRate, 4); 365 if (sampleRateIndex == 15) { 366 return -1; 367 } 368 369 if ((config = getPceEntry(channelMode)) == NULL) { 370 return -1; 371 } 372 373 FDK_ASSERT(config->num_front_channel_elements <= MAX_FRONT_ELEMENTS); 374 FDK_ASSERT(config->num_side_channel_elements <= MAX_SIDE_ELEMENTS); 375 FDK_ASSERT(config->num_back_channel_elements <= MAX_BACK_ELEMENTS); 376 377 UCHAR frontIsCpe[MAX_FRONT_ELEMENTS] = {0}, 378 frontTag[MAX_FRONT_ELEMENTS] = {0}, sideIsCpe[MAX_SIDE_ELEMENTS] = {0}, 379 sideTag[MAX_SIDE_ELEMENTS] = {0}, backIsCpe[MAX_BACK_ELEMENTS] = {0}, 380 backTag[MAX_BACK_ELEMENTS] = {0}; 381 382 /* Write general information */ 383 384 FDKwriteBits(hBs, instanceTagPCE, 4); /* Element instance tag */ 385 FDKwriteBits(hBs, profile, 2); /* Object type */ 386 FDKwriteBits(hBs, sampleRateIndex, 4); /* Sample rate index*/ 387 388 FDKwriteBits(hBs, config->num_front_channel_elements, 389 4); /* Front channel Elements */ 390 FDKwriteBits(hBs, config->num_side_channel_elements, 391 4); /* No Side Channel Elements */ 392 FDKwriteBits(hBs, config->num_back_channel_elements, 393 4); /* No Back channel Elements */ 394 FDKwriteBits(hBs, config->num_lfe_channel_elements, 395 2); /* No Lfe channel elements */ 396 397 FDKwriteBits(hBs, 0, 3); /* No assoc data elements */ 398 FDKwriteBits(hBs, 0, 4); /* No valid cc elements */ 399 FDKwriteBits(hBs, 0, 1); /* Mono mixdown present */ 400 FDKwriteBits(hBs, 0, 1); /* Stereo mixdown present */ 401 402 if (matrixMixdownA != 0 && 403 ((channelMode == MODE_1_2_2) || (channelMode == MODE_1_2_2_1))) { 404 FDKwriteBits(hBs, 1, 1); /* Matrix mixdown present */ 405 FDKwriteBits(hBs, (matrixMixdownA - 1) & 0x3, 2); /* matrix_mixdown_idx */ 406 FDKwriteBits(hBs, (pseudoSurroundEnable) ? 1 : 0, 407 1); /* pseudo_surround_enable */ 408 } else { 409 FDKwriteBits(hBs, 0, 1); /* Matrix mixdown not present */ 410 } 411 412 if (config->pHeight_num != NULL) { 413 /* we have up to three different height levels, and in each height level we 414 * may have front, side and back channels. We need to know where each 415 * section ends to correctly count the tags */ 416 normalFrontEnd = config->num_front_channel_elements - 417 config->pHeight_num->num_front_height_channel_elements[0] - 418 config->pHeight_num->num_front_height_channel_elements[1]; 419 normalSideEnd = normalFrontEnd + config->num_side_channel_elements - 420 config->pHeight_num->num_side_height_channel_elements[0] - 421 config->pHeight_num->num_side_height_channel_elements[1]; 422 normalBackEnd = normalSideEnd + config->num_back_channel_elements - 423 config->pHeight_num->num_back_height_channel_elements[0] - 424 config->pHeight_num->num_back_height_channel_elements[1]; 425 426 topFrontEnd = 427 normalBackEnd + config->num_lfe_channel_elements + 428 config->pHeight_num->num_front_height_channel_elements[0]; /* only 429 normal 430 height 431 LFEs 432 assumed */ 433 topSideEnd = 434 topFrontEnd + config->pHeight_num->num_side_height_channel_elements[0]; 435 topBackEnd = 436 topSideEnd + config->pHeight_num->num_back_height_channel_elements[0]; 437 438 bottomFrontEnd = 439 topBackEnd + config->pHeight_num->num_front_height_channel_elements[1]; 440 bottomSideEnd = bottomFrontEnd + 441 config->pHeight_num->num_side_height_channel_elements[1]; 442 #ifdef FDK_ASSERT_ENABLE 443 bottomBackEnd = bottomSideEnd + 444 config->pHeight_num->num_back_height_channel_elements[1]; 445 #endif 446 447 } else { 448 /* we have only one height level, so we don't care about top or bottom */ 449 normalFrontEnd = config->num_front_channel_elements; 450 normalSideEnd = normalFrontEnd + config->num_side_channel_elements; 451 normalBackEnd = normalSideEnd + config->num_back_channel_elements; 452 } 453 454 /* assign cpe and tag information to either front, side or back channels */ 455 456 pEl_list = config->pEl_type; 457 458 for (i = 0; i < config->num_front_channel_elements + 459 config->num_side_channel_elements + 460 config->num_back_channel_elements + 461 config->num_lfe_channel_elements; 462 i++) { 463 if (*pEl_list == ID_LFE) { 464 pEl_list++; 465 continue; 466 } 467 isCpe = (*pEl_list++ == ID_CPE) ? 1 : 0; 468 tag = (isCpe) ? cpeCnt++ : sceCnt++; 469 470 if (i < normalFrontEnd) 471 elDepth = FRONT; 472 else if (i < normalSideEnd) 473 elDepth = SIDE; 474 else if (i < normalBackEnd) 475 elDepth = BACK; 476 else if (i < topFrontEnd) 477 elDepth = FRONT; 478 else if (i < topSideEnd) 479 elDepth = SIDE; 480 else if (i < topBackEnd) 481 elDepth = BACK; 482 else if (i < bottomFrontEnd) 483 elDepth = FRONT; 484 else if (i < bottomSideEnd) 485 elDepth = SIDE; 486 else { 487 elDepth = BACK; 488 FDK_ASSERT(i < bottomBackEnd); /* won't fail if implementation of pce 489 configuration table is correct */ 490 } 491 492 switch (elDepth) { 493 case FRONT: 494 FDK_ASSERT(frntCnt < config->num_front_channel_elements); 495 frontIsCpe[frntCnt] = isCpe; 496 frontTag[frntCnt++] = tag; 497 break; 498 case SIDE: 499 FDK_ASSERT(sdCnt < config->num_side_channel_elements); 500 sideIsCpe[sdCnt] = isCpe; 501 sideTag[sdCnt++] = tag; 502 break; 503 case BACK: 504 FDK_ASSERT(bckCnt < config->num_back_channel_elements); 505 backIsCpe[bckCnt] = isCpe; 506 backTag[bckCnt++] = tag; 507 break; 508 } 509 } 510 511 /* Write front channel isCpe and tags */ 512 for (i = 0; i < config->num_front_channel_elements; i++) { 513 FDKwriteBits(hBs, frontIsCpe[i], 1); 514 FDKwriteBits(hBs, frontTag[i], 4); 515 } 516 /* Write side channel isCpe and tags */ 517 for (i = 0; i < config->num_side_channel_elements; i++) { 518 FDKwriteBits(hBs, sideIsCpe[i], 1); 519 FDKwriteBits(hBs, sideTag[i], 4); 520 } 521 /* Write back channel isCpe and tags */ 522 for (i = 0; i < config->num_back_channel_elements; i++) { 523 FDKwriteBits(hBs, backIsCpe[i], 1); 524 FDKwriteBits(hBs, backTag[i], 4); 525 } 526 /* Write LFE information */ 527 for (i = 0; i < config->num_lfe_channel_elements; i++) { 528 FDKwriteBits(hBs, lfeCnt++, 4); /* LFE channel Instance Tag. */ 529 } 530 531 /* - num_valid_cc_elements always 0. 532 - num_assoc_data_elements always 0. */ 533 534 /* Byte alignment: relative to alignAnchor 535 ADTS: align with respect to the first bit of the raw_data_block() 536 ADIF: align with respect to the first bit of the header 537 LATM: align with respect to the first bit of the ASC */ 538 FDKbyteAlign(hBs, alignAnchor); /* Alignment */ 539 540 /* Write comment information */ 541 542 if (config->pHeight_num != NULL) { 543 /* embed height information in comment field */ 544 545 INT commentBytes = 546 1 /* PCE_HEIGHT_EXT_SYNC */ 547 + ((((config->num_front_channel_elements + 548 config->num_side_channel_elements + 549 config->num_back_channel_elements) 550 << 1) + 551 7) >> 552 3) /* 2 bit height info per element, round up to full bytes */ 553 + 1; /* CRC */ 554 555 FDKwriteBits(hBs, commentBytes, 8); /* comment size. */ 556 557 FDK_CRCINFO crcInfo; /* CRC state info */ 558 INT crcReg; 559 560 FDKcrcInit(&crcInfo, 0x07, 0xFF, 8); 561 crcReg = FDKcrcStartReg(&crcInfo, hBs, 0); 562 563 FDKwriteBits(hBs, PCE_HEIGHT_EXT_SYNC, 8); /* indicate height extension */ 564 565 /* front channel height information */ 566 for (i = 0; 567 i < config->num_front_channel_elements - 568 config->pHeight_num->num_front_height_channel_elements[0] - 569 config->pHeight_num->num_front_height_channel_elements[1]; 570 i++) 571 FDKwriteBits(hBs, HEIGHT_NORMAL, 2); 572 for (i = 0; i < config->pHeight_num->num_front_height_channel_elements[0]; 573 i++) 574 FDKwriteBits(hBs, HEIGHT_TOP, 2); 575 for (i = 0; i < config->pHeight_num->num_front_height_channel_elements[1]; 576 i++) 577 FDKwriteBits(hBs, HEIGHT_BOTTOM, 2); 578 579 /* side channel height information */ 580 for (i = 0; 581 i < config->num_side_channel_elements - 582 config->pHeight_num->num_side_height_channel_elements[0] - 583 config->pHeight_num->num_side_height_channel_elements[1]; 584 i++) 585 FDKwriteBits(hBs, HEIGHT_NORMAL, 2); 586 for (i = 0; i < config->pHeight_num->num_side_height_channel_elements[0]; 587 i++) 588 FDKwriteBits(hBs, HEIGHT_TOP, 2); 589 for (i = 0; i < config->pHeight_num->num_side_height_channel_elements[1]; 590 i++) 591 FDKwriteBits(hBs, HEIGHT_BOTTOM, 2); 592 593 /* back channel height information */ 594 for (i = 0; 595 i < config->num_back_channel_elements - 596 config->pHeight_num->num_back_height_channel_elements[0] - 597 config->pHeight_num->num_back_height_channel_elements[1]; 598 i++) 599 FDKwriteBits(hBs, HEIGHT_NORMAL, 2); 600 for (i = 0; i < config->pHeight_num->num_back_height_channel_elements[0]; 601 i++) 602 FDKwriteBits(hBs, HEIGHT_TOP, 2); 603 for (i = 0; i < config->pHeight_num->num_back_height_channel_elements[1]; 604 i++) 605 FDKwriteBits(hBs, HEIGHT_BOTTOM, 2); 606 607 FDKbyteAlign(hBs, alignAnchor); /* Alignment */ 608 609 FDKcrcEndReg(&crcInfo, hBs, crcReg); 610 FDKwriteBits(hBs, FDKcrcGetCRC(&crcInfo), 8); 611 612 } else { 613 FDKwriteBits(hBs, 0, 614 8); /* Do no write any comment or height information. */ 615 } 616 617 return 0; 618 } 619 620 int transportEnc_GetPCEBits(CHANNEL_MODE channelMode, int matrixMixdownA, 621 int bits) { 622 const PCE_CONFIGURATION *config = NULL; 623 624 if ((config = getPceEntry(channelMode)) == NULL) { 625 return -1; /* unsupported channelmapping */ 626 } 627 628 bits += 629 4 + 2 + 4; /* Element instance tag + Object type + Sample rate index */ 630 bits += 4 + 4 + 4 + 2; /* No (front + side + back + lfe channel) elements */ 631 bits += 3 + 4; /* No (assoc data + valid cc) elements */ 632 bits += 1 + 1 + 1; /* Mono + Stereo + Matrix mixdown present */ 633 634 if (matrixMixdownA != 0 && 635 ((channelMode == MODE_1_2_2) || (channelMode == MODE_1_2_2_1))) { 636 bits += 3; /* matrix_mixdown_idx + pseudo_surround_enable */ 637 } 638 639 bits += (1 + 4) * (INT)config->num_front_channel_elements; 640 bits += (1 + 4) * (INT)config->num_side_channel_elements; 641 bits += (1 + 4) * (INT)config->num_back_channel_elements; 642 bits += (4) * (INT)config->num_lfe_channel_elements; 643 644 /* - num_valid_cc_elements always 0. 645 - num_assoc_data_elements always 0. */ 646 647 if ((bits % 8) != 0) { 648 bits += (8 - (bits % 8)); /* Alignment */ 649 } 650 651 bits += 8; /* Comment field bytes */ 652 653 if (config->pHeight_num != NULL) { 654 /* Comment field (height extension) */ 655 656 bits += 657 8 /* PCE_HEIGHT_EXT_SYNC */ 658 + 659 ((config->num_front_channel_elements + 660 config->num_side_channel_elements + config->num_back_channel_elements) 661 << 1) /* 2 bit height info per element */ 662 + 8; /* CRC */ 663 664 if ((bits % 8) != 0) { 665 bits += (8 - (bits % 8)); /* Alignment */ 666 } 667 } 668 669 return bits; 670 } 671 672 static void writeAot(HANDLE_FDK_BITSTREAM hBitstreamBuffer, 673 AUDIO_OBJECT_TYPE aot) { 674 int tmp = (int)aot; 675 676 if (tmp > 31) { 677 FDKwriteBits(hBitstreamBuffer, AOT_ESCAPE, 5); 678 FDKwriteBits(hBitstreamBuffer, tmp - 32, 6); /* AudioObjectType */ 679 } else { 680 FDKwriteBits(hBitstreamBuffer, tmp, 5); 681 } 682 } 683 684 static void writeSampleRate(HANDLE_FDK_BITSTREAM hBs, int sampleRate, 685 int nBits) { 686 int srIdx = getSamplingRateIndex(sampleRate, nBits); 687 688 FDKwriteBits(hBs, srIdx, nBits); 689 if (srIdx == (1 << nBits) - 1) { 690 FDKwriteBits(hBs, sampleRate, 24); 691 } 692 } 693 694 static int transportEnc_writeGASpecificConfig(HANDLE_FDK_BITSTREAM asc, 695 CODER_CONFIG *config, int extFlg, 696 UINT alignAnchor) { 697 int aot = config->aot; 698 int samplesPerFrame = config->samplesPerFrame; 699 700 /* start of GASpecificConfig according to ISO/IEC 14496-3 Subpart 4, 4.4.1 */ 701 FDKwriteBits(asc, 702 ((samplesPerFrame == 960 || samplesPerFrame == 480) ? 1 : 0), 703 1); /* frameLengthFlag: 1 for a 960/480 (I)MDCT, 0 for a 1024/512 704 (I)MDCT*/ 705 FDKwriteBits(asc, 0, 706 1); /* dependsOnCoreCoder: Sampling Rate Coder Specific, see in 707 ISO/IEC 14496-3 Subpart 4, 4.4.1 */ 708 FDKwriteBits(asc, extFlg, 709 1); /* Extension Flag: Shall be 1 for aot = 17,19,20,21,22,23 */ 710 711 /* Write PCE if channel config is not 1-7 */ 712 if (getChannelConfig(config->channelMode, config->channelConfigZero) == 0) { 713 transportEnc_writePCE(asc, config->channelMode, config->samplingRate, 0, 1, 714 config->matrixMixdownA, 715 (config->flags & CC_PSEUDO_SURROUND) ? 1 : 0, 716 alignAnchor); 717 } 718 if ((aot == AOT_AAC_SCAL) || (aot == AOT_ER_AAC_SCAL)) { 719 FDKwriteBits(asc, 0, 3); /* layerNr */ 720 } 721 if (extFlg) { 722 if (aot == AOT_ER_BSAC) { 723 FDKwriteBits(asc, config->BSACnumOfSubFrame, 5); /* numOfSubFrame */ 724 FDKwriteBits(asc, config->BSAClayerLength, 11); /* layer_length */ 725 } 726 if ((aot == AOT_ER_AAC_LC) || (aot == AOT_ER_AAC_LTP) || 727 (aot == AOT_ER_AAC_SCAL) || (aot == AOT_ER_AAC_LD)) { 728 FDKwriteBits(asc, (config->flags & CC_VCB11) ? 1 : 0, 729 1); /* aacSectionDataResillienceFlag */ 730 FDKwriteBits(asc, (config->flags & CC_RVLC) ? 1 : 0, 731 1); /* aacScaleFactorDataResillienceFlag */ 732 FDKwriteBits(asc, (config->flags & CC_HCR) ? 1 : 0, 733 1); /* aacSpectralDataResillienceFlag */ 734 } 735 FDKwriteBits(asc, 0, 1); /* extensionFlag3: reserved. Shall be '0' */ 736 } 737 return 0; 738 } 739 740 static int transportEnc_writeELDSpecificConfig(HANDLE_FDK_BITSTREAM hBs, 741 CODER_CONFIG *config, 742 int epConfig, 743 CSTpCallBacks *cb) { 744 UINT frameLengthFlag = 0; 745 switch (config->samplesPerFrame) { 746 case 512: 747 case 256: 748 case 128: 749 case 64: 750 frameLengthFlag = 0; 751 break; 752 case 480: 753 case 240: 754 case 160: 755 case 120: 756 case 60: 757 frameLengthFlag = 1; 758 break; 759 } 760 761 FDKwriteBits(hBs, frameLengthFlag, 1); 762 763 FDKwriteBits(hBs, (config->flags & CC_VCB11) ? 1 : 0, 1); 764 FDKwriteBits(hBs, (config->flags & CC_RVLC) ? 1 : 0, 1); 765 FDKwriteBits(hBs, (config->flags & CC_HCR) ? 1 : 0, 1); 766 767 FDKwriteBits(hBs, (config->flags & CC_SBR) ? 1 : 0, 1); /* SBR header flag */ 768 if ((config->flags & CC_SBR)) { 769 FDKwriteBits(hBs, (config->samplingRate == config->extSamplingRate) ? 0 : 1, 770 1); /* Samplerate Flag */ 771 FDKwriteBits(hBs, (config->flags & CC_SBRCRC) ? 1 : 0, 1); /* SBR CRC flag*/ 772 773 if (cb->cbSbr != NULL) { 774 const PCE_CONFIGURATION *pPce; 775 int e, sbrElementIndex = 0; 776 777 pPce = getPceEntry(config->channelMode); 778 779 for (e = 0; e < pPce->num_front_channel_elements + 780 pPce->num_side_channel_elements + 781 pPce->num_back_channel_elements + 782 pPce->num_lfe_channel_elements; 783 e++) { 784 if ((pPce->pEl_type[e] == ID_SCE) || (pPce->pEl_type[e] == ID_CPE)) { 785 cb->cbSbr(cb->cbSbrData, hBs, 0, 0, 0, config->aot, pPce->pEl_type[e], 786 sbrElementIndex, 0, 0, 0, NULL, 1); 787 sbrElementIndex++; 788 } 789 } 790 } 791 } 792 793 if ((config->flags & CC_SAC) && (cb->cbSsc != NULL)) { 794 FDKwriteBits(hBs, ELDEXT_LDSAC, 4); 795 796 const INT eldExtLen = 797 (cb->cbSsc(cb->cbSscData, NULL, config->aot, config->extSamplingRate, 0, 798 0, 0, 0, 0, NULL) + 799 7) >> 800 3; 801 INT cnt = eldExtLen; 802 803 if (cnt < 0xF) { 804 FDKwriteBits(hBs, cnt, 4); 805 } else { 806 FDKwriteBits(hBs, 0xF, 4); 807 cnt -= 0xF; 808 809 if (cnt < 0xFF) { 810 FDKwriteBits(hBs, cnt, 8); 811 } else { 812 FDKwriteBits(hBs, 0xFF, 8); 813 cnt -= 0xFF; 814 815 FDK_ASSERT(cnt <= 0xFFFF); 816 FDKwriteBits(hBs, cnt, 16); 817 } 818 } 819 820 cb->cbSsc(cb->cbSscData, hBs, config->aot, config->extSamplingRate, 0, 0, 0, 821 0, 0, NULL); 822 } 823 824 if (config->downscaleSamplingRate != 0 && 825 config->downscaleSamplingRate != config->extSamplingRate) { 826 /* downscale active */ 827 828 /* eldExtLenDsc: Number of bytes for the ELD downscale extension (srIdx 829 needs 1 byte 830 + downscaleSamplingRate needs additional 3 bytes) */ 831 int eldExtLenDsc = 1; 832 int downscaleSamplingRate = config->downscaleSamplingRate; 833 FDKwriteBits(hBs, ELDEXT_DOWNSCALEINFO, 4); /* ELDEXT_DOWNSCALEINFO */ 834 835 if ((downscaleSamplingRate != 96000) && (downscaleSamplingRate != 88200) && 836 (downscaleSamplingRate != 64000) && (downscaleSamplingRate != 48000) && 837 (downscaleSamplingRate != 44100) && (downscaleSamplingRate != 32000) && 838 (downscaleSamplingRate != 24000) && (downscaleSamplingRate != 22050) && 839 (downscaleSamplingRate != 16000) && (downscaleSamplingRate != 12000) && 840 (downscaleSamplingRate != 11025) && (downscaleSamplingRate != 8000) && 841 (downscaleSamplingRate != 7350)) { 842 eldExtLenDsc = 4; /* length extends to 4 if downscaleSamplingRate's value 843 is not one of the listed values */ 844 } 845 846 FDKwriteBits(hBs, eldExtLenDsc, 4); 847 writeSampleRate(hBs, downscaleSamplingRate, 4); 848 FDKwriteBits(hBs, 0x0, 4); /* fill_nibble */ 849 } 850 851 FDKwriteBits(hBs, ELDEXT_TERM, 4); /* ELDEXT_TERM */ 852 853 return 0; 854 } 855 856 static int transportEnc_writeUsacSpecificConfig(HANDLE_FDK_BITSTREAM hBs, 857 int extFlag, CODER_CONFIG *cc, 858 CSTpCallBacks *cb) { 859 FDK_BITSTREAM usacConf; 860 int usacConfigBits = cc->rawConfigBits; 861 862 if ((usacConfigBits <= 0) || 863 ((usacConfigBits + 7) / 8 > (int)sizeof(cc->rawConfig))) { 864 return TRANSPORTENC_UNSUPPORTED_FORMAT; 865 } 866 FDKinitBitStream(&usacConf, cc->rawConfig, BUFSIZE_DUMMY_VALUE, 867 usacConfigBits, BS_READER); 868 869 for (; usacConfigBits > 0; usacConfigBits--) { 870 UINT tmp = FDKreadBit(&usacConf); 871 FDKwriteBits(hBs, tmp, 1); 872 } 873 FDKsyncCache(hBs); 874 875 return TRANSPORTENC_OK; 876 } 877 878 int transportEnc_writeASC(HANDLE_FDK_BITSTREAM asc, CODER_CONFIG *config, 879 CSTpCallBacks *cb) { 880 UINT extFlag = 0; 881 int err; 882 int epConfig = 0; 883 884 /* Required for the PCE. */ 885 UINT alignAnchor = FDKgetValidBits(asc); 886 887 /* Extension Flag: Shall be 1 for aot = 17,19,20,21,22,23,39 */ 888 switch (config->aot) { 889 case AOT_ER_AAC_LC: 890 case AOT_ER_AAC_LTP: 891 case AOT_ER_AAC_SCAL: 892 case AOT_ER_TWIN_VQ: 893 case AOT_ER_BSAC: 894 case AOT_ER_AAC_LD: 895 case AOT_ER_AAC_ELD: 896 case AOT_USAC: 897 extFlag = 1; 898 break; 899 default: 900 break; 901 } 902 903 if (config->sbrSignaling == SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) 904 writeAot(asc, config->extAOT); 905 else 906 writeAot(asc, config->aot); 907 908 /* In case of USAC it is the output not the core sampling rate */ 909 writeSampleRate(asc, config->samplingRate, 4); 910 911 /* Try to guess a reasonable channel mode if not given */ 912 if (config->channelMode == MODE_INVALID) { 913 config->channelMode = transportEnc_GetChannelMode(config->noChannels); 914 if (config->channelMode == MODE_INVALID) return -1; 915 } 916 917 FDKwriteBits( 918 asc, getChannelConfig(config->channelMode, config->channelConfigZero), 4); 919 920 if (config->sbrSignaling == SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) { 921 writeSampleRate(asc, config->extSamplingRate, 4); 922 writeAot(asc, config->aot); 923 } 924 925 switch (config->aot) { 926 case AOT_AAC_MAIN: 927 case AOT_AAC_LC: 928 case AOT_AAC_SSR: 929 case AOT_AAC_LTP: 930 case AOT_AAC_SCAL: 931 case AOT_TWIN_VQ: 932 case AOT_ER_AAC_LC: 933 case AOT_ER_AAC_LTP: 934 case AOT_ER_AAC_SCAL: 935 case AOT_ER_TWIN_VQ: 936 case AOT_ER_BSAC: 937 case AOT_ER_AAC_LD: 938 err = 939 transportEnc_writeGASpecificConfig(asc, config, extFlag, alignAnchor); 940 if (err) return err; 941 break; 942 case AOT_ER_AAC_ELD: 943 err = transportEnc_writeELDSpecificConfig(asc, config, epConfig, cb); 944 if (err) return err; 945 break; 946 case AOT_USAC: 947 err = transportEnc_writeUsacSpecificConfig(asc, extFlag, config, cb); 948 if (err) { 949 return err; 950 } 951 break; 952 default: 953 return -1; 954 } 955 956 switch (config->aot) { 957 case AOT_ER_AAC_LC: 958 case AOT_ER_AAC_LTP: 959 case AOT_ER_AAC_SCAL: 960 case AOT_ER_TWIN_VQ: 961 case AOT_ER_BSAC: 962 case AOT_ER_AAC_LD: 963 case AOT_ER_CELP: 964 case AOT_ER_HVXC: 965 case AOT_ER_HILN: 966 case AOT_ER_PARA: 967 case AOT_ER_AAC_ELD: 968 FDKwriteBits(asc, 0, 2); /* epconfig 0 */ 969 break; 970 default: 971 break; 972 } 973 974 /* backward compatible explicit signaling of extension AOT */ 975 if (config->sbrSignaling == SIG_EXPLICIT_BW_COMPATIBLE) { 976 TP_ASC_EXTENSION_ID ascExtId = ASCEXT_UNKOWN; 977 978 if (config->sbrPresent) { 979 ascExtId = ASCEXT_SBR; 980 FDKwriteBits(asc, ascExtId, 11); 981 writeAot(asc, config->extAOT); 982 FDKwriteBits(asc, 1, 1); /* sbrPresentFlag=1 */ 983 writeSampleRate(asc, config->extSamplingRate, 4); 984 if (config->psPresent) { 985 ascExtId = ASCEXT_PS; 986 FDKwriteBits(asc, ascExtId, 11); 987 FDKwriteBits(asc, 1, 1); /* psPresentFlag=1 */ 988 } 989 } 990 } 991 992 /* Make sure all bits are sync'ed */ 993 FDKsyncCache(asc); 994 995 return 0; 996 } 997