1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /* 19 20 Pathname: ./src/get_audio_specific_config.c 21 22 ------------------------------------------------------------------------------ 23 REVISION HISTORY 24 25 Description: Modified per review comments 26 27 Description: Modified per second review comments 28 (1) change audioObjectType to Int 29 (2) do not set pVars->prog_config.profile 30 (3) clean up status flag, default to SUCCESS 31 (4) fix multiple lines comments 32 33 Description: Change getbits.h to ibstream.h 34 35 Description: Modified per review comments 36 (1) updated revision history 37 (2) declare audioObjectType as enum type 38 39 Description: Replace some instances of getbits to get9_n_lessbits 40 when the number of bits read is 9 or less. 41 42 Description: Added support for backward and non-backward (explicit) 43 mode for Parametric Stereo (PS) used in enhanced AAC+ 44 45 Who: Date: 46 Description: 47 48 ------------------------------------------------------------------------------ 49 INPUT AND OUTPUT DEFINITIONS 50 51 Inputs: 52 pVars = pointer to the structure that holds all information for 53 this instance of the library. pVars->prog_config is directly 54 used, and pVars->mc_info, pVars->prog_config, 55 pVars->pWinSeqInfo, pVars->SFBWidth128 are needed indirectly 56 for calling set_mc_info. Data type pointer to tDec_Int_File 57 58 Local Stores/Buffers/Pointers Needed: 59 None 60 61 Global Stores/Buffers/Pointers Needed: 62 None 63 64 Outputs: 65 status = 0 if successfully decoded AudioSpecificConfig 66 1 if un-supported config is used for this release 67 68 Pointers and Buffers Modified: 69 pVars->prog_config contents are updated with the information read in. 70 pVars->mc_info contents are updated with channel information. 71 pVars->pWinSeqInfo contents are updated with window information. 72 pVars->SFBWidth128 contents are updated with scale factor band width data. 73 74 Local Stores Modified: 75 None 76 77 Global Stores Modified: 78 None 79 80 ------------------------------------------------------------------------------ 81 FUNCTION DESCRIPTION 82 83 This function reads the bitstream for the structure "AudioSpecificConfig", 84 and sets the decoder configuration that is needed by the decoder to be able 85 to decode the media properly. 86 87 ------------------------------------------------------------------------------ 88 REQUIREMENTS 89 90 This function shall not use global variables 91 92 ------------------------------------------------------------------------------ 93 REFERENCES 94 95 (1) ISO/IEC 14496-3: 1999(E) 96 Part 3 97 Subpart 1 p18 1.6 Interface to MPEG-4 Systems 98 Subpart 4 p13 4.4.1 GA Specific Configuration 99 Amendment p10 6.2.1 AudioSpecificInfo 100 Amendment p78 8.2 Decoder configuration (GASpecificConfig) 101 102 (2) AAC DecoderSpecificInfo Information 103 PacketVideo descriptions - San Diego 104 105 ------------------------------------------------------------------------------ 106 PSEUDO-CODE 107 108 status = SUCCESS; 109 110 pInputStream = &(pVars->inputStream); 111 112 temp = CALL getbits( 113 neededBits = LEN_OBJ_TYPE + LEN_SAMP_RATE_IDX, 114 pInputStream = pInputStream) 115 MODIFYING (pInputStream) 116 RETURNING (temp) 117 118 audioObjectType = (temp & 0x1f0) >> 4; 119 120 pVars->prog_config.profile = audioObjectType; 121 122 pVars->prog_config.sampling_rate_idx = temp & 0xf; 123 124 IF (pVars->prog_config.sampling_rate_idx == 0xf) 125 THEN 126 sampling_rate = CALL getbits( 127 neededBits = LEN_SAMP_RATE, 128 pInputStream = pInputStream); 129 MODIFYING (pInputStream) 130 RETURNING (sampling_rate) 131 ENDIF 132 133 channel_config = CALL getbits( 134 neededBits = LEN_CHAN_CONFIG, 135 pInputStream = pInputStream); 136 MODIFYING (pInputStream) 137 RETURNING (channel_config) 138 139 IF (channel_config > 2) 140 THEN 141 status = 1; 142 ENDIF 143 144 IF (((audioObjectType == MP4AUDIO_AAC_MAIN) OR 145 (audioObjectType == MP4AUDIO_AAC_LC) OR 146 (audioObjectType == MP4AUDIO_AAC_SSR) OR 147 (audioObjectType == MP4AUDIO_LTP) OR 148 (audioObjectType == MP4AUDIO_AAC_SCALABLE) OR 149 (audioObjectType == MP4AUDIO_TWINVQ)) AND (status == -1)) 150 THEN 151 status = CALL get_GA_specific_config( 152 pVars = pVars, 153 channel_config = channel_config, 154 audioObjectType = audioObjectType, 155 pInputStream = pInputStream); 156 MODIFYING (pVars->mc_info,channel_config,pInputStream) 157 RETURNING (status) 158 159 ENDIF 160 161 IF (audioObjectType == MP4AUDIO_CELP) 162 THEN 163 status = 1; 164 ENDIF 165 166 IF (audioObjectType == MP4AUDIO_HVXC) 167 THEN 168 status = 1; 169 ENDIF 170 171 IF (audioObjectType == MP4AUDIO_TTSI) 172 THEN 173 status = 1; 174 ENDIF 175 176 IF ((audioObjectType == 13) OR (audioObjectType == 14) OR 177 (audioObjectType == 15) OR (audioObjectType == 16)) 178 THEN 179 status = 1; 180 ENDIF 181 182 IF (((audioObjectType == MP4AUDIO_ER_AAC_LC) OR 183 (audioObjectType == MP4AUDIO_ER_AAC_LTP) OR 184 (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) OR 185 (audioObjectType == MP4AUDIO_ER_TWINVQ) OR 186 (audioObjectType == MP4AUDIO_ER_BSAC) OR 187 (audioObjectType == MP4AUDIO_ER_AAC_LD)) AND (status == -1)) 188 THEN 189 status = 1; 190 ENDIF 191 192 IF (audioObjectType == MP4AUDIO_ER_CELP) 193 THEN 194 status = 1; 195 ENDIF 196 197 IF (audioObjectType == MP4AUDIO_ER_HVXC) 198 THEN 199 status = 1; 200 ENDIF 201 202 IF ((audioObjectType == MP4AUDIO_ER_HILN) OR 203 (audioObjectType == MP4AUDIO_PARAMETRIC)) 204 THEN 205 status = 1; 206 ENDIF 207 208 IF ((audioObjectType == MP4AUDIO_ER_AAC_LC) OR 209 (audioObjectType == MP4AUDIO_ER_AAC_LTP) OR 210 (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) OR 211 (audioObjectType == MP4AUDIO_ER_TWINVQ) OR 212 (audioObjectType == MP4AUDIO_ER_BSAC) OR 213 (audioObjectType == MP4AUDIO_ER_AAC_LD) OR 214 (audioObjectType == MP4AUDIO_ER_CELP) OR 215 (audioObjectType == MP4AUDIO_ER_HVXC) OR 216 (audioObjectType == MP4AUDIO_ER_HILN) OR 217 (audioObjectType == MP4AUDIO_PARAMETRIC)) 218 THEN 219 epConfig = CALL getbits( 220 neededBits = LEN_EP_CONFIG, 221 pInputStream = pInputStream); 222 MODIFYING (pInputStream) 223 RETURNING (epConfig) 224 225 IF (epConfig == 2) 226 THEN 227 status = 1; 228 ENDIF 229 230 ENDIF 231 232 RETURN status; 233 234 ------------------------------------------------------------------------------ 235 RESOURCES USED 236 When the code is written for a specific target processor the 237 the resources used should be documented below. 238 239 STACK USAGE: [stack count for this module] + [variable to represent 240 stack usage for each subroutine called] 241 242 where: [stack usage variable] = stack usage for [subroutine 243 name] (see [filename].ext) 244 245 DATA MEMORY USED: x words 246 247 PROGRAM MEMORY USED: x words 248 249 CLOCK CYCLES: [cycle count equation for this module] + [variable 250 used to represent cycle count for each subroutine 251 called] 252 253 where: [cycle count variable] = cycle count for [subroutine 254 name] (see [filename].ext) 255 256 ------------------------------------------------------------------------------ 257 */ 258 259 260 /*---------------------------------------------------------------------------- 261 ; INCLUDES 262 ----------------------------------------------------------------------------*/ 263 #include "pv_audio_type_defs.h" 264 #include "e_mp4ff_const.h" 265 #include "e_tmp4audioobjecttype.h" 266 #include "get_audio_specific_config.h" 267 #include "get_ga_specific_config.h" 268 #include "ibstream.h" 269 #include "sfb.h" /* Where samp_rate_info[] is declared */ 270 271 /*---------------------------------------------------------------------------- 272 ; MACROS 273 ; Define module specific macros here 274 ----------------------------------------------------------------------------*/ 275 276 277 /*---------------------------------------------------------------------------- 278 ; DEFINES 279 ; Include all pre-processor statements here. Include conditional 280 ; compile variables also. 281 ----------------------------------------------------------------------------*/ 282 283 /*---------------------------------------------------------------------------- 284 ; LOCAL FUNCTION DEFINITIONS 285 ; Function Prototype declaration 286 ----------------------------------------------------------------------------*/ 287 288 /*---------------------------------------------------------------------------- 289 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 290 ; Variable declaration - defined here and used outside this module 291 ----------------------------------------------------------------------------*/ 292 293 /*---------------------------------------------------------------------------- 294 ; EXTERNAL FUNCTION REFERENCES 295 ; Declare functions defined elsewhere and referenced in this module 296 ----------------------------------------------------------------------------*/ 297 298 /*---------------------------------------------------------------------------- 299 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 300 ; Declare variables used in this module but defined elsewhere 301 ----------------------------------------------------------------------------*/ 302 303 /*---------------------------------------------------------------------------- 304 ; FUNCTION CODE 305 ----------------------------------------------------------------------------*/ 306 Int get_audio_specific_config(tDec_Int_File * const pVars) 307 { 308 309 UInt temp; 310 tMP4AudioObjectType audioObjectType; 311 //UInt32 sampling_rate; 312 UInt channel_config; 313 UInt syncExtensionType; 314 UInt extensionAudioObjectType = 0; 315 UInt extensionSamplingFrequencyIndex = 0; 316 BITS *pInputStream; 317 Int status; 318 319 status = SUCCESS; 320 321 pInputStream = &(pVars->inputStream); 322 323 pVars->mc_info.upsamplingFactor = 1; /* default to regular AAC */ 324 325 temp = get9_n_lessbits(LEN_OBJ_TYPE + LEN_SAMP_RATE_IDX, 326 pInputStream); 327 328 /* 329 * The following code can directly set the values of elements in 330 * MC_Info, rather than first setting the values in pVars->prog_config 331 * and then copy these values to MC_Info by calling set_mc_info. 332 * In order to keep consistent with get_prog_config (ADIF) and 333 * get_adts_header (ADTS), the code here is still copying 334 * the info, and set the pVars->current_program = 0 335 */ 336 337 /* AudioObjectType */ 338 audioObjectType = (tMP4AudioObjectType)((temp & 0x1f0) >> 4); 339 340 pVars->mc_info.ExtendedAudioObjectType = audioObjectType; /* default */ 341 /* saving an audioObjectType into a profile field */ 342 /* pVars->prog_config.profile = audioObjectType; */ 343 344 /* sampling rate index */ 345 pVars->prog_config.sampling_rate_idx = temp & 0xf; 346 347 if (pVars->prog_config.sampling_rate_idx > 0xb) 348 { 349 /* 350 * Only support 12 sampling frequencies from array samp_rate_info ( see sfb.cpp) 351 * 7350 Hz (index 0xc) is not supported, the other indexes are reserved or escape 352 */ 353 if (pVars->prog_config.sampling_rate_idx == 0xf) /* escape sequence */ 354 { 355 /* 356 * sampling rate not listed in Table 1.6.2, 357 * this release does not support this 358 */ 359 /*sampling_rate = getbits( LEN_SAMP_RATE, 360 pInputStream);*/ 361 getbits(LEN_SAMP_RATE, pInputStream); /* future use */ 362 } 363 364 status = 1; 365 } 366 367 channel_config = get9_n_lessbits(LEN_CHAN_CONFIG, 368 pInputStream); 369 370 if ((channel_config > 2) && (!pVars->aacConfigUtilityEnabled)) 371 { 372 /* 373 * AAC lib does not support more than two channels 374 * signal error when in decoder mode 375 * do not test when in utility mode 376 */ 377 status = 1; 378 379 } 380 381 if (audioObjectType == MP4AUDIO_SBR || audioObjectType == MP4AUDIO_PS) 382 { 383 /* to disable explicit backward compatiblity check */ 384 pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_SBR; 385 pVars->mc_info.sbrPresentFlag = 1; 386 387 if (audioObjectType == MP4AUDIO_PS) 388 { 389 pVars->mc_info.psPresentFlag = 1; 390 pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_PS; 391 } 392 393 extensionSamplingFrequencyIndex = /* extensionSamplingFrequencyIndex */ 394 get9_n_lessbits(LEN_SAMP_RATE_IDX, 395 pInputStream); 396 if (extensionSamplingFrequencyIndex == 0x0f) 397 { 398 /* 399 * sampling rate not listed in Table 1.6.2, 400 * this release does not support this 401 */ 402 /*sampling_rate = getbits( LEN_SAMP_RATE, 403 pInputStream);*/ 404 getbits(LEN_SAMP_RATE, pInputStream); 405 } 406 407 audioObjectType = (tMP4AudioObjectType) get9_n_lessbits(LEN_OBJ_TYPE , 408 pInputStream); 409 } 410 411 412 if ((/*(audioObjectType == MP4AUDIO_AAC_MAIN) ||*/ 413 (audioObjectType == MP4AUDIO_AAC_LC) || 414 /*(audioObjectType == MP4AUDIO_AAC_SSR) ||*/ 415 (audioObjectType == MP4AUDIO_LTP) /*||*/ 416 /*(audioObjectType == MP4AUDIO_AAC_SCALABLE) ||*/ 417 /*(audioObjectType == MP4AUDIO_TWINVQ)*/) && (status == SUCCESS)) 418 { 419 status = get_GA_specific_config(pVars, 420 pInputStream, 421 channel_config, 422 audioObjectType); 423 424 /* 425 * verify that Program config returned a supported audio object type 426 */ 427 428 if ((pVars->mc_info.audioObjectType != MP4AUDIO_AAC_LC) && 429 (pVars->mc_info.audioObjectType != MP4AUDIO_LTP)) 430 { 431 return 1; /* status != SUCCESS invalid aot */ 432 } 433 } 434 else 435 { 436 return 1; /* status != SUCCESS invalid aot or invalid parameter */ 437 } 438 439 /* 440 * SBR tool explicit signaling ( backward compatible ) 441 */ 442 if (extensionAudioObjectType != MP4AUDIO_SBR) 443 { 444 syncExtensionType = (UInt)get17_n_lessbits(LEN_SYNC_EXTENSION_TYPE, 445 pInputStream); 446 447 if (syncExtensionType == 0x2b7) 448 { 449 extensionAudioObjectType = get9_n_lessbits( /* extensionAudioObjectType */ 450 LEN_OBJ_TYPE, 451 pInputStream); 452 453 if (extensionAudioObjectType == MP4AUDIO_SBR) 454 { 455 pVars->mc_info.sbrPresentFlag = get1bits(pInputStream); /* sbrPresentFlag */ 456 if (pVars->mc_info.sbrPresentFlag == 1) 457 { 458 extensionSamplingFrequencyIndex = 459 get9_n_lessbits( /* extensionSamplingFrequencyIndex */ 460 LEN_SAMP_RATE_IDX, 461 pInputStream); 462 if (pVars->aacPlusEnabled == true) 463 { 464 #ifdef AAC_PLUS 465 pVars->mc_info.upsamplingFactor = (samp_rate_info[extensionSamplingFrequencyIndex].samp_rate >> 1) == 466 samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate ? 2 : 1; 467 468 if ((Int)extensionSamplingFrequencyIndex == pVars->prog_config.sampling_rate_idx) 469 { 470 /* 471 * Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz 472 */ 473 if (pVars->prog_config.sampling_rate_idx < 6) 474 { 475 pVars->aacPlusEnabled = false; 476 } 477 478 pVars->mc_info.bDownSampledSbr = true; 479 } 480 pVars->prog_config.sampling_rate_idx = extensionSamplingFrequencyIndex; 481 482 #endif 483 } 484 485 if (extensionSamplingFrequencyIndex == 0x0f) 486 { 487 /* 488 * sampling rate not listed in Table 1.6.2, 489 * this release does not support this 490 */ 491 /*sampling_rate = getbits( LEN_SAMP_RATE, 492 pInputStream);*/ 493 getbits(LEN_SAMP_RATE, pInputStream); 494 } 495 /* syncExtensionType */ 496 syncExtensionType = (UInt)get17_n_lessbits(LEN_SYNC_EXTENSION_TYPE, 497 pInputStream); 498 if (syncExtensionType == 0x548) 499 { 500 pVars->mc_info.psPresentFlag = get1bits(pInputStream); /* psPresentFlag */ 501 if (pVars->mc_info.psPresentFlag) 502 { 503 extensionAudioObjectType = MP4AUDIO_PS; 504 } 505 } 506 else 507 { 508 /* 509 * Rewind bitstream pointer so that the syncExtensionType reading has no 510 * effect when decoding raw bitstream 511 */ 512 pVars->inputStream.usedBits -= LEN_SYNC_EXTENSION_TYPE; 513 } 514 515 pVars->mc_info.ExtendedAudioObjectType = (eMP4AudioObjectType)extensionAudioObjectType; 516 } 517 } 518 } 519 else if (!status) 520 { 521 /* 522 * Rewind bitstream pointer so that the syncExtensionType reading has no 523 * effect when decoding raw bitstream 524 */ 525 pVars->inputStream.usedBits -= LEN_SYNC_EXTENSION_TYPE; 526 527 #ifdef AAC_PLUS 528 529 /* 530 * For implicit signalling, no hint that sbr or ps is used, so we need to 531 * check the sampling frequency of the aac content, if lesser or equal to 532 * 24 KHz, by defualt upsample, otherwise, do nothing 533 */ 534 if ((pVars->prog_config.sampling_rate_idx >= 6) && (pVars->aacPlusEnabled == true) && 535 audioObjectType == MP4AUDIO_AAC_LC) 536 { 537 pVars->mc_info.upsamplingFactor = 2; 538 pVars->prog_config.sampling_rate_idx -= 3; 539 pVars->mc_info.sbrPresentFlag = 1; 540 pVars->sbrDecoderData.SbrChannel[0].syncState = SBR_NOT_INITIALIZED; 541 pVars->sbrDecoderData.SbrChannel[1].syncState = SBR_NOT_INITIALIZED; 542 543 } 544 #endif 545 546 } 547 } 548 else /* MP4AUDIO_SBR was detected */ 549 { 550 /* 551 * Set the real output frequency use by the SBR tool, define tentative upsample ratio 552 */ 553 if (pVars->aacPlusEnabled == true) 554 { 555 #ifdef AAC_PLUS 556 pVars->mc_info.upsamplingFactor = (samp_rate_info[extensionSamplingFrequencyIndex].samp_rate >> 1) == 557 samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate ? 2 : 1; 558 559 if ((Int)extensionSamplingFrequencyIndex == pVars->prog_config.sampling_rate_idx) 560 { 561 /* 562 * Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz 563 */ 564 if (pVars->prog_config.sampling_rate_idx < 6) 565 { 566 pVars->aacPlusEnabled = false; 567 } 568 pVars->mc_info.bDownSampledSbr = true; 569 } 570 pVars->prog_config.sampling_rate_idx = extensionSamplingFrequencyIndex; 571 572 573 574 #endif 575 576 577 578 579 } 580 581 } /* if ( extensionAudioObjectType != MP4AUDIO_SBR ) */ 582 583 /* 584 * The following object types are not supported in this release, 585 * however, keep these interfaces for future implementation 586 */ 587 588 /* 589 *if (audioObjectType == MP4AUDIO_CELP) 590 *{ 591 * status = 1; 592 *} 593 */ 594 595 /* 596 *if (audioObjectType == MP4AUDIO_HVXC) 597 *{ 598 * status = 1; 599 *} 600 */ 601 602 /* 603 *if (audioObjectType == MP4AUDIO_TTSI) 604 *{ 605 * status = 1; 606 *} 607 */ 608 609 /* 610 *if ((audioObjectType == 13) || (audioObjectType == 14) || 611 * (audioObjectType == 15) || (audioObjectType == 16)) 612 *{ 613 * status = 1; 614 *} 615 */ 616 617 /* The following objects are Amendment 1 objects */ 618 /* 619 *if (((audioObjectType == MP4AUDIO_ER_AAC_LC) || 620 * (audioObjectType == MP4AUDIO_ER_AAC_LTP) || 621 * (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) || 622 * (audioObjectType == MP4AUDIO_ER_TWINVQ) || 623 * (audioObjectType == MP4AUDIO_ER_BSAC) || 624 * (audioObjectType == MP4AUDIO_ER_AAC_LD)) && (status == -1)) 625 *{ 626 */ 627 /* 628 * should call get_GA_specific_config 629 * for this release, do not support Error Resilience 630 * temporary solution is set status flag and exit decoding 631 */ 632 /* status = 1; 633 *} 634 */ 635 636 /* 637 *if (audioObjectType == MP4AUDIO_ER_CELP) 638 * { 639 * status = 1; 640 *} 641 */ 642 643 /* 644 *if (audioObjectType == MP4AUDIO_ER_HVXC) 645 *{ 646 * status = 1; 647 *} 648 */ 649 650 /* 651 *if ((audioObjectType == MP4AUDIO_ER_HILN) || 652 * (audioObjectType == MP4AUDIO_PARAMETRIC)) 653 *{ 654 * status = 1; 655 *} 656 */ 657 658 /* 659 *if ((audioObjectType == MP4AUDIO_ER_AAC_LC) || 660 * (audioObjectType == MP4AUDIO_ER_AAC_LTP) || 661 * (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) || 662 * (audioObjectType == MP4AUDIO_ER_TWINVQ) || 663 * (audioObjectType == MP4AUDIO_ER_BSAC) || 664 * (audioObjectType == MP4AUDIO_ER_AAC_LD) || 665 * (audioObjectType == MP4AUDIO_ER_CELP) || 666 * (audioObjectType == MP4AUDIO_ER_HVXC) || 667 * (audioObjectType == MP4AUDIO_ER_HILN) || 668 * (audioObjectType == MP4AUDIO_PARAMETRIC)) 669 *{ 670 */ 671 /* error protection config */ 672 /* 673 * epConfig = 674 * getbits( 675 * LEN_EP_CONFIG, 676 * pInputStream); 677 * 678 * if (epConfig == 2) 679 * { 680 */ 681 /* should call ErrorProtectionSpecificConfig() */ 682 /* 683 * status = 1; 684 * } 685 * 686 *} 687 */ 688 689 return status; 690 691 } 692