1 2 /* ----------------------------------------------------------------------------------------------------------- 3 Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5 Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V. 6 All rights reserved. 7 8 1. INTRODUCTION 9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 16 of the MPEG specifications. 17 18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 20 individually for the purpose of encoding or decoding bit streams in products that are compliant with 21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 23 software may already be covered under those patent licenses when it is used for those licensed purposes only. 24 25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 27 applications information and documentation. 28 29 2. COPYRIGHT LICENSE 30 31 Redistribution and use in source and binary forms, with or without modification, are permitted without 32 payment of copyright license fees provided that you satisfy the following conditions: 33 34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or 35 your modifications thereto in source code form. 36 37 You must retain the complete text of this software license in the documentation and/or other materials 38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your 40 modifications thereto to recipients of copies in binary form. 41 42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without 43 prior written permission. 44 45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 46 software or your modifications thereto. 47 48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 49 and the date of any change. For modified versions of the FDK AAC Codec, the term 50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term 51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 52 53 3. NO PATENT LICENSE 54 55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 57 respect to this software. 58 59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 60 by appropriate patent licenses. 61 62 4. DISCLAIMER 63 64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors 65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties 66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits, 69 or business interruption, however caused and on any theory of liability, whether in contract, strict 70 liability, or tort (including negligence), arising in any way out of the use of this software, even if 71 advised of the possibility of such damage. 72 73 5. CONTACT INFORMATION 74 75 Fraunhofer Institute for Integrated Circuits IIS 76 Attention: Audio and Multimedia Departments - FDK AAC LL 77 Am Wolfsmantel 33 78 91058 Erlangen, Germany 79 80 www.iis.fraunhofer.de/amm 81 amm-info (at) iis.fraunhofer.de 82 ----------------------------------------------------------------------------------------------------------- */ 83 84 /***************************** MPEG-4 AAC Decoder ************************** 85 86 Author(s): Christian Griebel 87 Description: Dynamic range control (DRC) decoder tool for AAC 88 89 ******************************************************************************/ 90 91 #include "aacdec_drc.h" 92 93 94 #include "channelinfo.h" 95 #include "aac_rom.h" 96 97 #include "sbrdecoder.h" 98 99 /* 100 * Dynamic Range Control 101 */ 102 103 /* For parameter conversion */ 104 #define DRC_PARAMETER_BITS ( 7 ) 105 #define DRC_MAX_QUANT_STEPS ( 1<<DRC_PARAMETER_BITS ) 106 #define DRC_MAX_QUANT_FACTOR ( DRC_MAX_QUANT_STEPS-1 ) 107 #define DRC_PARAM_QUANT_STEP ( FL2FXCONST_DBL(1.0f/(float)DRC_MAX_QUANT_FACTOR) ) 108 #define DRC_PARAM_SCALE ( 1 ) 109 110 #define MAX_REFERENCE_LEVEL ( 127 ) 111 112 #define DVB_ANC_DATA_SYNC_BYTE ( 0xBC ) /* DVB ancillary data sync byte. */ 113 114 /*! 115 \brief Initialize DRC information 116 117 \self Handle of DRC info 118 119 \return none 120 */ 121 void aacDecoder_drcInit ( 122 HANDLE_AAC_DRC self ) 123 { 124 CDrcParams *pParams; 125 126 if (self == NULL) { 127 return; 128 } 129 130 /* init control fields */ 131 self->enable = 0; 132 self->numThreads = 0; 133 self->digitalNorm = 0; 134 135 /* init params */ 136 pParams = &self->params; 137 pParams->bsDelayEnable = 0; 138 pParams->cut = FL2FXCONST_DBL(0.0f); 139 pParams->usrCut = FL2FXCONST_DBL(0.0f); 140 pParams->boost = FL2FXCONST_DBL(0.0f); 141 pParams->usrBoost = FL2FXCONST_DBL(0.0f); 142 pParams->targetRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL; 143 pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES; 144 pParams->applyHeavyCompression = 0; 145 146 /* initial program ref level = target ref level */ 147 self->progRefLevel = pParams->targetRefLevel; 148 } 149 150 151 /*! 152 \brief Initialize DRC control data for one channel 153 154 \self Handle of DRC info 155 156 \return none 157 */ 158 void aacDecoder_drcInitChannelData ( 159 CDrcChannelData *pDrcChData ) 160 { 161 if (pDrcChData != NULL) { 162 pDrcChData->expiryCount = 0; 163 pDrcChData->numBands = 1; 164 pDrcChData->bandTop[0] = (1024 >> 2) - 1; 165 pDrcChData->drcValue[0] = 0; 166 pDrcChData->drcInterpolationScheme = 0; 167 pDrcChData->drcDataType = UNKNOWN_PAYLOAD; 168 } 169 } 170 171 172 /*! 173 \brief Set one single DRC parameter 174 175 \self Handle of DRC info. 176 \param Parameter to be set. 177 \value Value to be set. 178 179 \return an error code. 180 */ 181 AAC_DECODER_ERROR aacDecoder_drcSetParam ( 182 HANDLE_AAC_DRC self, 183 AACDEC_DRC_PARAM param, 184 INT value ) 185 { 186 AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; 187 188 switch (param) 189 { 190 case DRC_CUT_SCALE: 191 /* set attenuation scale factor */ 192 if ( (value < 0) 193 || (value > DRC_MAX_QUANT_FACTOR) ) { 194 return AAC_DEC_SET_PARAM_FAIL; 195 } 196 if (self == NULL) { 197 return AAC_DEC_INVALID_HANDLE; 198 } 199 self->params.usrCut = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value); 200 if (self->params.applyHeavyCompression == 0) 201 self->params.cut = self->params.usrCut; 202 break; 203 case DRC_BOOST_SCALE: 204 /* set boost factor */ 205 if ( (value < 0) 206 || (value > DRC_MAX_QUANT_FACTOR) ) { 207 return AAC_DEC_SET_PARAM_FAIL; 208 } 209 if (self == NULL) { 210 return AAC_DEC_INVALID_HANDLE; 211 } 212 self->params.usrBoost = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value); 213 if (self->params.applyHeavyCompression == 0) 214 self->params.boost = self->params.usrBoost; 215 break; 216 case TARGET_REF_LEVEL: 217 if ( value > MAX_REFERENCE_LEVEL 218 || value < -MAX_REFERENCE_LEVEL ) { 219 return AAC_DEC_SET_PARAM_FAIL; 220 } 221 if (self == NULL) { 222 return AAC_DEC_INVALID_HANDLE; 223 } 224 if (value < 0) { 225 self->digitalNorm = 0; 226 } 227 else { 228 /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */ 229 self->digitalNorm = 1; 230 if (self->params.targetRefLevel != (SCHAR)value) { 231 self->params.targetRefLevel = (SCHAR)value; 232 self->progRefLevel = (SCHAR)value; /* Always set the program reference level equal to the 233 target level according to 4.5.2.7.3 of ISO/IEC 14496-3. */ 234 } 235 } 236 break; 237 case APPLY_HEAVY_COMPRESSION: 238 if (value < 0 || value > 1) { 239 return AAC_DEC_SET_PARAM_FAIL; 240 } 241 if (self == NULL) { 242 return AAC_DEC_INVALID_HANDLE; 243 } 244 if (self->params.applyHeavyCompression != (UCHAR)value) { 245 if (value == 1) { 246 /* Disable scaling of DRC values by setting the max values */ 247 self->params.boost = FL2FXCONST_DBL(1.0f/(float)(1<<DRC_PARAM_SCALE)); 248 self->params.cut = FL2FXCONST_DBL(1.0f/(float)(1<<DRC_PARAM_SCALE)); 249 } else { 250 /* Restore the user params */ 251 self->params.boost = self->params.usrBoost; 252 self->params.cut = self->params.usrCut; 253 } 254 /* Store new parameter value */ 255 self->params.applyHeavyCompression = (UCHAR)value; 256 } 257 break; 258 case DRC_BS_DELAY: 259 if (value < 0 || value > 1) { 260 return AAC_DEC_SET_PARAM_FAIL; 261 } 262 if (self == NULL) { 263 return AAC_DEC_INVALID_HANDLE; 264 } 265 self->params.bsDelayEnable = value; 266 break; 267 case DRC_DATA_EXPIRY_FRAME: 268 if (self == NULL) { 269 return AAC_DEC_INVALID_HANDLE; 270 } 271 self->params.expiryFrame = (UINT)value; 272 break; 273 default: 274 return AAC_DEC_SET_PARAM_FAIL; 275 } /* switch(param) */ 276 277 /* switch on/off processing */ 278 self->enable = ( (self->params.boost > (FIXP_DBL)0) 279 || (self->params.cut > (FIXP_DBL)0) 280 || (self->params.applyHeavyCompression != 0) 281 || (self->digitalNorm == 1) ); 282 283 284 return ErrorStatus; 285 } 286 287 288 static int parseExcludedChannels( UINT *excludedChnsMask, 289 HANDLE_FDK_BITSTREAM bs ) 290 { 291 UINT excludeMask = 0; 292 UINT i, j; 293 int bitCnt = 9; 294 295 for (i = 0, j = 1; i < 7; i++, j<<=1) { 296 if (FDKreadBits(bs,1)) { 297 excludeMask |= j; 298 } 299 } 300 301 /* additional_excluded_chns */ 302 while (FDKreadBits(bs,1)) { 303 for (i = 0; i < 7; i++, j<<=1) { 304 if (FDKreadBits(bs,1)) { 305 excludeMask |= j; 306 } 307 } 308 bitCnt += 9; 309 FDK_ASSERT(j < (UINT)-1); 310 } 311 312 *excludedChnsMask = excludeMask; 313 314 return (bitCnt); 315 } 316 317 318 /*! 319 \brief Save DRC payload bitstream position 320 321 \self Handle of DRC info 322 \bs Handle of FDK bitstream 323 324 \return The number of DRC payload bits 325 */ 326 int aacDecoder_drcMarkPayload ( 327 HANDLE_AAC_DRC self, 328 HANDLE_FDK_BITSTREAM bs, 329 AACDEC_DRC_PAYLOAD_TYPE type ) 330 { 331 UINT bsStartPos; 332 int i, numBands = 1, bitCnt = 0; 333 334 if (self == NULL) { 335 return 0; 336 } 337 338 bsStartPos = FDKgetValidBits(bs); 339 340 switch (type) { 341 case MPEG_DRC_EXT_DATA: 342 { 343 bitCnt = 4; 344 345 if (FDKreadBits(bs,1)) { /* pce_tag_present */ 346 FDKreadBits(bs,8); /* pce_instance_tag + drc_tag_reserved_bits */ 347 bitCnt+=8; 348 } 349 350 if (FDKreadBits(bs,1)) { /* excluded_chns_present */ 351 FDKreadBits(bs,7); /* exclude mask [0..7] */ 352 bitCnt+=8; 353 while (FDKreadBits(bs,1)) { /* additional_excluded_chns */ 354 FDKreadBits(bs,7); /* exclude mask [x..y] */ 355 bitCnt+=8; 356 } 357 } 358 359 if (FDKreadBits(bs,1)) { /* drc_bands_present */ 360 numBands += FDKreadBits(bs, 4); /* drc_band_incr */ 361 FDKreadBits(bs,4); /* reserved */ 362 bitCnt+=8; 363 for (i = 0; i < numBands; i++) { 364 FDKreadBits(bs,8); /* drc_band_top[i] */ 365 bitCnt+=8; 366 } 367 } 368 369 if (FDKreadBits(bs,1)) { /* prog_ref_level_present */ 370 FDKreadBits(bs,8); /* prog_ref_level + prog_ref_level_reserved_bits */ 371 bitCnt+=8; 372 } 373 374 for (i = 0; i < numBands; i++) { 375 FDKreadBits(bs,8); /* dyn_rng_sgn[i] + dyn_rng_ctl[i] */ 376 bitCnt+=8; 377 } 378 379 if ( (self->numPayloads < MAX_DRC_THREADS) 380 && ((INT)FDKgetValidBits(bs) >= 0) ) 381 { 382 self->drcPayloadPosition[self->numPayloads++] = bsStartPos; 383 } 384 } 385 break; 386 387 case DVB_DRC_ANC_DATA: 388 bitCnt += 8; 389 /* check sync word */ 390 if (FDKreadBits(bs, 8) == DVB_ANC_DATA_SYNC_BYTE) 391 { 392 int dmxLevelsPresent, compressionPresent; 393 int coarseGrainTcPresent, fineGrainTcPresent; 394 395 /* bs_info field */ 396 FDKreadBits(bs, 8); /* mpeg_audio_type, dolby_surround_mode, presentation_mode */ 397 bitCnt+=8; 398 399 /* Evaluate ancillary_data_status */ 400 FDKreadBits(bs, 3); /* reserved, set to 0 */ 401 dmxLevelsPresent = FDKreadBits(bs, 1); /* downmixing_levels_MPEG4_status */ 402 FDKreadBits(bs, 1); /* reserved, set to 0 */ 403 compressionPresent = FDKreadBits(bs, 1); /* audio_coding_mode_and_compression status */ 404 coarseGrainTcPresent = FDKreadBits(bs, 1); /* coarse_grain_timecode_status */ 405 fineGrainTcPresent = FDKreadBits(bs, 1); /* fine_grain_timecode_status */ 406 bitCnt+=8; 407 408 /* MPEG4 downmixing levels */ 409 if (dmxLevelsPresent) { 410 FDKreadBits(bs, 8); /* downmixing_levels_MPEG4 */ 411 bitCnt+=8; 412 } 413 /* audio coding mode and compression status */ 414 if (compressionPresent) { 415 FDKreadBits(bs, 16); /* audio_coding_mode, Compression_value */ 416 bitCnt+=16; 417 } 418 /* coarse grain timecode */ 419 if (coarseGrainTcPresent) { 420 FDKreadBits(bs, 16); /* coarse_grain_timecode */ 421 bitCnt+=16; 422 } 423 /* fine grain timecode */ 424 if (fineGrainTcPresent) { 425 FDKreadBits(bs, 16); /* fine_grain_timecode */ 426 bitCnt+=16; 427 } 428 if ( !self->dvbAncDataAvailable 429 && ((INT)FDKgetValidBits(bs) >= 0) ) 430 { 431 self->dvbAncDataPosition = bsStartPos; 432 self->dvbAncDataAvailable = 1; 433 } 434 } 435 break; 436 437 default: 438 break; 439 } 440 441 return (bitCnt); 442 } 443 444 445 /*! 446 \brief Parse DRC parameters from bitstream 447 448 \bs Handle of FDK bitstream (in) 449 \pDrcBs Pointer to DRC payload data container (out) 450 \payloadPosition Bitstream position of MPEG DRC data junk (in) 451 452 \return Number of bits read (0 in case of a parse error) 453 */ 454 static int aacDecoder_drcParse ( 455 HANDLE_FDK_BITSTREAM bs, 456 CDrcPayload *pDrcBs, 457 UINT payloadPosition ) 458 { 459 int i, numBands, bitCnt = 4; 460 461 /* Move to the beginning of the DRC payload field */ 462 FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition); 463 464 /* pce_tag_present */ 465 if (FDKreadBits(bs,1)) 466 { 467 pDrcBs->pceInstanceTag = FDKreadBits(bs, 4); /* pce_instance_tag */ 468 /* only one program supported */ 469 FDKreadBits(bs, 4); /* drc_tag_reserved_bits */ 470 bitCnt += 8; 471 } else { 472 pDrcBs->pceInstanceTag = -1; /* not present */ 473 } 474 475 if (FDKreadBits(bs,1)) { /* excluded_chns_present */ 476 /* get excluded_chn_mask */ 477 bitCnt += parseExcludedChannels(&pDrcBs->excludedChnsMask, bs); 478 } else { 479 pDrcBs->excludedChnsMask = 0; 480 } 481 482 numBands = 1; 483 if (FDKreadBits(bs,1)) /* drc_bands_present */ 484 { 485 /* get band_incr */ 486 numBands += FDKreadBits(bs, 4); /* drc_band_incr */ 487 pDrcBs->channelData.drcInterpolationScheme = FDKreadBits(bs, 4); /* drc_interpolation_scheme */ 488 bitCnt += 8; 489 /* band_top */ 490 for (i = 0; i < numBands; i++) 491 { 492 pDrcBs->channelData.bandTop[i] = FDKreadBits(bs, 8); /* drc_band_top[i] */ 493 bitCnt += 8; 494 } 495 } 496 else { 497 pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */; 498 } 499 500 pDrcBs->channelData.numBands = numBands; 501 502 if (FDKreadBits(bs,1)) /* prog_ref_level_present */ 503 { 504 pDrcBs->progRefLevel = FDKreadBits(bs, 7); /* prog_ref_level */ 505 FDKreadBits(bs, 1); /* prog_ref_level_reserved_bits */ 506 bitCnt += 8; 507 } else { 508 pDrcBs->progRefLevel = -1; 509 } 510 511 for (i = 0; i < numBands; i++) 512 { 513 pDrcBs->channelData.drcValue[i] = FDKreadBits(bs, 1) << 7; /* dyn_rng_sgn[i] */ 514 pDrcBs->channelData.drcValue[i] |= FDKreadBits(bs, 7) & 0x7F; /* dyn_rng_ctl[i] */ 515 bitCnt += 8; 516 } 517 518 /* Set DRC payload type */ 519 pDrcBs->channelData.drcDataType = MPEG_DRC_EXT_DATA; 520 521 return (bitCnt); 522 } 523 524 525 /*! 526 \brief Parse heavy compression value transported in DSEs of DVB streams with MPEG-4 content. 527 528 \bs Handle of FDK bitstream (in) 529 \pDrcBs Pointer to DRC payload data container (out) 530 \payloadPosition Bitstream position of DVB ancillary data junk 531 532 \return Number of bits read (0 in case of a parse error) 533 */ 534 #define DVB_COMPRESSION_SCALE ( 8 ) /* 48,164 dB */ 535 536 static int aacDecoder_drcReadCompression ( 537 HANDLE_FDK_BITSTREAM bs, 538 CDrcPayload *pDrcBs, 539 UINT payloadPosition ) 540 { 541 int bitCnt = 0; 542 int dmxLevelsPresent, compressionPresent; 543 int coarseGrainTcPresent, fineGrainTcPresent; 544 545 /* Move to the beginning of the DRC payload field */ 546 FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition); 547 548 /* Sanity checks */ 549 if ( FDKgetValidBits(bs) < 24 ) { 550 return 0; 551 } 552 553 /* Check sync word */ 554 if (FDKreadBits(bs, 8) != DVB_ANC_DATA_SYNC_BYTE) { 555 return 0; 556 } 557 558 /* Evaluate bs_info field */ 559 if (FDKreadBits(bs, 2) != 3) { /* mpeg_audio_type */ 560 /* No MPEG-4 audio data */ 561 return 0; 562 } 563 FDKreadBits(bs, 2); /* dolby_surround_mode */ 564 FDKreadBits(bs, 2); /* presentation_mode */ 565 if (FDKreadBits(bs, 2) != 0) { /* reserved, set to 0 */ 566 return 0; 567 } 568 569 /* Evaluate ancillary_data_status */ 570 if (FDKreadBits(bs, 3) != 0) { /* reserved, set to 0 */ 571 return 0; 572 } 573 dmxLevelsPresent = FDKreadBits(bs, 1); /* downmixing_levels_MPEG4_status */ 574 if (FDKreadBits(bs, 1) != 0) { /* reserved, set to 0 */ 575 return 0; 576 } 577 compressionPresent = FDKreadBits(bs, 1); /* audio_coding_mode_and_compression status */ 578 coarseGrainTcPresent = FDKreadBits(bs, 1); /* coarse_grain_timecode_status */ 579 fineGrainTcPresent = FDKreadBits(bs, 1); /* fine_grain_timecode_status */ 580 bitCnt += 24; 581 582 if (dmxLevelsPresent) { 583 FDKreadBits(bs, 8); /* downmixing_levels_MPEG4 */ 584 bitCnt += 8; 585 } 586 587 /* audio_coding_mode_and_compression_status */ 588 if (compressionPresent) 589 { 590 UCHAR compressionOn, compressionValue; 591 592 /* audio_coding_mode */ 593 if ( FDKreadBits(bs, 7) != 0 ) { /* The reserved bits shall be set to "0". */ 594 return 0; 595 } 596 compressionOn = (UCHAR)FDKreadBits(bs, 1); /* compression_on */ 597 compressionValue = (UCHAR)FDKreadBits(bs, 8); /* Compression_value */ 598 bitCnt += 16; 599 600 if ( compressionOn ) { 601 /* A compression value is available so store the data just like MPEG DRC data */ 602 pDrcBs->channelData.numBands = 1; /* One band ... */ 603 pDrcBs->channelData.drcValue[0] = compressionValue; /* ... with one value ... */ 604 pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */ 605 pDrcBs->pceInstanceTag = -1; /* Not present */ 606 pDrcBs->progRefLevel = -1; /* Not present */ 607 pDrcBs->channelData.drcDataType = DVB_DRC_ANC_DATA; /* Set DRC payload type to DVB. */ 608 } else { 609 /* No compression value available */ 610 /* CAUTION: It is not clearly defined by standard how to react in this situation. */ 611 /* Turn down the compression value to aprox. 0dB */ 612 pDrcBs->channelData.numBands = 1; /* One band ... */ 613 pDrcBs->channelData.drcValue[0] = 0x80; /* ... with aprox. 0dB ... */ 614 pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */ 615 pDrcBs->channelData.drcDataType = DVB_DRC_ANC_DATA; /* Set DRC payload type to DVB. */ 616 617 /* If compression_on field is set to "0" the compression_value field shall be "0000 0000". */ 618 if (compressionValue != 0) { 619 return 0; 620 } 621 } 622 } 623 624 /* Read timecodes if available just to get the right amount of bits. */ 625 if (coarseGrainTcPresent) { 626 FDKreadBits(bs, 16); /* coarse_grain_timecode */ 627 bitCnt += 16; 628 } 629 if (fineGrainTcPresent) { 630 FDKreadBits(bs, 16); /* fine_grain_timecode */ 631 bitCnt += 16; 632 } 633 634 return (bitCnt); 635 } 636 637 638 /* 639 * Prepare DRC processing 640 */ 641 static int aacDecoder_drcExtractAndMap ( 642 HANDLE_AAC_DRC self, 643 HANDLE_FDK_BITSTREAM hBs, 644 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], 645 UCHAR pceInstanceTag, 646 UCHAR channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */ 647 int validChannels ) 648 { 649 CDrcPayload threadBs[MAX_DRC_THREADS]; 650 CDrcPayload *validThreadBs[MAX_DRC_THREADS]; 651 CDrcParams *pParams; 652 UINT backupBsPosition; 653 int i, thread, validThreads = 0; 654 int numExcludedChns[MAX_DRC_THREADS]; 655 656 FDK_ASSERT(self != NULL); 657 FDK_ASSERT(hBs != NULL); 658 FDK_ASSERT(pAacDecoderStaticChannelInfo != NULL); 659 660 pParams = &self->params; 661 662 self->numThreads = 0; 663 backupBsPosition = FDKgetValidBits(hBs); 664 665 for (i = 0; i < self->numPayloads && self->numThreads < MAX_DRC_THREADS; i++) { 666 int bitsParsed; 667 668 /* Init payload data chunk. The memclear is very important because it initializes 669 the most values. Without it the module wouldn't work properly or crash. */ 670 FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload)); 671 threadBs[self->numThreads].channelData.bandTop[0] = (1024 >> 2) - 1; 672 673 /* Extract payload */ 674 bitsParsed = aacDecoder_drcParse( hBs, 675 &threadBs[self->numThreads], 676 self->drcPayloadPosition[i] ); 677 if (bitsParsed > 0) { 678 self->numThreads++; 679 } 680 } 681 self->numPayloads = 0; 682 683 if (self->dvbAncDataAvailable) 684 { /* Append a DVB heavy compression payload thread if available. */ 685 int bitsParsed; 686 687 /* Init payload data chunk. The memclear is very important because it initializes 688 the most values. Without it the module wouldn't work properly or crash. */ 689 FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload)); 690 threadBs[self->numThreads].channelData.bandTop[0] = (1024 >> 2) - 1; 691 692 /* Extract payload */ 693 bitsParsed = aacDecoder_drcReadCompression( hBs, 694 &threadBs[self->numThreads], 695 self->dvbAncDataPosition ); 696 if (bitsParsed > 0) { 697 self->numThreads++; 698 } 699 } 700 self->dvbAncDataAvailable = 0; 701 702 /* Reset the bitbufffer */ 703 FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - backupBsPosition); 704 705 /* calculate number of valid bits in excl_chn_mask */ 706 707 /* coupling channels not supported */ 708 709 /* check for valid threads */ 710 for (thread = 0; thread < self->numThreads; thread++) { 711 CDrcPayload *pThreadBs = &threadBs[thread]; 712 int numExclChns = 0; 713 714 switch ((AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType) { 715 default: 716 continue; 717 case MPEG_DRC_EXT_DATA: 718 case DVB_DRC_ANC_DATA: 719 break; 720 } 721 722 if (pThreadBs->pceInstanceTag >= 0) { /* if PCE tag present */ 723 if (pThreadBs->pceInstanceTag != pceInstanceTag) { 724 continue; /* don't accept */ 725 } 726 } 727 728 /* calculate number of excluded channels */ 729 if (pThreadBs->excludedChnsMask > 0) { 730 INT exclMask = pThreadBs->excludedChnsMask; 731 int ch; 732 for (ch = 0; ch < validChannels; ch++) { 733 numExclChns += exclMask & 0x1; 734 exclMask >>= 1; 735 } 736 } 737 if (numExclChns < validChannels) { 738 validThreadBs[validThreads] = pThreadBs; 739 numExcludedChns[validThreads] = numExclChns; 740 validThreads++; 741 } 742 } 743 744 if (validThreads > 1) { 745 int ch; 746 747 /* check consistency of excl_chn_mask amongst valid DRC threads */ 748 for (ch = 0; ch < validChannels; ch++) { 749 int present = 0; 750 751 for (thread = 0; thread < validThreads; thread++) { 752 CDrcPayload *pThreadBs = validThreadBs[thread]; 753 754 755 /* thread applies to this channel */ 756 if ( (pThreadBs->channelData.drcDataType == MPEG_DRC_EXT_DATA) 757 && ( (numExcludedChns[thread] == 0) 758 || (!(pThreadBs->excludedChnsMask & (1<<ch))) ) ) { 759 present++; 760 } 761 } 762 763 764 if (present > 1) { 765 return -1; 766 } 767 } 768 } 769 770 /* map DRC bitstream information onto DRC channel information */ 771 for (thread = 0; thread < validThreads; thread++) 772 { 773 CDrcPayload *pThreadBs = validThreadBs[thread]; 774 INT exclMask = pThreadBs->excludedChnsMask; 775 AACDEC_DRC_PAYLOAD_TYPE drcPayloadType = (AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType; 776 int ch; 777 778 /* last progRefLevel transmitted is the one that is used 779 * (but it should really only be transmitted once per block!) 780 */ 781 if (pThreadBs->progRefLevel >= 0) { 782 self->progRefLevel = pThreadBs->progRefLevel; 783 self->prlExpiryCount = 0; /* Got a new value -> Reset counter */ 784 } 785 786 /* SCE, CPE and LFE */ 787 for (ch = 0; ch < validChannels; ch++) { 788 int mapedChannel = channelMapping[ch]; 789 790 if ( ((exclMask & (1<<mapedChannel)) == 0) 791 && ( (drcPayloadType == MPEG_DRC_EXT_DATA) 792 || ((drcPayloadType == DVB_DRC_ANC_DATA) && self->params.applyHeavyCompression) 793 ) ) { 794 /* copy thread to channel */ 795 pAacDecoderStaticChannelInfo[ch]->drcData = pThreadBs->channelData; 796 } 797 } 798 /* CCEs not supported by now */ 799 } 800 801 /* Increment and check expiry counter for the program reference level: */ 802 if ( (pParams->expiryFrame > 0) 803 && (self->prlExpiryCount++ > pParams->expiryFrame) ) 804 { /* The program reference level is too old, so set it back to the target level. */ 805 self->progRefLevel = pParams->targetRefLevel; 806 self->prlExpiryCount = 0; 807 } 808 809 return 0; 810 } 811 812 813 void aacDecoder_drcApply ( 814 HANDLE_AAC_DRC self, 815 void *pSbrDec, 816 CAacDecoderChannelInfo *pAacDecoderChannelInfo, 817 CDrcChannelData *pDrcChData, 818 int ch, /* needed only for SBR */ 819 int aacFrameSize, 820 int bSbrPresent ) 821 { 822 int band, top, bin, numBands; 823 int bottom = 0; 824 int modifyBins = 0; 825 826 FIXP_DBL max_mantissa; 827 INT max_exponent; 828 829 FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.0f); 830 INT norm_exponent = 0; 831 832 FIXP_DBL fact_mantissa[MAX_DRC_BANDS]; 833 INT fact_exponent[MAX_DRC_BANDS]; 834 835 CDrcParams *pParams = &self->params; 836 837 FIXP_DBL *pSpectralCoefficient = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); 838 CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; 839 SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; 840 841 int winSeq = pIcsInfo->WindowSequence; 842 843 /* Increment and check expiry counter */ 844 if ( (pParams->expiryFrame > 0) 845 && (++pDrcChData->expiryCount > pParams->expiryFrame) ) 846 { /* The DRC data is too old, so delete it. */ 847 aacDecoder_drcInitChannelData( pDrcChData ); 848 } 849 850 if (!self->enable) { 851 sbrDecoder_drcDisable( (HANDLE_SBRDECODER)pSbrDec, ch ); 852 return; 853 } 854 855 numBands = pDrcChData->numBands; 856 top = FDKmax(0, numBands-1); 857 858 pDrcChData->bandTop[0] = fixMin(pDrcChData->bandTop[0], (aacFrameSize >> 2) - 1); 859 860 /* If program reference normalization is done in the digital domain, 861 modify factor to perform normalization. prog_ref_level can 862 alternatively be passed to the system for modification of the level in 863 the analog domain. Analog level modification avoids problems with 864 reduced DAC SNR (if signal is attenuated) or clipping (if signal is 865 boosted) */ 866 867 if (self->digitalNorm == 1) 868 { 869 /* 0.5^((targetRefLevel - progRefLevel)/24) */ 870 norm_mantissa = fLdPow( 871 FL2FXCONST_DBL(-1.0), /* log2(0.5) */ 872 0, 873 (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0f/24.0)>>3) * (INT)(pParams->targetRefLevel-self->progRefLevel)), 874 3, 875 &norm_exponent ); 876 } 877 else { 878 norm_mantissa = FL2FXCONST_DBL(0.5f); 879 norm_exponent = 1; 880 } 881 882 883 /* calc scale factors */ 884 for (band = 0; band < numBands; band++) 885 { 886 UCHAR drcVal = pDrcChData->drcValue[band]; 887 top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize); 888 889 fact_mantissa[band] = FL2FXCONST_DBL(0.5f); 890 fact_exponent[band] = 1; 891 892 if ( pParams->applyHeavyCompression 893 && ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == DVB_DRC_ANC_DATA) ) 894 { 895 INT compressionFactorVal_e; 896 int valX, valY; 897 898 valX = drcVal >> 4; 899 valY = drcVal & 0x0F; 900 901 /* calculate the unscaled heavy compression factor. 902 compressionFactor = 48.164 - 6.0206*valX - 0.4014*valY dB 903 range: -48.166 dB to 48.164 dB */ 904 if ( drcVal != 0x7F ) { 905 fact_mantissa[band] = 906 fPowInt( FL2FXCONST_DBL(0.95483867181), /* -0.4014dB = 0.95483867181 */ 907 0, 908 valY, 909 &compressionFactorVal_e ); 910 911 /* -0.0008dB (48.164 - 6.0206*8 = -0.0008) */ 912 fact_mantissa[band] = fMult(FL2FXCONST_DBL(0.99990790084), fact_mantissa[band]); 913 914 fact_exponent[band] = DVB_COMPRESSION_SCALE - valX + compressionFactorVal_e; 915 } 916 } else 917 if ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == MPEG_DRC_EXT_DATA) 918 { 919 /* apply the scaled dynamic range control words to factor. 920 * if scaling drc_cut (or drc_boost), or control word drc_mantissa is 0 921 * then there is no dynamic range compression 922 * 923 * if pDrcChData->drcSgn[band] is 924 * 1 then gain is < 1 : factor = 2^(-self->cut * pDrcChData->drcMag[band] / 24) 925 * 0 then gain is > 1 : factor = 2^( self->boost * pDrcChData->drcMag[band] / 24) 926 */ 927 928 if ((drcVal&0x7F) > 0) { 929 FIXP_DBL tParamVal = (drcVal & 0x80) ? -pParams->cut : pParams->boost; 930 931 fact_mantissa[band] = 932 f2Pow( (FIXP_DBL)((INT)fMult(FL2FXCONST_DBL(1.0f/192.0f), tParamVal) * (drcVal&0x7F)), 933 3+DRC_PARAM_SCALE, 934 &fact_exponent[band] ); 935 } 936 } 937 938 fact_mantissa[band] = fMult(fact_mantissa[band], norm_mantissa); 939 fact_exponent[band] += norm_exponent; 940 941 942 bottom = top; 943 944 } /* end loop over bands */ 945 946 947 /* normalizations */ 948 { 949 int res; 950 951 max_mantissa = FL2FXCONST_DBL(0.0f); 952 max_exponent = 0; 953 for (band = 0; band < numBands; band++) { 954 max_mantissa = fixMax(max_mantissa, fact_mantissa[band]); 955 max_exponent = fixMax(max_exponent, fact_exponent[band]); 956 } 957 958 /* left shift factors to gain accurancy */ 959 res = CntLeadingZeros(max_mantissa) - 1; 960 961 /* above topmost DRC band gain factor is 1 */ 962 if (((pDrcChData->bandTop[numBands-1]+1)<<2) < aacFrameSize) res = 0; 963 964 if (res > 0) { 965 res = fixMin(res, max_exponent); 966 max_exponent -= res; 967 968 for (band = 0; band < numBands; band++) { 969 fact_mantissa[band] <<= res; 970 fact_exponent[band] -= res; 971 } 972 } 973 974 /* normalize magnitudes to one scale factor */ 975 for (band = 0; band < numBands; band++) { 976 if (fact_exponent[band] < max_exponent) { 977 fact_mantissa[band] >>= max_exponent - fact_exponent[band]; 978 } 979 if (fact_mantissa[band] != FL2FXCONST_DBL(0.5f)) { 980 modifyBins = 1; 981 } 982 } 983 if (max_exponent != 1) { 984 modifyBins = 1; 985 } 986 } 987 988 /* apply factor to spectral lines 989 * short blocks must take care that bands fall on 990 * block boundaries! 991 */ 992 if (!bSbrPresent) 993 { 994 bottom = 0; 995 996 if (!modifyBins) { 997 /* We don't have to modify the spectral bins because the fractional part of all factors is 0.5. 998 In order to keep accurancy we don't apply the factor but decrease the exponent instead. */ 999 max_exponent -= 1; 1000 } else 1001 { 1002 for (band = 0; band < numBands; band++) 1003 { 1004 top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize); /* ... * DRC_BAND_MULT; */ 1005 1006 for (bin = bottom; bin < top; bin++) { 1007 pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact_mantissa[band]); 1008 } 1009 1010 bottom = top; 1011 } 1012 } 1013 1014 /* above topmost DRC band gain factor is 1 */ 1015 if (max_exponent > 0) { 1016 for (bin = bottom; bin < aacFrameSize; bin+=1) { 1017 pSpectralCoefficient[bin] >>= max_exponent; 1018 } 1019 } 1020 1021 /* adjust scaling */ 1022 pSpecScale[0] += max_exponent; 1023 1024 if (winSeq == EightShortSequence) { 1025 int win; 1026 for (win = 1; win < 8; win++) { 1027 pSpecScale[win] += max_exponent; 1028 } 1029 } 1030 } 1031 else { 1032 HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec; 1033 UINT numBands = pDrcChData->numBands; 1034 1035 /* feed factors into SBR decoder for application in QMF domain. */ 1036 sbrDecoder_drcFeedChannel ( 1037 hSbrDecoder, 1038 ch, 1039 numBands, 1040 fact_mantissa, 1041 max_exponent, 1042 pDrcChData->drcInterpolationScheme, 1043 winSeq, 1044 pDrcChData->bandTop 1045 ); 1046 } 1047 1048 return; 1049 } 1050 1051 1052 /* 1053 * Prepare DRC processing 1054 */ 1055 int aacDecoder_drcProlog ( 1056 HANDLE_AAC_DRC self, 1057 HANDLE_FDK_BITSTREAM hBs, 1058 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], 1059 UCHAR pceInstanceTag, 1060 UCHAR channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */ 1061 int validChannels ) 1062 { 1063 int err = 0; 1064 1065 if (self == NULL) { 1066 return -1; 1067 } 1068 1069 if (!self->params.bsDelayEnable) 1070 { 1071 err = aacDecoder_drcExtractAndMap ( 1072 self, 1073 hBs, 1074 pAacDecoderStaticChannelInfo, 1075 pceInstanceTag, 1076 channelMapping, 1077 validChannels ); 1078 } 1079 1080 return err; 1081 } 1082 1083 1084 /* 1085 * Finalize DRC processing 1086 */ 1087 int aacDecoder_drcEpilog ( 1088 HANDLE_AAC_DRC self, 1089 HANDLE_FDK_BITSTREAM hBs, 1090 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], 1091 UCHAR pceInstanceTag, 1092 UCHAR channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */ 1093 int validChannels ) 1094 { 1095 int err = 0; 1096 1097 if (self == NULL) { 1098 return -1; 1099 } 1100 1101 if (self->params.bsDelayEnable) 1102 { 1103 err = aacDecoder_drcExtractAndMap ( 1104 self, 1105 hBs, 1106 pAacDecoderStaticChannelInfo, 1107 pceInstanceTag, 1108 channelMapping, 1109 validChannels ); 1110 } 1111 1112 return err; 1113 } 1114 1115