• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
parseDetail(ByteBuffer bb)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 
gaSpecificConfigSize()507     private int gaSpecificConfigSize() {
508         return 0;
509     }
510 
serializedSize()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 
serialize()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 
getAudioObjectType(BitReaderBuffer in)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 
parseGaSpecificConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in)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 
parseParametricSpecificConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in)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 
parseParaConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in)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 
parseErHvxcConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in)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 
parseHilnConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in)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 
parseHilnEnexConfig(int samplingFrequencyIndex, int channelConfiguration, int audioObjectType, BitReaderBuffer in)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 
getConfigBytes()688     public byte[] getConfigBytes() {
689         return configBytes;
690     }
691 
getAudioObjectType()692     public int getAudioObjectType() {
693         return audioObjectType;
694     }
695 
getExtensionAudioObjectType()696     public int getExtensionAudioObjectType() {
697         return extensionAudioObjectType;
698     }
699 
getSbrPresentFlag()700     public int getSbrPresentFlag() {
701         return sbrPresentFlag;
702     }
703 
getPsPresentFlag()704     public int getPsPresentFlag() {
705         return psPresentFlag;
706     }
707 
setAudioObjectType(int audioObjectType)708     public void setAudioObjectType(int audioObjectType) {
709         this.audioObjectType = audioObjectType;
710     }
711 
setSamplingFrequencyIndex(int samplingFrequencyIndex)712     public void setSamplingFrequencyIndex(int samplingFrequencyIndex) {
713         this.samplingFrequencyIndex = samplingFrequencyIndex;
714     }
715 
setSamplingFrequency(int samplingFrequency)716     public void setSamplingFrequency(int samplingFrequency) {
717         this.samplingFrequency = samplingFrequency;
718     }
719 
setChannelConfiguration(int channelConfiguration)720     public void setChannelConfiguration(int channelConfiguration) {
721         this.channelConfiguration = channelConfiguration;
722     }
723 
724     @Override
toString()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 
getSamplingFrequency()977     public int getSamplingFrequency() {
978         return samplingFrequencyIndex == 0xf ? samplingFrequency : samplingFrequencyIndexMap.get(samplingFrequencyIndex);
979     }
980 
getChannelConfiguration()981     public int getChannelConfiguration() {
982         return channelConfiguration;
983     }
984 
985     @Override
equals(Object o)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
hashCode()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