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