1 /* 2 * Copyright 2011 castLabs, Berlin 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 express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.googlecode.mp4parser.boxes.mp4.objectdescriptors; 17 18 import com.coremedia.iso.Hex; 19 import com.coremedia.iso.IsoTypeWriter; 20 21 import java.io.IOException; 22 import java.nio.ByteBuffer; 23 import java.util.Arrays; 24 import java.util.HashMap; 25 import java.util.Map; 26 27 28 // 29 //GetAudioObjectType() 30 //{ 31 //audioObjectType; 5 uimsbf 32 //if (audioObjectType == 31) { 33 //audioObjectType = 32 + audioObjectTypeExt; 6 uimsbf 34 //} 35 //return audioObjectType; 36 //} 37 //AudioSpecificConfig () 38 //{ 39 //audioObjectType = GetAudioObjectType(); 40 //samplingFrequencyIndex; 4 bslbf 41 //if ( samplingFrequencyIndex == 0xf ) { 42 //samplingFrequency; 24 uimsbf 43 //} 44 //channelConfiguration; 4 bslbf 45 //sbrPresentFlag = -1; 46 //psPresentFlag = -1; 47 //if ( audioObjectType == 5 || 48 //audioObjectType == 29 ) { 49 //extensionAudioObjectType = 5; 50 //sbrPresentFlag = 1; 51 //if ( audioObjectType == 29 ) { 52 //psPresentFlag = 1; 53 //} 54 //extensionSamplingFrequencyIndex; 4 uimsbf 55 //if ( extensionSamplingFrequencyIndex == 0xf ) 56 //extensionSamplingFrequency; 24 uimsbf 57 //audioObjectType = GetAudioObjectType(); 58 //if ( audioObjectType == 22 ) 59 //extensionChannelConfiguration; 4 uimsbf 60 //} 61 //else { 62 //extensionAudioObjectType = 0; 63 //} 64 //switch (audioObjectType) { 65 //case 1: 66 //case 2: 67 //case 3: 68 //case 4: 69 //case 6: 70 //case 7: 71 //case 17: 72 //case 19: 73 //case 20: 74 //case 21: 75 //case 22: 76 //case 23: 77 //GASpecificConfig(); 78 //break: 79 //case 8: 80 //CelpSpecificConfig(); 81 //break; 82 //case 9: 83 //HvxcSpecificConfig(); 84 //break: 85 //case 12: 86 //TTSSpecificConfig(); 87 //break; 88 //case 13: 89 //case 14: 90 //case 15: 91 //case 16: 92 //StructuredAudioSpecificConfig(); 93 //break; 94 //case 24: 95 //ErrorResilientCelpSpecificConfig(); 96 //break; 97 //case 25: 98 //ErrorResilientHvxcSpecificConfig(); 99 //break; 100 //case 26: 101 //case 27: 102 //ParametricSpecificConfig(); 103 //break; 104 // case 28: 105 //SSCSpecificConfig(); 106 //break; 107 //case 30: 108 //sacPayloadEmbedding; 1 uimsbf 109 //SpatialSpecificConfig(); 110 //break; 111 //case 32: 112 //case 33: 113 //case 34: 114 //MPEG_1_2_SpecificConfig(); 115 //break; 116 //case 35: 117 //DSTSpecificConfig(); 118 //break; 119 //case 36: 120 //fillBits; 5 bslbf 121 //ALSSpecificConfig(); 122 //break; 123 //case 37: 124 //case 38: 125 //SLSSpecificConfig(); 126 //break; 127 //case 39: 128 //ELDSpecificConfig(channelConfiguration); 129 //break: 130 //case 40: 131 //case 41: 132 //SymbolicMusicSpecificConfig(); 133 //break; 134 //default: 135 ///* reserved */ 136 //} 137 //switch (audioObjectType) { 138 //case 17: 139 //case 19: 140 //case 20: 141 //case 21: 142 //case 22: 143 //case 23: 144 //case 24: 145 //case 25: 146 //case 26: 147 //case 27: 148 //case 39: 149 //epConfig; 2 bslbf 150 //if ( epConfig == 2 || epConfig == 3 ) { 151 //ErrorProtectionSpecificConfig(); 152 //} 153 //if ( epConfig == 3 ) { 154 //directMapping; 1 bslbf 155 //if ( ! directMapping ) { 156 ///* tbd */ 157 //} 158 //} 159 //} 160 //if ( extensionAudioObjectType != 5 && bits_to_decode() >= 16 ) { 161 //syncExtensionType; 11 bslbf 162 //if (syncExtensionType == 0x2b7) { 163 // extensionAudioObjectType = GetAudioObjectType(); 164 //if ( extensionAudioObjectType == 5 ) { 165 //sbrPresentFlag; 1 uimsbf 166 //if (sbrPresentFlag == 1) { 167 //extensionSamplingFrequencyIndex; 4 uimsbf 168 //if ( extensionSamplingFrequencyIndex == 0xf ) { 169 //extensionSamplingFrequency; 24 uimsbf 170 //} 171 //if ( bits_to_decode() >= 12 ) { 172 //syncExtensionType; 11 bslbf 173 //if (syncExtesionType == 0x548) { 174 //psPresentFlag; 1 uimsbf 175 //} 176 //} 177 //} 178 //} 179 //if ( extensionAudioObjectType == 22 ) { 180 //sbrPresentFlag; 1 uimsbf 181 //if (sbrPresentFlag == 1) { 182 //extensionSamplingFrequencyIndex; 4 uimsbf 183 //if ( extensionSamplingFrequencyIndex == 0xf ) { 184 //extensionSamplingFrequency; 24 uimsbf 185 //} 186 //} 187 //extensionChannelConfiguration; 4 uimsbf 188 //} 189 //} 190 //} 191 //} 192 // } 193 // 194 // TFCodingType 195 //0x0 AAC scaleable 196 //0x1 BSAC 197 //0x2 TwinVQ 198 //0x3 AAC non scaleable (i.e. multichannel) 199 // 200 // class TFSpecificConfig( uint(4) samplingFrequencyIndex, uint(4) channelConfiguration ) { 201 //uint(2) TFCodingType; 202 //uint(1) frameLength; 203 //uint(1) dependsOnCoreCoder; 204 //if (dependsOnCoreCoder == 1){ 205 //uint(14)coreCoderDelay 206 //} 207 //if (TFCodingType==BSAC) { 208 //uint(11) lslayer_length 209 //} 210 //uint (1) extensionFlag; 211 //if (channelConfiguration == 0 ){ 212 //program_config_element(); 213 //} 214 //if (extensionFlag==1){ 215 //<to be defined in mpeg4 phase 2> 216 //} 217 //} 218 // 219 //program_config_element() 220 //{ 221 //element_instance_tag 4 uimsbf 222 //profile 2 uimsbf 223 //sampling_frequency_index 4 uimsbf 224 //num_front_channel_elements 4 uimsbf 225 //num_side_channel_elements 4 uimsbf 226 //num_back_channel_elements 4 uimsbf 227 // num_lfe_channel_elements 2 uimsbf 228 //num_assoc_data_elements 3 uimsbf 229 //num_valid_cc_elements 4 uimsbf 230 //mono_mixdown_present 1 uimsbf 231 //if ( mono_mixdown_present == 1 ) 232 //mono_mixdown_element_number 4 uimsbf 233 //stereo_mixdown_present 1 uimsbf 234 //if ( stereo_mixdown_present == 1 ) 235 //stereo_mixdown_element_number 4 uimsbf 236 //matrix_mixdown_idx_present 1 uimsbf 237 //if ( matrix_mixdown_idx_present == 1 ) { 238 //matrix_mixdown_idx 2 uimsbf 239 //pseudo_surround_enable 1 uimsbf 240 //} 241 //for ( i = 0; i < num_front_channel_elements; i++) { 242 //front_element_is_cpe[i]; 1 bslbf 243 //front_element_tag_select[i]; 4 uimsbf 244 //} 245 //for ( i = 0; i < num_side_channel_elements; i++) { 246 //side_element_is_cpe[i]; 1 bslbf 247 //side_element_tag_select[i]; 4 uimsbf 248 //} 249 //for ( i = 0; i < num_back_channel_elements; i++) { 250 //back_element_is_cpe[i]; 1 bslbf 251 //back_element_tag_select[i]; 4 uimsbf 252 //} 253 //for ( i = 0; i < num_lfe_channel_elements; i++) 254 //lfe_element_tag_select[i]; 4 uimsbf 255 //for ( i = 0; i < num_assoc_data_elements; i++) 256 //assoc_data_element_tag_select[i]; 4 uimsbf 257 //for ( i = 0; i < num_valid_cc_elements; i++) { 258 //cc_element_is_ind_sw[i]; 1 uimsbf 259 //valid_cc_element_tag_select[i]; 4 uimsbf 260 //} 261 //byte_alignment() 262 //comment_field_bytes 8 uimsbf 263 //for ( i = 0; i < comment_field_bytes; i++) 264 //comment_field_data[i]; 8 uimsbf 265 //} 266 267 @Descriptor(tags = 0x5, objectTypeIndication = 0x40) 268 public class AudioSpecificConfig extends BaseDescriptor { 269 byte[] configBytes; 270 271 public static Map<Integer, Integer> samplingFrequencyIndexMap = new HashMap<Integer, Integer>(); 272 public static Map<Integer, String> audioObjectTypeMap = new HashMap<Integer, String>(); 273 int audioObjectType; 274 int samplingFrequencyIndex; 275 int samplingFrequency; 276 int channelConfiguration; 277 int extensionAudioObjectType; 278 int sbrPresentFlag; 279 int psPresentFlag; 280 int extensionSamplingFrequencyIndex; 281 int extensionSamplingFrequency; 282 int extensionChannelConfiguration; 283 int sacPayloadEmbedding; 284 int fillBits; 285 int epConfig; 286 int directMapping; 287 int syncExtensionType; 288 289 //GASpecificConfig 290 int frameLengthFlag; 291 int dependsOnCoreCoder; 292 int coreCoderDelay; 293 int extensionFlag; 294 int layerNr; 295 int numOfSubFrame; 296 int layer_length; 297 int aacSectionDataResilienceFlag; 298 int aacScalefactorDataResilienceFlag; 299 int aacSpectralDataResilienceFlag; 300 int extensionFlag3; 301 boolean gaSpecificConfig; 302 303 //ParametricSpecificConfig 304 int isBaseLayer; 305 int paraMode; 306 int paraExtensionFlag; 307 int hvxcVarMode; 308 int hvxcRateMode; 309 int erHvxcExtensionFlag; 310 int var_ScalableFlag; 311 int hilnQuantMode; 312 int hilnMaxNumLine; 313 int hilnSampleRateCode; 314 int hilnFrameLength; 315 int hilnContMode; 316 int hilnEnhaLayer; 317 int hilnEnhaQuantMode; 318 boolean parametricSpecificConfig; 319 320 @Override 321 public void parseDetail(ByteBuffer bb) throws IOException { 322 ByteBuffer configBytes = bb.slice(); 323 configBytes.limit(sizeOfInstance); 324 bb.position(bb.position() + sizeOfInstance); 325 326 //copy original bytes to internal array for constructing codec config strings (todo until writing of the config is supported) 327 this.configBytes = new byte[sizeOfInstance]; 328 configBytes.get(this.configBytes); 329 configBytes.rewind(); 330 331 BitReaderBuffer bitReaderBuffer = new BitReaderBuffer(configBytes); 332 audioObjectType = getAudioObjectType(bitReaderBuffer); 333 samplingFrequencyIndex = bitReaderBuffer.readBits(4); 334 335 if (samplingFrequencyIndex == 0xf) { 336 samplingFrequency = bitReaderBuffer.readBits(24); 337 } 338 339 channelConfiguration = bitReaderBuffer.readBits(4); 340 341 if (audioObjectType == 5 || 342 audioObjectType == 29) { 343 extensionAudioObjectType = 5; 344 sbrPresentFlag = 1; 345 if (audioObjectType == 29) { 346 psPresentFlag = 1; 347 } 348 extensionSamplingFrequencyIndex = bitReaderBuffer.readBits(4); 349 if (extensionSamplingFrequencyIndex == 0xf) 350 extensionSamplingFrequency = bitReaderBuffer.readBits(24); 351 audioObjectType = getAudioObjectType(bitReaderBuffer); 352 if (audioObjectType == 22) 353 extensionChannelConfiguration = bitReaderBuffer.readBits(4); 354 } else { 355 extensionAudioObjectType = 0; 356 } 357 358 switch (audioObjectType) { 359 case 1: 360 case 2: 361 case 3: 362 case 4: 363 case 6: 364 case 7: 365 case 17: 366 case 19: 367 case 20: 368 case 21: 369 case 22: 370 case 23: 371 parseGaSpecificConfig(samplingFrequencyIndex, channelConfiguration, audioObjectType, bitReaderBuffer); 372 //GASpecificConfig(); 373 break; 374 case 8: 375 throw new UnsupportedOperationException("can't parse CelpSpecificConfig yet"); 376 //CelpSpecificConfig(); 377 //break; 378 case 9: 379 throw new UnsupportedOperationException("can't parse HvxcSpecificConfig yet"); 380 //HvxcSpecificConfig(); 381 //break; 382 case 12: 383 throw new UnsupportedOperationException("can't parse TTSSpecificConfig yet"); 384 //TTSSpecificConfig(); 385 //break; 386 case 13: 387 case 14: 388 case 15: 389 case 16: 390 throw new UnsupportedOperationException("can't parse StructuredAudioSpecificConfig yet"); 391 //StructuredAudioSpecificConfig(); 392 //break; 393 case 24: 394 throw new UnsupportedOperationException("can't parse ErrorResilientCelpSpecificConfig yet"); 395 //ErrorResilientCelpSpecificConfig(); 396 //break; 397 case 25: 398 throw new UnsupportedOperationException("can't parse ErrorResilientHvxcSpecificConfig yet"); 399 //ErrorResilientHvxcSpecificConfig(); 400 //break; 401 case 26: 402 case 27: 403 parseParametricSpecificConfig(samplingFrequencyIndex, channelConfiguration, audioObjectType, bitReaderBuffer); 404 //ParametricSpecificConfig(); 405 break; 406 case 28: 407 throw new UnsupportedOperationException("can't parse SSCSpecificConfig yet"); 408 //SSCSpecificConfig(); 409 //break; 410 case 30: 411 sacPayloadEmbedding = bitReaderBuffer.readBits(1); 412 throw new UnsupportedOperationException("can't parse SpatialSpecificConfig yet"); 413 //SpatialSpecificConfig(); 414 //break; 415 case 32: 416 case 33: 417 case 34: 418 throw new UnsupportedOperationException("can't parse MPEG_1_2_SpecificConfig yet"); 419 //MPEG_1_2_SpecificConfig(); 420 //break; 421 case 35: 422 throw new UnsupportedOperationException("can't parse DSTSpecificConfig yet"); 423 //DSTSpecificConfig(); 424 //break; 425 case 36: 426 fillBits = bitReaderBuffer.readBits(5); 427 throw new UnsupportedOperationException("can't parse ALSSpecificConfig yet"); 428 //ALSSpecificConfig(); 429 //break; 430 case 37: 431 case 38: 432 throw new UnsupportedOperationException("can't parse SLSSpecificConfig yet"); 433 //SLSSpecificConfig(); 434 //break; 435 case 39: 436 throw new UnsupportedOperationException("can't parse ELDSpecificConfig yet"); 437 //ELDSpecificConfig(channelConfiguration); 438 //break; 439 case 40: 440 case 41: 441 throw new UnsupportedOperationException("can't parse SymbolicMusicSpecificConfig yet"); 442 //SymbolicMusicSpecificConfig(); 443 //break; 444 default: 445 /* reserved */ 446 } 447 448 switch (audioObjectType) { 449 case 17: 450 case 19: 451 case 20: 452 case 21: 453 case 22: 454 case 23: 455 case 24: 456 case 25: 457 case 26: 458 case 27: 459 case 39: 460 epConfig = bitReaderBuffer.readBits(2); 461 if (epConfig == 2 || epConfig == 3) { 462 throw new UnsupportedOperationException("can't parse ErrorProtectionSpecificConfig yet"); 463 //ErrorProtectionSpecificConfig(); 464 } 465 if (epConfig == 3) { 466 directMapping = bitReaderBuffer.readBits(1); 467 if (directMapping == 0) { 468 /* tbd */ 469 throw new RuntimeException("not implemented"); 470 } 471 } 472 } 473 474 if (extensionAudioObjectType != 5 && bitReaderBuffer.remainingBits() >= 16) { 475 syncExtensionType = bitReaderBuffer.readBits(11); 476 if (syncExtensionType == 0x2b7) { 477 extensionAudioObjectType = getAudioObjectType(bitReaderBuffer); 478 if (extensionAudioObjectType == 5) { 479 sbrPresentFlag = bitReaderBuffer.readBits(1); 480 if (sbrPresentFlag == 1) { 481 extensionSamplingFrequencyIndex = bitReaderBuffer.readBits(4); 482 if (extensionSamplingFrequencyIndex == 0xf) { 483 extensionSamplingFrequency = bitReaderBuffer.readBits(24); 484 } 485 if (bitReaderBuffer.remainingBits() >= 12) { 486 syncExtensionType = bitReaderBuffer.readBits(11); //10101001000 487 if (syncExtensionType == 0x548) { 488 psPresentFlag = bitReaderBuffer.readBits(1); 489 } 490 } 491 } 492 } 493 if (extensionAudioObjectType == 22) { 494 sbrPresentFlag = bitReaderBuffer.readBits(1); 495 if (sbrPresentFlag == 1) { 496 extensionSamplingFrequencyIndex = bitReaderBuffer.readBits(4); 497 if (extensionSamplingFrequencyIndex == 0xf) { 498 extensionSamplingFrequency = bitReaderBuffer.readBits(24); 499 } 500 } 501 extensionChannelConfiguration = bitReaderBuffer.readBits(4); 502 } 503 } 504 } 505 } 506 507 private int gaSpecificConfigSize() { 508 return 0; 509 } 510 511 public int serializedSize() { 512 int out = 4; 513 if (audioObjectType == 2) { 514 out += gaSpecificConfigSize(); 515 } else { 516 throw new UnsupportedOperationException("can't serialize that yet"); 517 } 518 return out; 519 } 520 521 public ByteBuffer serialize() { 522 ByteBuffer out = ByteBuffer.allocate(serializedSize()); 523 IsoTypeWriter.writeUInt8(out, 5); 524 IsoTypeWriter.writeUInt8(out, serializedSize() - 2); 525 BitWriterBuffer bwb = new BitWriterBuffer(out); 526 bwb.writeBits(audioObjectType, 5); 527 bwb.writeBits(samplingFrequencyIndex, 4); 528 if (samplingFrequencyIndex == 0xf) { 529 throw new UnsupportedOperationException("can't serialize that yet"); 530 } 531 bwb.writeBits(channelConfiguration, 4); 532 533 // Don't support any extensions, unusual GASpecificConfig other than the default or anything... 534 535 return out; 536 } 537 538 private int getAudioObjectType(BitReaderBuffer in) throws IOException { 539 int audioObjectType = in.readBits(5); 540 if (audioObjectType == 31) { 541 audioObjectType = 32 + in.readBits(6); 542 } 543 return audioObjectType; 544 } 545 546 private void parseGaSpecificConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in) throws IOException { 547 // GASpecificConfig (samplingFrequencyIndex, 548 // channelConfiguration, 549 // audioObjectType) 550 // { 551 frameLengthFlag = in.readBits(1); 552 dependsOnCoreCoder = in.readBits(1); 553 if (dependsOnCoreCoder == 1) { 554 coreCoderDelay = in.readBits(14); 555 } 556 extensionFlag = in.readBits(1); 557 if (channelConfiguration == 0) { 558 throw new UnsupportedOperationException("can't parse program_config_element yet"); 559 //program_config_element (); 560 } 561 if ((audioObjectType == 6) || (audioObjectType == 20)) { 562 layerNr = in.readBits(3); 563 } 564 if (extensionFlag == 1) { 565 if (audioObjectType == 22) { 566 numOfSubFrame = in.readBits(5); 567 layer_length = in.readBits(11); 568 } 569 if (audioObjectType == 17 || audioObjectType == 19 || 570 audioObjectType == 20 || audioObjectType == 23) { 571 aacSectionDataResilienceFlag = in.readBits(1); 572 aacScalefactorDataResilienceFlag = in.readBits(1); 573 aacSpectralDataResilienceFlag = in.readBits(1); 574 } 575 extensionFlag3 = in.readBits(1); 576 if (extensionFlag3 == 1) { 577 /* tbd in version 3 */ 578 } 579 } 580 // } 581 gaSpecificConfig = true; 582 } 583 584 private void parseParametricSpecificConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in) throws IOException { 585 /* 586 ParametricSpecificConfig() { 587 isBaseLayer; 1 uimsbf 588 if (isBaseLayer) { 589 PARAconfig(); 590 } else { 591 HILNenexConfig(); 592 } 593 } 594 */ 595 isBaseLayer = in.readBits(1); 596 if (isBaseLayer == 1) { 597 parseParaConfig(samplingFrequencyIndex, channelConfiguration, audioObjectType, in); 598 } else { 599 parseHilnEnexConfig(samplingFrequencyIndex, channelConfiguration, audioObjectType, in); 600 } 601 } 602 603 private void parseParaConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in) throws IOException { 604 /* 605 PARAconfig() 606 { 607 PARAmode; 2 uimsbf 608 if (PARAmode != 1) { 609 ErHVXCconfig(); 610 } 611 if (PARAmode != 0) { 612 HILNconfig(); 613 } 614 PARAextensionFlag; 1 uimsbf 615 if (PARAextensionFlag) { 616 // to be defined in MPEG-4 Phase 3 617 } 618 } 619 */ 620 paraMode = in.readBits(2); 621 622 if (paraMode != 1) { 623 parseErHvxcConfig(samplingFrequencyIndex, channelConfiguration, audioObjectType, in); 624 } 625 if (paraMode != 0) { 626 parseHilnConfig(samplingFrequencyIndex, channelConfiguration, audioObjectType, in); 627 } 628 629 paraExtensionFlag = in.readBits(1); 630 parametricSpecificConfig = true; 631 } 632 633 private void parseErHvxcConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in) throws IOException { 634 /* 635 ErHVXCconfig() 636 { 637 HVXCvarMode; 1 uimsbf 638 HVXCrateMode; 2 uimsbf 639 extensionFlag; 1 uimsbf 640 if (extensionFlag) { 641 var_ScalableFlag; 1 uimsbf 642 } 643 } 644 */ 645 hvxcVarMode = in.readBits(1); 646 hvxcRateMode = in.readBits(2); 647 erHvxcExtensionFlag = in.readBits(1); 648 649 if (erHvxcExtensionFlag == 1) { 650 var_ScalableFlag = in.readBits(1); 651 } 652 } 653 654 private void parseHilnConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in) throws IOException { 655 /* 656 HILNconfig() 657 { 658 HILNquantMode; 1 uimsbf 659 HILNmaxNumLine; 8 uimsbf 660 HILNsampleRateCode; 4 uimsbf 661 HILNframeLength; 12 uimsbf 662 HILNcontMode; 2 uimsbf 663 } 664 */ 665 hilnQuantMode = in.readBits(1); 666 hilnMaxNumLine = in.readBits(8); 667 hilnSampleRateCode = in.readBits(4); 668 hilnFrameLength = in.readBits(12); 669 hilnContMode = in.readBits(2); 670 } 671 672 private void parseHilnEnexConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in) throws IOException { 673 /* 674 HILNenexConfig() 675 { 676 HILNenhaLayer; 1 uimsbf 677 if (HILNenhaLayer) { 678 HILNenhaQuantMode; 2 uimsbf 679 } 680 } 681 */ 682 hilnEnhaLayer = in.readBits(1); 683 if (hilnEnhaLayer == 1) { 684 hilnEnhaQuantMode = in.readBits(2); 685 } 686 } 687 688 public byte[] getConfigBytes() { 689 return configBytes; 690 } 691 692 public int getAudioObjectType() { 693 return audioObjectType; 694 } 695 696 public int getExtensionAudioObjectType() { 697 return extensionAudioObjectType; 698 } 699 700 public int getSbrPresentFlag() { 701 return sbrPresentFlag; 702 } 703 704 public int getPsPresentFlag() { 705 return psPresentFlag; 706 } 707 708 public void setAudioObjectType(int audioObjectType) { 709 this.audioObjectType = audioObjectType; 710 } 711 712 public void setSamplingFrequencyIndex(int samplingFrequencyIndex) { 713 this.samplingFrequencyIndex = samplingFrequencyIndex; 714 } 715 716 public void setSamplingFrequency(int samplingFrequency) { 717 this.samplingFrequency = samplingFrequency; 718 } 719 720 public void setChannelConfiguration(int channelConfiguration) { 721 this.channelConfiguration = channelConfiguration; 722 } 723 724 @Override 725 public String toString() { 726 final StringBuilder sb = new StringBuilder(); 727 sb.append("AudioSpecificConfig"); 728 sb.append("{configBytes=").append(Hex.encodeHex(configBytes)); 729 sb.append(", audioObjectType=").append(audioObjectType).append(" (").append(audioObjectTypeMap.get(audioObjectType)).append(")"); 730 sb.append(", samplingFrequencyIndex=").append(samplingFrequencyIndex).append(" (").append(samplingFrequencyIndexMap.get(samplingFrequencyIndex)).append(")"); 731 sb.append(", samplingFrequency=").append(samplingFrequency); 732 sb.append(", channelConfiguration=").append(channelConfiguration); 733 if (extensionAudioObjectType > 0) { 734 sb.append(", extensionAudioObjectType=").append(extensionAudioObjectType).append(" (").append(audioObjectTypeMap.get(extensionAudioObjectType)).append(")"); 735 sb.append(", sbrPresentFlag=").append(sbrPresentFlag); 736 sb.append(", psPresentFlag=").append(psPresentFlag); 737 sb.append(", extensionSamplingFrequencyIndex=").append(extensionSamplingFrequencyIndex).append(" (").append(samplingFrequencyIndexMap.get(extensionSamplingFrequencyIndex)).append(")"); 738 sb.append(", extensionSamplingFrequency=").append(extensionSamplingFrequency); 739 sb.append(", extensionChannelConfiguration=").append(extensionChannelConfiguration); 740 } 741 // sb.append(", sacPayloadEmbedding=").append(sacPayloadEmbedding); 742 // sb.append(", fillBits=").append(fillBits); 743 // sb.append(", epConfig=").append(epConfig); 744 // sb.append(", directMapping=").append(directMapping); 745 sb.append(", syncExtensionType=").append(syncExtensionType); 746 if (gaSpecificConfig) { 747 sb.append(", frameLengthFlag=").append(frameLengthFlag); 748 sb.append(", dependsOnCoreCoder=").append(dependsOnCoreCoder); 749 sb.append(", coreCoderDelay=").append(coreCoderDelay); 750 sb.append(", extensionFlag=").append(extensionFlag); 751 sb.append(", layerNr=").append(layerNr); 752 sb.append(", numOfSubFrame=").append(numOfSubFrame); 753 sb.append(", layer_length=").append(layer_length); 754 sb.append(", aacSectionDataResilienceFlag=").append(aacSectionDataResilienceFlag); 755 sb.append(", aacScalefactorDataResilienceFlag=").append(aacScalefactorDataResilienceFlag); 756 sb.append(", aacSpectralDataResilienceFlag=").append(aacSpectralDataResilienceFlag); 757 sb.append(", extensionFlag3=").append(extensionFlag3); 758 } 759 if (parametricSpecificConfig) { 760 sb.append(", isBaseLayer=").append(isBaseLayer); 761 sb.append(", paraMode=").append(paraMode); 762 sb.append(", paraExtensionFlag=").append(paraExtensionFlag); 763 sb.append(", hvxcVarMode=").append(hvxcVarMode); 764 sb.append(", hvxcRateMode=").append(hvxcRateMode); 765 sb.append(", erHvxcExtensionFlag=").append(erHvxcExtensionFlag); 766 sb.append(", var_ScalableFlag=").append(var_ScalableFlag); 767 sb.append(", hilnQuantMode=").append(hilnQuantMode); 768 sb.append(", hilnMaxNumLine=").append(hilnMaxNumLine); 769 sb.append(", hilnSampleRateCode=").append(hilnSampleRateCode); 770 sb.append(", hilnFrameLength=").append(hilnFrameLength); 771 sb.append(", hilnContMode=").append(hilnContMode); 772 sb.append(", hilnEnhaLayer=").append(hilnEnhaLayer); 773 sb.append(", hilnEnhaQuantMode=").append(hilnEnhaQuantMode); 774 } 775 sb.append('}'); 776 return sb.toString(); 777 } 778 779 static { 780 // sampling_frequency_index sampling frequeny 781 //0x0 96000 782 //0x1 88200 783 //0x2 64000 784 //0x3 48000 785 //0x4 44100 786 //0x5 32000 787 //0x6 24000 788 //0x7 22050 789 //0x8 16000 790 //0x9 12000 791 //0xa 11025 792 //0xb 8000 793 //0xc reserved 794 //0xd reserved 795 //0xe reserved 796 //0xf reserved 797 samplingFrequencyIndexMap.put(0x0, 96000); 798 samplingFrequencyIndexMap.put(0x1, 88200); 799 samplingFrequencyIndexMap.put(0x2, 64000); 800 samplingFrequencyIndexMap.put(0x3, 48000); 801 samplingFrequencyIndexMap.put(0x4, 44100); 802 samplingFrequencyIndexMap.put(0x5, 32000); 803 samplingFrequencyIndexMap.put(0x6, 24000); 804 samplingFrequencyIndexMap.put(0x7, 22050); 805 samplingFrequencyIndexMap.put(0x8, 16000); 806 samplingFrequencyIndexMap.put(0x9, 12000); 807 samplingFrequencyIndexMap.put(0xa, 11025); 808 samplingFrequencyIndexMap.put(0xb, 8000); 809 810 /* audioObjectType IDs 811 0 Null 812 1 AAC main X X 813 2 AAC LC X X X X X X X 814 3 AAC SSR X X 815 4 AAC LTP X X X X 816 5 SBR X X 817 6 AAC Scalable X X X X 818 7 TwinVQ X X X 819 8 CELP X X X X X X 820 9 HVXC X X X X X 821 10 (reserved) 822 11 (reserved) 823 12 TTSI X X X X X X 824 13 Main synthetic X X 825 14 Wavetable synthesis X* X* 826 15 General MIDI X* X* 827 16 Algorithmic Synthesis and Audio FX X* X* 828 17 ER AAC LC X X X 829 18 (reserved) 830 19 ER AAC LTP X X 831 20 ER AAC Scalable X X X 832 21 ER TwinVQ X X 833 22 ER BSAC X X 834 23 ER AAC LD X X X X 835 24 ER CELP X X X 836 25 ER HVXC X X 837 26 ER HILN X 838 27 ER Parametric X 839 28 SSC 840 29 PS X 841 30 MPEG Surround 842 31 (escape) 843 32 Layer-1 844 33 Layer-2 845 34 Layer-3 846 35 DST 847 36 ALS 848 37 SLS 849 38 SLS non-core 850 39 ER AAC ELD 851 40 SMR Simple 852 41 SMR Main 853 */ 854 audioObjectTypeMap.put(1, "AAC main"); 855 audioObjectTypeMap.put(2, "AAC LC"); 856 audioObjectTypeMap.put(3, "AAC SSR"); 857 audioObjectTypeMap.put(4, "AAC LTP"); 858 audioObjectTypeMap.put(5, "SBR"); 859 audioObjectTypeMap.put(6, "AAC Scalable"); 860 audioObjectTypeMap.put(7, "TwinVQ"); 861 audioObjectTypeMap.put(8, "CELP"); 862 audioObjectTypeMap.put(9, "HVXC"); 863 audioObjectTypeMap.put(10, "(reserved)"); 864 audioObjectTypeMap.put(11, "(reserved)"); 865 audioObjectTypeMap.put(12, "TTSI"); 866 audioObjectTypeMap.put(13, "Main synthetic"); 867 audioObjectTypeMap.put(14, "Wavetable synthesis"); 868 audioObjectTypeMap.put(15, "General MIDI"); 869 audioObjectTypeMap.put(16, "Algorithmic Synthesis and Audio FX"); 870 audioObjectTypeMap.put(17, "ER AAC LC"); 871 audioObjectTypeMap.put(18, "(reserved)"); 872 audioObjectTypeMap.put(19, "ER AAC LTP"); 873 audioObjectTypeMap.put(20, "ER AAC Scalable"); 874 audioObjectTypeMap.put(21, "ER TwinVQ"); 875 audioObjectTypeMap.put(22, "ER BSAC"); 876 audioObjectTypeMap.put(23, "ER AAC LD"); 877 audioObjectTypeMap.put(24, "ER CELP"); 878 audioObjectTypeMap.put(25, "ER HVXC"); 879 audioObjectTypeMap.put(26, "ER HILN"); 880 audioObjectTypeMap.put(27, "ER Parametric"); 881 audioObjectTypeMap.put(28, "SSC"); 882 audioObjectTypeMap.put(29, "PS"); 883 audioObjectTypeMap.put(30, "MPEG Surround"); 884 audioObjectTypeMap.put(31, "(escape)"); 885 audioObjectTypeMap.put(32, "Layer-1"); 886 audioObjectTypeMap.put(33, "Layer-2"); 887 audioObjectTypeMap.put(34, "Layer-3"); 888 audioObjectTypeMap.put(35, "DST"); 889 audioObjectTypeMap.put(36, "ALS"); 890 audioObjectTypeMap.put(37, "SLS"); 891 audioObjectTypeMap.put(38, "SLS non-core"); 892 audioObjectTypeMap.put(39, "ER AAC ELD"); 893 audioObjectTypeMap.put(40, "SMR Simple"); 894 audioObjectTypeMap.put(41, "SMR Main"); 895 896 /* profileLevelIds 897 0x00 Reserved for ISO use - 898 0x01 Main Audio Profile L1 899 0x02 Main Audio Profile L2 900 0x03 Main Audio Profile L3 901 0x04 Main Audio Profile L4 902 0x05 Scalable Audio Profile L1 903 0x06 Scalable Audio Profile L2 904 0x07 Scalable Audio Profile L3 905 0x08 Scalable Audio Profile L4 906 0x09 Speech Audio Profile L1 907 0x0A Speech Audio Profile L2 908 0x0B Synthetic Audio Profile L1 909 0x0C Synthetic Audio Profile L2 910 0x0D Synthetic Audio Profile L3 911 0x0E High Quality Audio Profile L1 912 0x0F High Quality Audio Profile L2 913 0x10 High Quality Audio Profile L3 914 0x11 High Quality Audio Profile L4 915 0x12 High Quality Audio Profile L5 916 0x13 High Quality Audio Profile L6 917 0x14 High Quality Audio Profile L7 918 0x15 High Quality Audio Profile L8 919 0x16 Low Delay Audio Profile L1 920 0x17 Low Delay Audio Profile L2 921 0x18 Low Delay Audio Profile L3 922 0x19 Low Delay Audio Profile L4 923 0x1A Low Delay Audio Profile L5 924 0x1B Low Delay Audio Profile L6 925 0x1C Low Delay Audio Profile L7 926 0x1D Low Delay Audio Profile L8 927 0x1E Natural Audio Profile L1 928 0x1F Natural Audio Profile L2 929 0x20 Natural Audio Profile L3 930 0x21 Natural Audio Profile L4 931 0x22 Mobile Audio Internetworking Profile L1 932 0x23 Mobile Audio Internetworking Profile L2 933 0x24 Mobile Audio Internetworking Profile L3 934 0x25 Mobile Audio Internetworking Profile L4 935 0x26 Mobile Audio Internetworking Profile L5 936 0x27 Mobile Audio Internetworking Profile L6 937 0x28 AAC Profile L1 938 0x29 AAC Profile L2 939 0x2A AAC Profile L4 940 0x2B AAC Profile L5 941 0x2C High Efficiency AAC Profile L2 942 0x2D High Efficiency AAC Profile L3 943 0x2E High Efficiency AAC Profile L4 944 0x2F High Efficiency AAC Profile L5 945 0x30 High Efficiency AAC v2 Profile L2 946 0x31 High Efficiency AAC v2 Profile L3 947 0x32 High Efficiency AAC v2 Profile L4 948 0x33 High Efficiency AAC v2 Profile L5 949 0x34 Low Delay AAC Profile L1 950 0x35 Baseline MPEG Surround Profile (see ISO/IEC 951 23003-1) 952 L1 953 0x36 Baseline MPEG Surround Profile (see ISO/IEC 954 23003-1) 955 L2 956 0x37 Baseline MPEG Surround Profile (see ISO/IEC 957 23003-1) 958 L3 959 0x38 Baseline MPEG Surround Profile (see ISO/IEC 960 23003-1) 961 L4 962 0c39 Baseline MPEG Surround Profile (see ISO/IEC 963 23003-1) 964 L5 965 0x3A Baseline MPEG Surround Profile (see ISO/IEC 966 23003-1) 967 L6 968 0x3B - 0x7F reserved for ISO use - 969 0x80 - 0xFD user private - 970 0xFE no audio profile specified - 971 0xFF no audio capability required - 972 973 */ 974 } 975 976 977 public int getSamplingFrequency() { 978 return samplingFrequencyIndex == 0xf ? samplingFrequency : samplingFrequencyIndexMap.get(samplingFrequencyIndex); 979 } 980 981 public int getChannelConfiguration() { 982 return channelConfiguration; 983 } 984 985 @Override 986 public boolean equals(Object o) { 987 if (this == o) { 988 return true; 989 } 990 if (o == null || getClass() != o.getClass()) { 991 return false; 992 } 993 994 AudioSpecificConfig that = (AudioSpecificConfig) o; 995 996 if (aacScalefactorDataResilienceFlag != that.aacScalefactorDataResilienceFlag) { 997 return false; 998 } 999 if (aacSectionDataResilienceFlag != that.aacSectionDataResilienceFlag) { 1000 return false; 1001 } 1002 if (aacSpectralDataResilienceFlag != that.aacSpectralDataResilienceFlag) { 1003 return false; 1004 } 1005 if (audioObjectType != that.audioObjectType) { 1006 return false; 1007 } 1008 if (channelConfiguration != that.channelConfiguration) { 1009 return false; 1010 } 1011 if (coreCoderDelay != that.coreCoderDelay) { 1012 return false; 1013 } 1014 if (dependsOnCoreCoder != that.dependsOnCoreCoder) { 1015 return false; 1016 } 1017 if (directMapping != that.directMapping) { 1018 return false; 1019 } 1020 if (epConfig != that.epConfig) { 1021 return false; 1022 } 1023 if (erHvxcExtensionFlag != that.erHvxcExtensionFlag) { 1024 return false; 1025 } 1026 if (extensionAudioObjectType != that.extensionAudioObjectType) { 1027 return false; 1028 } 1029 if (extensionChannelConfiguration != that.extensionChannelConfiguration) { 1030 return false; 1031 } 1032 if (extensionFlag != that.extensionFlag) { 1033 return false; 1034 } 1035 if (extensionFlag3 != that.extensionFlag3) { 1036 return false; 1037 } 1038 if (extensionSamplingFrequency != that.extensionSamplingFrequency) { 1039 return false; 1040 } 1041 if (extensionSamplingFrequencyIndex != that.extensionSamplingFrequencyIndex) { 1042 return false; 1043 } 1044 if (fillBits != that.fillBits) { 1045 return false; 1046 } 1047 if (frameLengthFlag != that.frameLengthFlag) { 1048 return false; 1049 } 1050 if (gaSpecificConfig != that.gaSpecificConfig) { 1051 return false; 1052 } 1053 if (hilnContMode != that.hilnContMode) { 1054 return false; 1055 } 1056 if (hilnEnhaLayer != that.hilnEnhaLayer) { 1057 return false; 1058 } 1059 if (hilnEnhaQuantMode != that.hilnEnhaQuantMode) { 1060 return false; 1061 } 1062 if (hilnFrameLength != that.hilnFrameLength) { 1063 return false; 1064 } 1065 if (hilnMaxNumLine != that.hilnMaxNumLine) { 1066 return false; 1067 } 1068 if (hilnQuantMode != that.hilnQuantMode) { 1069 return false; 1070 } 1071 if (hilnSampleRateCode != that.hilnSampleRateCode) { 1072 return false; 1073 } 1074 if (hvxcRateMode != that.hvxcRateMode) { 1075 return false; 1076 } 1077 if (hvxcVarMode != that.hvxcVarMode) { 1078 return false; 1079 } 1080 if (isBaseLayer != that.isBaseLayer) { 1081 return false; 1082 } 1083 if (layerNr != that.layerNr) { 1084 return false; 1085 } 1086 if (layer_length != that.layer_length) { 1087 return false; 1088 } 1089 if (numOfSubFrame != that.numOfSubFrame) { 1090 return false; 1091 } 1092 if (paraExtensionFlag != that.paraExtensionFlag) { 1093 return false; 1094 } 1095 if (paraMode != that.paraMode) { 1096 return false; 1097 } 1098 if (parametricSpecificConfig != that.parametricSpecificConfig) { 1099 return false; 1100 } 1101 if (psPresentFlag != that.psPresentFlag) { 1102 return false; 1103 } 1104 if (sacPayloadEmbedding != that.sacPayloadEmbedding) { 1105 return false; 1106 } 1107 if (samplingFrequency != that.samplingFrequency) { 1108 return false; 1109 } 1110 if (samplingFrequencyIndex != that.samplingFrequencyIndex) { 1111 return false; 1112 } 1113 if (sbrPresentFlag != that.sbrPresentFlag) { 1114 return false; 1115 } 1116 if (syncExtensionType != that.syncExtensionType) { 1117 return false; 1118 } 1119 if (var_ScalableFlag != that.var_ScalableFlag) { 1120 return false; 1121 } 1122 if (!Arrays.equals(configBytes, that.configBytes)) { 1123 return false; 1124 } 1125 1126 return true; 1127 } 1128 1129 @Override 1130 public int hashCode() { 1131 int result = configBytes != null ? Arrays.hashCode(configBytes) : 0; 1132 result = 31 * result + audioObjectType; 1133 result = 31 * result + samplingFrequencyIndex; 1134 result = 31 * result + samplingFrequency; 1135 result = 31 * result + channelConfiguration; 1136 result = 31 * result + extensionAudioObjectType; 1137 result = 31 * result + sbrPresentFlag; 1138 result = 31 * result + psPresentFlag; 1139 result = 31 * result + extensionSamplingFrequencyIndex; 1140 result = 31 * result + extensionSamplingFrequency; 1141 result = 31 * result + extensionChannelConfiguration; 1142 result = 31 * result + sacPayloadEmbedding; 1143 result = 31 * result + fillBits; 1144 result = 31 * result + epConfig; 1145 result = 31 * result + directMapping; 1146 result = 31 * result + syncExtensionType; 1147 result = 31 * result + frameLengthFlag; 1148 result = 31 * result + dependsOnCoreCoder; 1149 result = 31 * result + coreCoderDelay; 1150 result = 31 * result + extensionFlag; 1151 result = 31 * result + layerNr; 1152 result = 31 * result + numOfSubFrame; 1153 result = 31 * result + layer_length; 1154 result = 31 * result + aacSectionDataResilienceFlag; 1155 result = 31 * result + aacScalefactorDataResilienceFlag; 1156 result = 31 * result + aacSpectralDataResilienceFlag; 1157 result = 31 * result + extensionFlag3; 1158 result = 31 * result + (gaSpecificConfig ? 1 : 0); 1159 result = 31 * result + isBaseLayer; 1160 result = 31 * result + paraMode; 1161 result = 31 * result + paraExtensionFlag; 1162 result = 31 * result + hvxcVarMode; 1163 result = 31 * result + hvxcRateMode; 1164 result = 31 * result + erHvxcExtensionFlag; 1165 result = 31 * result + var_ScalableFlag; 1166 result = 31 * result + hilnQuantMode; 1167 result = 31 * result + hilnMaxNumLine; 1168 result = 31 * result + hilnSampleRateCode; 1169 result = 31 * result + hilnFrameLength; 1170 result = 31 * result + hilnContMode; 1171 result = 31 * result + hilnEnhaLayer; 1172 result = 31 * result + hilnEnhaQuantMode; 1173 result = 31 * result + (parametricSpecificConfig ? 1 : 0); 1174 return result; 1175 } 1176 } 1177