xref: /aosp_15_r20/external/aac/libSBRenc/src/fram_gen.cpp (revision e54365361535b070c2db7374cec45c159c7d0e7a)
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