1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker
21*15dc779aSAndroid Build Coastguard Worker #include <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
31*15dc779aSAndroid Build Coastguard Worker
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_freq_scaling.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_misc.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
39*15dc779aSAndroid Build Coastguard Worker
ixheaace_get_start_freq_4_1(WORD32 fs,WORD32 start_freq)40*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_start_freq_4_1(WORD32 fs, WORD32 start_freq) {
41*15dc779aSAndroid Build Coastguard Worker WORD32 minimum_k0;
42*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_start_offset;
43*15dc779aSAndroid Build Coastguard Worker
44*15dc779aSAndroid Build Coastguard Worker switch (fs) {
45*15dc779aSAndroid Build Coastguard Worker case 16000:
46*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 12;
47*15dc779aSAndroid Build Coastguard Worker break;
48*15dc779aSAndroid Build Coastguard Worker case 22050:
49*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 9;
50*15dc779aSAndroid Build Coastguard Worker break;
51*15dc779aSAndroid Build Coastguard Worker case 24000:
52*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 8;
53*15dc779aSAndroid Build Coastguard Worker break;
54*15dc779aSAndroid Build Coastguard Worker case 32000:
55*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 8;
56*15dc779aSAndroid Build Coastguard Worker break;
57*15dc779aSAndroid Build Coastguard Worker case 44100:
58*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 6;
59*15dc779aSAndroid Build Coastguard Worker break;
60*15dc779aSAndroid Build Coastguard Worker case 48000:
61*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 5;
62*15dc779aSAndroid Build Coastguard Worker break;
63*15dc779aSAndroid Build Coastguard Worker default:
64*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 5; /* illegal fs */
65*15dc779aSAndroid Build Coastguard Worker }
66*15dc779aSAndroid Build Coastguard Worker
67*15dc779aSAndroid Build Coastguard Worker switch (fs) {
68*15dc779aSAndroid Build Coastguard Worker case 16000: {
69*15dc779aSAndroid Build Coastguard Worker ptr_start_offset = &ixheaace_start_freq_16k_4_1[0];
70*15dc779aSAndroid Build Coastguard Worker } break;
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker case 22050: {
73*15dc779aSAndroid Build Coastguard Worker ptr_start_offset = &ixheaace_start_freq_22k_4_1[0];
74*15dc779aSAndroid Build Coastguard Worker } break;
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker case 24000: {
77*15dc779aSAndroid Build Coastguard Worker ptr_start_offset = &ixheaace_start_freq_24k_4_1[0];
78*15dc779aSAndroid Build Coastguard Worker } break;
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker case 32000: {
81*15dc779aSAndroid Build Coastguard Worker ptr_start_offset = &ixheaace_start_freq_32k_4_1[0];
82*15dc779aSAndroid Build Coastguard Worker } break;
83*15dc779aSAndroid Build Coastguard Worker
84*15dc779aSAndroid Build Coastguard Worker case 44100:
85*15dc779aSAndroid Build Coastguard Worker case 48000:
86*15dc779aSAndroid Build Coastguard Worker case 64000: {
87*15dc779aSAndroid Build Coastguard Worker ptr_start_offset = &ixheaace_start_freq_48k_4_1[0];
88*15dc779aSAndroid Build Coastguard Worker } break;
89*15dc779aSAndroid Build Coastguard Worker
90*15dc779aSAndroid Build Coastguard Worker case 88200:
91*15dc779aSAndroid Build Coastguard Worker case 96000: {
92*15dc779aSAndroid Build Coastguard Worker ptr_start_offset = &ixheaace_start_freq_96k_4_1[0];
93*15dc779aSAndroid Build Coastguard Worker } break;
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker default: {
96*15dc779aSAndroid Build Coastguard Worker ptr_start_offset = &ixheaace_start_freq_dflt_4_1[0];
97*15dc779aSAndroid Build Coastguard Worker }
98*15dc779aSAndroid Build Coastguard Worker }
99*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + ptr_start_offset[start_freq]);
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker
ixheaace_get_stop_freq_4_1(WORD32 fs,WORD32 stop_freq)102*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_stop_freq_4_1(WORD32 fs, WORD32 stop_freq) {
103*15dc779aSAndroid Build Coastguard Worker WORD32 result, i;
104*15dc779aSAndroid Build Coastguard Worker WORD32 *v_stop_freq = 0;
105*15dc779aSAndroid Build Coastguard Worker WORD32 k1_min;
106*15dc779aSAndroid Build Coastguard Worker WORD32 v_dstop[13];
107*15dc779aSAndroid Build Coastguard Worker
108*15dc779aSAndroid Build Coastguard Worker /* counting previous operations */
109*15dc779aSAndroid Build Coastguard Worker switch (fs) {
110*15dc779aSAndroid Build Coastguard Worker case 16000:
111*15dc779aSAndroid Build Coastguard Worker k1_min = 24;
112*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_16k_4_1[0];
113*15dc779aSAndroid Build Coastguard Worker break;
114*15dc779aSAndroid Build Coastguard Worker case 22050:
115*15dc779aSAndroid Build Coastguard Worker k1_min = 17;
116*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_22k_4_1[0];
117*15dc779aSAndroid Build Coastguard Worker break;
118*15dc779aSAndroid Build Coastguard Worker case 24000:
119*15dc779aSAndroid Build Coastguard Worker k1_min = 16;
120*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_24k_4_1[0];
121*15dc779aSAndroid Build Coastguard Worker break;
122*15dc779aSAndroid Build Coastguard Worker case 32000:
123*15dc779aSAndroid Build Coastguard Worker k1_min = 16;
124*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_32k_4_1[0];
125*15dc779aSAndroid Build Coastguard Worker break;
126*15dc779aSAndroid Build Coastguard Worker
127*15dc779aSAndroid Build Coastguard Worker case 44100:
128*15dc779aSAndroid Build Coastguard Worker k1_min = 12;
129*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_44k_4_1[0];
130*15dc779aSAndroid Build Coastguard Worker break;
131*15dc779aSAndroid Build Coastguard Worker
132*15dc779aSAndroid Build Coastguard Worker case 48000:
133*15dc779aSAndroid Build Coastguard Worker k1_min = 11;
134*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_48k_4_1[0];
135*15dc779aSAndroid Build Coastguard Worker break;
136*15dc779aSAndroid Build Coastguard Worker
137*15dc779aSAndroid Build Coastguard Worker default:
138*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_32k_4_1[0];
139*15dc779aSAndroid Build Coastguard Worker k1_min = 11; /* illegal fs */
140*15dc779aSAndroid Build Coastguard Worker }
141*15dc779aSAndroid Build Coastguard Worker
142*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= 12; i++) {
143*15dc779aSAndroid Build Coastguard Worker v_dstop[i] = v_stop_freq[i + 1] - v_stop_freq[i];
144*15dc779aSAndroid Build Coastguard Worker }
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker ixheaace_shellsort_int(v_dstop, 13);
147*15dc779aSAndroid Build Coastguard Worker
148*15dc779aSAndroid Build Coastguard Worker result = k1_min;
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < stop_freq; i++) {
151*15dc779aSAndroid Build Coastguard Worker result = result + v_dstop[i];
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker
154*15dc779aSAndroid Build Coastguard Worker return result;
155*15dc779aSAndroid Build Coastguard Worker }
156*15dc779aSAndroid Build Coastguard Worker
ixheaace_get_start_freq(WORD32 fs,WORD32 start_freq)157*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_start_freq(WORD32 fs, WORD32 start_freq) {
158*15dc779aSAndroid Build Coastguard Worker WORD32 minimum_k0;
159*15dc779aSAndroid Build Coastguard Worker
160*15dc779aSAndroid Build Coastguard Worker switch (fs) {
161*15dc779aSAndroid Build Coastguard Worker case 16000:
162*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 24;
163*15dc779aSAndroid Build Coastguard Worker break;
164*15dc779aSAndroid Build Coastguard Worker case 22050:
165*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 17;
166*15dc779aSAndroid Build Coastguard Worker break;
167*15dc779aSAndroid Build Coastguard Worker case 24000:
168*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 16;
169*15dc779aSAndroid Build Coastguard Worker break;
170*15dc779aSAndroid Build Coastguard Worker case 32000:
171*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 16;
172*15dc779aSAndroid Build Coastguard Worker break;
173*15dc779aSAndroid Build Coastguard Worker case 44100:
174*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 12;
175*15dc779aSAndroid Build Coastguard Worker break;
176*15dc779aSAndroid Build Coastguard Worker case 48000:
177*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 11;
178*15dc779aSAndroid Build Coastguard Worker break;
179*15dc779aSAndroid Build Coastguard Worker case 64000:
180*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 10;
181*15dc779aSAndroid Build Coastguard Worker break;
182*15dc779aSAndroid Build Coastguard Worker case 88200:
183*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 7;
184*15dc779aSAndroid Build Coastguard Worker break;
185*15dc779aSAndroid Build Coastguard Worker case 96000:
186*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 7;
187*15dc779aSAndroid Build Coastguard Worker break;
188*15dc779aSAndroid Build Coastguard Worker default:
189*15dc779aSAndroid Build Coastguard Worker minimum_k0 = 11; /* illegal fs */
190*15dc779aSAndroid Build Coastguard Worker }
191*15dc779aSAndroid Build Coastguard Worker
192*15dc779aSAndroid Build Coastguard Worker switch (fs) {
193*15dc779aSAndroid Build Coastguard Worker case 16000: {
194*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + vector_offset_16k[start_freq]);
195*15dc779aSAndroid Build Coastguard Worker } break;
196*15dc779aSAndroid Build Coastguard Worker
197*15dc779aSAndroid Build Coastguard Worker case 22050: {
198*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + vector_offset_22k[start_freq]);
199*15dc779aSAndroid Build Coastguard Worker } break;
200*15dc779aSAndroid Build Coastguard Worker
201*15dc779aSAndroid Build Coastguard Worker case 24000: {
202*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + vector_offset_24k[start_freq]);
203*15dc779aSAndroid Build Coastguard Worker } break;
204*15dc779aSAndroid Build Coastguard Worker
205*15dc779aSAndroid Build Coastguard Worker case 32000: {
206*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + vector_offset_32k[start_freq]);
207*15dc779aSAndroid Build Coastguard Worker } break;
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker case 44100:
210*15dc779aSAndroid Build Coastguard Worker case 48000:
211*15dc779aSAndroid Build Coastguard Worker case 64000: {
212*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + vector_offset_44_48_64[start_freq]);
213*15dc779aSAndroid Build Coastguard Worker } break;
214*15dc779aSAndroid Build Coastguard Worker
215*15dc779aSAndroid Build Coastguard Worker case 88200:
216*15dc779aSAndroid Build Coastguard Worker case 96000: {
217*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + vector_offset_88_96[start_freq]);
218*15dc779aSAndroid Build Coastguard Worker } break;
219*15dc779aSAndroid Build Coastguard Worker
220*15dc779aSAndroid Build Coastguard Worker default: {
221*15dc779aSAndroid Build Coastguard Worker return (minimum_k0 + vector_offset_def[start_freq]);
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker }
224*15dc779aSAndroid Build Coastguard Worker }
225*15dc779aSAndroid Build Coastguard Worker
ixheaace_get_stop_freq(WORD32 fs,WORD32 stop_freq)226*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_stop_freq(WORD32 fs, WORD32 stop_freq) {
227*15dc779aSAndroid Build Coastguard Worker WORD32 result, i;
228*15dc779aSAndroid Build Coastguard Worker WORD32 *v_stop_freq = 0;
229*15dc779aSAndroid Build Coastguard Worker WORD32 k1_min;
230*15dc779aSAndroid Build Coastguard Worker WORD32 v_dstop[13];
231*15dc779aSAndroid Build Coastguard Worker
232*15dc779aSAndroid Build Coastguard Worker switch (fs) {
233*15dc779aSAndroid Build Coastguard Worker case 16000:
234*15dc779aSAndroid Build Coastguard Worker k1_min = ixheaace_stop_freq_16k[0];
235*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_16k[0];
236*15dc779aSAndroid Build Coastguard Worker break;
237*15dc779aSAndroid Build Coastguard Worker case 22050:
238*15dc779aSAndroid Build Coastguard Worker k1_min = ixheaace_stop_freq_22k[0];
239*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_22k[0];
240*15dc779aSAndroid Build Coastguard Worker break;
241*15dc779aSAndroid Build Coastguard Worker case 24000:
242*15dc779aSAndroid Build Coastguard Worker k1_min = ixheaace_stop_freq_24k[0];
243*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_stop_freq_24k[0];
244*15dc779aSAndroid Build Coastguard Worker break;
245*15dc779aSAndroid Build Coastguard Worker case 32000:
246*15dc779aSAndroid Build Coastguard Worker k1_min = 32;
247*15dc779aSAndroid Build Coastguard Worker
248*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_32;
249*15dc779aSAndroid Build Coastguard Worker break;
250*15dc779aSAndroid Build Coastguard Worker
251*15dc779aSAndroid Build Coastguard Worker case 44100:
252*15dc779aSAndroid Build Coastguard Worker k1_min = 23;
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_44;
255*15dc779aSAndroid Build Coastguard Worker break;
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker case 48000:
258*15dc779aSAndroid Build Coastguard Worker k1_min = 21;
259*15dc779aSAndroid Build Coastguard Worker
260*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_48;
261*15dc779aSAndroid Build Coastguard Worker break;
262*15dc779aSAndroid Build Coastguard Worker
263*15dc779aSAndroid Build Coastguard Worker default:
264*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_32;
265*15dc779aSAndroid Build Coastguard Worker k1_min = 21; /* illegal fs */
266*15dc779aSAndroid Build Coastguard Worker }
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= 12; i++) {
269*15dc779aSAndroid Build Coastguard Worker v_dstop[i] = v_stop_freq[i + 1] - v_stop_freq[i];
270*15dc779aSAndroid Build Coastguard Worker }
271*15dc779aSAndroid Build Coastguard Worker
272*15dc779aSAndroid Build Coastguard Worker ixheaace_shellsort_int(v_dstop, 13);
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker result = k1_min;
275*15dc779aSAndroid Build Coastguard Worker
276*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < stop_freq; i++) {
277*15dc779aSAndroid Build Coastguard Worker result = result + v_dstop[i];
278*15dc779aSAndroid Build Coastguard Worker }
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker return result;
281*15dc779aSAndroid Build Coastguard Worker }
282*15dc779aSAndroid Build Coastguard Worker
ixheaace_get_usac_stop_freq(WORD32 fs,WORD32 stop_freq)283*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_usac_stop_freq(WORD32 fs, WORD32 stop_freq)
284*15dc779aSAndroid Build Coastguard Worker {
285*15dc779aSAndroid Build Coastguard Worker WORD32 result, i;
286*15dc779aSAndroid Build Coastguard Worker WORD32 *v_stop_freq = 0;
287*15dc779aSAndroid Build Coastguard Worker WORD32 k1_min;
288*15dc779aSAndroid Build Coastguard Worker WORD32 v_dstop[13];
289*15dc779aSAndroid Build Coastguard Worker
290*15dc779aSAndroid Build Coastguard Worker switch (fs)
291*15dc779aSAndroid Build Coastguard Worker {
292*15dc779aSAndroid Build Coastguard Worker case 16000:
293*15dc779aSAndroid Build Coastguard Worker k1_min = ixheaace_usac_stop_freq_16k[0];
294*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_usac_stop_freq_16k[0];
295*15dc779aSAndroid Build Coastguard Worker break;
296*15dc779aSAndroid Build Coastguard Worker case 22050:
297*15dc779aSAndroid Build Coastguard Worker k1_min = ixheaace_usac_stop_freq_22k[0];
298*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_usac_stop_freq_22k[0];
299*15dc779aSAndroid Build Coastguard Worker break;
300*15dc779aSAndroid Build Coastguard Worker case 24000:
301*15dc779aSAndroid Build Coastguard Worker k1_min = ixheaace_usac_stop_freq_24k[0];
302*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)&ixheaace_usac_stop_freq_24k[0];
303*15dc779aSAndroid Build Coastguard Worker break;
304*15dc779aSAndroid Build Coastguard Worker case 32000:
305*15dc779aSAndroid Build Coastguard Worker k1_min = 32;
306*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_32;
307*15dc779aSAndroid Build Coastguard Worker break;
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker case 44100:
310*15dc779aSAndroid Build Coastguard Worker k1_min = 23;
311*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_44;
312*15dc779aSAndroid Build Coastguard Worker break;
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker case 48000:
315*15dc779aSAndroid Build Coastguard Worker k1_min = 21;
316*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_48;
317*15dc779aSAndroid Build Coastguard Worker break;
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker default:
320*15dc779aSAndroid Build Coastguard Worker v_stop_freq = (WORD32 *)vector_stop_freq_32;
321*15dc779aSAndroid Build Coastguard Worker k1_min = 21; /* illegal fs */
322*15dc779aSAndroid Build Coastguard Worker }
323*15dc779aSAndroid Build Coastguard Worker
324*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= 12; i++)
325*15dc779aSAndroid Build Coastguard Worker {
326*15dc779aSAndroid Build Coastguard Worker v_dstop[i] = v_stop_freq[i + 1] - v_stop_freq[i];
327*15dc779aSAndroid Build Coastguard Worker }
328*15dc779aSAndroid Build Coastguard Worker
329*15dc779aSAndroid Build Coastguard Worker ixheaace_shellsort_int(v_dstop, 13);
330*15dc779aSAndroid Build Coastguard Worker
331*15dc779aSAndroid Build Coastguard Worker result = k1_min;
332*15dc779aSAndroid Build Coastguard Worker
333*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < stop_freq; i++)
334*15dc779aSAndroid Build Coastguard Worker {
335*15dc779aSAndroid Build Coastguard Worker result = result + v_dstop[i];
336*15dc779aSAndroid Build Coastguard Worker }
337*15dc779aSAndroid Build Coastguard Worker
338*15dc779aSAndroid Build Coastguard Worker return result;
339*15dc779aSAndroid Build Coastguard Worker }
340*15dc779aSAndroid Build Coastguard Worker
341*15dc779aSAndroid Build Coastguard Worker WORD32
ixheaace_get_sbr_start_freq_raw(WORD32 start_freq,WORD32 qmf_bands,WORD32 fs)342*15dc779aSAndroid Build Coastguard Worker ixheaace_get_sbr_start_freq_raw(WORD32 start_freq, WORD32 qmf_bands, WORD32 fs) {
343*15dc779aSAndroid Build Coastguard Worker WORD32 result;
344*15dc779aSAndroid Build Coastguard Worker
345*15dc779aSAndroid Build Coastguard Worker if (start_freq < 0 || start_freq > 15) {
346*15dc779aSAndroid Build Coastguard Worker return -1;
347*15dc779aSAndroid Build Coastguard Worker }
348*15dc779aSAndroid Build Coastguard Worker
349*15dc779aSAndroid Build Coastguard Worker result = ixheaace_get_start_freq(fs, start_freq);
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker result = (result * fs / qmf_bands + 1) >> 1;
352*15dc779aSAndroid Build Coastguard Worker
353*15dc779aSAndroid Build Coastguard Worker return result;
354*15dc779aSAndroid Build Coastguard Worker }
355*15dc779aSAndroid Build Coastguard Worker
ixheaace_number_of_bands(WORD32 b_p_o,WORD32 start,WORD32 stop,FLOAT32 warp_fac)356*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_number_of_bands(WORD32 b_p_o, WORD32 start, WORD32 stop,
357*15dc779aSAndroid Build Coastguard Worker FLOAT32 warp_fac) {
358*15dc779aSAndroid Build Coastguard Worker WORD32 result = 0;
359*15dc779aSAndroid Build Coastguard Worker result = (WORD32)(b_p_o * log((FLOAT32)(stop) / start) / (2.0 * log(2.0) * warp_fac) + 0.5);
360*15dc779aSAndroid Build Coastguard Worker result <<= 1;
361*15dc779aSAndroid Build Coastguard Worker return result;
362*15dc779aSAndroid Build Coastguard Worker }
363*15dc779aSAndroid Build Coastguard Worker
ixheaace_calc_bands(WORD32 * ptr_diff,WORD32 start,WORD32 stop,WORD32 num_bands)364*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_calc_bands(WORD32 *ptr_diff, WORD32 start, WORD32 stop, WORD32 num_bands) {
365*15dc779aSAndroid Build Coastguard Worker WORD32 i;
366*15dc779aSAndroid Build Coastguard Worker WORD32 previous;
367*15dc779aSAndroid Build Coastguard Worker WORD32 current;
368*15dc779aSAndroid Build Coastguard Worker previous = start;
369*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= num_bands; i++) {
370*15dc779aSAndroid Build Coastguard Worker current = (WORD32)((start * pow((FLOAT32)stop / start, (FLOAT32)i / num_bands)) + 0.5f);
371*15dc779aSAndroid Build Coastguard Worker ptr_diff[i - 1] = current - previous;
372*15dc779aSAndroid Build Coastguard Worker previous = current;
373*15dc779aSAndroid Build Coastguard Worker }
374*15dc779aSAndroid Build Coastguard Worker }
375*15dc779aSAndroid Build Coastguard Worker
ixheaace_modify_bands(WORD32 max_band_previous,WORD32 * ptr_diff,WORD32 length)376*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_modify_bands(WORD32 max_band_previous, WORD32 *ptr_diff, WORD32 length) {
377*15dc779aSAndroid Build Coastguard Worker WORD32 change = max_band_previous - ptr_diff[0];
378*15dc779aSAndroid Build Coastguard Worker
379*15dc779aSAndroid Build Coastguard Worker if (change > (ptr_diff[length - 1] - ptr_diff[0]) / 2) {
380*15dc779aSAndroid Build Coastguard Worker change = (ptr_diff[length - 1] - ptr_diff[0]) / 2;
381*15dc779aSAndroid Build Coastguard Worker }
382*15dc779aSAndroid Build Coastguard Worker
383*15dc779aSAndroid Build Coastguard Worker ptr_diff[0] += change;
384*15dc779aSAndroid Build Coastguard Worker
385*15dc779aSAndroid Build Coastguard Worker ptr_diff[length - 1] -= change;
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker ixheaace_shellsort_int(ptr_diff, length);
388*15dc779aSAndroid Build Coastguard Worker }
389*15dc779aSAndroid Build Coastguard Worker
ixheaace_cum_sum(WORD32 start_value,WORD32 * ptr_diff,WORD32 length,UWORD8 * ptr_start_adress)390*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cum_sum(WORD32 start_value, WORD32 *ptr_diff, WORD32 length,
391*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_start_adress) {
392*15dc779aSAndroid Build Coastguard Worker WORD32 i;
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker ptr_start_adress[0] = (UWORD8)start_value;
395*15dc779aSAndroid Build Coastguard Worker
396*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= length; i++) {
397*15dc779aSAndroid Build Coastguard Worker ptr_start_adress[i] = ptr_start_adress[i - 1] + (UWORD8)ptr_diff[i - 1];
398*15dc779aSAndroid Build Coastguard Worker }
399*15dc779aSAndroid Build Coastguard Worker }
400*15dc779aSAndroid Build Coastguard Worker
401*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_find_start_and_stop_band(const WORD32 sampling_freq,const WORD32 num_channels,const WORD32 start_freq,const WORD32 stop_freq,const ixheaace_sr_mode sample_rate_mode,WORD32 * ptr_k0,WORD32 * ptr_k2,WORD32 sbr_ratio_idx,ixheaace_sbr_codec_type sbr_codec)402*15dc779aSAndroid Build Coastguard Worker ixheaace_find_start_and_stop_band(const WORD32 sampling_freq, const WORD32 num_channels,
403*15dc779aSAndroid Build Coastguard Worker const WORD32 start_freq, const WORD32 stop_freq,
404*15dc779aSAndroid Build Coastguard Worker const ixheaace_sr_mode sample_rate_mode, WORD32 *ptr_k0,
405*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_k2, WORD32 sbr_ratio_idx,
406*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_codec_type sbr_codec) {
407*15dc779aSAndroid Build Coastguard Worker switch (sbr_codec) {
408*15dc779aSAndroid Build Coastguard Worker case USAC_SBR: {
409*15dc779aSAndroid Build Coastguard Worker if (sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
410*15dc779aSAndroid Build Coastguard Worker *ptr_k0 = ixheaace_get_start_freq_4_1(sampling_freq, start_freq);
411*15dc779aSAndroid Build Coastguard Worker } else {
412*15dc779aSAndroid Build Coastguard Worker *ptr_k0 = ixheaace_get_start_freq(sampling_freq, start_freq);
413*15dc779aSAndroid Build Coastguard Worker }
414*15dc779aSAndroid Build Coastguard Worker break;
415*15dc779aSAndroid Build Coastguard Worker }
416*15dc779aSAndroid Build Coastguard Worker default: {
417*15dc779aSAndroid Build Coastguard Worker *ptr_k0 = ixheaace_get_start_freq(sampling_freq, start_freq);
418*15dc779aSAndroid Build Coastguard Worker break;
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker }
421*15dc779aSAndroid Build Coastguard Worker if ((sample_rate_mode == 1) && (sampling_freq * num_channels < 2 * *ptr_k0 * sampling_freq)) {
422*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_SAMPLERATE_MODE;
423*15dc779aSAndroid Build Coastguard Worker }
424*15dc779aSAndroid Build Coastguard Worker
425*15dc779aSAndroid Build Coastguard Worker if (stop_freq < 14) {
426*15dc779aSAndroid Build Coastguard Worker switch (sbr_codec) {
427*15dc779aSAndroid Build Coastguard Worker case USAC_SBR: {
428*15dc779aSAndroid Build Coastguard Worker if (USAC_SBR_RATIO_INDEX_4_1 == sbr_ratio_idx) {
429*15dc779aSAndroid Build Coastguard Worker *ptr_k2 = ixheaace_get_stop_freq_4_1(sampling_freq, stop_freq);
430*15dc779aSAndroid Build Coastguard Worker } else {
431*15dc779aSAndroid Build Coastguard Worker *ptr_k2 = ixheaace_get_usac_stop_freq(sampling_freq, stop_freq);
432*15dc779aSAndroid Build Coastguard Worker }
433*15dc779aSAndroid Build Coastguard Worker break;
434*15dc779aSAndroid Build Coastguard Worker }
435*15dc779aSAndroid Build Coastguard Worker default: {
436*15dc779aSAndroid Build Coastguard Worker *ptr_k2 = ixheaace_get_stop_freq(sampling_freq, stop_freq);
437*15dc779aSAndroid Build Coastguard Worker break;
438*15dc779aSAndroid Build Coastguard Worker }
439*15dc779aSAndroid Build Coastguard Worker }
440*15dc779aSAndroid Build Coastguard Worker }
441*15dc779aSAndroid Build Coastguard Worker
442*15dc779aSAndroid Build Coastguard Worker else {
443*15dc779aSAndroid Build Coastguard Worker *ptr_k2 = (stop_freq == 14 ? 2 * *ptr_k0 : 3 * *ptr_k0);
444*15dc779aSAndroid Build Coastguard Worker }
445*15dc779aSAndroid Build Coastguard Worker
446*15dc779aSAndroid Build Coastguard Worker if (*ptr_k2 > num_channels) {
447*15dc779aSAndroid Build Coastguard Worker *ptr_k2 = num_channels;
448*15dc779aSAndroid Build Coastguard Worker }
449*15dc779aSAndroid Build Coastguard Worker if (sbr_codec == USAC_SBR) {
450*15dc779aSAndroid Build Coastguard Worker if (sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
451*15dc779aSAndroid Build Coastguard Worker if (((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_USAC) || (*ptr_k2 <= *ptr_k0)) {
452*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
453*15dc779aSAndroid Build Coastguard Worker }
454*15dc779aSAndroid Build Coastguard Worker if ((2 * sampling_freq == 44100) && ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_USAC)) {
455*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
456*15dc779aSAndroid Build Coastguard Worker }
457*15dc779aSAndroid Build Coastguard Worker if ((2 * sampling_freq >= 48000) && ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_USAC)) {
458*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
459*15dc779aSAndroid Build Coastguard Worker }
460*15dc779aSAndroid Build Coastguard Worker } else {
461*15dc779aSAndroid Build Coastguard Worker if (sampling_freq <= 32000) {
462*15dc779aSAndroid Build Coastguard Worker if ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_LE32KHZ) {
463*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
464*15dc779aSAndroid Build Coastguard Worker }
465*15dc779aSAndroid Build Coastguard Worker } else if (sampling_freq == 44100) {
466*15dc779aSAndroid Build Coastguard Worker if ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_EQ44KHZ) {
467*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
468*15dc779aSAndroid Build Coastguard Worker }
469*15dc779aSAndroid Build Coastguard Worker } else if (sampling_freq >= 48000) {
470*15dc779aSAndroid Build Coastguard Worker if ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_GE48KHZ) {
471*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
472*15dc779aSAndroid Build Coastguard Worker }
473*15dc779aSAndroid Build Coastguard Worker } else {
474*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
475*15dc779aSAndroid Build Coastguard Worker }
476*15dc779aSAndroid Build Coastguard Worker }
477*15dc779aSAndroid Build Coastguard Worker } else {
478*15dc779aSAndroid Build Coastguard Worker if (sampling_freq <= 32000) {
479*15dc779aSAndroid Build Coastguard Worker if ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_LE32KHZ) {
480*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
481*15dc779aSAndroid Build Coastguard Worker }
482*15dc779aSAndroid Build Coastguard Worker } else if (sampling_freq == 44100) {
483*15dc779aSAndroid Build Coastguard Worker if ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_EQ44KHZ) {
484*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
485*15dc779aSAndroid Build Coastguard Worker }
486*15dc779aSAndroid Build Coastguard Worker } else if (sampling_freq >= 48000) {
487*15dc779aSAndroid Build Coastguard Worker if ((*ptr_k2 - *ptr_k0) > MAXIMUM_FREQ_COEFFS_GE48KHZ) {
488*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
489*15dc779aSAndroid Build Coastguard Worker }
490*15dc779aSAndroid Build Coastguard Worker } else {
491*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
492*15dc779aSAndroid Build Coastguard Worker }
493*15dc779aSAndroid Build Coastguard Worker }
494*15dc779aSAndroid Build Coastguard Worker
495*15dc779aSAndroid Build Coastguard Worker if ((*ptr_k2 - *ptr_k0) < 0) {
496*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_FREQ_COEFFS;
497*15dc779aSAndroid Build Coastguard Worker }
498*15dc779aSAndroid Build Coastguard Worker
499*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
500*15dc779aSAndroid Build Coastguard Worker }
501*15dc779aSAndroid Build Coastguard Worker
502*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_update_freq_scale(UWORD8 * ptr_k_master,WORD32 * ptr_num_bands,const WORD32 k0,const WORD32 k2,const WORD32 freq_scale,const WORD32 alter_scale,ixheaace_sr_mode sbr_rate)503*15dc779aSAndroid Build Coastguard Worker ixheaace_update_freq_scale(UWORD8 *ptr_k_master, WORD32 *ptr_num_bands, const WORD32 k0,
504*15dc779aSAndroid Build Coastguard Worker const WORD32 k2, const WORD32 freq_scale, const WORD32 alter_scale,
505*15dc779aSAndroid Build Coastguard Worker ixheaace_sr_mode sbr_rate)
506*15dc779aSAndroid Build Coastguard Worker
507*15dc779aSAndroid Build Coastguard Worker {
508*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
509*15dc779aSAndroid Build Coastguard Worker WORD32 b_p_o = 0;
510*15dc779aSAndroid Build Coastguard Worker WORD32 dk = 0;
511*15dc779aSAndroid Build Coastguard Worker
512*15dc779aSAndroid Build Coastguard Worker FLOAT32 warp;
513*15dc779aSAndroid Build Coastguard Worker WORD32 k1 = 0, i;
514*15dc779aSAndroid Build Coastguard Worker WORD32 num_bands0;
515*15dc779aSAndroid Build Coastguard Worker WORD32 num_bands1;
516*15dc779aSAndroid Build Coastguard Worker WORD32 diff_tot[IXHEAACE_MAXIMUM_OCTAVE + IXHEAACE_MAXIMUM_SECOND_REGION] = {0};
517*15dc779aSAndroid Build Coastguard Worker WORD32 *diff0 = diff_tot;
518*15dc779aSAndroid Build Coastguard Worker WORD32 *diff1 = diff_tot + IXHEAACE_MAXIMUM_OCTAVE;
519*15dc779aSAndroid Build Coastguard Worker WORD32 k2_achived;
520*15dc779aSAndroid Build Coastguard Worker WORD32 k2_diff;
521*15dc779aSAndroid Build Coastguard Worker WORD32 incr = 0;
522*15dc779aSAndroid Build Coastguard Worker
523*15dc779aSAndroid Build Coastguard Worker switch (freq_scale) {
524*15dc779aSAndroid Build Coastguard Worker case 1:
525*15dc779aSAndroid Build Coastguard Worker b_p_o = 12;
526*15dc779aSAndroid Build Coastguard Worker break;
527*15dc779aSAndroid Build Coastguard Worker case 2:
528*15dc779aSAndroid Build Coastguard Worker b_p_o = 10;
529*15dc779aSAndroid Build Coastguard Worker break;
530*15dc779aSAndroid Build Coastguard Worker case 3:
531*15dc779aSAndroid Build Coastguard Worker b_p_o = 8;
532*15dc779aSAndroid Build Coastguard Worker break;
533*15dc779aSAndroid Build Coastguard Worker }
534*15dc779aSAndroid Build Coastguard Worker
535*15dc779aSAndroid Build Coastguard Worker if (freq_scale > 0) {
536*15dc779aSAndroid Build Coastguard Worker if (alter_scale == 0) {
537*15dc779aSAndroid Build Coastguard Worker warp = 1.0f;
538*15dc779aSAndroid Build Coastguard Worker } else {
539*15dc779aSAndroid Build Coastguard Worker warp = 1.3f;
540*15dc779aSAndroid Build Coastguard Worker }
541*15dc779aSAndroid Build Coastguard Worker
542*15dc779aSAndroid Build Coastguard Worker if (IXHEAACE_QUAD_RATE == sbr_rate) {
543*15dc779aSAndroid Build Coastguard Worker if (k0 < b_p_o) {
544*15dc779aSAndroid Build Coastguard Worker b_p_o = (k0 >> 1) * 2;
545*15dc779aSAndroid Build Coastguard Worker }
546*15dc779aSAndroid Build Coastguard Worker }
547*15dc779aSAndroid Build Coastguard Worker
548*15dc779aSAndroid Build Coastguard Worker if (4 * k2 >= 9 * k0) {
549*15dc779aSAndroid Build Coastguard Worker k1 = 2 * k0;
550*15dc779aSAndroid Build Coastguard Worker num_bands0 = ixheaace_number_of_bands(b_p_o, k0, k1, 1.0f);
551*15dc779aSAndroid Build Coastguard Worker num_bands1 = ixheaace_number_of_bands(b_p_o, k1, k2, warp);
552*15dc779aSAndroid Build Coastguard Worker
553*15dc779aSAndroid Build Coastguard Worker ixheaace_calc_bands(diff0, k0, k1, num_bands0);
554*15dc779aSAndroid Build Coastguard Worker ixheaace_shellsort_int(diff0, num_bands0);
555*15dc779aSAndroid Build Coastguard Worker
556*15dc779aSAndroid Build Coastguard Worker if (diff0[0] == 0) {
557*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_NUM_BANDS;
558*15dc779aSAndroid Build Coastguard Worker }
559*15dc779aSAndroid Build Coastguard Worker
560*15dc779aSAndroid Build Coastguard Worker ixheaace_cum_sum(k0, diff0, num_bands0, ptr_k_master);
561*15dc779aSAndroid Build Coastguard Worker
562*15dc779aSAndroid Build Coastguard Worker ixheaace_calc_bands(diff1, k1, k2, num_bands1);
563*15dc779aSAndroid Build Coastguard Worker ixheaace_shellsort_int(diff1, num_bands1);
564*15dc779aSAndroid Build Coastguard Worker
565*15dc779aSAndroid Build Coastguard Worker if (diff0[num_bands0 - 1] > diff1[0]) {
566*15dc779aSAndroid Build Coastguard Worker ixheaace_modify_bands(diff0[num_bands0 - 1], diff1, num_bands1);
567*15dc779aSAndroid Build Coastguard Worker }
568*15dc779aSAndroid Build Coastguard Worker
569*15dc779aSAndroid Build Coastguard Worker ixheaace_cum_sum(k1, diff1, num_bands1, &ptr_k_master[num_bands0]);
570*15dc779aSAndroid Build Coastguard Worker *ptr_num_bands = num_bands0 + num_bands1;
571*15dc779aSAndroid Build Coastguard Worker } else {
572*15dc779aSAndroid Build Coastguard Worker k1 = k2;
573*15dc779aSAndroid Build Coastguard Worker num_bands0 = ixheaace_number_of_bands(b_p_o, k0, k1, 1.0f);
574*15dc779aSAndroid Build Coastguard Worker
575*15dc779aSAndroid Build Coastguard Worker ixheaace_calc_bands(diff0, k0, k1, num_bands0);
576*15dc779aSAndroid Build Coastguard Worker ixheaace_shellsort_int(diff0, num_bands0);
577*15dc779aSAndroid Build Coastguard Worker
578*15dc779aSAndroid Build Coastguard Worker if (diff0[0] == 0) {
579*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_NUM_BANDS;
580*15dc779aSAndroid Build Coastguard Worker }
581*15dc779aSAndroid Build Coastguard Worker
582*15dc779aSAndroid Build Coastguard Worker ixheaace_cum_sum(k0, diff0, num_bands0, ptr_k_master);
583*15dc779aSAndroid Build Coastguard Worker
584*15dc779aSAndroid Build Coastguard Worker *ptr_num_bands = num_bands0;
585*15dc779aSAndroid Build Coastguard Worker }
586*15dc779aSAndroid Build Coastguard Worker } else {
587*15dc779aSAndroid Build Coastguard Worker if (alter_scale == 0) {
588*15dc779aSAndroid Build Coastguard Worker dk = 1;
589*15dc779aSAndroid Build Coastguard Worker num_bands0 = 2 * ((k2 - k0) / 2);
590*15dc779aSAndroid Build Coastguard Worker } else {
591*15dc779aSAndroid Build Coastguard Worker dk = 2;
592*15dc779aSAndroid Build Coastguard Worker num_bands0 = 2 * (((k2 - k0) / dk + 1) / 2);
593*15dc779aSAndroid Build Coastguard Worker }
594*15dc779aSAndroid Build Coastguard Worker
595*15dc779aSAndroid Build Coastguard Worker k2_achived = k0 + num_bands0 * dk;
596*15dc779aSAndroid Build Coastguard Worker k2_diff = k2 - k2_achived;
597*15dc779aSAndroid Build Coastguard Worker
598*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_bands0; i++) {
599*15dc779aSAndroid Build Coastguard Worker diff_tot[i] = dk;
600*15dc779aSAndroid Build Coastguard Worker }
601*15dc779aSAndroid Build Coastguard Worker
602*15dc779aSAndroid Build Coastguard Worker if (k2_diff < 0) {
603*15dc779aSAndroid Build Coastguard Worker incr = 1;
604*15dc779aSAndroid Build Coastguard Worker i = 0;
605*15dc779aSAndroid Build Coastguard Worker }
606*15dc779aSAndroid Build Coastguard Worker
607*15dc779aSAndroid Build Coastguard Worker if (k2_diff > 0) {
608*15dc779aSAndroid Build Coastguard Worker incr = -1;
609*15dc779aSAndroid Build Coastguard Worker
610*15dc779aSAndroid Build Coastguard Worker i = num_bands0 - 1;
611*15dc779aSAndroid Build Coastguard Worker }
612*15dc779aSAndroid Build Coastguard Worker
613*15dc779aSAndroid Build Coastguard Worker while (k2_diff != 0) {
614*15dc779aSAndroid Build Coastguard Worker if (i < 0) break;
615*15dc779aSAndroid Build Coastguard Worker diff_tot[i] = diff_tot[i] - incr;
616*15dc779aSAndroid Build Coastguard Worker
617*15dc779aSAndroid Build Coastguard Worker i = i + incr;
618*15dc779aSAndroid Build Coastguard Worker
619*15dc779aSAndroid Build Coastguard Worker k2_diff = k2_diff + incr;
620*15dc779aSAndroid Build Coastguard Worker }
621*15dc779aSAndroid Build Coastguard Worker
622*15dc779aSAndroid Build Coastguard Worker ixheaace_cum_sum(k0, diff_tot, num_bands0, ptr_k_master);
623*15dc779aSAndroid Build Coastguard Worker
624*15dc779aSAndroid Build Coastguard Worker *ptr_num_bands = num_bands0;
625*15dc779aSAndroid Build Coastguard Worker }
626*15dc779aSAndroid Build Coastguard Worker
627*15dc779aSAndroid Build Coastguard Worker if (*ptr_num_bands < 1) {
628*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_NUM_BANDS;
629*15dc779aSAndroid Build Coastguard Worker }
630*15dc779aSAndroid Build Coastguard Worker
631*15dc779aSAndroid Build Coastguard Worker if (sbr_rate == IXHEAACE_QUAD_RATE) {
632*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < *ptr_num_bands; i++) {
633*15dc779aSAndroid Build Coastguard Worker if (!(ptr_k_master[i] - ptr_k_master[i - 1] <= k0 - 2)) {
634*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_NUM_BANDS;
635*15dc779aSAndroid Build Coastguard Worker }
636*15dc779aSAndroid Build Coastguard Worker }
637*15dc779aSAndroid Build Coastguard Worker }
638*15dc779aSAndroid Build Coastguard Worker
639*15dc779aSAndroid Build Coastguard Worker return err_code;
640*15dc779aSAndroid Build Coastguard Worker }
641*15dc779aSAndroid Build Coastguard Worker
ixheaace_update_high_res(UWORD8 * ptr_hires,WORD32 * ptr_num_hires,UWORD8 * ptr_k_master,WORD32 num_master,WORD32 * ptr_xover_band,ixheaace_sr_mode dr_or_sr,WORD32 num_qmf_ch)642*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_update_high_res(UWORD8 *ptr_hires, WORD32 *ptr_num_hires, UWORD8 *ptr_k_master,
643*15dc779aSAndroid Build Coastguard Worker WORD32 num_master, WORD32 *ptr_xover_band,
644*15dc779aSAndroid Build Coastguard Worker ixheaace_sr_mode dr_or_sr, WORD32 num_qmf_ch) {
645*15dc779aSAndroid Build Coastguard Worker WORD32 i;
646*15dc779aSAndroid Build Coastguard Worker WORD32 divider;
647*15dc779aSAndroid Build Coastguard Worker WORD32 max1, max2;
648*15dc779aSAndroid Build Coastguard Worker
649*15dc779aSAndroid Build Coastguard Worker divider = (dr_or_sr == IXHEAACE_DUAL_RATE) ? 2 : 1;
650*15dc779aSAndroid Build Coastguard Worker if (dr_or_sr == IXHEAACE_QUAD_RATE) {
651*15dc779aSAndroid Build Coastguard Worker divider = 4;
652*15dc779aSAndroid Build Coastguard Worker }
653*15dc779aSAndroid Build Coastguard Worker
654*15dc779aSAndroid Build Coastguard Worker if ((ptr_k_master[*ptr_xover_band] > (num_qmf_ch / divider)) ||
655*15dc779aSAndroid Build Coastguard Worker (*ptr_xover_band > num_master)) {
656*15dc779aSAndroid Build Coastguard Worker max1 = 0;
657*15dc779aSAndroid Build Coastguard Worker max2 = num_master;
658*15dc779aSAndroid Build Coastguard Worker
659*15dc779aSAndroid Build Coastguard Worker while ((ptr_k_master[max1 + 1] < (num_qmf_ch / divider)) && ((max1 + 1) < max2)) {
660*15dc779aSAndroid Build Coastguard Worker max1++;
661*15dc779aSAndroid Build Coastguard Worker }
662*15dc779aSAndroid Build Coastguard Worker
663*15dc779aSAndroid Build Coastguard Worker *ptr_xover_band = max1;
664*15dc779aSAndroid Build Coastguard Worker }
665*15dc779aSAndroid Build Coastguard Worker
666*15dc779aSAndroid Build Coastguard Worker *ptr_num_hires = num_master - *ptr_xover_band;
667*15dc779aSAndroid Build Coastguard Worker
668*15dc779aSAndroid Build Coastguard Worker for (i = *ptr_xover_band; i <= num_master; i++) {
669*15dc779aSAndroid Build Coastguard Worker ptr_hires[i - *ptr_xover_band] = ptr_k_master[i];
670*15dc779aSAndroid Build Coastguard Worker }
671*15dc779aSAndroid Build Coastguard Worker }
672*15dc779aSAndroid Build Coastguard Worker
ixheaace_update_low_res(UWORD8 * ptr_lores,WORD32 * ptr_num_lores,UWORD8 * ptr_hires,WORD32 ptr_num_hires)673*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_update_low_res(UWORD8 *ptr_lores, WORD32 *ptr_num_lores, UWORD8 *ptr_hires,
674*15dc779aSAndroid Build Coastguard Worker WORD32 ptr_num_hires) {
675*15dc779aSAndroid Build Coastguard Worker WORD32 i;
676*15dc779aSAndroid Build Coastguard Worker
677*15dc779aSAndroid Build Coastguard Worker if (ptr_num_hires % 2 == 0) {
678*15dc779aSAndroid Build Coastguard Worker *ptr_num_lores = ptr_num_hires / 2;
679*15dc779aSAndroid Build Coastguard Worker
680*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= *ptr_num_lores; i++) {
681*15dc779aSAndroid Build Coastguard Worker ptr_lores[i] = ptr_hires[i * 2];
682*15dc779aSAndroid Build Coastguard Worker }
683*15dc779aSAndroid Build Coastguard Worker } else {
684*15dc779aSAndroid Build Coastguard Worker *ptr_num_lores = (ptr_num_hires + 1) / 2;
685*15dc779aSAndroid Build Coastguard Worker
686*15dc779aSAndroid Build Coastguard Worker ptr_lores[0] = ptr_hires[0];
687*15dc779aSAndroid Build Coastguard Worker
688*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= *ptr_num_lores; i++) {
689*15dc779aSAndroid Build Coastguard Worker ptr_lores[i] = ptr_hires[i * 2 - 1];
690*15dc779aSAndroid Build Coastguard Worker }
691*15dc779aSAndroid Build Coastguard Worker }
692*15dc779aSAndroid Build Coastguard Worker }
693