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