1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker
4*e5436536SAndroid Build Coastguard Worker © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker
7*e5436536SAndroid Build Coastguard Worker 1. INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker
34*e5436536SAndroid Build Coastguard Worker 2. COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker
61*e5436536SAndroid Build Coastguard Worker 3. NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker
71*e5436536SAndroid Build Coastguard Worker 4. DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker
84*e5436536SAndroid Build Coastguard Worker 5. CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker
95*e5436536SAndroid Build Coastguard Worker /**************************** SBR encoder library ******************************
96*e5436536SAndroid Build Coastguard Worker
97*e5436536SAndroid Build Coastguard Worker Author(s):
98*e5436536SAndroid Build Coastguard Worker
99*e5436536SAndroid Build Coastguard Worker Description:
100*e5436536SAndroid Build Coastguard Worker
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker
103*e5436536SAndroid Build Coastguard Worker #include "fram_gen.h"
104*e5436536SAndroid Build Coastguard Worker #include "sbr_misc.h"
105*e5436536SAndroid Build Coastguard Worker
106*e5436536SAndroid Build Coastguard Worker #include "genericStds.h"
107*e5436536SAndroid Build Coastguard Worker
108*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo1_2048 = {1, {0, 16}, {FREQ_RES_HIGH},
109*e5436536SAndroid Build Coastguard Worker 0, 1, {0, 16}};
110*e5436536SAndroid Build Coastguard Worker
111*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo2_2048 = {
112*e5436536SAndroid Build Coastguard Worker 2, {0, 8, 16}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 8, 16}};
113*e5436536SAndroid Build Coastguard Worker
114*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo4_2048 = {
115*e5436536SAndroid Build Coastguard Worker 4,
116*e5436536SAndroid Build Coastguard Worker {0, 4, 8, 12, 16},
117*e5436536SAndroid Build Coastguard Worker {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH},
118*e5436536SAndroid Build Coastguard Worker 0,
119*e5436536SAndroid Build Coastguard Worker 2,
120*e5436536SAndroid Build Coastguard Worker {0, 8, 16}};
121*e5436536SAndroid Build Coastguard Worker
122*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo1_2304 = {1, {0, 18}, {FREQ_RES_HIGH},
123*e5436536SAndroid Build Coastguard Worker 0, 1, {0, 18}};
124*e5436536SAndroid Build Coastguard Worker
125*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo2_2304 = {
126*e5436536SAndroid Build Coastguard Worker 2, {0, 9, 18}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 9, 18}};
127*e5436536SAndroid Build Coastguard Worker
128*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo4_2304 = {
129*e5436536SAndroid Build Coastguard Worker 4,
130*e5436536SAndroid Build Coastguard Worker {0, 5, 9, 14, 18},
131*e5436536SAndroid Build Coastguard Worker {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH},
132*e5436536SAndroid Build Coastguard Worker 0,
133*e5436536SAndroid Build Coastguard Worker 2,
134*e5436536SAndroid Build Coastguard Worker {0, 9, 18}};
135*e5436536SAndroid Build Coastguard Worker
136*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo1_1920 = {1, {0, 15}, {FREQ_RES_HIGH},
137*e5436536SAndroid Build Coastguard Worker 0, 1, {0, 15}};
138*e5436536SAndroid Build Coastguard Worker
139*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo2_1920 = {
140*e5436536SAndroid Build Coastguard Worker 2, {0, 8, 15}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 8, 15}};
141*e5436536SAndroid Build Coastguard Worker
142*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo4_1920 = {
143*e5436536SAndroid Build Coastguard Worker 4,
144*e5436536SAndroid Build Coastguard Worker {0, 4, 8, 12, 15},
145*e5436536SAndroid Build Coastguard Worker {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH},
146*e5436536SAndroid Build Coastguard Worker 0,
147*e5436536SAndroid Build Coastguard Worker 2,
148*e5436536SAndroid Build Coastguard Worker {0, 8, 15}};
149*e5436536SAndroid Build Coastguard Worker
150*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo1_1152 = {1, {0, 9}, {FREQ_RES_HIGH},
151*e5436536SAndroid Build Coastguard Worker 0, 1, {0, 9}};
152*e5436536SAndroid Build Coastguard Worker
153*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo2_1152 = {
154*e5436536SAndroid Build Coastguard Worker 2, {0, 5, 9}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 5, 9}};
155*e5436536SAndroid Build Coastguard Worker
156*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo4_1152 = {
157*e5436536SAndroid Build Coastguard Worker 4,
158*e5436536SAndroid Build Coastguard Worker {0, 2, 5, 7, 9},
159*e5436536SAndroid Build Coastguard Worker {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH},
160*e5436536SAndroid Build Coastguard Worker 0,
161*e5436536SAndroid Build Coastguard Worker 2,
162*e5436536SAndroid Build Coastguard Worker {0, 5, 9}};
163*e5436536SAndroid Build Coastguard Worker
164*e5436536SAndroid Build Coastguard Worker /* AACLD frame info */
165*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo1_512LD = {1, {0, 8}, {FREQ_RES_HIGH},
166*e5436536SAndroid Build Coastguard Worker 0, 1, {0, 8}};
167*e5436536SAndroid Build Coastguard Worker
168*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo2_512LD = {
169*e5436536SAndroid Build Coastguard Worker 2, {0, 4, 8}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 4, 8}};
170*e5436536SAndroid Build Coastguard Worker
171*e5436536SAndroid Build Coastguard Worker static const SBR_FRAME_INFO frameInfo4_512LD = {
172*e5436536SAndroid Build Coastguard Worker 4,
173*e5436536SAndroid Build Coastguard Worker {0, 2, 4, 6, 8},
174*e5436536SAndroid Build Coastguard Worker {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH},
175*e5436536SAndroid Build Coastguard Worker 0,
176*e5436536SAndroid Build Coastguard Worker 2,
177*e5436536SAndroid Build Coastguard Worker {0, 4, 8}};
178*e5436536SAndroid Build Coastguard Worker
179*e5436536SAndroid Build Coastguard Worker static int calcFillLengthMax(
180*e5436536SAndroid Build Coastguard Worker int tranPos, /*!< input : transient position (ref: tran det) */
181*e5436536SAndroid Build Coastguard Worker int numberTimeSlots /*!< input : number of timeslots */
182*e5436536SAndroid Build Coastguard Worker );
183*e5436536SAndroid Build Coastguard Worker
184*e5436536SAndroid Build Coastguard Worker static void fillFrameTran(
185*e5436536SAndroid Build Coastguard Worker const int *v_tuningSegm, /*!< tuning: desired segment lengths */
186*e5436536SAndroid Build Coastguard Worker const int *v_tuningFreq, /*!< tuning: desired frequency resolutions */
187*e5436536SAndroid Build Coastguard Worker int tran, /*!< input : position of transient */
188*e5436536SAndroid Build Coastguard Worker int *v_bord, /*!< memNew: borders */
189*e5436536SAndroid Build Coastguard Worker int *length_v_bord, /*!< memNew: # borders */
190*e5436536SAndroid Build Coastguard Worker int *v_freq, /*!< memNew: frequency resolutions */
191*e5436536SAndroid Build Coastguard Worker int *length_v_freq, /*!< memNew: # frequency resolutions */
192*e5436536SAndroid Build Coastguard Worker int *bmin, /*!< hlpNew: first mandatory border */
193*e5436536SAndroid Build Coastguard Worker int *bmax /*!< hlpNew: last mandatory border */
194*e5436536SAndroid Build Coastguard Worker );
195*e5436536SAndroid Build Coastguard Worker
196*e5436536SAndroid Build Coastguard Worker static void fillFramePre(INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq,
197*e5436536SAndroid Build Coastguard Worker INT *length_v_freq, INT bmin, INT rest);
198*e5436536SAndroid Build Coastguard Worker
199*e5436536SAndroid Build Coastguard Worker static void fillFramePost(INT *parts, INT *d, INT dmax, INT *v_bord,
200*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT *v_freq, INT *length_v_freq,
201*e5436536SAndroid Build Coastguard Worker INT bmax, INT bufferFrameStart, INT numberTimeSlots,
202*e5436536SAndroid Build Coastguard Worker INT fmax);
203*e5436536SAndroid Build Coastguard Worker
204*e5436536SAndroid Build Coastguard Worker static void fillFrameInter(INT *nL, const int *v_tuningSegm, INT *v_bord,
205*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT bmin, INT *v_freq,
206*e5436536SAndroid Build Coastguard Worker INT *length_v_freq, INT *v_bordFollow,
207*e5436536SAndroid Build Coastguard Worker INT *length_v_bordFollow, INT *v_freqFollow,
208*e5436536SAndroid Build Coastguard Worker INT *length_v_freqFollow, INT i_fillFollow, INT dmin,
209*e5436536SAndroid Build Coastguard Worker INT dmax, INT numberTimeSlots);
210*e5436536SAndroid Build Coastguard Worker
211*e5436536SAndroid Build Coastguard Worker static void calcFrameClass(FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld,
212*e5436536SAndroid Build Coastguard Worker INT tranFlag, INT *spreadFlag);
213*e5436536SAndroid Build Coastguard Worker
214*e5436536SAndroid Build Coastguard Worker static void specialCase(INT *spreadFlag, INT allowSpread, INT *v_bord,
215*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT *v_freq, INT *length_v_freq,
216*e5436536SAndroid Build Coastguard Worker INT *parts, INT d);
217*e5436536SAndroid Build Coastguard Worker
218*e5436536SAndroid Build Coastguard Worker static void calcCmonBorder(INT *i_cmon, INT *i_tran, INT *v_bord,
219*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT tran, INT bufferFrameStart,
220*e5436536SAndroid Build Coastguard Worker INT numberTimeSlots);
221*e5436536SAndroid Build Coastguard Worker
222*e5436536SAndroid Build Coastguard Worker static void keepForFollowUp(INT *v_bordFollow, INT *length_v_bordFollow,
223*e5436536SAndroid Build Coastguard Worker INT *v_freqFollow, INT *length_v_freqFollow,
224*e5436536SAndroid Build Coastguard Worker INT *i_tranFollow, INT *i_fillFollow, INT *v_bord,
225*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT *v_freq, INT i_cmon,
226*e5436536SAndroid Build Coastguard Worker INT i_tran, INT parts, INT numberTimeSlots);
227*e5436536SAndroid Build Coastguard Worker
228*e5436536SAndroid Build Coastguard Worker static void calcCtrlSignal(HANDLE_SBR_GRID hSbrGrid, FRAME_CLASS frameClass,
229*e5436536SAndroid Build Coastguard Worker INT *v_bord, INT length_v_bord, INT *v_freq,
230*e5436536SAndroid Build Coastguard Worker INT length_v_freq, INT i_cmon, INT i_tran,
231*e5436536SAndroid Build Coastguard Worker INT spreadFlag, INT nL);
232*e5436536SAndroid Build Coastguard Worker
233*e5436536SAndroid Build Coastguard Worker static void ctrlSignal2FrameInfo(HANDLE_SBR_GRID hSbrGrid,
234*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_FRAME_INFO hFrameInfo,
235*e5436536SAndroid Build Coastguard Worker FREQ_RES *freq_res_fixfix);
236*e5436536SAndroid Build Coastguard Worker
237*e5436536SAndroid Build Coastguard Worker /* table for 8 time slot index */
238*e5436536SAndroid Build Coastguard Worker static const int envelopeTable_8[8][5] = {
239*e5436536SAndroid Build Coastguard Worker /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */
240*e5436536SAndroid Build Coastguard Worker /* borders from left to right side; -1 = not in use */
241*e5436536SAndroid Build Coastguard Worker /*[|T-|------]*/ {2, 0, 0, 1, -1},
242*e5436536SAndroid Build Coastguard Worker /*[|-T-|-----]*/ {2, 0, 0, 2, -1},
243*e5436536SAndroid Build Coastguard Worker /*[--|T-|----]*/ {3, 1, 1, 2, 4},
244*e5436536SAndroid Build Coastguard Worker /*[---|T-|---]*/ {3, 1, 1, 3, 5},
245*e5436536SAndroid Build Coastguard Worker /*[----|T-|--]*/ {3, 1, 1, 4, 6},
246*e5436536SAndroid Build Coastguard Worker /*[-----|T--|]*/ {2, 1, 1, 5, -1},
247*e5436536SAndroid Build Coastguard Worker /*[------|T-|]*/ {2, 1, 1, 6, -1},
248*e5436536SAndroid Build Coastguard Worker /*[-------|T|]*/ {2, 1, 1, 7, -1},
249*e5436536SAndroid Build Coastguard Worker };
250*e5436536SAndroid Build Coastguard Worker
251*e5436536SAndroid Build Coastguard Worker /* table for 16 time slot index */
252*e5436536SAndroid Build Coastguard Worker static const int envelopeTable_16[16][6] = {
253*e5436536SAndroid Build Coastguard Worker /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */
254*e5436536SAndroid Build Coastguard Worker /* length from left to right side; -1 = not in use */
255*e5436536SAndroid Build Coastguard Worker /*[|T---|------------|]*/ {2, 0, 0, 4, -1, -1},
256*e5436536SAndroid Build Coastguard Worker /*[|-T---|-----------|]*/ {2, 0, 0, 5, -1, -1},
257*e5436536SAndroid Build Coastguard Worker /*[|--|T---|----------]*/ {3, 1, 1, 2, 6, -1},
258*e5436536SAndroid Build Coastguard Worker /*[|---|T---|---------]*/ {3, 1, 1, 3, 7, -1},
259*e5436536SAndroid Build Coastguard Worker /*[|----|T---|--------]*/ {3, 1, 1, 4, 8, -1},
260*e5436536SAndroid Build Coastguard Worker /*[|-----|T---|-------]*/ {3, 1, 1, 5, 9, -1},
261*e5436536SAndroid Build Coastguard Worker /*[|------|T---|------]*/ {3, 1, 1, 6, 10, -1},
262*e5436536SAndroid Build Coastguard Worker /*[|-------|T---|-----]*/ {3, 1, 1, 7, 11, -1},
263*e5436536SAndroid Build Coastguard Worker /*[|--------|T---|----]*/ {3, 1, 1, 8, 12, -1},
264*e5436536SAndroid Build Coastguard Worker /*[|---------|T---|---]*/ {3, 1, 1, 9, 13, -1},
265*e5436536SAndroid Build Coastguard Worker /*[|----------|T---|--]*/ {3, 1, 1, 10, 14, -1},
266*e5436536SAndroid Build Coastguard Worker /*[|-----------|T----|]*/ {2, 1, 1, 11, -1, -1},
267*e5436536SAndroid Build Coastguard Worker /*[|------------|T---|]*/ {2, 1, 1, 12, -1, -1},
268*e5436536SAndroid Build Coastguard Worker /*[|-------------|T--|]*/ {2, 1, 1, 13, -1, -1},
269*e5436536SAndroid Build Coastguard Worker /*[|--------------|T-|]*/ {2, 1, 1, 14, -1, -1},
270*e5436536SAndroid Build Coastguard Worker /*[|---------------|T|]*/ {2, 1, 1, 15, -1, -1},
271*e5436536SAndroid Build Coastguard Worker };
272*e5436536SAndroid Build Coastguard Worker
273*e5436536SAndroid Build Coastguard Worker /* table for 15 time slot index */
274*e5436536SAndroid Build Coastguard Worker static const int envelopeTable_15[15][6] = {
275*e5436536SAndroid Build Coastguard Worker /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */
276*e5436536SAndroid Build Coastguard Worker /* length from left to right side; -1 = not in use */
277*e5436536SAndroid Build Coastguard Worker /*[|T---|------------]*/ {2, 0, 0, 4, -1, -1},
278*e5436536SAndroid Build Coastguard Worker /*[|-T---|-----------]*/ {2, 0, 0, 5, -1, -1},
279*e5436536SAndroid Build Coastguard Worker /*[|--|T---|---------]*/ {3, 1, 1, 2, 6, -1},
280*e5436536SAndroid Build Coastguard Worker /*[|---|T---|--------]*/ {3, 1, 1, 3, 7, -1},
281*e5436536SAndroid Build Coastguard Worker /*[|----|T---|-------]*/ {3, 1, 1, 4, 8, -1},
282*e5436536SAndroid Build Coastguard Worker /*[|-----|T---|------]*/ {3, 1, 1, 5, 9, -1},
283*e5436536SAndroid Build Coastguard Worker /*[|------|T---|-----]*/ {3, 1, 1, 6, 10, -1},
284*e5436536SAndroid Build Coastguard Worker /*[|-------|T---|----]*/ {3, 1, 1, 7, 11, -1},
285*e5436536SAndroid Build Coastguard Worker /*[|--------|T---|---]*/ {3, 1, 1, 8, 12, -1},
286*e5436536SAndroid Build Coastguard Worker /*[|---------|T---|--]*/ {3, 1, 1, 9, 13, -1},
287*e5436536SAndroid Build Coastguard Worker /*[|----------|T----|]*/ {2, 1, 1, 10, -1, -1},
288*e5436536SAndroid Build Coastguard Worker /*[|-----------|T---|]*/ {2, 1, 1, 11, -1, -1},
289*e5436536SAndroid Build Coastguard Worker /*[|------------|T--|]*/ {2, 1, 1, 12, -1, -1},
290*e5436536SAndroid Build Coastguard Worker /*[|-------------|T-|]*/ {2, 1, 1, 13, -1, -1},
291*e5436536SAndroid Build Coastguard Worker /*[|--------------|T|]*/ {2, 1, 1, 14, -1, -1},
292*e5436536SAndroid Build Coastguard Worker };
293*e5436536SAndroid Build Coastguard Worker
294*e5436536SAndroid Build Coastguard Worker static const int minFrameTranDistance = 4;
295*e5436536SAndroid Build Coastguard Worker
296*e5436536SAndroid Build Coastguard Worker static const FREQ_RES freqRes_table_8[] = {
297*e5436536SAndroid Build Coastguard Worker FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW,
298*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH};
299*e5436536SAndroid Build Coastguard Worker
300*e5436536SAndroid Build Coastguard Worker static const FREQ_RES freqRes_table_16[16] = {
301*e5436536SAndroid Build Coastguard Worker /* size of envelope */
302*e5436536SAndroid Build Coastguard Worker /* 0-4 */ FREQ_RES_LOW,
303*e5436536SAndroid Build Coastguard Worker FREQ_RES_LOW,
304*e5436536SAndroid Build Coastguard Worker FREQ_RES_LOW,
305*e5436536SAndroid Build Coastguard Worker FREQ_RES_LOW,
306*e5436536SAndroid Build Coastguard Worker FREQ_RES_LOW,
307*e5436536SAndroid Build Coastguard Worker /* 5-9 */ FREQ_RES_LOW,
308*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
309*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
310*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
311*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
312*e5436536SAndroid Build Coastguard Worker /* 10-16 */ FREQ_RES_HIGH,
313*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
314*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
315*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
316*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH,
317*e5436536SAndroid Build Coastguard Worker FREQ_RES_HIGH};
318*e5436536SAndroid Build Coastguard Worker
319*e5436536SAndroid Build Coastguard Worker static void generateFixFixOnly(HANDLE_SBR_FRAME_INFO hSbrFrameInfo,
320*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_GRID hSbrGrid, int tranPosInternal,
321*e5436536SAndroid Build Coastguard Worker int numberTimeSlots, UCHAR fResTransIsLow);
322*e5436536SAndroid Build Coastguard Worker
323*e5436536SAndroid Build Coastguard Worker /*!
324*e5436536SAndroid Build Coastguard Worker Functionname: FDKsbrEnc_frameInfoGenerator
325*e5436536SAndroid Build Coastguard Worker
326*e5436536SAndroid Build Coastguard Worker Description: produces the FRAME_INFO struct for the current frame
327*e5436536SAndroid Build Coastguard Worker
328*e5436536SAndroid Build Coastguard Worker Arguments: hSbrEnvFrame - pointer to sbr envelope handle
329*e5436536SAndroid Build Coastguard Worker v_pre_transient_info - pointer to transient info vector
330*e5436536SAndroid Build Coastguard Worker v_transient_info - pointer to previous transient info
331*e5436536SAndroid Build Coastguard Worker vector v_tuning - pointer to tuning vector
332*e5436536SAndroid Build Coastguard Worker
333*e5436536SAndroid Build Coastguard Worker Return: frame_info - pointer to SBR_FRAME_INFO struct
334*e5436536SAndroid Build Coastguard Worker
335*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
336*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_FRAME_INFO
FDKsbrEnc_frameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame,UCHAR * v_transient_info,const INT rightBorderFIX,UCHAR * v_transient_info_pre,int ldGrid,const int * v_tuning)337*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_frameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame,
338*e5436536SAndroid Build Coastguard Worker UCHAR *v_transient_info, const INT rightBorderFIX,
339*e5436536SAndroid Build Coastguard Worker UCHAR *v_transient_info_pre, int ldGrid,
340*e5436536SAndroid Build Coastguard Worker const int *v_tuning) {
341*e5436536SAndroid Build Coastguard Worker INT numEnv, tranPosInternal = 0, bmin = 0, bmax = 0, parts, d, i_cmon = 0,
342*e5436536SAndroid Build Coastguard Worker i_tran = 0, nL;
343*e5436536SAndroid Build Coastguard Worker INT fmax = 0;
344*e5436536SAndroid Build Coastguard Worker
345*e5436536SAndroid Build Coastguard Worker INT *v_bord = hSbrEnvFrame->v_bord;
346*e5436536SAndroid Build Coastguard Worker INT *v_freq = hSbrEnvFrame->v_freq;
347*e5436536SAndroid Build Coastguard Worker INT *v_bordFollow = hSbrEnvFrame->v_bordFollow;
348*e5436536SAndroid Build Coastguard Worker INT *v_freqFollow = hSbrEnvFrame->v_freqFollow;
349*e5436536SAndroid Build Coastguard Worker
350*e5436536SAndroid Build Coastguard Worker INT *length_v_bordFollow = &hSbrEnvFrame->length_v_bordFollow;
351*e5436536SAndroid Build Coastguard Worker INT *length_v_freqFollow = &hSbrEnvFrame->length_v_freqFollow;
352*e5436536SAndroid Build Coastguard Worker INT *length_v_bord = &hSbrEnvFrame->length_v_bord;
353*e5436536SAndroid Build Coastguard Worker INT *length_v_freq = &hSbrEnvFrame->length_v_freq;
354*e5436536SAndroid Build Coastguard Worker INT *spreadFlag = &hSbrEnvFrame->spreadFlag;
355*e5436536SAndroid Build Coastguard Worker INT *i_tranFollow = &hSbrEnvFrame->i_tranFollow;
356*e5436536SAndroid Build Coastguard Worker INT *i_fillFollow = &hSbrEnvFrame->i_fillFollow;
357*e5436536SAndroid Build Coastguard Worker FRAME_CLASS *frameClassOld = &hSbrEnvFrame->frameClassOld;
358*e5436536SAndroid Build Coastguard Worker FRAME_CLASS frameClass = FIXFIX;
359*e5436536SAndroid Build Coastguard Worker
360*e5436536SAndroid Build Coastguard Worker INT allowSpread = hSbrEnvFrame->allowSpread;
361*e5436536SAndroid Build Coastguard Worker INT numEnvStatic = hSbrEnvFrame->numEnvStatic;
362*e5436536SAndroid Build Coastguard Worker INT staticFraming = hSbrEnvFrame->staticFraming;
363*e5436536SAndroid Build Coastguard Worker INT dmin = hSbrEnvFrame->dmin;
364*e5436536SAndroid Build Coastguard Worker INT dmax = hSbrEnvFrame->dmax;
365*e5436536SAndroid Build Coastguard Worker
366*e5436536SAndroid Build Coastguard Worker INT bufferFrameStart = hSbrEnvFrame->SbrGrid.bufferFrameStart;
367*e5436536SAndroid Build Coastguard Worker INT numberTimeSlots = hSbrEnvFrame->SbrGrid.numberTimeSlots;
368*e5436536SAndroid Build Coastguard Worker INT frameMiddleSlot = hSbrEnvFrame->frameMiddleSlot;
369*e5436536SAndroid Build Coastguard Worker
370*e5436536SAndroid Build Coastguard Worker INT tranPos = v_transient_info[0];
371*e5436536SAndroid Build Coastguard Worker INT tranFlag = v_transient_info[1];
372*e5436536SAndroid Build Coastguard Worker
373*e5436536SAndroid Build Coastguard Worker const int *v_tuningSegm = v_tuning;
374*e5436536SAndroid Build Coastguard Worker const int *v_tuningFreq = v_tuning + 3;
375*e5436536SAndroid Build Coastguard Worker
376*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->v_tuningSegm = v_tuningSegm;
377*e5436536SAndroid Build Coastguard Worker
378*e5436536SAndroid Build Coastguard Worker if (ldGrid) {
379*e5436536SAndroid Build Coastguard Worker /* in case there was a transient at the very end of the previous frame,
380*e5436536SAndroid Build Coastguard Worker * start with a transient envelope */
381*e5436536SAndroid Build Coastguard Worker if (!tranFlag && v_transient_info_pre[1] &&
382*e5436536SAndroid Build Coastguard Worker (numberTimeSlots - v_transient_info_pre[0] < minFrameTranDistance)) {
383*e5436536SAndroid Build Coastguard Worker tranFlag = 1;
384*e5436536SAndroid Build Coastguard Worker tranPos = 0;
385*e5436536SAndroid Build Coastguard Worker }
386*e5436536SAndroid Build Coastguard Worker }
387*e5436536SAndroid Build Coastguard Worker
388*e5436536SAndroid Build Coastguard Worker /*
389*e5436536SAndroid Build Coastguard Worker * Synopsis:
390*e5436536SAndroid Build Coastguard Worker *
391*e5436536SAndroid Build Coastguard Worker * The frame generator creates the time-/frequency-grid for one SBR frame.
392*e5436536SAndroid Build Coastguard Worker * Input signals are provided by the transient detector and the frame
393*e5436536SAndroid Build Coastguard Worker * splitter (transientDetectNew() & FrameSplitter() in tran_det.c). The
394*e5436536SAndroid Build Coastguard Worker * framing is controlled by adjusting tuning parameters stored in
395*e5436536SAndroid Build Coastguard Worker * FRAME_GEN_TUNING. The parameter values are dependent on frame lengths
396*e5436536SAndroid Build Coastguard Worker * and bitrates, and may in the future be signal dependent.
397*e5436536SAndroid Build Coastguard Worker *
398*e5436536SAndroid Build Coastguard Worker * The envelope borders are stored for frame generator internal use in
399*e5436536SAndroid Build Coastguard Worker * aBorders. The contents of aBorders represent positions along the time
400*e5436536SAndroid Build Coastguard Worker * axis given in the figures in fram_gen.h (the "frame-generator" rows).
401*e5436536SAndroid Build Coastguard Worker * The unit is "time slot". The figures in fram_gen.h also define the
402*e5436536SAndroid Build Coastguard Worker * detection ranges for the transient detector. For every border in
403*e5436536SAndroid Build Coastguard Worker * aBorders, there is a corresponding entry in aFreqRes, which defines the
404*e5436536SAndroid Build Coastguard Worker * frequency resolution of the envelope following (delimited by) the
405*e5436536SAndroid Build Coastguard Worker * border.
406*e5436536SAndroid Build Coastguard Worker *
407*e5436536SAndroid Build Coastguard Worker * When no transients are present, FIXFIX class frames are used. The
408*e5436536SAndroid Build Coastguard Worker * frame splitter decides whether to use one or two envelopes in the
409*e5436536SAndroid Build Coastguard Worker * FIXFIX frame. "Sparse transients" (separated by a few frames without
410*e5436536SAndroid Build Coastguard Worker * transients) are handeled by [FIXVAR, VARFIX] pairs or (depending on
411*e5436536SAndroid Build Coastguard Worker * tuning and transient position relative the nominal frame boundaries)
412*e5436536SAndroid Build Coastguard Worker * by [FIXVAR, VARVAR, VARFIX] triples. "Tight transients" (in
413*e5436536SAndroid Build Coastguard Worker * consecutive frames) are handeled by [..., VARVAR, VARVAR, ...]
414*e5436536SAndroid Build Coastguard Worker * sequences.
415*e5436536SAndroid Build Coastguard Worker *
416*e5436536SAndroid Build Coastguard Worker * The generator assumes that transients are "sparse", and designs
417*e5436536SAndroid Build Coastguard Worker * borders for [FIXVAR, VARFIX] pairs right away, where the first frame
418*e5436536SAndroid Build Coastguard Worker * corresponds to the present frame. At the next call of the generator
419*e5436536SAndroid Build Coastguard Worker * it is known whether the transient actually is "sparse" or not. If
420*e5436536SAndroid Build Coastguard Worker * 'yes', the already calculated VARFIX borders are used. If 'no', new
421*e5436536SAndroid Build Coastguard Worker * borders, meeting the requirements of the "tight" transient, are
422*e5436536SAndroid Build Coastguard Worker * calculated.
423*e5436536SAndroid Build Coastguard Worker *
424*e5436536SAndroid Build Coastguard Worker * The generator produces two outputs: A "clear-text bitstream" stored in
425*e5436536SAndroid Build Coastguard Worker * SBR_GRID, and a straight-forward representation of the grid stored in
426*e5436536SAndroid Build Coastguard Worker * SBR_FRAME_INFO. The former is subsequently converted to the actual
427*e5436536SAndroid Build Coastguard Worker * bitstream sbr_grid() (encodeSbrGrid() in bit_sbr.c). The latter is
428*e5436536SAndroid Build Coastguard Worker * used by other encoder functions, such as the envelope estimator
429*e5436536SAndroid Build Coastguard Worker * (calculateSbrEnvelope() in env_est.c) and the noise floor and missing
430*e5436536SAndroid Build Coastguard Worker * harmonics detector (TonCorrParamExtr() in nf_est.c).
431*e5436536SAndroid Build Coastguard Worker */
432*e5436536SAndroid Build Coastguard Worker
433*e5436536SAndroid Build Coastguard Worker if (staticFraming) {
434*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
435*e5436536SAndroid Build Coastguard Worker Ignore transient detector
436*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
437*e5436536SAndroid Build Coastguard Worker
438*e5436536SAndroid Build Coastguard Worker frameClass = FIXFIX;
439*e5436536SAndroid Build Coastguard Worker numEnv = numEnvStatic; /* {1,2,4,8} */
440*e5436536SAndroid Build Coastguard Worker *frameClassOld = FIXFIX; /* for change to dyn */
441*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.bs_num_env = numEnv;
442*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.frameClass = frameClass;
443*e5436536SAndroid Build Coastguard Worker } else {
444*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
445*e5436536SAndroid Build Coastguard Worker Calculate frame class to use
446*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
447*e5436536SAndroid Build Coastguard Worker if (rightBorderFIX) {
448*e5436536SAndroid Build Coastguard Worker tranFlag = 0;
449*e5436536SAndroid Build Coastguard Worker *spreadFlag = 0;
450*e5436536SAndroid Build Coastguard Worker }
451*e5436536SAndroid Build Coastguard Worker calcFrameClass(&frameClass, frameClassOld, tranFlag, spreadFlag);
452*e5436536SAndroid Build Coastguard Worker
453*e5436536SAndroid Build Coastguard Worker /* patch for new frame class FIXFIXonly for AAC LD */
454*e5436536SAndroid Build Coastguard Worker if (tranFlag && ldGrid) {
455*e5436536SAndroid Build Coastguard Worker frameClass = FIXFIXonly;
456*e5436536SAndroid Build Coastguard Worker *frameClassOld = FIXFIX;
457*e5436536SAndroid Build Coastguard Worker }
458*e5436536SAndroid Build Coastguard Worker
459*e5436536SAndroid Build Coastguard Worker /*
460*e5436536SAndroid Build Coastguard Worker * every transient is processed below by inserting
461*e5436536SAndroid Build Coastguard Worker *
462*e5436536SAndroid Build Coastguard Worker * - one border at the onset of the transient
463*e5436536SAndroid Build Coastguard Worker * - one or more "decay borders" (after the onset of the transient)
464*e5436536SAndroid Build Coastguard Worker * - optionally one "attack border" (before the onset of the transient)
465*e5436536SAndroid Build Coastguard Worker *
466*e5436536SAndroid Build Coastguard Worker * those borders are referred to as "mandatory borders" and are
467*e5436536SAndroid Build Coastguard Worker * defined by the 'segmentLength' array in FRAME_GEN_TUNING
468*e5436536SAndroid Build Coastguard Worker *
469*e5436536SAndroid Build Coastguard Worker * the frequency resolutions of the corresponding envelopes are
470*e5436536SAndroid Build Coastguard Worker * defined by the 'segmentRes' array in FRAME_GEN_TUNING
471*e5436536SAndroid Build Coastguard Worker */
472*e5436536SAndroid Build Coastguard Worker
473*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
474*e5436536SAndroid Build Coastguard Worker Design frame (or follow-up old design)
475*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
476*e5436536SAndroid Build Coastguard Worker if (tranFlag) {
477*e5436536SAndroid Build Coastguard Worker /* Always for FixVar, often but not always for VarVar */
478*e5436536SAndroid Build Coastguard Worker
479*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
480*e5436536SAndroid Build Coastguard Worker Design part of T/F-grid around the new transient
481*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
482*e5436536SAndroid Build Coastguard Worker
483*e5436536SAndroid Build Coastguard Worker tranPosInternal =
484*e5436536SAndroid Build Coastguard Worker frameMiddleSlot + tranPos + bufferFrameStart; /* FH 00-06-26 */
485*e5436536SAndroid Build Coastguard Worker /*
486*e5436536SAndroid Build Coastguard Worker add mandatory borders around transient
487*e5436536SAndroid Build Coastguard Worker */
488*e5436536SAndroid Build Coastguard Worker
489*e5436536SAndroid Build Coastguard Worker fillFrameTran(v_tuningSegm, v_tuningFreq, tranPosInternal, v_bord,
490*e5436536SAndroid Build Coastguard Worker length_v_bord, v_freq, length_v_freq, &bmin, &bmax);
491*e5436536SAndroid Build Coastguard Worker
492*e5436536SAndroid Build Coastguard Worker /* make sure we stay within the maximum SBR frame overlap */
493*e5436536SAndroid Build Coastguard Worker fmax = calcFillLengthMax(tranPos, numberTimeSlots);
494*e5436536SAndroid Build Coastguard Worker }
495*e5436536SAndroid Build Coastguard Worker
496*e5436536SAndroid Build Coastguard Worker switch (frameClass) {
497*e5436536SAndroid Build Coastguard Worker case FIXFIXonly:
498*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(ldGrid);
499*e5436536SAndroid Build Coastguard Worker tranPosInternal = tranPos;
500*e5436536SAndroid Build Coastguard Worker generateFixFixOnly(&(hSbrEnvFrame->SbrFrameInfo),
501*e5436536SAndroid Build Coastguard Worker &(hSbrEnvFrame->SbrGrid), tranPosInternal,
502*e5436536SAndroid Build Coastguard Worker numberTimeSlots, hSbrEnvFrame->fResTransIsLow);
503*e5436536SAndroid Build Coastguard Worker
504*e5436536SAndroid Build Coastguard Worker return &(hSbrEnvFrame->SbrFrameInfo);
505*e5436536SAndroid Build Coastguard Worker
506*e5436536SAndroid Build Coastguard Worker case FIXVAR:
507*e5436536SAndroid Build Coastguard Worker
508*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
509*e5436536SAndroid Build Coastguard Worker Design remaining parts of T/F-grid (assuming next frame is VarFix)
510*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
511*e5436536SAndroid Build Coastguard Worker
512*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
513*e5436536SAndroid Build Coastguard Worker Fill region before new transient:
514*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
515*e5436536SAndroid Build Coastguard Worker fillFramePre(dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin,
516*e5436536SAndroid Build Coastguard Worker bmin - bufferFrameStart); /* FH 00-06-26 */
517*e5436536SAndroid Build Coastguard Worker
518*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
519*e5436536SAndroid Build Coastguard Worker Fill region after new transient:
520*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
521*e5436536SAndroid Build Coastguard Worker fillFramePost(&parts, &d, dmax, v_bord, length_v_bord, v_freq,
522*e5436536SAndroid Build Coastguard Worker length_v_freq, bmax, bufferFrameStart, numberTimeSlots,
523*e5436536SAndroid Build Coastguard Worker fmax);
524*e5436536SAndroid Build Coastguard Worker
525*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
526*e5436536SAndroid Build Coastguard Worker Take care of special case:
527*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
528*e5436536SAndroid Build Coastguard Worker if (parts == 1 && d < dmin) /* no fill, short last envelope */
529*e5436536SAndroid Build Coastguard Worker specialCase(spreadFlag, allowSpread, v_bord, length_v_bord, v_freq,
530*e5436536SAndroid Build Coastguard Worker length_v_freq, &parts, d);
531*e5436536SAndroid Build Coastguard Worker
532*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
533*e5436536SAndroid Build Coastguard Worker Calculate common border (split-point)
534*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
535*e5436536SAndroid Build Coastguard Worker calcCmonBorder(&i_cmon, &i_tran, v_bord, length_v_bord, tranPosInternal,
536*e5436536SAndroid Build Coastguard Worker bufferFrameStart, numberTimeSlots); /* FH 00-06-26 */
537*e5436536SAndroid Build Coastguard Worker
538*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
539*e5436536SAndroid Build Coastguard Worker Extract data for proper follow-up in next frame
540*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
541*e5436536SAndroid Build Coastguard Worker keepForFollowUp(v_bordFollow, length_v_bordFollow, v_freqFollow,
542*e5436536SAndroid Build Coastguard Worker length_v_freqFollow, i_tranFollow, i_fillFollow, v_bord,
543*e5436536SAndroid Build Coastguard Worker length_v_bord, v_freq, i_cmon, i_tran, parts,
544*e5436536SAndroid Build Coastguard Worker numberTimeSlots); /* FH 00-06-26 */
545*e5436536SAndroid Build Coastguard Worker
546*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
547*e5436536SAndroid Build Coastguard Worker Calculate control signal
548*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
549*e5436536SAndroid Build Coastguard Worker calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bord,
550*e5436536SAndroid Build Coastguard Worker *length_v_bord, v_freq, *length_v_freq, i_cmon, i_tran,
551*e5436536SAndroid Build Coastguard Worker *spreadFlag, DC);
552*e5436536SAndroid Build Coastguard Worker break;
553*e5436536SAndroid Build Coastguard Worker case VARFIX:
554*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
555*e5436536SAndroid Build Coastguard Worker Follow-up old transient - calculate control signal
556*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
557*e5436536SAndroid Build Coastguard Worker calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bordFollow,
558*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow, v_freqFollow, *length_v_freqFollow,
559*e5436536SAndroid Build Coastguard Worker DC, *i_tranFollow, *spreadFlag, DC);
560*e5436536SAndroid Build Coastguard Worker break;
561*e5436536SAndroid Build Coastguard Worker case VARVAR:
562*e5436536SAndroid Build Coastguard Worker if (*spreadFlag) { /* spread across three frames */
563*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
564*e5436536SAndroid Build Coastguard Worker Follow-up old transient - calculate control signal
565*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
566*e5436536SAndroid Build Coastguard Worker calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bordFollow,
567*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow, v_freqFollow,
568*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow, DC, *i_tranFollow, *spreadFlag,
569*e5436536SAndroid Build Coastguard Worker DC);
570*e5436536SAndroid Build Coastguard Worker
571*e5436536SAndroid Build Coastguard Worker *spreadFlag = 0;
572*e5436536SAndroid Build Coastguard Worker
573*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
574*e5436536SAndroid Build Coastguard Worker Extract data for proper follow-up in next frame
575*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
576*e5436536SAndroid Build Coastguard Worker v_bordFollow[0] = hSbrEnvFrame->SbrGrid.bs_abs_bord_1 -
577*e5436536SAndroid Build Coastguard Worker numberTimeSlots; /* FH 00-06-26 */
578*e5436536SAndroid Build Coastguard Worker v_freqFollow[0] = 1;
579*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow = 1;
580*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow = 1;
581*e5436536SAndroid Build Coastguard Worker
582*e5436536SAndroid Build Coastguard Worker *i_tranFollow = -DC;
583*e5436536SAndroid Build Coastguard Worker *i_fillFollow = -DC;
584*e5436536SAndroid Build Coastguard Worker } else {
585*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
586*e5436536SAndroid Build Coastguard Worker Design remaining parts of T/F-grid (assuming next frame is VarFix)
587*e5436536SAndroid Build Coastguard Worker adapt or fill region before new transient:
588*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
589*e5436536SAndroid Build Coastguard Worker fillFrameInter(&nL, v_tuningSegm, v_bord, length_v_bord, bmin, v_freq,
590*e5436536SAndroid Build Coastguard Worker length_v_freq, v_bordFollow, length_v_bordFollow,
591*e5436536SAndroid Build Coastguard Worker v_freqFollow, length_v_freqFollow, *i_fillFollow, dmin,
592*e5436536SAndroid Build Coastguard Worker dmax, numberTimeSlots);
593*e5436536SAndroid Build Coastguard Worker
594*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
595*e5436536SAndroid Build Coastguard Worker Fill after transient:
596*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
597*e5436536SAndroid Build Coastguard Worker fillFramePost(&parts, &d, dmax, v_bord, length_v_bord, v_freq,
598*e5436536SAndroid Build Coastguard Worker length_v_freq, bmax, bufferFrameStart, numberTimeSlots,
599*e5436536SAndroid Build Coastguard Worker fmax);
600*e5436536SAndroid Build Coastguard Worker
601*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
602*e5436536SAndroid Build Coastguard Worker Take care of special case:
603*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
604*e5436536SAndroid Build Coastguard Worker if (parts == 1 && d < dmin) /*% no fill, short last envelope */
605*e5436536SAndroid Build Coastguard Worker specialCase(spreadFlag, allowSpread, v_bord, length_v_bord, v_freq,
606*e5436536SAndroid Build Coastguard Worker length_v_freq, &parts, d);
607*e5436536SAndroid Build Coastguard Worker
608*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
609*e5436536SAndroid Build Coastguard Worker Calculate common border (split-point)
610*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
611*e5436536SAndroid Build Coastguard Worker calcCmonBorder(&i_cmon, &i_tran, v_bord, length_v_bord,
612*e5436536SAndroid Build Coastguard Worker tranPosInternal, bufferFrameStart, numberTimeSlots);
613*e5436536SAndroid Build Coastguard Worker
614*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
615*e5436536SAndroid Build Coastguard Worker Extract data for proper follow-up in next frame
616*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
617*e5436536SAndroid Build Coastguard Worker keepForFollowUp(v_bordFollow, length_v_bordFollow, v_freqFollow,
618*e5436536SAndroid Build Coastguard Worker length_v_freqFollow, i_tranFollow, i_fillFollow,
619*e5436536SAndroid Build Coastguard Worker v_bord, length_v_bord, v_freq, i_cmon, i_tran, parts,
620*e5436536SAndroid Build Coastguard Worker numberTimeSlots);
621*e5436536SAndroid Build Coastguard Worker
622*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------
623*e5436536SAndroid Build Coastguard Worker Calculate control signal
624*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
625*e5436536SAndroid Build Coastguard Worker calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bord,
626*e5436536SAndroid Build Coastguard Worker *length_v_bord, v_freq, *length_v_freq, i_cmon, i_tran,
627*e5436536SAndroid Build Coastguard Worker 0, nL);
628*e5436536SAndroid Build Coastguard Worker }
629*e5436536SAndroid Build Coastguard Worker break;
630*e5436536SAndroid Build Coastguard Worker case FIXFIX:
631*e5436536SAndroid Build Coastguard Worker if (tranPos == 0)
632*e5436536SAndroid Build Coastguard Worker numEnv = 1;
633*e5436536SAndroid Build Coastguard Worker else
634*e5436536SAndroid Build Coastguard Worker numEnv = 2;
635*e5436536SAndroid Build Coastguard Worker
636*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.bs_num_env = numEnv;
637*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.frameClass = frameClass;
638*e5436536SAndroid Build Coastguard Worker
639*e5436536SAndroid Build Coastguard Worker break;
640*e5436536SAndroid Build Coastguard Worker default:
641*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0);
642*e5436536SAndroid Build Coastguard Worker }
643*e5436536SAndroid Build Coastguard Worker }
644*e5436536SAndroid Build Coastguard Worker
645*e5436536SAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
646*e5436536SAndroid Build Coastguard Worker Convert control signal to frame info struct
647*e5436536SAndroid Build Coastguard Worker ---------------------------------------------------------------------------*/
648*e5436536SAndroid Build Coastguard Worker ctrlSignal2FrameInfo(&hSbrEnvFrame->SbrGrid, &hSbrEnvFrame->SbrFrameInfo,
649*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->freq_res_fixfix);
650*e5436536SAndroid Build Coastguard Worker
651*e5436536SAndroid Build Coastguard Worker return &hSbrEnvFrame->SbrFrameInfo;
652*e5436536SAndroid Build Coastguard Worker }
653*e5436536SAndroid Build Coastguard Worker
654*e5436536SAndroid Build Coastguard Worker /***************************************************************************/
655*e5436536SAndroid Build Coastguard Worker /*!
656*e5436536SAndroid Build Coastguard Worker \brief Gnerates frame info for FIXFIXonly frame class used for low delay
657*e5436536SAndroid Build Coastguard Worker version
658*e5436536SAndroid Build Coastguard Worker
659*e5436536SAndroid Build Coastguard Worker \return nothing
660*e5436536SAndroid Build Coastguard Worker ****************************************************************************/
generateFixFixOnly(HANDLE_SBR_FRAME_INFO hSbrFrameInfo,HANDLE_SBR_GRID hSbrGrid,int tranPosInternal,int numberTimeSlots,UCHAR fResTransIsLow)661*e5436536SAndroid Build Coastguard Worker static void generateFixFixOnly(HANDLE_SBR_FRAME_INFO hSbrFrameInfo,
662*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_GRID hSbrGrid, int tranPosInternal,
663*e5436536SAndroid Build Coastguard Worker int numberTimeSlots, UCHAR fResTransIsLow) {
664*e5436536SAndroid Build Coastguard Worker int nEnv, i, k = 0, tranIdx;
665*e5436536SAndroid Build Coastguard Worker const int *pTable = NULL;
666*e5436536SAndroid Build Coastguard Worker const FREQ_RES *freqResTable = NULL;
667*e5436536SAndroid Build Coastguard Worker
668*e5436536SAndroid Build Coastguard Worker switch (numberTimeSlots) {
669*e5436536SAndroid Build Coastguard Worker case 8: {
670*e5436536SAndroid Build Coastguard Worker pTable = envelopeTable_8[tranPosInternal];
671*e5436536SAndroid Build Coastguard Worker }
672*e5436536SAndroid Build Coastguard Worker freqResTable = freqRes_table_8;
673*e5436536SAndroid Build Coastguard Worker break;
674*e5436536SAndroid Build Coastguard Worker case 15:
675*e5436536SAndroid Build Coastguard Worker pTable = envelopeTable_15[tranPosInternal];
676*e5436536SAndroid Build Coastguard Worker freqResTable = freqRes_table_16;
677*e5436536SAndroid Build Coastguard Worker break;
678*e5436536SAndroid Build Coastguard Worker case 16:
679*e5436536SAndroid Build Coastguard Worker pTable = envelopeTable_16[tranPosInternal];
680*e5436536SAndroid Build Coastguard Worker freqResTable = freqRes_table_16;
681*e5436536SAndroid Build Coastguard Worker break;
682*e5436536SAndroid Build Coastguard Worker }
683*e5436536SAndroid Build Coastguard Worker
684*e5436536SAndroid Build Coastguard Worker /* look number of envolpes in table */
685*e5436536SAndroid Build Coastguard Worker nEnv = pTable[0];
686*e5436536SAndroid Build Coastguard Worker /* look up envolpe distribution in table */
687*e5436536SAndroid Build Coastguard Worker for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2];
688*e5436536SAndroid Build Coastguard Worker
689*e5436536SAndroid Build Coastguard Worker /* open and close frame border */
690*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[0] = 0;
691*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[nEnv] = numberTimeSlots;
692*e5436536SAndroid Build Coastguard Worker
693*e5436536SAndroid Build Coastguard Worker /* adjust segment-frequency-resolution according to the segment-length */
694*e5436536SAndroid Build Coastguard Worker for (i = 0; i < nEnv; i++) {
695*e5436536SAndroid Build Coastguard Worker k = hSbrFrameInfo->borders[i + 1] - hSbrFrameInfo->borders[i];
696*e5436536SAndroid Build Coastguard Worker if (!fResTransIsLow)
697*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->freqRes[i] = freqResTable[k];
698*e5436536SAndroid Build Coastguard Worker else
699*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->freqRes[i] = FREQ_RES_LOW;
700*e5436536SAndroid Build Coastguard Worker
701*e5436536SAndroid Build Coastguard Worker hSbrGrid->v_f[i] = hSbrFrameInfo->freqRes[i];
702*e5436536SAndroid Build Coastguard Worker }
703*e5436536SAndroid Build Coastguard Worker
704*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nEnvelopes = nEnv;
705*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->shortEnv = pTable[2];
706*e5436536SAndroid Build Coastguard Worker /* transient idx */
707*e5436536SAndroid Build Coastguard Worker tranIdx = pTable[1];
708*e5436536SAndroid Build Coastguard Worker
709*e5436536SAndroid Build Coastguard Worker /* add noise floors */
710*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[0] = 0;
711*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] =
712*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[tranIdx ? tranIdx : 1];
713*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[2] = numberTimeSlots;
714*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nNoiseEnvelopes = 2;
715*e5436536SAndroid Build Coastguard Worker
716*e5436536SAndroid Build Coastguard Worker hSbrGrid->frameClass = FIXFIXonly;
717*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_abs_bord = tranPosInternal;
718*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_num_env = nEnv;
719*e5436536SAndroid Build Coastguard Worker }
720*e5436536SAndroid Build Coastguard Worker
721*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
722*e5436536SAndroid Build Coastguard Worker Functionname: FDKsbrEnc_initFrameInfoGenerator
723*e5436536SAndroid Build Coastguard Worker *******************************************************************************
724*e5436536SAndroid Build Coastguard Worker
725*e5436536SAndroid Build Coastguard Worker Description:
726*e5436536SAndroid Build Coastguard Worker
727*e5436536SAndroid Build Coastguard Worker Arguments: hSbrEnvFrame - pointer to sbr envelope handle
728*e5436536SAndroid Build Coastguard Worker allowSpread - commandline parameter
729*e5436536SAndroid Build Coastguard Worker numEnvStatic - commandline parameter
730*e5436536SAndroid Build Coastguard Worker staticFraming - commandline parameter
731*e5436536SAndroid Build Coastguard Worker
732*e5436536SAndroid Build Coastguard Worker Return: none
733*e5436536SAndroid Build Coastguard Worker
734*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
FDKsbrEnc_initFrameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame,INT allowSpread,INT numEnvStatic,INT staticFraming,INT timeSlots,const FREQ_RES * freq_res_fixfix,UCHAR fResTransIsLow,INT ldGrid)735*e5436536SAndroid Build Coastguard Worker void FDKsbrEnc_initFrameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame,
736*e5436536SAndroid Build Coastguard Worker INT allowSpread, INT numEnvStatic,
737*e5436536SAndroid Build Coastguard Worker INT staticFraming, INT timeSlots,
738*e5436536SAndroid Build Coastguard Worker const FREQ_RES *freq_res_fixfix,
739*e5436536SAndroid Build Coastguard Worker UCHAR fResTransIsLow,
740*e5436536SAndroid Build Coastguard Worker INT ldGrid) { /* FH 00-06-26 */
741*e5436536SAndroid Build Coastguard Worker
742*e5436536SAndroid Build Coastguard Worker FDKmemclear(hSbrEnvFrame, sizeof(SBR_ENVELOPE_FRAME));
743*e5436536SAndroid Build Coastguard Worker
744*e5436536SAndroid Build Coastguard Worker /* Initialisation */
745*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->frameClassOld = FIXFIX;
746*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->spreadFlag = 0;
747*e5436536SAndroid Build Coastguard Worker
748*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->allowSpread = allowSpread;
749*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->numEnvStatic = numEnvStatic;
750*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->staticFraming = staticFraming;
751*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->freq_res_fixfix[0] = freq_res_fixfix[0];
752*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->freq_res_fixfix[1] = freq_res_fixfix[1];
753*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->fResTransIsLow = fResTransIsLow;
754*e5436536SAndroid Build Coastguard Worker
755*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->length_v_bord = 0;
756*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->length_v_bordFollow = 0;
757*e5436536SAndroid Build Coastguard Worker
758*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->length_v_freq = 0;
759*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->length_v_freqFollow = 0;
760*e5436536SAndroid Build Coastguard Worker
761*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->i_tranFollow = 0;
762*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->i_fillFollow = 0;
763*e5436536SAndroid Build Coastguard Worker
764*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.numberTimeSlots = timeSlots;
765*e5436536SAndroid Build Coastguard Worker
766*e5436536SAndroid Build Coastguard Worker if (ldGrid) {
767*e5436536SAndroid Build Coastguard Worker /*case CODEC_AACLD:*/
768*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmin = 2;
769*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmax = 16;
770*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_512LD;
771*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.bufferFrameStart = 0;
772*e5436536SAndroid Build Coastguard Worker } else
773*e5436536SAndroid Build Coastguard Worker switch (timeSlots) {
774*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1920:
775*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmin = 4;
776*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmax = 12;
777*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.bufferFrameStart = 0;
778*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1920;
779*e5436536SAndroid Build Coastguard Worker break;
780*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2048:
781*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmin = 4;
782*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmax = 12;
783*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.bufferFrameStart = 0;
784*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2048;
785*e5436536SAndroid Build Coastguard Worker break;
786*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1152:
787*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmin = 2;
788*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmax = 8;
789*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.bufferFrameStart = 0;
790*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1152;
791*e5436536SAndroid Build Coastguard Worker break;
792*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2304:
793*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmin = 4;
794*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->dmax = 15;
795*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->SbrGrid.bufferFrameStart = 0;
796*e5436536SAndroid Build Coastguard Worker hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2304;
797*e5436536SAndroid Build Coastguard Worker break;
798*e5436536SAndroid Build Coastguard Worker default:
799*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0);
800*e5436536SAndroid Build Coastguard Worker }
801*e5436536SAndroid Build Coastguard Worker }
802*e5436536SAndroid Build Coastguard Worker
803*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
804*e5436536SAndroid Build Coastguard Worker Functionname: fillFrameTran
805*e5436536SAndroid Build Coastguard Worker *******************************************************************************
806*e5436536SAndroid Build Coastguard Worker
807*e5436536SAndroid Build Coastguard Worker Description: Add mandatory borders, as described by the tuning vector
808*e5436536SAndroid Build Coastguard Worker and the current transient position
809*e5436536SAndroid Build Coastguard Worker
810*e5436536SAndroid Build Coastguard Worker Arguments:
811*e5436536SAndroid Build Coastguard Worker modified:
812*e5436536SAndroid Build Coastguard Worker v_bord - int pointer to v_bord vector
813*e5436536SAndroid Build Coastguard Worker length_v_bord - length of v_bord vector
814*e5436536SAndroid Build Coastguard Worker v_freq - int pointer to v_freq vector
815*e5436536SAndroid Build Coastguard Worker length_v_freq - length of v_freq vector
816*e5436536SAndroid Build Coastguard Worker bmin - int pointer to bmin (call by reference)
817*e5436536SAndroid Build Coastguard Worker bmax - int pointer to bmax (call by reference)
818*e5436536SAndroid Build Coastguard Worker not modified:
819*e5436536SAndroid Build Coastguard Worker tran - position of transient
820*e5436536SAndroid Build Coastguard Worker v_tuningSegm - int pointer to v_tuningSegm vector
821*e5436536SAndroid Build Coastguard Worker v_tuningFreq - int pointer to v_tuningFreq vector
822*e5436536SAndroid Build Coastguard Worker
823*e5436536SAndroid Build Coastguard Worker Return: none
824*e5436536SAndroid Build Coastguard Worker
825*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
fillFrameTran(const int * v_tuningSegm,const int * v_tuningFreq,int tran,int * v_bord,int * length_v_bord,int * v_freq,int * length_v_freq,int * bmin,int * bmax)826*e5436536SAndroid Build Coastguard Worker static void fillFrameTran(
827*e5436536SAndroid Build Coastguard Worker const int *v_tuningSegm, /*!< tuning: desired segment lengths */
828*e5436536SAndroid Build Coastguard Worker const int *v_tuningFreq, /*!< tuning: desired frequency resolutions */
829*e5436536SAndroid Build Coastguard Worker int tran, /*!< input : position of transient */
830*e5436536SAndroid Build Coastguard Worker int *v_bord, /*!< memNew: borders */
831*e5436536SAndroid Build Coastguard Worker int *length_v_bord, /*!< memNew: # borders */
832*e5436536SAndroid Build Coastguard Worker int *v_freq, /*!< memNew: frequency resolutions */
833*e5436536SAndroid Build Coastguard Worker int *length_v_freq, /*!< memNew: # frequency resolutions */
834*e5436536SAndroid Build Coastguard Worker int *bmin, /*!< hlpNew: first mandatory border */
835*e5436536SAndroid Build Coastguard Worker int *bmax /*!< hlpNew: last mandatory border */
836*e5436536SAndroid Build Coastguard Worker ) {
837*e5436536SAndroid Build Coastguard Worker int bord, i;
838*e5436536SAndroid Build Coastguard Worker
839*e5436536SAndroid Build Coastguard Worker *length_v_bord = 0;
840*e5436536SAndroid Build Coastguard Worker *length_v_freq = 0;
841*e5436536SAndroid Build Coastguard Worker
842*e5436536SAndroid Build Coastguard Worker /* add attack env leading border (optional) */
843*e5436536SAndroid Build Coastguard Worker if (v_tuningSegm[0]) {
844*e5436536SAndroid Build Coastguard Worker /* v_bord = [(Ba)] start of attack env */
845*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_bord, length_v_bord, (tran - v_tuningSegm[0]));
846*e5436536SAndroid Build Coastguard Worker
847*e5436536SAndroid Build Coastguard Worker /* v_freq = [(Fa)] res of attack env */
848*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_freq, length_v_freq, v_tuningFreq[0]);
849*e5436536SAndroid Build Coastguard Worker }
850*e5436536SAndroid Build Coastguard Worker
851*e5436536SAndroid Build Coastguard Worker /* add attack env trailing border/first decay env leading border */
852*e5436536SAndroid Build Coastguard Worker bord = tran;
853*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_bord, length_v_bord, tran); /* v_bord = [(Ba),Bd1] */
854*e5436536SAndroid Build Coastguard Worker
855*e5436536SAndroid Build Coastguard Worker /* add first decay env trailing border/2:nd decay env leading border */
856*e5436536SAndroid Build Coastguard Worker if (v_tuningSegm[1]) {
857*e5436536SAndroid Build Coastguard Worker bord += v_tuningSegm[1];
858*e5436536SAndroid Build Coastguard Worker
859*e5436536SAndroid Build Coastguard Worker /* v_bord = [(Ba),Bd1,Bd2] */
860*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_bord, length_v_bord, bord);
861*e5436536SAndroid Build Coastguard Worker
862*e5436536SAndroid Build Coastguard Worker /* v_freq = [(Fa),Fd1] */
863*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_freq, length_v_freq, v_tuningFreq[1]);
864*e5436536SAndroid Build Coastguard Worker }
865*e5436536SAndroid Build Coastguard Worker
866*e5436536SAndroid Build Coastguard Worker /* add 2:nd decay env trailing border (optional) */
867*e5436536SAndroid Build Coastguard Worker if (v_tuningSegm[2] != 0) {
868*e5436536SAndroid Build Coastguard Worker bord += v_tuningSegm[2];
869*e5436536SAndroid Build Coastguard Worker
870*e5436536SAndroid Build Coastguard Worker /* v_bord = [(Ba),Bd1, Bd2,(Bd3)] */
871*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_bord, length_v_bord, bord);
872*e5436536SAndroid Build Coastguard Worker
873*e5436536SAndroid Build Coastguard Worker /* v_freq = [(Fa),Fd1,(Fd2)] */
874*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_freq, length_v_freq, v_tuningFreq[2]);
875*e5436536SAndroid Build Coastguard Worker }
876*e5436536SAndroid Build Coastguard Worker
877*e5436536SAndroid Build Coastguard Worker /* v_freq = [(Fa),Fd1,(Fd2),1] */
878*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_freq, length_v_freq, 1);
879*e5436536SAndroid Build Coastguard Worker
880*e5436536SAndroid Build Coastguard Worker /* calc min and max values of mandatory borders */
881*e5436536SAndroid Build Coastguard Worker *bmin = v_bord[0];
882*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_bord; i++)
883*e5436536SAndroid Build Coastguard Worker if (v_bord[i] < *bmin) *bmin = v_bord[i];
884*e5436536SAndroid Build Coastguard Worker
885*e5436536SAndroid Build Coastguard Worker *bmax = v_bord[0];
886*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_bord; i++)
887*e5436536SAndroid Build Coastguard Worker if (v_bord[i] > *bmax) *bmax = v_bord[i];
888*e5436536SAndroid Build Coastguard Worker }
889*e5436536SAndroid Build Coastguard Worker
890*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
891*e5436536SAndroid Build Coastguard Worker Functionname: fillFramePre
892*e5436536SAndroid Build Coastguard Worker *******************************************************************************
893*e5436536SAndroid Build Coastguard Worker
894*e5436536SAndroid Build Coastguard Worker Description: Add borders before mandatory borders, if needed
895*e5436536SAndroid Build Coastguard Worker
896*e5436536SAndroid Build Coastguard Worker Arguments:
897*e5436536SAndroid Build Coastguard Worker modified:
898*e5436536SAndroid Build Coastguard Worker v_bord - int pointer to v_bord vector
899*e5436536SAndroid Build Coastguard Worker length_v_bord - length of v_bord vector
900*e5436536SAndroid Build Coastguard Worker v_freq - int pointer to v_freq vector
901*e5436536SAndroid Build Coastguard Worker length_v_freq - length of v_freq vector
902*e5436536SAndroid Build Coastguard Worker not modified:
903*e5436536SAndroid Build Coastguard Worker dmax - int value
904*e5436536SAndroid Build Coastguard Worker bmin - int value
905*e5436536SAndroid Build Coastguard Worker rest - int value
906*e5436536SAndroid Build Coastguard Worker
907*e5436536SAndroid Build Coastguard Worker Return: none
908*e5436536SAndroid Build Coastguard Worker
909*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
fillFramePre(INT dmax,INT * v_bord,INT * length_v_bord,INT * v_freq,INT * length_v_freq,INT bmin,INT rest)910*e5436536SAndroid Build Coastguard Worker static void fillFramePre(INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq,
911*e5436536SAndroid Build Coastguard Worker INT *length_v_freq, INT bmin, INT rest) {
912*e5436536SAndroid Build Coastguard Worker /*
913*e5436536SAndroid Build Coastguard Worker input state:
914*e5436536SAndroid Build Coastguard Worker v_bord = [(Ba),Bd1, Bd2 ,(Bd3)]
915*e5436536SAndroid Build Coastguard Worker v_freq = [(Fa),Fd1,(Fd2),1 ]
916*e5436536SAndroid Build Coastguard Worker */
917*e5436536SAndroid Build Coastguard Worker
918*e5436536SAndroid Build Coastguard Worker INT parts, d, j, S, s = 0, segm, bord;
919*e5436536SAndroid Build Coastguard Worker
920*e5436536SAndroid Build Coastguard Worker /*
921*e5436536SAndroid Build Coastguard Worker start with one envelope
922*e5436536SAndroid Build Coastguard Worker */
923*e5436536SAndroid Build Coastguard Worker
924*e5436536SAndroid Build Coastguard Worker parts = 1;
925*e5436536SAndroid Build Coastguard Worker d = rest;
926*e5436536SAndroid Build Coastguard Worker
927*e5436536SAndroid Build Coastguard Worker /*
928*e5436536SAndroid Build Coastguard Worker calc # of additional envelopes and corresponding lengths
929*e5436536SAndroid Build Coastguard Worker */
930*e5436536SAndroid Build Coastguard Worker
931*e5436536SAndroid Build Coastguard Worker while (d > dmax) {
932*e5436536SAndroid Build Coastguard Worker parts++;
933*e5436536SAndroid Build Coastguard Worker
934*e5436536SAndroid Build Coastguard Worker segm = rest / parts;
935*e5436536SAndroid Build Coastguard Worker S = (segm - 2) >> 1;
936*e5436536SAndroid Build Coastguard Worker s = fixMin(8, 2 * S + 2);
937*e5436536SAndroid Build Coastguard Worker d = rest - (parts - 1) * s;
938*e5436536SAndroid Build Coastguard Worker }
939*e5436536SAndroid Build Coastguard Worker
940*e5436536SAndroid Build Coastguard Worker /*
941*e5436536SAndroid Build Coastguard Worker add borders before mandatory borders
942*e5436536SAndroid Build Coastguard Worker */
943*e5436536SAndroid Build Coastguard Worker
944*e5436536SAndroid Build Coastguard Worker bord = bmin;
945*e5436536SAndroid Build Coastguard Worker
946*e5436536SAndroid Build Coastguard Worker for (j = 0; j <= parts - 2; j++) {
947*e5436536SAndroid Build Coastguard Worker bord = bord - s;
948*e5436536SAndroid Build Coastguard Worker
949*e5436536SAndroid Build Coastguard Worker /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] */
950*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddLeft(v_bord, length_v_bord, bord);
951*e5436536SAndroid Build Coastguard Worker
952*e5436536SAndroid Build Coastguard Worker /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 ] */
953*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddLeft(v_freq, length_v_freq, 1);
954*e5436536SAndroid Build Coastguard Worker }
955*e5436536SAndroid Build Coastguard Worker }
956*e5436536SAndroid Build Coastguard Worker
957*e5436536SAndroid Build Coastguard Worker /***************************************************************************/
958*e5436536SAndroid Build Coastguard Worker /*!
959*e5436536SAndroid Build Coastguard Worker \brief Overlap control
960*e5436536SAndroid Build Coastguard Worker
961*e5436536SAndroid Build Coastguard Worker Calculate max length of trailing fill segments, such that we always get a
962*e5436536SAndroid Build Coastguard Worker border within the frame overlap region
963*e5436536SAndroid Build Coastguard Worker
964*e5436536SAndroid Build Coastguard Worker \return void
965*e5436536SAndroid Build Coastguard Worker
966*e5436536SAndroid Build Coastguard Worker ****************************************************************************/
calcFillLengthMax(int tranPos,int numberTimeSlots)967*e5436536SAndroid Build Coastguard Worker static int calcFillLengthMax(
968*e5436536SAndroid Build Coastguard Worker int tranPos, /*!< input : transient position (ref: tran det) */
969*e5436536SAndroid Build Coastguard Worker int numberTimeSlots /*!< input : number of timeslots */
970*e5436536SAndroid Build Coastguard Worker ) {
971*e5436536SAndroid Build Coastguard Worker int fmax;
972*e5436536SAndroid Build Coastguard Worker
973*e5436536SAndroid Build Coastguard Worker /*
974*e5436536SAndroid Build Coastguard Worker calculate transient position within envelope buffer
975*e5436536SAndroid Build Coastguard Worker */
976*e5436536SAndroid Build Coastguard Worker switch (numberTimeSlots) {
977*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2048:
978*e5436536SAndroid Build Coastguard Worker if (tranPos < 4)
979*e5436536SAndroid Build Coastguard Worker fmax = 6;
980*e5436536SAndroid Build Coastguard Worker else if (tranPos == 4 || tranPos == 5)
981*e5436536SAndroid Build Coastguard Worker fmax = 4;
982*e5436536SAndroid Build Coastguard Worker else
983*e5436536SAndroid Build Coastguard Worker fmax = 8;
984*e5436536SAndroid Build Coastguard Worker break;
985*e5436536SAndroid Build Coastguard Worker
986*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1920:
987*e5436536SAndroid Build Coastguard Worker if (tranPos < 4)
988*e5436536SAndroid Build Coastguard Worker fmax = 5;
989*e5436536SAndroid Build Coastguard Worker else if (tranPos == 4 || tranPos == 5)
990*e5436536SAndroid Build Coastguard Worker fmax = 3;
991*e5436536SAndroid Build Coastguard Worker else
992*e5436536SAndroid Build Coastguard Worker fmax = 7;
993*e5436536SAndroid Build Coastguard Worker break;
994*e5436536SAndroid Build Coastguard Worker
995*e5436536SAndroid Build Coastguard Worker default:
996*e5436536SAndroid Build Coastguard Worker fmax = 8;
997*e5436536SAndroid Build Coastguard Worker break;
998*e5436536SAndroid Build Coastguard Worker }
999*e5436536SAndroid Build Coastguard Worker
1000*e5436536SAndroid Build Coastguard Worker return fmax;
1001*e5436536SAndroid Build Coastguard Worker }
1002*e5436536SAndroid Build Coastguard Worker
1003*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1004*e5436536SAndroid Build Coastguard Worker Functionname: fillFramePost
1005*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1006*e5436536SAndroid Build Coastguard Worker
1007*e5436536SAndroid Build Coastguard Worker Description: -Add borders after mandatory borders, if needed
1008*e5436536SAndroid Build Coastguard Worker Make a preliminary design of next frame,
1009*e5436536SAndroid Build Coastguard Worker assuming no transient is present there
1010*e5436536SAndroid Build Coastguard Worker
1011*e5436536SAndroid Build Coastguard Worker Arguments:
1012*e5436536SAndroid Build Coastguard Worker modified:
1013*e5436536SAndroid Build Coastguard Worker parts - int pointer to parts (call by reference)
1014*e5436536SAndroid Build Coastguard Worker d - int pointer to d (call by reference)
1015*e5436536SAndroid Build Coastguard Worker v_bord - int pointer to v_bord vector
1016*e5436536SAndroid Build Coastguard Worker length_v_bord - length of v_bord vector
1017*e5436536SAndroid Build Coastguard Worker v_freq - int pointer to v_freq vector
1018*e5436536SAndroid Build Coastguard Worker length_v_freq - length of v_freq vector
1019*e5436536SAndroid Build Coastguard Worker not modified:
1020*e5436536SAndroid Build Coastguard Worker bmax - int value
1021*e5436536SAndroid Build Coastguard Worker dmax - int value
1022*e5436536SAndroid Build Coastguard Worker
1023*e5436536SAndroid Build Coastguard Worker Return: none
1024*e5436536SAndroid Build Coastguard Worker
1025*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
fillFramePost(INT * parts,INT * d,INT dmax,INT * v_bord,INT * length_v_bord,INT * v_freq,INT * length_v_freq,INT bmax,INT bufferFrameStart,INT numberTimeSlots,INT fmax)1026*e5436536SAndroid Build Coastguard Worker static void fillFramePost(INT *parts, INT *d, INT dmax, INT *v_bord,
1027*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT *v_freq, INT *length_v_freq,
1028*e5436536SAndroid Build Coastguard Worker INT bmax, INT bufferFrameStart, INT numberTimeSlots,
1029*e5436536SAndroid Build Coastguard Worker INT fmax) {
1030*e5436536SAndroid Build Coastguard Worker INT j, rest, segm, S, s = 0, bord;
1031*e5436536SAndroid Build Coastguard Worker
1032*e5436536SAndroid Build Coastguard Worker /*
1033*e5436536SAndroid Build Coastguard Worker input state:
1034*e5436536SAndroid Build Coastguard Worker v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)]
1035*e5436536SAndroid Build Coastguard Worker v_freq = [...,(1 ),(Fa),Fd1,(Fd2),1 ]
1036*e5436536SAndroid Build Coastguard Worker */
1037*e5436536SAndroid Build Coastguard Worker
1038*e5436536SAndroid Build Coastguard Worker rest = bufferFrameStart + 2 * numberTimeSlots - bmax;
1039*e5436536SAndroid Build Coastguard Worker *d = rest;
1040*e5436536SAndroid Build Coastguard Worker
1041*e5436536SAndroid Build Coastguard Worker if (*d > 0) {
1042*e5436536SAndroid Build Coastguard Worker *parts = 1; /* start with one envelope */
1043*e5436536SAndroid Build Coastguard Worker
1044*e5436536SAndroid Build Coastguard Worker /* calc # of additional envelopes and corresponding lengths */
1045*e5436536SAndroid Build Coastguard Worker
1046*e5436536SAndroid Build Coastguard Worker while (*d > dmax) {
1047*e5436536SAndroid Build Coastguard Worker *parts = *parts + 1;
1048*e5436536SAndroid Build Coastguard Worker
1049*e5436536SAndroid Build Coastguard Worker segm = rest / (*parts);
1050*e5436536SAndroid Build Coastguard Worker S = (segm - 2) >> 1;
1051*e5436536SAndroid Build Coastguard Worker s = fixMin(fmax, 2 * S + 2);
1052*e5436536SAndroid Build Coastguard Worker *d = rest - (*parts - 1) * s;
1053*e5436536SAndroid Build Coastguard Worker }
1054*e5436536SAndroid Build Coastguard Worker
1055*e5436536SAndroid Build Coastguard Worker /* add borders after mandatory borders */
1056*e5436536SAndroid Build Coastguard Worker
1057*e5436536SAndroid Build Coastguard Worker bord = bmax;
1058*e5436536SAndroid Build Coastguard Worker for (j = 0; j <= *parts - 2; j++) {
1059*e5436536SAndroid Build Coastguard Worker bord += s;
1060*e5436536SAndroid Build Coastguard Worker
1061*e5436536SAndroid Build Coastguard Worker /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3),(Bf)] */
1062*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_bord, length_v_bord, bord);
1063*e5436536SAndroid Build Coastguard Worker
1064*e5436536SAndroid Build Coastguard Worker /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 , 1! ,1] */
1065*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_freq, length_v_freq, 1);
1066*e5436536SAndroid Build Coastguard Worker }
1067*e5436536SAndroid Build Coastguard Worker } else {
1068*e5436536SAndroid Build Coastguard Worker *parts = 1;
1069*e5436536SAndroid Build Coastguard Worker
1070*e5436536SAndroid Build Coastguard Worker /* remove last element from v_bord and v_freq */
1071*e5436536SAndroid Build Coastguard Worker
1072*e5436536SAndroid Build Coastguard Worker *length_v_bord = *length_v_bord - 1;
1073*e5436536SAndroid Build Coastguard Worker *length_v_freq = *length_v_freq - 1;
1074*e5436536SAndroid Build Coastguard Worker }
1075*e5436536SAndroid Build Coastguard Worker }
1076*e5436536SAndroid Build Coastguard Worker
1077*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1078*e5436536SAndroid Build Coastguard Worker Functionname: fillFrameInter
1079*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1080*e5436536SAndroid Build Coastguard Worker
1081*e5436536SAndroid Build Coastguard Worker Description:
1082*e5436536SAndroid Build Coastguard Worker
1083*e5436536SAndroid Build Coastguard Worker Arguments: nL -
1084*e5436536SAndroid Build Coastguard Worker v_tuningSegm -
1085*e5436536SAndroid Build Coastguard Worker v_bord -
1086*e5436536SAndroid Build Coastguard Worker length_v_bord -
1087*e5436536SAndroid Build Coastguard Worker bmin -
1088*e5436536SAndroid Build Coastguard Worker v_freq -
1089*e5436536SAndroid Build Coastguard Worker length_v_freq -
1090*e5436536SAndroid Build Coastguard Worker v_bordFollow -
1091*e5436536SAndroid Build Coastguard Worker length_v_bordFollow -
1092*e5436536SAndroid Build Coastguard Worker v_freqFollow -
1093*e5436536SAndroid Build Coastguard Worker length_v_freqFollow -
1094*e5436536SAndroid Build Coastguard Worker i_fillFollow -
1095*e5436536SAndroid Build Coastguard Worker dmin -
1096*e5436536SAndroid Build Coastguard Worker dmax -
1097*e5436536SAndroid Build Coastguard Worker
1098*e5436536SAndroid Build Coastguard Worker Return: none
1099*e5436536SAndroid Build Coastguard Worker
1100*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
fillFrameInter(INT * nL,const int * v_tuningSegm,INT * v_bord,INT * length_v_bord,INT bmin,INT * v_freq,INT * length_v_freq,INT * v_bordFollow,INT * length_v_bordFollow,INT * v_freqFollow,INT * length_v_freqFollow,INT i_fillFollow,INT dmin,INT dmax,INT numberTimeSlots)1101*e5436536SAndroid Build Coastguard Worker static void fillFrameInter(INT *nL, const int *v_tuningSegm, INT *v_bord,
1102*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT bmin, INT *v_freq,
1103*e5436536SAndroid Build Coastguard Worker INT *length_v_freq, INT *v_bordFollow,
1104*e5436536SAndroid Build Coastguard Worker INT *length_v_bordFollow, INT *v_freqFollow,
1105*e5436536SAndroid Build Coastguard Worker INT *length_v_freqFollow, INT i_fillFollow, INT dmin,
1106*e5436536SAndroid Build Coastguard Worker INT dmax, INT numberTimeSlots) {
1107*e5436536SAndroid Build Coastguard Worker INT middle, b_new, numBordFollow, bordMaxFollow, i;
1108*e5436536SAndroid Build Coastguard Worker
1109*e5436536SAndroid Build Coastguard Worker if (numberTimeSlots != NUMBER_TIME_SLOTS_1152) {
1110*e5436536SAndroid Build Coastguard Worker /* % remove fill borders: */
1111*e5436536SAndroid Build Coastguard Worker if (i_fillFollow >= 1) {
1112*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow = i_fillFollow;
1113*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow = i_fillFollow;
1114*e5436536SAndroid Build Coastguard Worker }
1115*e5436536SAndroid Build Coastguard Worker
1116*e5436536SAndroid Build Coastguard Worker numBordFollow = *length_v_bordFollow;
1117*e5436536SAndroid Build Coastguard Worker bordMaxFollow = v_bordFollow[numBordFollow - 1];
1118*e5436536SAndroid Build Coastguard Worker
1119*e5436536SAndroid Build Coastguard Worker /* remove even more borders if needed */
1120*e5436536SAndroid Build Coastguard Worker middle = bmin - bordMaxFollow;
1121*e5436536SAndroid Build Coastguard Worker while (middle < 0) {
1122*e5436536SAndroid Build Coastguard Worker numBordFollow--;
1123*e5436536SAndroid Build Coastguard Worker bordMaxFollow = v_bordFollow[numBordFollow - 1];
1124*e5436536SAndroid Build Coastguard Worker middle = bmin - bordMaxFollow;
1125*e5436536SAndroid Build Coastguard Worker }
1126*e5436536SAndroid Build Coastguard Worker
1127*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow = numBordFollow;
1128*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow = numBordFollow;
1129*e5436536SAndroid Build Coastguard Worker *nL = numBordFollow - 1;
1130*e5436536SAndroid Build Coastguard Worker
1131*e5436536SAndroid Build Coastguard Worker b_new = *length_v_bord;
1132*e5436536SAndroid Build Coastguard Worker
1133*e5436536SAndroid Build Coastguard Worker if (middle <= dmax) {
1134*e5436536SAndroid Build Coastguard Worker if (middle >= dmin) { /* concatenate */
1135*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1136*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1137*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1138*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1139*e5436536SAndroid Build Coastguard Worker }
1140*e5436536SAndroid Build Coastguard Worker
1141*e5436536SAndroid Build Coastguard Worker else {
1142*e5436536SAndroid Build Coastguard Worker if (v_tuningSegm[0] != 0) { /* remove one new border and concatenate */
1143*e5436536SAndroid Build Coastguard Worker *length_v_bord = b_new - 1;
1144*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1145*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1146*e5436536SAndroid Build Coastguard Worker
1147*e5436536SAndroid Build Coastguard Worker *length_v_freq = b_new - 1;
1148*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq + 1, length_v_freq, v_freqFollow,
1149*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1150*e5436536SAndroid Build Coastguard Worker } else {
1151*e5436536SAndroid Build Coastguard Worker if (*length_v_bordFollow >
1152*e5436536SAndroid Build Coastguard Worker 1) { /* remove one old border and concatenate */
1153*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1154*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow - 1);
1155*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1156*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow - 1);
1157*e5436536SAndroid Build Coastguard Worker
1158*e5436536SAndroid Build Coastguard Worker *nL = *nL - 1;
1159*e5436536SAndroid Build Coastguard Worker } else { /* remove new "transient" border and concatenate */
1160*e5436536SAndroid Build Coastguard Worker
1161*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_bord - 1; i++) v_bord[i] = v_bord[i + 1];
1162*e5436536SAndroid Build Coastguard Worker
1163*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_freq - 1; i++) v_freq[i] = v_freq[i + 1];
1164*e5436536SAndroid Build Coastguard Worker
1165*e5436536SAndroid Build Coastguard Worker *length_v_bord = b_new - 1;
1166*e5436536SAndroid Build Coastguard Worker *length_v_freq = b_new - 1;
1167*e5436536SAndroid Build Coastguard Worker
1168*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1169*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1170*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1171*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1172*e5436536SAndroid Build Coastguard Worker }
1173*e5436536SAndroid Build Coastguard Worker }
1174*e5436536SAndroid Build Coastguard Worker }
1175*e5436536SAndroid Build Coastguard Worker } else { /* middle > dmax */
1176*e5436536SAndroid Build Coastguard Worker
1177*e5436536SAndroid Build Coastguard Worker fillFramePre(dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin,
1178*e5436536SAndroid Build Coastguard Worker middle);
1179*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1180*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1181*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1182*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1183*e5436536SAndroid Build Coastguard Worker }
1184*e5436536SAndroid Build Coastguard Worker
1185*e5436536SAndroid Build Coastguard Worker } else { /* numberTimeSlots==NUMBER_TIME_SLOTS_1152 */
1186*e5436536SAndroid Build Coastguard Worker
1187*e5436536SAndroid Build Coastguard Worker INT l, m;
1188*e5436536SAndroid Build Coastguard Worker
1189*e5436536SAndroid Build Coastguard Worker /*------------------------------------------------------------------------
1190*e5436536SAndroid Build Coastguard Worker remove fill borders
1191*e5436536SAndroid Build Coastguard Worker ------------------------------------------------------------------------*/
1192*e5436536SAndroid Build Coastguard Worker if (i_fillFollow >= 1) {
1193*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow = i_fillFollow;
1194*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow = i_fillFollow;
1195*e5436536SAndroid Build Coastguard Worker }
1196*e5436536SAndroid Build Coastguard Worker
1197*e5436536SAndroid Build Coastguard Worker numBordFollow = *length_v_bordFollow;
1198*e5436536SAndroid Build Coastguard Worker bordMaxFollow = v_bordFollow[numBordFollow - 1];
1199*e5436536SAndroid Build Coastguard Worker
1200*e5436536SAndroid Build Coastguard Worker /*------------------------------------------------------------------------
1201*e5436536SAndroid Build Coastguard Worker remove more borders if necessary to eliminate overlap
1202*e5436536SAndroid Build Coastguard Worker ------------------------------------------------------------------------*/
1203*e5436536SAndroid Build Coastguard Worker
1204*e5436536SAndroid Build Coastguard Worker /* check for overlap */
1205*e5436536SAndroid Build Coastguard Worker middle = bmin - bordMaxFollow;
1206*e5436536SAndroid Build Coastguard Worker
1207*e5436536SAndroid Build Coastguard Worker /* intervals:
1208*e5436536SAndroid Build Coastguard Worker i) middle < 0 : overlap, must remove borders
1209*e5436536SAndroid Build Coastguard Worker ii) 0 <= middle < dmin : no overlap but too tight, must remove
1210*e5436536SAndroid Build Coastguard Worker borders iii) dmin <= middle <= dmax : ok, just concatenate iv) dmax
1211*e5436536SAndroid Build Coastguard Worker <= middle : too wide, must add borders
1212*e5436536SAndroid Build Coastguard Worker */
1213*e5436536SAndroid Build Coastguard Worker
1214*e5436536SAndroid Build Coastguard Worker /* first remove old non-fill-borders... */
1215*e5436536SAndroid Build Coastguard Worker while (middle < 0) {
1216*e5436536SAndroid Build Coastguard Worker /* ...but don't remove all of them */
1217*e5436536SAndroid Build Coastguard Worker if (numBordFollow == 1) break;
1218*e5436536SAndroid Build Coastguard Worker
1219*e5436536SAndroid Build Coastguard Worker numBordFollow--;
1220*e5436536SAndroid Build Coastguard Worker bordMaxFollow = v_bordFollow[numBordFollow - 1];
1221*e5436536SAndroid Build Coastguard Worker middle = bmin - bordMaxFollow;
1222*e5436536SAndroid Build Coastguard Worker }
1223*e5436536SAndroid Build Coastguard Worker
1224*e5436536SAndroid Build Coastguard Worker /* if this isn't enough, remove new non-fill borders */
1225*e5436536SAndroid Build Coastguard Worker if (middle < 0) {
1226*e5436536SAndroid Build Coastguard Worker for (l = 0, m = 0; l < *length_v_bord; l++) {
1227*e5436536SAndroid Build Coastguard Worker if (v_bord[l] > bordMaxFollow) {
1228*e5436536SAndroid Build Coastguard Worker v_bord[m] = v_bord[l];
1229*e5436536SAndroid Build Coastguard Worker v_freq[m] = v_freq[l];
1230*e5436536SAndroid Build Coastguard Worker m++;
1231*e5436536SAndroid Build Coastguard Worker }
1232*e5436536SAndroid Build Coastguard Worker }
1233*e5436536SAndroid Build Coastguard Worker
1234*e5436536SAndroid Build Coastguard Worker *length_v_bord = l;
1235*e5436536SAndroid Build Coastguard Worker *length_v_freq = l;
1236*e5436536SAndroid Build Coastguard Worker
1237*e5436536SAndroid Build Coastguard Worker bmin = v_bord[0];
1238*e5436536SAndroid Build Coastguard Worker }
1239*e5436536SAndroid Build Coastguard Worker
1240*e5436536SAndroid Build Coastguard Worker /*------------------------------------------------------------------------
1241*e5436536SAndroid Build Coastguard Worker update modified follow-up data
1242*e5436536SAndroid Build Coastguard Worker ------------------------------------------------------------------------*/
1243*e5436536SAndroid Build Coastguard Worker
1244*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow = numBordFollow;
1245*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow = numBordFollow;
1246*e5436536SAndroid Build Coastguard Worker
1247*e5436536SAndroid Build Coastguard Worker /* left relative borders correspond to follow-up */
1248*e5436536SAndroid Build Coastguard Worker *nL = numBordFollow - 1;
1249*e5436536SAndroid Build Coastguard Worker
1250*e5436536SAndroid Build Coastguard Worker /*------------------------------------------------------------------------
1251*e5436536SAndroid Build Coastguard Worker take care of intervals ii through iv
1252*e5436536SAndroid Build Coastguard Worker ------------------------------------------------------------------------*/
1253*e5436536SAndroid Build Coastguard Worker
1254*e5436536SAndroid Build Coastguard Worker /* now middle should be >= 0 */
1255*e5436536SAndroid Build Coastguard Worker middle = bmin - bordMaxFollow;
1256*e5436536SAndroid Build Coastguard Worker
1257*e5436536SAndroid Build Coastguard Worker if (middle <= dmin) /* (ii) */
1258*e5436536SAndroid Build Coastguard Worker {
1259*e5436536SAndroid Build Coastguard Worker b_new = *length_v_bord;
1260*e5436536SAndroid Build Coastguard Worker
1261*e5436536SAndroid Build Coastguard Worker if (v_tuningSegm[0] != 0) {
1262*e5436536SAndroid Build Coastguard Worker /* remove new "luxury" border and concatenate */
1263*e5436536SAndroid Build Coastguard Worker *length_v_bord = b_new - 1;
1264*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1265*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1266*e5436536SAndroid Build Coastguard Worker
1267*e5436536SAndroid Build Coastguard Worker *length_v_freq = b_new - 1;
1268*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq + 1, length_v_freq, v_freqFollow,
1269*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1270*e5436536SAndroid Build Coastguard Worker
1271*e5436536SAndroid Build Coastguard Worker } else if (*length_v_bordFollow > 1) {
1272*e5436536SAndroid Build Coastguard Worker /* remove old border and concatenate */
1273*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1274*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow - 1);
1275*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1276*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow - 1);
1277*e5436536SAndroid Build Coastguard Worker
1278*e5436536SAndroid Build Coastguard Worker *nL = *nL - 1;
1279*e5436536SAndroid Build Coastguard Worker } else {
1280*e5436536SAndroid Build Coastguard Worker /* remove new border and concatenate */
1281*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_bord - 1; i++) v_bord[i] = v_bord[i + 1];
1282*e5436536SAndroid Build Coastguard Worker
1283*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_freq - 1; i++) v_freq[i] = v_freq[i + 1];
1284*e5436536SAndroid Build Coastguard Worker
1285*e5436536SAndroid Build Coastguard Worker *length_v_bord = b_new - 1;
1286*e5436536SAndroid Build Coastguard Worker *length_v_freq = b_new - 1;
1287*e5436536SAndroid Build Coastguard Worker
1288*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1289*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1290*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1291*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1292*e5436536SAndroid Build Coastguard Worker }
1293*e5436536SAndroid Build Coastguard Worker } else if ((middle >= dmin) && (middle <= dmax)) /* (iii) */
1294*e5436536SAndroid Build Coastguard Worker {
1295*e5436536SAndroid Build Coastguard Worker /* concatenate */
1296*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1297*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1298*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1299*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1300*e5436536SAndroid Build Coastguard Worker
1301*e5436536SAndroid Build Coastguard Worker } else /* (iv) */
1302*e5436536SAndroid Build Coastguard Worker {
1303*e5436536SAndroid Build Coastguard Worker fillFramePre(dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin,
1304*e5436536SAndroid Build Coastguard Worker middle);
1305*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow,
1306*e5436536SAndroid Build Coastguard Worker *length_v_bordFollow);
1307*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow,
1308*e5436536SAndroid Build Coastguard Worker *length_v_freqFollow);
1309*e5436536SAndroid Build Coastguard Worker }
1310*e5436536SAndroid Build Coastguard Worker }
1311*e5436536SAndroid Build Coastguard Worker }
1312*e5436536SAndroid Build Coastguard Worker
1313*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1314*e5436536SAndroid Build Coastguard Worker Functionname: calcFrameClass
1315*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1316*e5436536SAndroid Build Coastguard Worker
1317*e5436536SAndroid Build Coastguard Worker Description:
1318*e5436536SAndroid Build Coastguard Worker
1319*e5436536SAndroid Build Coastguard Worker Arguments: INT* frameClass, INT* frameClassOld, INT tranFlag, INT* spreadFlag)
1320*e5436536SAndroid Build Coastguard Worker
1321*e5436536SAndroid Build Coastguard Worker Return: none
1322*e5436536SAndroid Build Coastguard Worker
1323*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
calcFrameClass(FRAME_CLASS * frameClass,FRAME_CLASS * frameClassOld,INT tranFlag,INT * spreadFlag)1324*e5436536SAndroid Build Coastguard Worker static void calcFrameClass(FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld,
1325*e5436536SAndroid Build Coastguard Worker INT tranFlag, INT *spreadFlag) {
1326*e5436536SAndroid Build Coastguard Worker switch (*frameClassOld) {
1327*e5436536SAndroid Build Coastguard Worker case FIXFIXonly:
1328*e5436536SAndroid Build Coastguard Worker case FIXFIX:
1329*e5436536SAndroid Build Coastguard Worker if (tranFlag)
1330*e5436536SAndroid Build Coastguard Worker *frameClass = FIXVAR;
1331*e5436536SAndroid Build Coastguard Worker else
1332*e5436536SAndroid Build Coastguard Worker *frameClass = FIXFIX;
1333*e5436536SAndroid Build Coastguard Worker break;
1334*e5436536SAndroid Build Coastguard Worker case FIXVAR:
1335*e5436536SAndroid Build Coastguard Worker if (tranFlag) {
1336*e5436536SAndroid Build Coastguard Worker *frameClass = VARVAR;
1337*e5436536SAndroid Build Coastguard Worker *spreadFlag = 0;
1338*e5436536SAndroid Build Coastguard Worker } else {
1339*e5436536SAndroid Build Coastguard Worker if (*spreadFlag)
1340*e5436536SAndroid Build Coastguard Worker *frameClass = VARVAR;
1341*e5436536SAndroid Build Coastguard Worker else
1342*e5436536SAndroid Build Coastguard Worker *frameClass = VARFIX;
1343*e5436536SAndroid Build Coastguard Worker }
1344*e5436536SAndroid Build Coastguard Worker break;
1345*e5436536SAndroid Build Coastguard Worker case VARFIX:
1346*e5436536SAndroid Build Coastguard Worker if (tranFlag)
1347*e5436536SAndroid Build Coastguard Worker *frameClass = FIXVAR;
1348*e5436536SAndroid Build Coastguard Worker else
1349*e5436536SAndroid Build Coastguard Worker *frameClass = FIXFIX;
1350*e5436536SAndroid Build Coastguard Worker break;
1351*e5436536SAndroid Build Coastguard Worker case VARVAR:
1352*e5436536SAndroid Build Coastguard Worker if (tranFlag) {
1353*e5436536SAndroid Build Coastguard Worker *frameClass = VARVAR;
1354*e5436536SAndroid Build Coastguard Worker *spreadFlag = 0;
1355*e5436536SAndroid Build Coastguard Worker } else {
1356*e5436536SAndroid Build Coastguard Worker if (*spreadFlag)
1357*e5436536SAndroid Build Coastguard Worker *frameClass = VARVAR;
1358*e5436536SAndroid Build Coastguard Worker else
1359*e5436536SAndroid Build Coastguard Worker *frameClass = VARFIX;
1360*e5436536SAndroid Build Coastguard Worker }
1361*e5436536SAndroid Build Coastguard Worker break;
1362*e5436536SAndroid Build Coastguard Worker };
1363*e5436536SAndroid Build Coastguard Worker
1364*e5436536SAndroid Build Coastguard Worker *frameClassOld = *frameClass;
1365*e5436536SAndroid Build Coastguard Worker }
1366*e5436536SAndroid Build Coastguard Worker
1367*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1368*e5436536SAndroid Build Coastguard Worker Functionname: specialCase
1369*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1370*e5436536SAndroid Build Coastguard Worker
1371*e5436536SAndroid Build Coastguard Worker Description:
1372*e5436536SAndroid Build Coastguard Worker
1373*e5436536SAndroid Build Coastguard Worker Arguments: spreadFlag
1374*e5436536SAndroid Build Coastguard Worker allowSpread
1375*e5436536SAndroid Build Coastguard Worker v_bord
1376*e5436536SAndroid Build Coastguard Worker length_v_bord
1377*e5436536SAndroid Build Coastguard Worker v_freq
1378*e5436536SAndroid Build Coastguard Worker length_v_freq
1379*e5436536SAndroid Build Coastguard Worker parts
1380*e5436536SAndroid Build Coastguard Worker d
1381*e5436536SAndroid Build Coastguard Worker
1382*e5436536SAndroid Build Coastguard Worker Return: none
1383*e5436536SAndroid Build Coastguard Worker
1384*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
specialCase(INT * spreadFlag,INT allowSpread,INT * v_bord,INT * length_v_bord,INT * v_freq,INT * length_v_freq,INT * parts,INT d)1385*e5436536SAndroid Build Coastguard Worker static void specialCase(INT *spreadFlag, INT allowSpread, INT *v_bord,
1386*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT *v_freq, INT *length_v_freq,
1387*e5436536SAndroid Build Coastguard Worker INT *parts, INT d) {
1388*e5436536SAndroid Build Coastguard Worker INT L;
1389*e5436536SAndroid Build Coastguard Worker
1390*e5436536SAndroid Build Coastguard Worker L = *length_v_bord;
1391*e5436536SAndroid Build Coastguard Worker
1392*e5436536SAndroid Build Coastguard Worker if (allowSpread) { /* add one "step 8" */
1393*e5436536SAndroid Build Coastguard Worker *spreadFlag = 1;
1394*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_bord, length_v_bord, v_bord[L - 1] + 8);
1395*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_freq, length_v_freq, 1);
1396*e5436536SAndroid Build Coastguard Worker (*parts)++;
1397*e5436536SAndroid Build Coastguard Worker } else {
1398*e5436536SAndroid Build Coastguard Worker if (d == 1) { /* stretch one slot */
1399*e5436536SAndroid Build Coastguard Worker *length_v_bord = L - 1;
1400*e5436536SAndroid Build Coastguard Worker *length_v_freq = L - 1;
1401*e5436536SAndroid Build Coastguard Worker } else {
1402*e5436536SAndroid Build Coastguard Worker if ((v_bord[L - 1] - v_bord[L - 2]) > 2) { /* compress one quant step */
1403*e5436536SAndroid Build Coastguard Worker v_bord[L - 1] = v_bord[L - 1] - 2;
1404*e5436536SAndroid Build Coastguard Worker v_freq[*length_v_freq - 1] = 0; /* use low res for short segment */
1405*e5436536SAndroid Build Coastguard Worker }
1406*e5436536SAndroid Build Coastguard Worker }
1407*e5436536SAndroid Build Coastguard Worker }
1408*e5436536SAndroid Build Coastguard Worker }
1409*e5436536SAndroid Build Coastguard Worker
1410*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1411*e5436536SAndroid Build Coastguard Worker Functionname: calcCmonBorder
1412*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1413*e5436536SAndroid Build Coastguard Worker
1414*e5436536SAndroid Build Coastguard Worker Description:
1415*e5436536SAndroid Build Coastguard Worker
1416*e5436536SAndroid Build Coastguard Worker Arguments: i_cmon
1417*e5436536SAndroid Build Coastguard Worker i_tran
1418*e5436536SAndroid Build Coastguard Worker v_bord
1419*e5436536SAndroid Build Coastguard Worker length_v_bord
1420*e5436536SAndroid Build Coastguard Worker tran
1421*e5436536SAndroid Build Coastguard Worker
1422*e5436536SAndroid Build Coastguard Worker Return: none
1423*e5436536SAndroid Build Coastguard Worker
1424*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
calcCmonBorder(INT * i_cmon,INT * i_tran,INT * v_bord,INT * length_v_bord,INT tran,INT bufferFrameStart,INT numberTimeSlots)1425*e5436536SAndroid Build Coastguard Worker static void calcCmonBorder(INT *i_cmon, INT *i_tran, INT *v_bord,
1426*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT tran, INT bufferFrameStart,
1427*e5436536SAndroid Build Coastguard Worker INT numberTimeSlots) { /* FH 00-06-26 */
1428*e5436536SAndroid Build Coastguard Worker INT i;
1429*e5436536SAndroid Build Coastguard Worker
1430*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_bord; i++)
1431*e5436536SAndroid Build Coastguard Worker if (v_bord[i] >= bufferFrameStart + numberTimeSlots) { /* FH 00-06-26 */
1432*e5436536SAndroid Build Coastguard Worker *i_cmon = i;
1433*e5436536SAndroid Build Coastguard Worker break;
1434*e5436536SAndroid Build Coastguard Worker }
1435*e5436536SAndroid Build Coastguard Worker
1436*e5436536SAndroid Build Coastguard Worker /* keep track of transient: */
1437*e5436536SAndroid Build Coastguard Worker for (i = 0; i < *length_v_bord; i++)
1438*e5436536SAndroid Build Coastguard Worker if (v_bord[i] >= tran) {
1439*e5436536SAndroid Build Coastguard Worker *i_tran = i;
1440*e5436536SAndroid Build Coastguard Worker break;
1441*e5436536SAndroid Build Coastguard Worker } else
1442*e5436536SAndroid Build Coastguard Worker *i_tran = EMPTY;
1443*e5436536SAndroid Build Coastguard Worker }
1444*e5436536SAndroid Build Coastguard Worker
1445*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1446*e5436536SAndroid Build Coastguard Worker Functionname: keepForFollowUp
1447*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1448*e5436536SAndroid Build Coastguard Worker
1449*e5436536SAndroid Build Coastguard Worker Description:
1450*e5436536SAndroid Build Coastguard Worker
1451*e5436536SAndroid Build Coastguard Worker Arguments: v_bordFollow
1452*e5436536SAndroid Build Coastguard Worker length_v_bordFollow
1453*e5436536SAndroid Build Coastguard Worker v_freqFollow
1454*e5436536SAndroid Build Coastguard Worker length_v_freqFollow
1455*e5436536SAndroid Build Coastguard Worker i_tranFollow
1456*e5436536SAndroid Build Coastguard Worker i_fillFollow
1457*e5436536SAndroid Build Coastguard Worker v_bord
1458*e5436536SAndroid Build Coastguard Worker length_v_bord
1459*e5436536SAndroid Build Coastguard Worker v_freq
1460*e5436536SAndroid Build Coastguard Worker i_cmon
1461*e5436536SAndroid Build Coastguard Worker i_tran
1462*e5436536SAndroid Build Coastguard Worker parts)
1463*e5436536SAndroid Build Coastguard Worker
1464*e5436536SAndroid Build Coastguard Worker Return: none
1465*e5436536SAndroid Build Coastguard Worker
1466*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
keepForFollowUp(INT * v_bordFollow,INT * length_v_bordFollow,INT * v_freqFollow,INT * length_v_freqFollow,INT * i_tranFollow,INT * i_fillFollow,INT * v_bord,INT * length_v_bord,INT * v_freq,INT i_cmon,INT i_tran,INT parts,INT numberTimeSlots)1467*e5436536SAndroid Build Coastguard Worker static void keepForFollowUp(INT *v_bordFollow, INT *length_v_bordFollow,
1468*e5436536SAndroid Build Coastguard Worker INT *v_freqFollow, INT *length_v_freqFollow,
1469*e5436536SAndroid Build Coastguard Worker INT *i_tranFollow, INT *i_fillFollow, INT *v_bord,
1470*e5436536SAndroid Build Coastguard Worker INT *length_v_bord, INT *v_freq, INT i_cmon,
1471*e5436536SAndroid Build Coastguard Worker INT i_tran, INT parts,
1472*e5436536SAndroid Build Coastguard Worker INT numberTimeSlots) { /* FH 00-06-26 */
1473*e5436536SAndroid Build Coastguard Worker INT L, i, j;
1474*e5436536SAndroid Build Coastguard Worker
1475*e5436536SAndroid Build Coastguard Worker L = *length_v_bord;
1476*e5436536SAndroid Build Coastguard Worker
1477*e5436536SAndroid Build Coastguard Worker (*length_v_bordFollow) = 0;
1478*e5436536SAndroid Build Coastguard Worker (*length_v_freqFollow) = 0;
1479*e5436536SAndroid Build Coastguard Worker
1480*e5436536SAndroid Build Coastguard Worker for (j = 0, i = i_cmon; i < L; i++, j++) {
1481*e5436536SAndroid Build Coastguard Worker v_bordFollow[j] = v_bord[i] - numberTimeSlots; /* FH 00-06-26 */
1482*e5436536SAndroid Build Coastguard Worker v_freqFollow[j] = v_freq[i];
1483*e5436536SAndroid Build Coastguard Worker (*length_v_bordFollow)++;
1484*e5436536SAndroid Build Coastguard Worker (*length_v_freqFollow)++;
1485*e5436536SAndroid Build Coastguard Worker }
1486*e5436536SAndroid Build Coastguard Worker if (i_tran != EMPTY)
1487*e5436536SAndroid Build Coastguard Worker *i_tranFollow = i_tran - i_cmon;
1488*e5436536SAndroid Build Coastguard Worker else
1489*e5436536SAndroid Build Coastguard Worker *i_tranFollow = EMPTY;
1490*e5436536SAndroid Build Coastguard Worker *i_fillFollow = L - (parts - 1) - i_cmon;
1491*e5436536SAndroid Build Coastguard Worker }
1492*e5436536SAndroid Build Coastguard Worker
1493*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1494*e5436536SAndroid Build Coastguard Worker Functionname: calcCtrlSignal
1495*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1496*e5436536SAndroid Build Coastguard Worker
1497*e5436536SAndroid Build Coastguard Worker Description:
1498*e5436536SAndroid Build Coastguard Worker
1499*e5436536SAndroid Build Coastguard Worker Arguments: hSbrGrid
1500*e5436536SAndroid Build Coastguard Worker frameClass
1501*e5436536SAndroid Build Coastguard Worker v_bord
1502*e5436536SAndroid Build Coastguard Worker length_v_bord
1503*e5436536SAndroid Build Coastguard Worker v_freq
1504*e5436536SAndroid Build Coastguard Worker length_v_freq
1505*e5436536SAndroid Build Coastguard Worker i_cmon
1506*e5436536SAndroid Build Coastguard Worker i_tran
1507*e5436536SAndroid Build Coastguard Worker spreadFlag
1508*e5436536SAndroid Build Coastguard Worker nL
1509*e5436536SAndroid Build Coastguard Worker
1510*e5436536SAndroid Build Coastguard Worker Return: none
1511*e5436536SAndroid Build Coastguard Worker
1512*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
calcCtrlSignal(HANDLE_SBR_GRID hSbrGrid,FRAME_CLASS frameClass,INT * v_bord,INT length_v_bord,INT * v_freq,INT length_v_freq,INT i_cmon,INT i_tran,INT spreadFlag,INT nL)1513*e5436536SAndroid Build Coastguard Worker static void calcCtrlSignal(HANDLE_SBR_GRID hSbrGrid, FRAME_CLASS frameClass,
1514*e5436536SAndroid Build Coastguard Worker INT *v_bord, INT length_v_bord, INT *v_freq,
1515*e5436536SAndroid Build Coastguard Worker INT length_v_freq, INT i_cmon, INT i_tran,
1516*e5436536SAndroid Build Coastguard Worker INT spreadFlag, INT nL) {
1517*e5436536SAndroid Build Coastguard Worker INT i, r, a, n, p, b, aL, aR, ntot, nmax, nR;
1518*e5436536SAndroid Build Coastguard Worker
1519*e5436536SAndroid Build Coastguard Worker INT *v_f = hSbrGrid->v_f;
1520*e5436536SAndroid Build Coastguard Worker INT *v_fLR = hSbrGrid->v_fLR;
1521*e5436536SAndroid Build Coastguard Worker INT *v_r = hSbrGrid->bs_rel_bord;
1522*e5436536SAndroid Build Coastguard Worker INT *v_rL = hSbrGrid->bs_rel_bord_0;
1523*e5436536SAndroid Build Coastguard Worker INT *v_rR = hSbrGrid->bs_rel_bord_1;
1524*e5436536SAndroid Build Coastguard Worker
1525*e5436536SAndroid Build Coastguard Worker INT length_v_r = 0;
1526*e5436536SAndroid Build Coastguard Worker INT length_v_rR = 0;
1527*e5436536SAndroid Build Coastguard Worker INT length_v_rL = 0;
1528*e5436536SAndroid Build Coastguard Worker
1529*e5436536SAndroid Build Coastguard Worker switch (frameClass) {
1530*e5436536SAndroid Build Coastguard Worker case FIXVAR:
1531*e5436536SAndroid Build Coastguard Worker /* absolute border: */
1532*e5436536SAndroid Build Coastguard Worker
1533*e5436536SAndroid Build Coastguard Worker a = v_bord[i_cmon];
1534*e5436536SAndroid Build Coastguard Worker
1535*e5436536SAndroid Build Coastguard Worker /* relative borders: */
1536*e5436536SAndroid Build Coastguard Worker length_v_r = 0;
1537*e5436536SAndroid Build Coastguard Worker i = i_cmon;
1538*e5436536SAndroid Build Coastguard Worker
1539*e5436536SAndroid Build Coastguard Worker while (i >= 1) {
1540*e5436536SAndroid Build Coastguard Worker r = v_bord[i] - v_bord[i - 1];
1541*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_r, &length_v_r, r);
1542*e5436536SAndroid Build Coastguard Worker i--;
1543*e5436536SAndroid Build Coastguard Worker }
1544*e5436536SAndroid Build Coastguard Worker
1545*e5436536SAndroid Build Coastguard Worker /* number of relative borders: */
1546*e5436536SAndroid Build Coastguard Worker n = length_v_r;
1547*e5436536SAndroid Build Coastguard Worker
1548*e5436536SAndroid Build Coastguard Worker /* freq res: */
1549*e5436536SAndroid Build Coastguard Worker for (i = 0; i < i_cmon; i++) v_f[i] = v_freq[i_cmon - 1 - i];
1550*e5436536SAndroid Build Coastguard Worker v_f[i_cmon] = 1;
1551*e5436536SAndroid Build Coastguard Worker
1552*e5436536SAndroid Build Coastguard Worker /* pointer: */
1553*e5436536SAndroid Build Coastguard Worker p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0);
1554*e5436536SAndroid Build Coastguard Worker
1555*e5436536SAndroid Build Coastguard Worker hSbrGrid->frameClass = frameClass;
1556*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_abs_bord = a;
1557*e5436536SAndroid Build Coastguard Worker hSbrGrid->n = n;
1558*e5436536SAndroid Build Coastguard Worker hSbrGrid->p = p;
1559*e5436536SAndroid Build Coastguard Worker
1560*e5436536SAndroid Build Coastguard Worker break;
1561*e5436536SAndroid Build Coastguard Worker case VARFIX:
1562*e5436536SAndroid Build Coastguard Worker /* absolute border: */
1563*e5436536SAndroid Build Coastguard Worker a = v_bord[0];
1564*e5436536SAndroid Build Coastguard Worker
1565*e5436536SAndroid Build Coastguard Worker /* relative borders: */
1566*e5436536SAndroid Build Coastguard Worker length_v_r = 0;
1567*e5436536SAndroid Build Coastguard Worker
1568*e5436536SAndroid Build Coastguard Worker for (i = 1; i < length_v_bord; i++) {
1569*e5436536SAndroid Build Coastguard Worker r = v_bord[i] - v_bord[i - 1];
1570*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_r, &length_v_r, r);
1571*e5436536SAndroid Build Coastguard Worker }
1572*e5436536SAndroid Build Coastguard Worker
1573*e5436536SAndroid Build Coastguard Worker /* number of relative borders: */
1574*e5436536SAndroid Build Coastguard Worker n = length_v_r;
1575*e5436536SAndroid Build Coastguard Worker
1576*e5436536SAndroid Build Coastguard Worker /* freq res: */
1577*e5436536SAndroid Build Coastguard Worker FDKmemcpy(v_f, v_freq, length_v_freq * sizeof(INT));
1578*e5436536SAndroid Build Coastguard Worker
1579*e5436536SAndroid Build Coastguard Worker /* pointer: */
1580*e5436536SAndroid Build Coastguard Worker p = (i_tran >= 0 && i_tran != EMPTY) ? (i_tran + 1) : (0);
1581*e5436536SAndroid Build Coastguard Worker
1582*e5436536SAndroid Build Coastguard Worker hSbrGrid->frameClass = frameClass;
1583*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_abs_bord = a;
1584*e5436536SAndroid Build Coastguard Worker hSbrGrid->n = n;
1585*e5436536SAndroid Build Coastguard Worker hSbrGrid->p = p;
1586*e5436536SAndroid Build Coastguard Worker
1587*e5436536SAndroid Build Coastguard Worker break;
1588*e5436536SAndroid Build Coastguard Worker case VARVAR:
1589*e5436536SAndroid Build Coastguard Worker if (spreadFlag) {
1590*e5436536SAndroid Build Coastguard Worker /* absolute borders: */
1591*e5436536SAndroid Build Coastguard Worker b = length_v_bord;
1592*e5436536SAndroid Build Coastguard Worker
1593*e5436536SAndroid Build Coastguard Worker aL = v_bord[0];
1594*e5436536SAndroid Build Coastguard Worker aR = v_bord[b - 1];
1595*e5436536SAndroid Build Coastguard Worker
1596*e5436536SAndroid Build Coastguard Worker /* number of relative borders: */
1597*e5436536SAndroid Build Coastguard Worker ntot = b - 2;
1598*e5436536SAndroid Build Coastguard Worker
1599*e5436536SAndroid Build Coastguard Worker nmax = 2; /* n: {0,1,2} */
1600*e5436536SAndroid Build Coastguard Worker if (ntot > nmax) {
1601*e5436536SAndroid Build Coastguard Worker nL = nmax;
1602*e5436536SAndroid Build Coastguard Worker nR = ntot - nmax;
1603*e5436536SAndroid Build Coastguard Worker } else {
1604*e5436536SAndroid Build Coastguard Worker nL = ntot;
1605*e5436536SAndroid Build Coastguard Worker nR = 0;
1606*e5436536SAndroid Build Coastguard Worker }
1607*e5436536SAndroid Build Coastguard Worker
1608*e5436536SAndroid Build Coastguard Worker /* relative borders: */
1609*e5436536SAndroid Build Coastguard Worker length_v_rL = 0;
1610*e5436536SAndroid Build Coastguard Worker for (i = 1; i <= nL; i++) {
1611*e5436536SAndroid Build Coastguard Worker r = v_bord[i] - v_bord[i - 1];
1612*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_rL, &length_v_rL, r);
1613*e5436536SAndroid Build Coastguard Worker }
1614*e5436536SAndroid Build Coastguard Worker
1615*e5436536SAndroid Build Coastguard Worker length_v_rR = 0;
1616*e5436536SAndroid Build Coastguard Worker i = b - 1;
1617*e5436536SAndroid Build Coastguard Worker while (i >= b - nR) {
1618*e5436536SAndroid Build Coastguard Worker r = v_bord[i] - v_bord[i - 1];
1619*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_rR, &length_v_rR, r);
1620*e5436536SAndroid Build Coastguard Worker i--;
1621*e5436536SAndroid Build Coastguard Worker }
1622*e5436536SAndroid Build Coastguard Worker
1623*e5436536SAndroid Build Coastguard Worker /* pointer (only one due to constraint in frame info): */
1624*e5436536SAndroid Build Coastguard Worker p = (i_tran > 0 && i_tran != EMPTY) ? (b - i_tran) : (0);
1625*e5436536SAndroid Build Coastguard Worker
1626*e5436536SAndroid Build Coastguard Worker /* freq res: */
1627*e5436536SAndroid Build Coastguard Worker
1628*e5436536SAndroid Build Coastguard Worker for (i = 0; i < b - 1; i++) v_fLR[i] = v_freq[i];
1629*e5436536SAndroid Build Coastguard Worker } else {
1630*e5436536SAndroid Build Coastguard Worker length_v_bord = i_cmon + 1;
1631*e5436536SAndroid Build Coastguard Worker
1632*e5436536SAndroid Build Coastguard Worker /* absolute borders: */
1633*e5436536SAndroid Build Coastguard Worker b = length_v_bord;
1634*e5436536SAndroid Build Coastguard Worker
1635*e5436536SAndroid Build Coastguard Worker aL = v_bord[0];
1636*e5436536SAndroid Build Coastguard Worker aR = v_bord[b - 1];
1637*e5436536SAndroid Build Coastguard Worker
1638*e5436536SAndroid Build Coastguard Worker /* number of relative borders: */
1639*e5436536SAndroid Build Coastguard Worker ntot = b - 2;
1640*e5436536SAndroid Build Coastguard Worker nR = ntot - nL;
1641*e5436536SAndroid Build Coastguard Worker
1642*e5436536SAndroid Build Coastguard Worker /* relative borders: */
1643*e5436536SAndroid Build Coastguard Worker length_v_rL = 0;
1644*e5436536SAndroid Build Coastguard Worker for (i = 1; i <= nL; i++) {
1645*e5436536SAndroid Build Coastguard Worker r = v_bord[i] - v_bord[i - 1];
1646*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_rL, &length_v_rL, r);
1647*e5436536SAndroid Build Coastguard Worker }
1648*e5436536SAndroid Build Coastguard Worker
1649*e5436536SAndroid Build Coastguard Worker length_v_rR = 0;
1650*e5436536SAndroid Build Coastguard Worker i = b - 1;
1651*e5436536SAndroid Build Coastguard Worker while (i >= b - nR) {
1652*e5436536SAndroid Build Coastguard Worker r = v_bord[i] - v_bord[i - 1];
1653*e5436536SAndroid Build Coastguard Worker FDKsbrEnc_AddRight(v_rR, &length_v_rR, r);
1654*e5436536SAndroid Build Coastguard Worker i--;
1655*e5436536SAndroid Build Coastguard Worker }
1656*e5436536SAndroid Build Coastguard Worker
1657*e5436536SAndroid Build Coastguard Worker /* pointer (only one due to constraint in frame info): */
1658*e5436536SAndroid Build Coastguard Worker p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0);
1659*e5436536SAndroid Build Coastguard Worker
1660*e5436536SAndroid Build Coastguard Worker /* freq res: */
1661*e5436536SAndroid Build Coastguard Worker for (i = 0; i < b - 1; i++) v_fLR[i] = v_freq[i];
1662*e5436536SAndroid Build Coastguard Worker }
1663*e5436536SAndroid Build Coastguard Worker
1664*e5436536SAndroid Build Coastguard Worker hSbrGrid->frameClass = frameClass;
1665*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_abs_bord_0 = aL;
1666*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_abs_bord_1 = aR;
1667*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_num_rel_0 = nL;
1668*e5436536SAndroid Build Coastguard Worker hSbrGrid->bs_num_rel_1 = nR;
1669*e5436536SAndroid Build Coastguard Worker hSbrGrid->p = p;
1670*e5436536SAndroid Build Coastguard Worker
1671*e5436536SAndroid Build Coastguard Worker break;
1672*e5436536SAndroid Build Coastguard Worker
1673*e5436536SAndroid Build Coastguard Worker default:
1674*e5436536SAndroid Build Coastguard Worker /* do nothing */
1675*e5436536SAndroid Build Coastguard Worker break;
1676*e5436536SAndroid Build Coastguard Worker }
1677*e5436536SAndroid Build Coastguard Worker }
1678*e5436536SAndroid Build Coastguard Worker
1679*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1680*e5436536SAndroid Build Coastguard Worker Functionname: createDefFrameInfo
1681*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1682*e5436536SAndroid Build Coastguard Worker
1683*e5436536SAndroid Build Coastguard Worker Description: Copies the default (static) frameInfo structs to the frameInfo
1684*e5436536SAndroid Build Coastguard Worker passed by reference; only used for FIXFIX frames
1685*e5436536SAndroid Build Coastguard Worker
1686*e5436536SAndroid Build Coastguard Worker Arguments: hFrameInfo - HANLDE_SBR_FRAME_INFO
1687*e5436536SAndroid Build Coastguard Worker nEnv - INT
1688*e5436536SAndroid Build Coastguard Worker nTimeSlots - INT
1689*e5436536SAndroid Build Coastguard Worker
1690*e5436536SAndroid Build Coastguard Worker Return: none; hSbrFrameInfo contains a copy of the default frameInfo
1691*e5436536SAndroid Build Coastguard Worker
1692*e5436536SAndroid Build Coastguard Worker Written: Andreas Schneider
1693*e5436536SAndroid Build Coastguard Worker Revised:
1694*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
createDefFrameInfo(HANDLE_SBR_FRAME_INFO hSbrFrameInfo,INT nEnv,INT nTimeSlots)1695*e5436536SAndroid Build Coastguard Worker static void createDefFrameInfo(HANDLE_SBR_FRAME_INFO hSbrFrameInfo, INT nEnv,
1696*e5436536SAndroid Build Coastguard Worker INT nTimeSlots) {
1697*e5436536SAndroid Build Coastguard Worker switch (nEnv) {
1698*e5436536SAndroid Build Coastguard Worker case 1:
1699*e5436536SAndroid Build Coastguard Worker switch (nTimeSlots) {
1700*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1920:
1701*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo1_1920, sizeof(SBR_FRAME_INFO));
1702*e5436536SAndroid Build Coastguard Worker break;
1703*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2048:
1704*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo1_2048, sizeof(SBR_FRAME_INFO));
1705*e5436536SAndroid Build Coastguard Worker break;
1706*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1152:
1707*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo1_1152, sizeof(SBR_FRAME_INFO));
1708*e5436536SAndroid Build Coastguard Worker break;
1709*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2304:
1710*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo1_2304, sizeof(SBR_FRAME_INFO));
1711*e5436536SAndroid Build Coastguard Worker break;
1712*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_512LD:
1713*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo1_512LD, sizeof(SBR_FRAME_INFO));
1714*e5436536SAndroid Build Coastguard Worker break;
1715*e5436536SAndroid Build Coastguard Worker default:
1716*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0);
1717*e5436536SAndroid Build Coastguard Worker }
1718*e5436536SAndroid Build Coastguard Worker break;
1719*e5436536SAndroid Build Coastguard Worker case 2:
1720*e5436536SAndroid Build Coastguard Worker switch (nTimeSlots) {
1721*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1920:
1722*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo2_1920, sizeof(SBR_FRAME_INFO));
1723*e5436536SAndroid Build Coastguard Worker break;
1724*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2048:
1725*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo2_2048, sizeof(SBR_FRAME_INFO));
1726*e5436536SAndroid Build Coastguard Worker break;
1727*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1152:
1728*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo2_1152, sizeof(SBR_FRAME_INFO));
1729*e5436536SAndroid Build Coastguard Worker break;
1730*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2304:
1731*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo2_2304, sizeof(SBR_FRAME_INFO));
1732*e5436536SAndroid Build Coastguard Worker break;
1733*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_512LD:
1734*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo2_512LD, sizeof(SBR_FRAME_INFO));
1735*e5436536SAndroid Build Coastguard Worker break;
1736*e5436536SAndroid Build Coastguard Worker default:
1737*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0);
1738*e5436536SAndroid Build Coastguard Worker }
1739*e5436536SAndroid Build Coastguard Worker break;
1740*e5436536SAndroid Build Coastguard Worker case 4:
1741*e5436536SAndroid Build Coastguard Worker switch (nTimeSlots) {
1742*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1920:
1743*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo4_1920, sizeof(SBR_FRAME_INFO));
1744*e5436536SAndroid Build Coastguard Worker break;
1745*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2048:
1746*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo4_2048, sizeof(SBR_FRAME_INFO));
1747*e5436536SAndroid Build Coastguard Worker break;
1748*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_1152:
1749*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo4_1152, sizeof(SBR_FRAME_INFO));
1750*e5436536SAndroid Build Coastguard Worker break;
1751*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_2304:
1752*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo4_2304, sizeof(SBR_FRAME_INFO));
1753*e5436536SAndroid Build Coastguard Worker break;
1754*e5436536SAndroid Build Coastguard Worker case NUMBER_TIME_SLOTS_512LD:
1755*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hSbrFrameInfo, &frameInfo4_512LD, sizeof(SBR_FRAME_INFO));
1756*e5436536SAndroid Build Coastguard Worker break;
1757*e5436536SAndroid Build Coastguard Worker default:
1758*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0);
1759*e5436536SAndroid Build Coastguard Worker }
1760*e5436536SAndroid Build Coastguard Worker break;
1761*e5436536SAndroid Build Coastguard Worker default:
1762*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0);
1763*e5436536SAndroid Build Coastguard Worker }
1764*e5436536SAndroid Build Coastguard Worker }
1765*e5436536SAndroid Build Coastguard Worker
1766*e5436536SAndroid Build Coastguard Worker /*******************************************************************************
1767*e5436536SAndroid Build Coastguard Worker Functionname: ctrlSignal2FrameInfo
1768*e5436536SAndroid Build Coastguard Worker *******************************************************************************
1769*e5436536SAndroid Build Coastguard Worker
1770*e5436536SAndroid Build Coastguard Worker Description: Convert "clear-text" sbr_grid() to "frame info" used by the
1771*e5436536SAndroid Build Coastguard Worker envelope and noise floor estimators.
1772*e5436536SAndroid Build Coastguard Worker This is basically (except for "low level" calculations) the
1773*e5436536SAndroid Build Coastguard Worker bitstream decoder defined in the MPEG-4 standard, sub clause
1774*e5436536SAndroid Build Coastguard Worker 4.6.18.3.3, Time / Frequency Grid. See inline comments for
1775*e5436536SAndroid Build Coastguard Worker explanation of the shorten and noise border algorithms.
1776*e5436536SAndroid Build Coastguard Worker
1777*e5436536SAndroid Build Coastguard Worker Arguments: hSbrGrid - source
1778*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo - destination
1779*e5436536SAndroid Build Coastguard Worker freq_res_fixfix - frequency resolution for FIXFIX frames
1780*e5436536SAndroid Build Coastguard Worker
1781*e5436536SAndroid Build Coastguard Worker Return: void; hSbrFrameInfo contains the updated FRAME_INFO struct
1782*e5436536SAndroid Build Coastguard Worker
1783*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
ctrlSignal2FrameInfo(HANDLE_SBR_GRID hSbrGrid,HANDLE_SBR_FRAME_INFO hSbrFrameInfo,FREQ_RES * freq_res_fixfix)1784*e5436536SAndroid Build Coastguard Worker static void ctrlSignal2FrameInfo(
1785*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_GRID hSbrGrid, /* input : the grid handle */
1786*e5436536SAndroid Build Coastguard Worker HANDLE_SBR_FRAME_INFO hSbrFrameInfo, /* output: the frame info handle */
1787*e5436536SAndroid Build Coastguard Worker FREQ_RES
1788*e5436536SAndroid Build Coastguard Worker *freq_res_fixfix /* in/out: frequency resolution for FIXFIX frames */
1789*e5436536SAndroid Build Coastguard Worker ) {
1790*e5436536SAndroid Build Coastguard Worker INT frameSplit = 0;
1791*e5436536SAndroid Build Coastguard Worker INT nEnv = 0, border = 0, i, k, p /*?*/;
1792*e5436536SAndroid Build Coastguard Worker INT *v_r = hSbrGrid->bs_rel_bord;
1793*e5436536SAndroid Build Coastguard Worker INT *v_f = hSbrGrid->v_f;
1794*e5436536SAndroid Build Coastguard Worker
1795*e5436536SAndroid Build Coastguard Worker FRAME_CLASS frameClass = hSbrGrid->frameClass;
1796*e5436536SAndroid Build Coastguard Worker INT bufferFrameStart = hSbrGrid->bufferFrameStart;
1797*e5436536SAndroid Build Coastguard Worker INT numberTimeSlots = hSbrGrid->numberTimeSlots;
1798*e5436536SAndroid Build Coastguard Worker
1799*e5436536SAndroid Build Coastguard Worker switch (frameClass) {
1800*e5436536SAndroid Build Coastguard Worker case FIXFIX:
1801*e5436536SAndroid Build Coastguard Worker createDefFrameInfo(hSbrFrameInfo, hSbrGrid->bs_num_env, numberTimeSlots);
1802*e5436536SAndroid Build Coastguard Worker
1803*e5436536SAndroid Build Coastguard Worker frameSplit = (hSbrFrameInfo->nEnvelopes > 1);
1804*e5436536SAndroid Build Coastguard Worker for (i = 0; i < hSbrFrameInfo->nEnvelopes; i++) {
1805*e5436536SAndroid Build Coastguard Worker hSbrGrid->v_f[i] = hSbrFrameInfo->freqRes[i] =
1806*e5436536SAndroid Build Coastguard Worker freq_res_fixfix[frameSplit];
1807*e5436536SAndroid Build Coastguard Worker }
1808*e5436536SAndroid Build Coastguard Worker break;
1809*e5436536SAndroid Build Coastguard Worker
1810*e5436536SAndroid Build Coastguard Worker case FIXVAR:
1811*e5436536SAndroid Build Coastguard Worker case VARFIX:
1812*e5436536SAndroid Build Coastguard Worker nEnv = hSbrGrid->n + 1; /* read n [SBR_NUM_BITS bits] */ /*? snd*/
1813*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(nEnv <= MAX_ENVELOPES_FIXVAR_VARFIX);
1814*e5436536SAndroid Build Coastguard Worker
1815*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nEnvelopes = nEnv;
1816*e5436536SAndroid Build Coastguard Worker
1817*e5436536SAndroid Build Coastguard Worker border = hSbrGrid->bs_abs_bord; /* read the absolute border */
1818*e5436536SAndroid Build Coastguard Worker
1819*e5436536SAndroid Build Coastguard Worker if (nEnv == 1)
1820*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nNoiseEnvelopes = 1;
1821*e5436536SAndroid Build Coastguard Worker else
1822*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nNoiseEnvelopes = 2;
1823*e5436536SAndroid Build Coastguard Worker
1824*e5436536SAndroid Build Coastguard Worker break;
1825*e5436536SAndroid Build Coastguard Worker
1826*e5436536SAndroid Build Coastguard Worker default:
1827*e5436536SAndroid Build Coastguard Worker /* do nothing */
1828*e5436536SAndroid Build Coastguard Worker break;
1829*e5436536SAndroid Build Coastguard Worker }
1830*e5436536SAndroid Build Coastguard Worker
1831*e5436536SAndroid Build Coastguard Worker switch (frameClass) {
1832*e5436536SAndroid Build Coastguard Worker case FIXVAR:
1833*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[0] =
1834*e5436536SAndroid Build Coastguard Worker bufferFrameStart; /* start-position of 1st envelope */
1835*e5436536SAndroid Build Coastguard Worker
1836*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[nEnv] = border;
1837*e5436536SAndroid Build Coastguard Worker
1838*e5436536SAndroid Build Coastguard Worker for (k = 0, i = nEnv - 1; k < nEnv - 1; k++, i--) {
1839*e5436536SAndroid Build Coastguard Worker border -= v_r[k];
1840*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[i] = border;
1841*e5436536SAndroid Build Coastguard Worker }
1842*e5436536SAndroid Build Coastguard Worker
1843*e5436536SAndroid Build Coastguard Worker /* make either envelope nr. nEnv + 1 - p short; or don't shorten if p == 0
1844*e5436536SAndroid Build Coastguard Worker */
1845*e5436536SAndroid Build Coastguard Worker p = hSbrGrid->p;
1846*e5436536SAndroid Build Coastguard Worker if (p == 0) {
1847*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->shortEnv = 0;
1848*e5436536SAndroid Build Coastguard Worker } else {
1849*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->shortEnv = nEnv + 1 - p;
1850*e5436536SAndroid Build Coastguard Worker }
1851*e5436536SAndroid Build Coastguard Worker
1852*e5436536SAndroid Build Coastguard Worker for (k = 0, i = nEnv - 1; k < nEnv; k++, i--) {
1853*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->freqRes[i] = (FREQ_RES)v_f[k];
1854*e5436536SAndroid Build Coastguard Worker }
1855*e5436536SAndroid Build Coastguard Worker
1856*e5436536SAndroid Build Coastguard Worker /* if either there is no short envelope or the last envelope is short...
1857*e5436536SAndroid Build Coastguard Worker */
1858*e5436536SAndroid Build Coastguard Worker if (p == 0 || p == 1) {
1859*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1];
1860*e5436536SAndroid Build Coastguard Worker } else {
1861*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] =
1862*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv];
1863*e5436536SAndroid Build Coastguard Worker }
1864*e5436536SAndroid Build Coastguard Worker
1865*e5436536SAndroid Build Coastguard Worker break;
1866*e5436536SAndroid Build Coastguard Worker
1867*e5436536SAndroid Build Coastguard Worker case VARFIX:
1868*e5436536SAndroid Build Coastguard Worker /* in this case 'border' indicates the start of the 1st envelope */
1869*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[0] = border;
1870*e5436536SAndroid Build Coastguard Worker
1871*e5436536SAndroid Build Coastguard Worker for (k = 0; k < nEnv - 1; k++) {
1872*e5436536SAndroid Build Coastguard Worker border += v_r[k];
1873*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[k + 1] = border;
1874*e5436536SAndroid Build Coastguard Worker }
1875*e5436536SAndroid Build Coastguard Worker
1876*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[nEnv] = bufferFrameStart + numberTimeSlots;
1877*e5436536SAndroid Build Coastguard Worker
1878*e5436536SAndroid Build Coastguard Worker p = hSbrGrid->p;
1879*e5436536SAndroid Build Coastguard Worker if (p == 0 || p == 1) {
1880*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->shortEnv = 0;
1881*e5436536SAndroid Build Coastguard Worker } else {
1882*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->shortEnv = p - 1;
1883*e5436536SAndroid Build Coastguard Worker }
1884*e5436536SAndroid Build Coastguard Worker
1885*e5436536SAndroid Build Coastguard Worker for (k = 0; k < nEnv; k++) {
1886*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->freqRes[k] = (FREQ_RES)v_f[k];
1887*e5436536SAndroid Build Coastguard Worker }
1888*e5436536SAndroid Build Coastguard Worker
1889*e5436536SAndroid Build Coastguard Worker switch (p) {
1890*e5436536SAndroid Build Coastguard Worker case 0:
1891*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[1];
1892*e5436536SAndroid Build Coastguard Worker break;
1893*e5436536SAndroid Build Coastguard Worker case 1:
1894*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1];
1895*e5436536SAndroid Build Coastguard Worker break;
1896*e5436536SAndroid Build Coastguard Worker default:
1897*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] =
1898*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv];
1899*e5436536SAndroid Build Coastguard Worker break;
1900*e5436536SAndroid Build Coastguard Worker }
1901*e5436536SAndroid Build Coastguard Worker break;
1902*e5436536SAndroid Build Coastguard Worker
1903*e5436536SAndroid Build Coastguard Worker case VARVAR:
1904*e5436536SAndroid Build Coastguard Worker nEnv = hSbrGrid->bs_num_rel_0 + hSbrGrid->bs_num_rel_1 + 1;
1905*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(nEnv <= MAX_ENVELOPES_VARVAR); /* just to be sure */
1906*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nEnvelopes = nEnv;
1907*e5436536SAndroid Build Coastguard Worker
1908*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[0] = border = hSbrGrid->bs_abs_bord_0;
1909*e5436536SAndroid Build Coastguard Worker
1910*e5436536SAndroid Build Coastguard Worker for (k = 0, i = 1; k < hSbrGrid->bs_num_rel_0; k++, i++) {
1911*e5436536SAndroid Build Coastguard Worker border += hSbrGrid->bs_rel_bord_0[k];
1912*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[i] = border;
1913*e5436536SAndroid Build Coastguard Worker }
1914*e5436536SAndroid Build Coastguard Worker
1915*e5436536SAndroid Build Coastguard Worker border = hSbrGrid->bs_abs_bord_1;
1916*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[nEnv] = border;
1917*e5436536SAndroid Build Coastguard Worker
1918*e5436536SAndroid Build Coastguard Worker for (k = 0, i = nEnv - 1; k < hSbrGrid->bs_num_rel_1; k++, i--) {
1919*e5436536SAndroid Build Coastguard Worker border -= hSbrGrid->bs_rel_bord_1[k];
1920*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[i] = border;
1921*e5436536SAndroid Build Coastguard Worker }
1922*e5436536SAndroid Build Coastguard Worker
1923*e5436536SAndroid Build Coastguard Worker p = hSbrGrid->p;
1924*e5436536SAndroid Build Coastguard Worker if (p == 0) {
1925*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->shortEnv = 0;
1926*e5436536SAndroid Build Coastguard Worker } else {
1927*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->shortEnv = nEnv + 1 - p;
1928*e5436536SAndroid Build Coastguard Worker }
1929*e5436536SAndroid Build Coastguard Worker
1930*e5436536SAndroid Build Coastguard Worker for (k = 0; k < nEnv; k++) {
1931*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->freqRes[k] = (FREQ_RES)hSbrGrid->v_fLR[k];
1932*e5436536SAndroid Build Coastguard Worker }
1933*e5436536SAndroid Build Coastguard Worker
1934*e5436536SAndroid Build Coastguard Worker if (nEnv == 1) {
1935*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nNoiseEnvelopes = 1;
1936*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0;
1937*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] = hSbrGrid->bs_abs_bord_1;
1938*e5436536SAndroid Build Coastguard Worker } else {
1939*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->nNoiseEnvelopes = 2;
1940*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0;
1941*e5436536SAndroid Build Coastguard Worker
1942*e5436536SAndroid Build Coastguard Worker if (p == 0 || p == 1) {
1943*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1];
1944*e5436536SAndroid Build Coastguard Worker } else {
1945*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] =
1946*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv];
1947*e5436536SAndroid Build Coastguard Worker }
1948*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[2] = hSbrGrid->bs_abs_bord_1;
1949*e5436536SAndroid Build Coastguard Worker }
1950*e5436536SAndroid Build Coastguard Worker break;
1951*e5436536SAndroid Build Coastguard Worker
1952*e5436536SAndroid Build Coastguard Worker default:
1953*e5436536SAndroid Build Coastguard Worker /* do nothing */
1954*e5436536SAndroid Build Coastguard Worker break;
1955*e5436536SAndroid Build Coastguard Worker }
1956*e5436536SAndroid Build Coastguard Worker
1957*e5436536SAndroid Build Coastguard Worker if (frameClass == VARFIX || frameClass == FIXVAR) {
1958*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[0] = hSbrFrameInfo->borders[0];
1959*e5436536SAndroid Build Coastguard Worker if (nEnv == 1) {
1960*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv];
1961*e5436536SAndroid Build Coastguard Worker } else {
1962*e5436536SAndroid Build Coastguard Worker hSbrFrameInfo->bordersNoise[2] = hSbrFrameInfo->borders[nEnv];
1963*e5436536SAndroid Build Coastguard Worker }
1964*e5436536SAndroid Build Coastguard Worker }
1965*e5436536SAndroid Build Coastguard Worker }
1966