1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2018 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 #include <math.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_defines.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_nlc_dec.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
42*15dc779aSAndroid Build Coastguard Worker
43*15dc779aSAndroid Build Coastguard Worker static const WORD32 ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4};
44*15dc779aSAndroid Build Coastguard Worker
45*15dc779aSAndroid Build Coastguard Worker static const WORD32 ixheaacd_freq_res_table_ld[] = {0, 23, 15, 12, 9, 7, 5, 4};
46*15dc779aSAndroid Build Coastguard Worker
47*15dc779aSAndroid Build Coastguard Worker static const WORD32
48*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] = {
49*15dc779aSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
50*15dc779aSAndroid Build Coastguard Worker 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
51*15dc779aSAndroid Build Coastguard Worker 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
52*15dc779aSAndroid Build Coastguard Worker
53*15dc779aSAndroid Build Coastguard Worker static const WORD32
54*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] = {
55*15dc779aSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
56*15dc779aSAndroid Build Coastguard Worker 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
57*15dc779aSAndroid Build Coastguard Worker 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker static const WORD32
60*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] = {
61*15dc779aSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5,
62*15dc779aSAndroid Build Coastguard Worker 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
63*15dc779aSAndroid Build Coastguard Worker 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker static const WORD32
66*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_10_map[MAX_HYBRID_BANDS_MPS] = {
67*15dc779aSAndroid Build Coastguard Worker 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8,
68*15dc779aSAndroid Build Coastguard Worker 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
69*15dc779aSAndroid Build Coastguard Worker 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
70*15dc779aSAndroid Build Coastguard Worker
71*15dc779aSAndroid Build Coastguard Worker static const WORD32
72*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_14_map[MAX_HYBRID_BANDS_MPS] = {
73*15dc779aSAndroid Build Coastguard Worker 0, 0, 0, 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8,
74*15dc779aSAndroid Build Coastguard Worker 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
75*15dc779aSAndroid Build Coastguard Worker 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
76*15dc779aSAndroid Build Coastguard Worker 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13};
77*15dc779aSAndroid Build Coastguard Worker
78*15dc779aSAndroid Build Coastguard Worker const WORD32
79*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS] = {
80*15dc779aSAndroid Build Coastguard Worker 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14,
81*15dc779aSAndroid Build Coastguard Worker 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
82*15dc779aSAndroid Build Coastguard Worker 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
83*15dc779aSAndroid Build Coastguard Worker 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19};
84*15dc779aSAndroid Build Coastguard Worker
85*15dc779aSAndroid Build Coastguard Worker const WORD32
86*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS] = {
87*15dc779aSAndroid Build Coastguard Worker 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
88*15dc779aSAndroid Build Coastguard Worker 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23,
89*15dc779aSAndroid Build Coastguard Worker 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
90*15dc779aSAndroid Build Coastguard Worker 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27};
91*15dc779aSAndroid Build Coastguard Worker
92*15dc779aSAndroid Build Coastguard Worker const WORD32
93*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] =
94*15dc779aSAndroid Build Coastguard Worker {0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95*15dc779aSAndroid Build Coastguard Worker 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
96*15dc779aSAndroid Build Coastguard Worker 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
97*15dc779aSAndroid Build Coastguard Worker 3, 3, 3, 3, 3};
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker const WORD32
100*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] =
101*15dc779aSAndroid Build Coastguard Worker {0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
102*15dc779aSAndroid Build Coastguard Worker 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
103*15dc779aSAndroid Build Coastguard Worker 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
104*15dc779aSAndroid Build Coastguard Worker 4, 4, 4, 4, 4};
105*15dc779aSAndroid Build Coastguard Worker
106*15dc779aSAndroid Build Coastguard Worker const WORD32
107*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] =
108*15dc779aSAndroid Build Coastguard Worker {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
109*15dc779aSAndroid Build Coastguard Worker 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
110*15dc779aSAndroid Build Coastguard Worker 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
111*15dc779aSAndroid Build Coastguard Worker 6, 6, 6, 6, 6};
112*15dc779aSAndroid Build Coastguard Worker
113*15dc779aSAndroid Build Coastguard Worker const WORD32
114*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_9_map[MAX_HYBRID_BANDS_MPS] =
115*15dc779aSAndroid Build Coastguard Worker {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
116*15dc779aSAndroid Build Coastguard Worker 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
117*15dc779aSAndroid Build Coastguard Worker 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
118*15dc779aSAndroid Build Coastguard Worker 8, 8, 8, 8, 8};
119*15dc779aSAndroid Build Coastguard Worker
120*15dc779aSAndroid Build Coastguard Worker const WORD32
121*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_12_map[MAX_HYBRID_BANDS_MPS] =
122*15dc779aSAndroid Build Coastguard Worker {0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8,
123*15dc779aSAndroid Build Coastguard Worker 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10,
124*15dc779aSAndroid Build Coastguard Worker 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
125*15dc779aSAndroid Build Coastguard Worker 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
126*15dc779aSAndroid Build Coastguard Worker 11, 11, 11, 11, 11, 11, 11};
127*15dc779aSAndroid Build Coastguard Worker
128*15dc779aSAndroid Build Coastguard Worker const WORD32
129*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_15_map[MAX_HYBRID_BANDS_MPS] =
130*15dc779aSAndroid Build Coastguard Worker {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 10, 10, 11, 11,
131*15dc779aSAndroid Build Coastguard Worker 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
132*15dc779aSAndroid Build Coastguard Worker 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
133*15dc779aSAndroid Build Coastguard Worker 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
134*15dc779aSAndroid Build Coastguard Worker 14, 14, 14, 14, 14, 14, 14};
135*15dc779aSAndroid Build Coastguard Worker
136*15dc779aSAndroid Build Coastguard Worker const WORD32
137*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_23_map[MAX_HYBRID_BANDS_MPS] =
138*15dc779aSAndroid Build Coastguard Worker {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13,
139*15dc779aSAndroid Build Coastguard Worker 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19,
140*15dc779aSAndroid Build Coastguard Worker 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21,
141*15dc779aSAndroid Build Coastguard Worker 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
142*15dc779aSAndroid Build Coastguard Worker 22, 22, 22, 22, 22, 22, 22};
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 ixheaacd_mps_clip_gain_table[] = {
145*15dc779aSAndroid Build Coastguard Worker 1.000000f, 1.189207f, 1.414213f, 1.681792f,
146*15dc779aSAndroid Build Coastguard Worker 2.000000f, 2.378414f, 2.828427f, 4.000000f};
147*15dc779aSAndroid Build Coastguard Worker
148*15dc779aSAndroid Build Coastguard Worker static const WORD32 ixheaacd_mps_stride_table[] = {1, 2, 5, 28};
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 ixheaacd_cld_de_quant_table[] = {
151*15dc779aSAndroid Build Coastguard Worker -150.0, -45.0, -40.0, -35.0, -30.0, -25.0, -22.0, -19.0,
152*15dc779aSAndroid Build Coastguard Worker -16.0, -13.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0,
153*15dc779aSAndroid Build Coastguard Worker 2.0, 4.0, 6.0, 8.0, 10.0, 13.0, 16.0, 19.0,
154*15dc779aSAndroid Build Coastguard Worker 22.0, 25.0, 30.0, 35.0, 40.0, 45.0, 150.0};
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 ixheaacd_icc_de_quant_table[] = {
157*15dc779aSAndroid Build Coastguard Worker 1.0000f, 0.9370f, 0.84118f, 0.60092f, 0.36764f, 0.0f, -0.5890f, -0.9900f};
158*15dc779aSAndroid Build Coastguard Worker
159*15dc779aSAndroid Build Coastguard Worker const FLOAT32 ixheaacd_ipd_de_quant_table[] = {
160*15dc779aSAndroid Build Coastguard Worker 0.f, 0.392699082f, 0.785398163f, 1.178097245f,
161*15dc779aSAndroid Build Coastguard Worker 1.570796327f, 1.963495408f, 2.35619449f, 2.748893572f,
162*15dc779aSAndroid Build Coastguard Worker 3.141592654f, 3.534291735f, 3.926990817f, 4.319689899f,
163*15dc779aSAndroid Build Coastguard Worker 4.71238898f, 5.105088062f, 5.497787144f, 5.890486225f};
164*15dc779aSAndroid Build Coastguard Worker const WORD32 ixheaacd_ipd_de_quant_table_q28[] = {
165*15dc779aSAndroid Build Coastguard Worker 0, 105414360, 210828720, 316243072, 421657440, 527071776,
166*15dc779aSAndroid Build Coastguard Worker 632486144, 737900480, 843314880, 948729216, 1054143552, 1159557888,
167*15dc779aSAndroid Build Coastguard Worker 1264972288, 1370386688, 1475800960, 1581215360};
168*15dc779aSAndroid Build Coastguard Worker static const WORD32 ixheaacd_smoothing_time_table[] = {64, 128, 256, 512};
169*15dc779aSAndroid Build Coastguard Worker
170*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 ixheaacd_inverse_smoothing_time_table[] = {
171*15dc779aSAndroid Build Coastguard Worker 1.0f / 64.0f, 1.0f / 128.0f, 1.0f / 256.0f, 1.0f / 512.0f};
172*15dc779aSAndroid Build Coastguard Worker
bound_check(WORD32 var,WORD32 lower_bound,WORD32 upper_bound)173*15dc779aSAndroid Build Coastguard Worker static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
174*15dc779aSAndroid Build Coastguard Worker var = min(var, upper_bound);
175*15dc779aSAndroid Build Coastguard Worker var = max(var, lower_bound);
176*15dc779aSAndroid Build Coastguard Worker return var;
177*15dc779aSAndroid Build Coastguard Worker }
178*15dc779aSAndroid Build Coastguard Worker
ixheaacd_longmult1(UWORD16 a[],UWORD16 b,UWORD16 d[],WORD32 len)179*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b,
180*15dc779aSAndroid Build Coastguard Worker UWORD16 d[], WORD32 len) {
181*15dc779aSAndroid Build Coastguard Worker WORD32 k;
182*15dc779aSAndroid Build Coastguard Worker UWORD32 tmp;
183*15dc779aSAndroid Build Coastguard Worker UWORD32 b0 = (UWORD32)b;
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker tmp = ((UWORD32)a[0]) * b0;
186*15dc779aSAndroid Build Coastguard Worker d[0] = (UWORD16)tmp;
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker for (k = 1; k < len; k++) {
189*15dc779aSAndroid Build Coastguard Worker tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0;
190*15dc779aSAndroid Build Coastguard Worker d[k] = (UWORD16)tmp;
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker }
193*15dc779aSAndroid Build Coastguard Worker
ixheaacd_longdiv(UWORD16 b[],UWORD16 a,UWORD16 d[],UWORD16 * pr,WORD32 len)194*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a,
195*15dc779aSAndroid Build Coastguard Worker UWORD16 d[], UWORD16 *pr, WORD32 len) {
196*15dc779aSAndroid Build Coastguard Worker UWORD32 r;
197*15dc779aSAndroid Build Coastguard Worker UWORD32 tmp;
198*15dc779aSAndroid Build Coastguard Worker UWORD32 temp;
199*15dc779aSAndroid Build Coastguard Worker WORD32 k;
200*15dc779aSAndroid Build Coastguard Worker
201*15dc779aSAndroid Build Coastguard Worker if (a == 0)
202*15dc779aSAndroid Build Coastguard Worker return;
203*15dc779aSAndroid Build Coastguard Worker
204*15dc779aSAndroid Build Coastguard Worker r = 0;
205*15dc779aSAndroid Build Coastguard Worker
206*15dc779aSAndroid Build Coastguard Worker for (k = len - 1; k >= 0; k--) {
207*15dc779aSAndroid Build Coastguard Worker tmp = ((UWORD32)b[k]) + (r << 16);
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker if (tmp) {
210*15dc779aSAndroid Build Coastguard Worker d[k] = (UWORD16)(tmp / a);
211*15dc779aSAndroid Build Coastguard Worker temp = d[k] * a;
212*15dc779aSAndroid Build Coastguard Worker r = tmp - temp;
213*15dc779aSAndroid Build Coastguard Worker } else {
214*15dc779aSAndroid Build Coastguard Worker d[k] = 0;
215*15dc779aSAndroid Build Coastguard Worker }
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker *pr = (UWORD16)r;
218*15dc779aSAndroid Build Coastguard Worker }
219*15dc779aSAndroid Build Coastguard Worker
ixheaacd_longsub(UWORD16 a[],UWORD16 b[],WORD32 lena,WORD32 lenb)220*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena,
221*15dc779aSAndroid Build Coastguard Worker WORD32 lenb) {
222*15dc779aSAndroid Build Coastguard Worker WORD32 h;
223*15dc779aSAndroid Build Coastguard Worker WORD32 carry = 0;
224*15dc779aSAndroid Build Coastguard Worker
225*15dc779aSAndroid Build Coastguard Worker if (lenb > lena)
226*15dc779aSAndroid Build Coastguard Worker return;
227*15dc779aSAndroid Build Coastguard Worker
228*15dc779aSAndroid Build Coastguard Worker for (h = 0; h < lenb; h++) {
229*15dc779aSAndroid Build Coastguard Worker carry = carry + (WORD32)(a[h] - b[h]);
230*15dc779aSAndroid Build Coastguard Worker a[h] = (UWORD16)carry;
231*15dc779aSAndroid Build Coastguard Worker carry = carry >> 16;
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker
234*15dc779aSAndroid Build Coastguard Worker for (; h < lena; h++) {
235*15dc779aSAndroid Build Coastguard Worker carry = ((UWORD32)a[h]) + carry;
236*15dc779aSAndroid Build Coastguard Worker a[h] = (UWORD16)carry;
237*15dc779aSAndroid Build Coastguard Worker carry = carry >> 16;
238*15dc779aSAndroid Build Coastguard Worker }
239*15dc779aSAndroid Build Coastguard Worker
240*15dc779aSAndroid Build Coastguard Worker if (carry != 0)
241*15dc779aSAndroid Build Coastguard Worker return;
242*15dc779aSAndroid Build Coastguard Worker return;
243*15dc779aSAndroid Build Coastguard Worker }
244*15dc779aSAndroid Build Coastguard Worker
ixheaacd_longcompare(UWORD16 a[],UWORD16 b[],WORD32 len)245*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[],
246*15dc779aSAndroid Build Coastguard Worker WORD32 len) {
247*15dc779aSAndroid Build Coastguard Worker WORD32 i;
248*15dc779aSAndroid Build Coastguard Worker
249*15dc779aSAndroid Build Coastguard Worker for (i = len - 1; i > 0; i--) {
250*15dc779aSAndroid Build Coastguard Worker if (a[i] != b[i]) break;
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker return (a[i] >= b[i]) ? 1 : 0;
253*15dc779aSAndroid Build Coastguard Worker }
254*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_coarse2fine(WORD32 * data,WORD32 data_type,WORD32 band_start,WORD32 ixheaacd_num_bands)255*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type,
256*15dc779aSAndroid Build Coastguard Worker WORD32 band_start, WORD32 ixheaacd_num_bands) {
257*15dc779aSAndroid Build Coastguard Worker WORD32 i;
258*15dc779aSAndroid Build Coastguard Worker
259*15dc779aSAndroid Build Coastguard Worker for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
260*15dc779aSAndroid Build Coastguard Worker data[i] <<= 1;
261*15dc779aSAndroid Build Coastguard Worker }
262*15dc779aSAndroid Build Coastguard Worker
263*15dc779aSAndroid Build Coastguard Worker if (data_type == CLD) {
264*15dc779aSAndroid Build Coastguard Worker for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
265*15dc779aSAndroid Build Coastguard Worker if (data[i] == -14)
266*15dc779aSAndroid Build Coastguard Worker data[i] = -15;
267*15dc779aSAndroid Build Coastguard Worker else if (data[i] == 14)
268*15dc779aSAndroid Build Coastguard Worker data[i] = 15;
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker }
271*15dc779aSAndroid Build Coastguard Worker }
272*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_fine2coarse(WORD32 * data,WORD32 ixheaacd_num_bands)273*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) {
274*15dc779aSAndroid Build Coastguard Worker WORD32 i;
275*15dc779aSAndroid Build Coastguard Worker
276*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ixheaacd_num_bands; i++) {
277*15dc779aSAndroid Build Coastguard Worker data[i] /= 2;
278*15dc779aSAndroid Build Coastguard Worker }
279*15dc779aSAndroid Build Coastguard Worker }
280*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_getstridemap(WORD32 freq_res_stride,WORD32 band_start,WORD32 band_stop,WORD32 * strides)281*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start,
282*15dc779aSAndroid Build Coastguard Worker WORD32 band_stop, WORD32 *strides) {
283*15dc779aSAndroid Build Coastguard Worker WORD32 i, pb, ch_fac, data_bands, start_offset;
284*15dc779aSAndroid Build Coastguard Worker
285*15dc779aSAndroid Build Coastguard Worker ch_fac = ixheaacd_mps_stride_table[freq_res_stride];
286*15dc779aSAndroid Build Coastguard Worker data_bands = (band_stop - band_start - 1) / ch_fac + 1;
287*15dc779aSAndroid Build Coastguard Worker
288*15dc779aSAndroid Build Coastguard Worker strides[0] = band_start;
289*15dc779aSAndroid Build Coastguard Worker for (pb = 1; pb <= data_bands; pb++) {
290*15dc779aSAndroid Build Coastguard Worker strides[pb] = strides[pb - 1] + ch_fac;
291*15dc779aSAndroid Build Coastguard Worker }
292*15dc779aSAndroid Build Coastguard Worker start_offset = 0;
293*15dc779aSAndroid Build Coastguard Worker while (strides[data_bands] > band_stop) {
294*15dc779aSAndroid Build Coastguard Worker if (start_offset < data_bands)
295*15dc779aSAndroid Build Coastguard Worker start_offset++;
296*15dc779aSAndroid Build Coastguard Worker else
297*15dc779aSAndroid Build Coastguard Worker start_offset = 1;
298*15dc779aSAndroid Build Coastguard Worker
299*15dc779aSAndroid Build Coastguard Worker for (i = start_offset; i <= data_bands; i++) {
300*15dc779aSAndroid Build Coastguard Worker strides[i]--;
301*15dc779aSAndroid Build Coastguard Worker }
302*15dc779aSAndroid Build Coastguard Worker }
303*15dc779aSAndroid Build Coastguard Worker
304*15dc779aSAndroid Build Coastguard Worker return data_bands;
305*15dc779aSAndroid Build Coastguard Worker }
306*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_ecdata_decoding(ia_mps_dec_state_struct * self,ia_bit_buf_struct * bitstream,WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],WORD32 datatype)307*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaacd_mps_ecdata_decoding(
308*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream,
309*15dc779aSAndroid Build Coastguard Worker WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) {
310*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
311*15dc779aSAndroid Build Coastguard Worker WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
312*15dc779aSAndroid Build Coastguard Worker WORD32 band_stop = 0;
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker WORD32 *lastdata = NULL;
315*15dc779aSAndroid Build Coastguard Worker ia_mps_data_struct *frame_xxx_data = NULL;
316*15dc779aSAndroid Build Coastguard Worker WORD32 default_val = 0;
317*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err = IA_NO_ERROR;
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *frame = &(self->bs_frame);
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker if (datatype == 0) {
322*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->cld_data;
323*15dc779aSAndroid Build Coastguard Worker lastdata = frame->cmp_cld_idx_prev;
324*15dc779aSAndroid Build Coastguard Worker band_stop = self->bs_param_bands;
325*15dc779aSAndroid Build Coastguard Worker } else if (datatype == 1) {
326*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->icc_data;
327*15dc779aSAndroid Build Coastguard Worker lastdata = frame->cmp_icc_idx_prev;
328*15dc779aSAndroid Build Coastguard Worker band_stop = self->bs_param_bands;
329*15dc779aSAndroid Build Coastguard Worker } else if (datatype == 2) {
330*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->ipd_data;
331*15dc779aSAndroid Build Coastguard Worker lastdata = frame->ipd_idx_data_prev;
332*15dc779aSAndroid Build Coastguard Worker band_stop = self->num_bands_ipd;
333*15dc779aSAndroid Build Coastguard Worker } else {
334*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->cld_data;
335*15dc779aSAndroid Build Coastguard Worker lastdata = frame->cmp_cld_idx_prev;
336*15dc779aSAndroid Build Coastguard Worker band_stop = self->bs_param_bands;
337*15dc779aSAndroid Build Coastguard Worker }
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
340*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2);
341*15dc779aSAndroid Build Coastguard Worker }
342*15dc779aSAndroid Build Coastguard Worker
343*15dc779aSAndroid Build Coastguard Worker set_index = 0;
344*15dc779aSAndroid Build Coastguard Worker bs_data_pair = 0;
345*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
346*15dc779aSAndroid Build Coastguard Worker
347*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
348*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
349*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < band_stop; pb++) {
350*15dc779aSAndroid Build Coastguard Worker lastdata[pb] = default_val;
351*15dc779aSAndroid Build Coastguard Worker }
352*15dc779aSAndroid Build Coastguard Worker
353*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx = 0;
354*15dc779aSAndroid Build Coastguard Worker }
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
357*15dc779aSAndroid Build Coastguard Worker if (bs_data_pair) {
358*15dc779aSAndroid Build Coastguard Worker bs_data_pair = 0;
359*15dc779aSAndroid Build Coastguard Worker } else {
360*15dc779aSAndroid Build Coastguard Worker bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1);
361*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index] =
362*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(bitstream, 1);
363*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
364*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(bitstream, 2);
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
367*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx) {
368*15dc779aSAndroid Build Coastguard Worker if (old_quant_coarse_xxx) {
369*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
370*15dc779aSAndroid Build Coastguard Worker } else {
371*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_fine2coarse(lastdata, band_stop);
372*15dc779aSAndroid Build Coastguard Worker }
373*15dc779aSAndroid Build Coastguard Worker }
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker data_bands = ixheaacd_mps_getstridemap(
376*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop,
377*15dc779aSAndroid Build Coastguard Worker strides);
378*15dc779aSAndroid Build Coastguard Worker
379*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < data_bands; pb++) {
380*15dc779aSAndroid Build Coastguard Worker lastdata[pb] = lastdata[strides[pb]];
381*15dc779aSAndroid Build Coastguard Worker }
382*15dc779aSAndroid Build Coastguard Worker
383*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_mps_ecdatapairdec(
384*15dc779aSAndroid Build Coastguard Worker bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
385*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index],
386*15dc779aSAndroid Build Coastguard Worker !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag);
387*15dc779aSAndroid Build Coastguard Worker if (err) return err;
388*15dc779aSAndroid Build Coastguard Worker
389*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < data_bands; pb++) {
390*15dc779aSAndroid Build Coastguard Worker for (j = strides[pb]; j < strides[pb + 1]; j++) {
391*15dc779aSAndroid Build Coastguard Worker if (datatype == IPD) {
392*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
393*15dc779aSAndroid Build Coastguard Worker lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
394*15dc779aSAndroid Build Coastguard Worker } else {
395*15dc779aSAndroid Build Coastguard Worker lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
396*15dc779aSAndroid Build Coastguard Worker }
397*15dc779aSAndroid Build Coastguard Worker } else {
398*15dc779aSAndroid Build Coastguard Worker lastdata[j] = data[set_index + bs_data_pair][pb];
399*15dc779aSAndroid Build Coastguard Worker }
400*15dc779aSAndroid Build Coastguard Worker }
401*15dc779aSAndroid Build Coastguard Worker }
402*15dc779aSAndroid Build Coastguard Worker
403*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
404*15dc779aSAndroid Build Coastguard Worker
405*15dc779aSAndroid Build Coastguard Worker if (bs_data_pair) {
406*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
407*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index];
408*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
409*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index];
410*15dc779aSAndroid Build Coastguard Worker }
411*15dc779aSAndroid Build Coastguard Worker set_index += bs_data_pair + 1;
412*15dc779aSAndroid Build Coastguard Worker }
413*15dc779aSAndroid Build Coastguard Worker }
414*15dc779aSAndroid Build Coastguard Worker }
415*15dc779aSAndroid Build Coastguard Worker return err;
416*15dc779aSAndroid Build Coastguard Worker }
417*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct * self,WORD32 usac_independency_flag,ia_bit_buf_struct * bitstream)418*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self,
419*15dc779aSAndroid Build Coastguard Worker WORD32 usac_independency_flag,
420*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *bitstream) {
421*15dc779aSAndroid Build Coastguard Worker WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch;
422*15dc779aSAndroid Build Coastguard Worker WORD32 ps, pg, ts, pb;
423*15dc779aSAndroid Build Coastguard Worker WORD32 env_shape_data[MAX_TIME_SLOTS];
424*15dc779aSAndroid Build Coastguard Worker
425*15dc779aSAndroid Build Coastguard Worker WORD32 bits_param_slot = 0;
426*15dc779aSAndroid Build Coastguard Worker
427*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *frame = &(self->bs_frame);
428*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err = IA_NO_ERROR;
429*15dc779aSAndroid Build Coastguard Worker
430*15dc779aSAndroid Build Coastguard Worker if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
431*15dc779aSAndroid Build Coastguard Worker
432*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets_prev = self->num_parameter_sets;
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker if (self->bs_high_rate_mode) {
435*15dc779aSAndroid Build Coastguard Worker bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1);
436*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1;
437*15dc779aSAndroid Build Coastguard Worker } else {
438*15dc779aSAndroid Build Coastguard Worker bs_frame_type = 0;
439*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets = 1;
440*15dc779aSAndroid Build Coastguard Worker }
441*15dc779aSAndroid Build Coastguard Worker
442*15dc779aSAndroid Build Coastguard Worker if (self->time_slots == 32)
443*15dc779aSAndroid Build Coastguard Worker bits_param_slot = 5;
444*15dc779aSAndroid Build Coastguard Worker else if (self->time_slots == 64)
445*15dc779aSAndroid Build Coastguard Worker bits_param_slot = 6;
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker if (bs_frame_type) {
448*15dc779aSAndroid Build Coastguard Worker WORD32 prev_param_slot = -1;
449*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
450*15dc779aSAndroid Build Coastguard Worker self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot);
451*15dc779aSAndroid Build Coastguard Worker
452*15dc779aSAndroid Build Coastguard Worker if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
453*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
454*15dc779aSAndroid Build Coastguard Worker }
455*15dc779aSAndroid Build Coastguard Worker prev_param_slot = self->param_slots[i];
456*15dc779aSAndroid Build Coastguard Worker }
457*15dc779aSAndroid Build Coastguard Worker } else {
458*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
459*15dc779aSAndroid Build Coastguard Worker self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
460*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets) -
461*15dc779aSAndroid Build Coastguard Worker 1;
462*15dc779aSAndroid Build Coastguard Worker }
463*15dc779aSAndroid Build Coastguard Worker }
464*15dc779aSAndroid Build Coastguard Worker
465*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flag) {
466*15dc779aSAndroid Build Coastguard Worker frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1);
467*15dc779aSAndroid Build Coastguard Worker } else {
468*15dc779aSAndroid Build Coastguard Worker frame->independency_flag = 1;
469*15dc779aSAndroid Build Coastguard Worker }
470*15dc779aSAndroid Build Coastguard Worker
471*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD);
472*15dc779aSAndroid Build Coastguard Worker if (err) return err;
473*15dc779aSAndroid Build Coastguard Worker
474*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC);
475*15dc779aSAndroid Build Coastguard Worker if (err) return err;
476*15dc779aSAndroid Build Coastguard Worker
477*15dc779aSAndroid Build Coastguard Worker if (self->config->bs_phase_coding) {
478*15dc779aSAndroid Build Coastguard Worker self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1);
479*15dc779aSAndroid Build Coastguard Worker
480*15dc779aSAndroid Build Coastguard Worker if (!self->bs_phase_mode) {
481*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->num_bands_ipd; pb++) {
482*15dc779aSAndroid Build Coastguard Worker frame->ipd_idx_data_prev[pb] = 0;
483*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
484*15dc779aSAndroid Build Coastguard Worker frame->ipd_idx_data[i][pb] = 0;
485*15dc779aSAndroid Build Coastguard Worker self->bs_frame.ipd_idx[i][pb] = 0;
486*15dc779aSAndroid Build Coastguard Worker }
487*15dc779aSAndroid Build Coastguard Worker self->bs_frame.ipd_idx_prev[pb] = 0;
488*15dc779aSAndroid Build Coastguard Worker }
489*15dc779aSAndroid Build Coastguard Worker self->opd_smoothing_mode = 0;
490*15dc779aSAndroid Build Coastguard Worker } else {
491*15dc779aSAndroid Build Coastguard Worker self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1);
492*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data,
493*15dc779aSAndroid Build Coastguard Worker IPD);
494*15dc779aSAndroid Build Coastguard Worker if (err) return err;
495*15dc779aSAndroid Build Coastguard Worker }
496*15dc779aSAndroid Build Coastguard Worker }
497*15dc779aSAndroid Build Coastguard Worker
498*15dc779aSAndroid Build Coastguard Worker else {
499*15dc779aSAndroid Build Coastguard Worker self->bs_phase_mode = 0;
500*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->num_bands_ipd; pb++) {
501*15dc779aSAndroid Build Coastguard Worker frame->ipd_idx_data_prev[pb] = 0;
502*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
503*15dc779aSAndroid Build Coastguard Worker frame->ipd_idx_data[i][pb] = 0;
504*15dc779aSAndroid Build Coastguard Worker self->bs_frame.ipd_idx[i][pb] = 0;
505*15dc779aSAndroid Build Coastguard Worker }
506*15dc779aSAndroid Build Coastguard Worker self->bs_frame.ipd_idx_prev[pb] = 0;
507*15dc779aSAndroid Build Coastguard Worker }
508*15dc779aSAndroid Build Coastguard Worker self->opd_smoothing_mode = 0;
509*15dc779aSAndroid Build Coastguard Worker }
510*15dc779aSAndroid Build Coastguard Worker
511*15dc779aSAndroid Build Coastguard Worker if (self->bs_high_rate_mode) {
512*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < self->num_parameter_sets; ps++) {
513*15dc779aSAndroid Build Coastguard Worker frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2);
514*15dc779aSAndroid Build Coastguard Worker if (frame->bs_smooth_mode[ps] >= 2) {
515*15dc779aSAndroid Build Coastguard Worker frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2);
516*15dc779aSAndroid Build Coastguard Worker }
517*15dc779aSAndroid Build Coastguard Worker if (frame->bs_smooth_mode[ps] == 3) {
518*15dc779aSAndroid Build Coastguard Worker frame->bs_freq_res_stride_smg[ps] =
519*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(bitstream, 2);
520*15dc779aSAndroid Build Coastguard Worker data_bands =
521*15dc779aSAndroid Build Coastguard Worker (self->bs_param_bands - 1) /
522*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
523*15dc779aSAndroid Build Coastguard Worker 1;
524*15dc779aSAndroid Build Coastguard Worker for (pg = 0; pg < data_bands; pg++) {
525*15dc779aSAndroid Build Coastguard Worker frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1);
526*15dc779aSAndroid Build Coastguard Worker }
527*15dc779aSAndroid Build Coastguard Worker }
528*15dc779aSAndroid Build Coastguard Worker }
529*15dc779aSAndroid Build Coastguard Worker } else {
530*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < self->num_parameter_sets; ps++) {
531*15dc779aSAndroid Build Coastguard Worker frame->bs_smooth_mode[ps] = 0;
532*15dc779aSAndroid Build Coastguard Worker }
533*15dc779aSAndroid Build Coastguard Worker }
534*15dc779aSAndroid Build Coastguard Worker
535*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
536*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_stp[i] = 0;
537*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_ges[i] = 0;
538*15dc779aSAndroid Build Coastguard Worker }
539*15dc779aSAndroid Build Coastguard Worker
540*15dc779aSAndroid Build Coastguard Worker self->bs_tsd_enable = 0;
541*15dc779aSAndroid Build Coastguard Worker if (self->config->bs_temp_shape_config == 3) {
542*15dc779aSAndroid Build Coastguard Worker self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1);
543*15dc779aSAndroid Build Coastguard Worker } else if (self->config->bs_temp_shape_config != 0) {
544*15dc779aSAndroid Build Coastguard Worker bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1);
545*15dc779aSAndroid Build Coastguard Worker if (bs_temp_shape_enable) {
546*15dc779aSAndroid Build Coastguard Worker num_of_temp_shape_ch = 2;
547*15dc779aSAndroid Build Coastguard Worker switch (self->config->bs_temp_shape_config) {
548*15dc779aSAndroid Build Coastguard Worker case 1:
549*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_temp_shape_ch; i++) {
550*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_stp[i] =
551*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(bitstream, 1);
552*15dc779aSAndroid Build Coastguard Worker }
553*15dc779aSAndroid Build Coastguard Worker break;
554*15dc779aSAndroid Build Coastguard Worker case 2:
555*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_temp_shape_ch; i++) {
556*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_ges[i] =
557*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(bitstream, 1);
558*15dc779aSAndroid Build Coastguard Worker }
559*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_temp_shape_ch; i++) {
560*15dc779aSAndroid Build Coastguard Worker if (self->temp_shape_enable_ch_ges[i]) {
561*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_huff_decode(bitstream, env_shape_data,
562*15dc779aSAndroid Build Coastguard Worker self->time_slots);
563*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
564*15dc779aSAndroid Build Coastguard Worker self->env_shape_data[i][ts] = (FLOAT32)pow(
565*15dc779aSAndroid Build Coastguard Worker 2, (FLOAT32)env_shape_data[ts] /
566*15dc779aSAndroid Build Coastguard Worker (self->config->bs_env_quant_mode + 2) -
567*15dc779aSAndroid Build Coastguard Worker 1);
568*15dc779aSAndroid Build Coastguard Worker }
569*15dc779aSAndroid Build Coastguard Worker }
570*15dc779aSAndroid Build Coastguard Worker }
571*15dc779aSAndroid Build Coastguard Worker break;
572*15dc779aSAndroid Build Coastguard Worker default:
573*15dc779aSAndroid Build Coastguard Worker return -1;
574*15dc779aSAndroid Build Coastguard Worker }
575*15dc779aSAndroid Build Coastguard Worker }
576*15dc779aSAndroid Build Coastguard Worker }
577*15dc779aSAndroid Build Coastguard Worker
578*15dc779aSAndroid Build Coastguard Worker if (self->bs_tsd_enable) {
579*15dc779aSAndroid Build Coastguard Worker UWORD16 s[4];
580*15dc779aSAndroid Build Coastguard Worker UWORD64 s_64;
581*15dc779aSAndroid Build Coastguard Worker UWORD16 c[5];
582*15dc779aSAndroid Build Coastguard Worker UWORD64 c_64;
583*15dc779aSAndroid Build Coastguard Worker UWORD16 b;
584*15dc779aSAndroid Build Coastguard Worker UWORD16 r[1];
585*15dc779aSAndroid Build Coastguard Worker static const UWORD16 table_64[] = {
586*15dc779aSAndroid Build Coastguard Worker 6, 11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49,
587*15dc779aSAndroid Build Coastguard Worker 51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61};
588*15dc779aSAndroid Build Coastguard Worker static const UWORD16 table_32[] = {5, 9, 13, 16, 18, 20, 22, 24,
589*15dc779aSAndroid Build Coastguard Worker 25, 26, 27, 28, 29, 29, 30, 30};
590*15dc779aSAndroid Build Coastguard Worker unsigned const short *tab = NULL;
591*15dc779aSAndroid Build Coastguard Worker WORD32 k;
592*15dc779aSAndroid Build Coastguard Worker UWORD16 h;
593*15dc779aSAndroid Build Coastguard Worker WORD32 nbits_tr_slots = 0;
594*15dc779aSAndroid Build Coastguard Worker
595*15dc779aSAndroid Build Coastguard Worker if (self->time_slots == 32) {
596*15dc779aSAndroid Build Coastguard Worker nbits_tr_slots = 4;
597*15dc779aSAndroid Build Coastguard Worker tab = table_32;
598*15dc779aSAndroid Build Coastguard Worker } else if (self->time_slots == 64) {
599*15dc779aSAndroid Build Coastguard Worker nbits_tr_slots = 5;
600*15dc779aSAndroid Build Coastguard Worker tab = table_64;
601*15dc779aSAndroid Build Coastguard Worker }
602*15dc779aSAndroid Build Coastguard Worker
603*15dc779aSAndroid Build Coastguard Worker self->tsd_num_tr_slots = ixheaacd_read_bits_buf(bitstream, nbits_tr_slots);
604*15dc779aSAndroid Build Coastguard Worker self->tsd_num_tr_slots++;
605*15dc779aSAndroid Build Coastguard Worker self->tsd_codeword_len = tab[self->tsd_num_tr_slots - 1];
606*15dc779aSAndroid Build Coastguard Worker
607*15dc779aSAndroid Build Coastguard Worker if (self->tsd_codeword_len > 48) {
608*15dc779aSAndroid Build Coastguard Worker s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48);
609*15dc779aSAndroid Build Coastguard Worker s_64 = s[3];
610*15dc779aSAndroid Build Coastguard Worker s[2] = ixheaacd_read_bits_buf(bitstream, 16);
611*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[2];
612*15dc779aSAndroid Build Coastguard Worker s[1] = ixheaacd_read_bits_buf(bitstream, 16);
613*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[1];
614*15dc779aSAndroid Build Coastguard Worker s[0] = ixheaacd_read_bits_buf(bitstream, 16);
615*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[0];
616*15dc779aSAndroid Build Coastguard Worker } else if (self->tsd_codeword_len > 32) {
617*15dc779aSAndroid Build Coastguard Worker s[3] = 0;
618*15dc779aSAndroid Build Coastguard Worker s_64 = s[3];
619*15dc779aSAndroid Build Coastguard Worker s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32);
620*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[2];
621*15dc779aSAndroid Build Coastguard Worker s[1] = ixheaacd_read_bits_buf(bitstream, 16);
622*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[1];
623*15dc779aSAndroid Build Coastguard Worker s[0] = ixheaacd_read_bits_buf(bitstream, 16);
624*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[0];
625*15dc779aSAndroid Build Coastguard Worker } else if (self->tsd_codeword_len > 16) {
626*15dc779aSAndroid Build Coastguard Worker s[3] = 0;
627*15dc779aSAndroid Build Coastguard Worker s_64 = s[3];
628*15dc779aSAndroid Build Coastguard Worker s[2] = 0;
629*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[2];
630*15dc779aSAndroid Build Coastguard Worker s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16);
631*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[1];
632*15dc779aSAndroid Build Coastguard Worker s[0] = ixheaacd_read_bits_buf(bitstream, 16);
633*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[0];
634*15dc779aSAndroid Build Coastguard Worker } else {
635*15dc779aSAndroid Build Coastguard Worker s[3] = 0;
636*15dc779aSAndroid Build Coastguard Worker s_64 = s[3];
637*15dc779aSAndroid Build Coastguard Worker s[2] = 0;
638*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[2];
639*15dc779aSAndroid Build Coastguard Worker s[1] = 0;
640*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[1];
641*15dc779aSAndroid Build Coastguard Worker s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len);
642*15dc779aSAndroid Build Coastguard Worker s_64 = (s_64 << 16) | s[0];
643*15dc779aSAndroid Build Coastguard Worker }
644*15dc779aSAndroid Build Coastguard Worker
645*15dc779aSAndroid Build Coastguard Worker {
646*15dc779aSAndroid Build Coastguard Worker WORD32 p = self->tsd_num_tr_slots;
647*15dc779aSAndroid Build Coastguard Worker
648*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0;
649*15dc779aSAndroid Build Coastguard Worker
650*15dc779aSAndroid Build Coastguard Worker for (k = self->time_slots - 1; k >= 0; k--) {
651*15dc779aSAndroid Build Coastguard Worker if (p > k) {
652*15dc779aSAndroid Build Coastguard Worker for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1;
653*15dc779aSAndroid Build Coastguard Worker break;
654*15dc779aSAndroid Build Coastguard Worker }
655*15dc779aSAndroid Build Coastguard Worker
656*15dc779aSAndroid Build Coastguard Worker c[0] = k - p + 1;
657*15dc779aSAndroid Build Coastguard Worker c_64 = c[0];
658*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < 5; i++) c[i] = 0;
659*15dc779aSAndroid Build Coastguard Worker
660*15dc779aSAndroid Build Coastguard Worker for (h = 2; h <= p; h++) {
661*15dc779aSAndroid Build Coastguard Worker b = k - p + h;
662*15dc779aSAndroid Build Coastguard Worker c_64 = c_64 * (b / h);
663*15dc779aSAndroid Build Coastguard Worker ixheaacd_longmult1(c, b, c, 5);
664*15dc779aSAndroid Build Coastguard Worker b = h;
665*15dc779aSAndroid Build Coastguard Worker ixheaacd_longdiv(c, b, c, r, 5);
666*15dc779aSAndroid Build Coastguard Worker }
667*15dc779aSAndroid Build Coastguard Worker
668*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_longcompare(s, c, 4)) {
669*15dc779aSAndroid Build Coastguard Worker ixheaacd_longsub(s, c, 4, 4);
670*15dc779aSAndroid Build Coastguard Worker self->bs_tsd_sep_data[k] = 1;
671*15dc779aSAndroid Build Coastguard Worker p--;
672*15dc779aSAndroid Build Coastguard Worker if (p == 0) break;
673*15dc779aSAndroid Build Coastguard Worker }
674*15dc779aSAndroid Build Coastguard Worker }
675*15dc779aSAndroid Build Coastguard Worker }
676*15dc779aSAndroid Build Coastguard Worker
677*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->time_slots; i++) {
678*15dc779aSAndroid Build Coastguard Worker if (self->bs_tsd_sep_data[i])
679*15dc779aSAndroid Build Coastguard Worker self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3);
680*15dc779aSAndroid Build Coastguard Worker }
681*15dc779aSAndroid Build Coastguard Worker }
682*15dc779aSAndroid Build Coastguard Worker
683*15dc779aSAndroid Build Coastguard Worker self->parse_nxt_frame = 0;
684*15dc779aSAndroid Build Coastguard Worker return err;
685*15dc779aSAndroid Build Coastguard Worker }
686*15dc779aSAndroid Build Coastguard Worker
ixheaacd_ld_mps_ecdata_decoding(ia_mps_dec_state_struct * self,ia_bit_buf_struct * it_bit_buff,WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],WORD32 datatype,WORD32 start_band)687*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_ld_mps_ecdata_decoding(
688*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff,
689*15dc779aSAndroid Build Coastguard Worker WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype,
690*15dc779aSAndroid Build Coastguard Worker WORD32 start_band) {
691*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, pb, data_set, set_index, bs_data_pair, data_bands,
692*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx;
693*15dc779aSAndroid Build Coastguard Worker WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
694*15dc779aSAndroid Build Coastguard Worker WORD32 band_stop = 0;
695*15dc779aSAndroid Build Coastguard Worker
696*15dc779aSAndroid Build Coastguard Worker WORD32 *lastdata = NULL;
697*15dc779aSAndroid Build Coastguard Worker ia_mps_data_struct *frame_xxx_data = NULL;
698*15dc779aSAndroid Build Coastguard Worker WORD32 default_val = 0;
699*15dc779aSAndroid Build Coastguard Worker
700*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *frame = &(self->bs_frame);
701*15dc779aSAndroid Build Coastguard Worker
702*15dc779aSAndroid Build Coastguard Worker if (datatype == CLD) {
703*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->cld_data;
704*15dc779aSAndroid Build Coastguard Worker lastdata = frame->cmp_cld_idx_prev;
705*15dc779aSAndroid Build Coastguard Worker band_stop = self->bs_param_bands;
706*15dc779aSAndroid Build Coastguard Worker } else if (datatype == ICC) {
707*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->icc_data;
708*15dc779aSAndroid Build Coastguard Worker lastdata = frame->cmp_icc_idx_prev;
709*15dc779aSAndroid Build Coastguard Worker band_stop = self->bs_param_bands;
710*15dc779aSAndroid Build Coastguard Worker } else if (datatype == IPD) {
711*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->ipd_data;
712*15dc779aSAndroid Build Coastguard Worker lastdata = frame->ipd_idx_data_prev;
713*15dc779aSAndroid Build Coastguard Worker band_stop = self->num_bands_ipd;
714*15dc779aSAndroid Build Coastguard Worker } else {
715*15dc779aSAndroid Build Coastguard Worker frame_xxx_data = &frame->cld_data;
716*15dc779aSAndroid Build Coastguard Worker lastdata = frame->cmp_cld_idx_prev;
717*15dc779aSAndroid Build Coastguard Worker band_stop = self->bs_param_bands;
718*15dc779aSAndroid Build Coastguard Worker }
719*15dc779aSAndroid Build Coastguard Worker data_set = 0;
720*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
721*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_xxx_data_mode[i] =
722*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
723*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
724*15dc779aSAndroid Build Coastguard Worker data_set++;
725*15dc779aSAndroid Build Coastguard Worker }
726*15dc779aSAndroid Build Coastguard Worker }
727*15dc779aSAndroid Build Coastguard Worker
728*15dc779aSAndroid Build Coastguard Worker set_index = 0;
729*15dc779aSAndroid Build Coastguard Worker bs_data_pair = 0;
730*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
731*15dc779aSAndroid Build Coastguard Worker
732*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
733*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
734*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < band_stop; pb++) {
735*15dc779aSAndroid Build Coastguard Worker lastdata[pb] = default_val;
736*15dc779aSAndroid Build Coastguard Worker }
737*15dc779aSAndroid Build Coastguard Worker
738*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx = 0;
739*15dc779aSAndroid Build Coastguard Worker }
740*15dc779aSAndroid Build Coastguard Worker
741*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
742*15dc779aSAndroid Build Coastguard Worker if (bs_data_pair) {
743*15dc779aSAndroid Build Coastguard Worker bs_data_pair = 0;
744*15dc779aSAndroid Build Coastguard Worker } else {
745*15dc779aSAndroid Build Coastguard Worker bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1);
746*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index] =
747*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 1);
748*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
749*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
750*15dc779aSAndroid Build Coastguard Worker
751*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
752*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx) {
753*15dc779aSAndroid Build Coastguard Worker if (old_quant_coarse_xxx) {
754*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
755*15dc779aSAndroid Build Coastguard Worker } else {
756*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_fine2coarse(lastdata, band_stop);
757*15dc779aSAndroid Build Coastguard Worker }
758*15dc779aSAndroid Build Coastguard Worker }
759*15dc779aSAndroid Build Coastguard Worker
760*15dc779aSAndroid Build Coastguard Worker data_bands = ixheaacd_mps_getstridemap(
761*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band,
762*15dc779aSAndroid Build Coastguard Worker band_stop, strides);
763*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < data_bands; pb++) {
764*15dc779aSAndroid Build Coastguard Worker lastdata[pb] = lastdata[strides[pb]];
765*15dc779aSAndroid Build Coastguard Worker }
766*15dc779aSAndroid Build Coastguard Worker
767*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_ecdatapairdec(
768*15dc779aSAndroid Build Coastguard Worker it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
769*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index],
770*15dc779aSAndroid Build Coastguard Worker !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag);
771*15dc779aSAndroid Build Coastguard Worker
772*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < data_bands; pb++) {
773*15dc779aSAndroid Build Coastguard Worker for (j = strides[pb]; j < strides[pb + 1]; j++) {
774*15dc779aSAndroid Build Coastguard Worker if (datatype == IPD) {
775*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
776*15dc779aSAndroid Build Coastguard Worker lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
777*15dc779aSAndroid Build Coastguard Worker } else {
778*15dc779aSAndroid Build Coastguard Worker lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
779*15dc779aSAndroid Build Coastguard Worker }
780*15dc779aSAndroid Build Coastguard Worker } else {
781*15dc779aSAndroid Build Coastguard Worker lastdata[j] = data[set_index + bs_data_pair][pb];
782*15dc779aSAndroid Build Coastguard Worker }
783*15dc779aSAndroid Build Coastguard Worker }
784*15dc779aSAndroid Build Coastguard Worker }
785*15dc779aSAndroid Build Coastguard Worker
786*15dc779aSAndroid Build Coastguard Worker old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
787*15dc779aSAndroid Build Coastguard Worker
788*15dc779aSAndroid Build Coastguard Worker if (bs_data_pair) {
789*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
790*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index];
791*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
792*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_freq_res_stride_xxx[set_index];
793*15dc779aSAndroid Build Coastguard Worker }
794*15dc779aSAndroid Build Coastguard Worker set_index += bs_data_pair + 1;
795*15dc779aSAndroid Build Coastguard Worker }
796*15dc779aSAndroid Build Coastguard Worker }
797*15dc779aSAndroid Build Coastguard Worker }
798*15dc779aSAndroid Build Coastguard Worker }
799*15dc779aSAndroid Build Coastguard Worker
ixheaacd_ld_mps_frame_parsing(ia_mps_dec_state_struct * self,ia_bit_buf_struct * it_bit_buff)800*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
801*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) {
802*15dc779aSAndroid Build Coastguard Worker WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable,
803*15dc779aSAndroid Build Coastguard Worker num_of_temp_shape_ch;
804*15dc779aSAndroid Build Coastguard Worker WORD32 ps, pg, ts, ic;
805*15dc779aSAndroid Build Coastguard Worker WORD32 env_shape_data[MAX_TIME_SLOTS];
806*15dc779aSAndroid Build Coastguard Worker WORD32 alignment;
807*15dc779aSAndroid Build Coastguard Worker WORD32 bits_param_slot = 0;
808*15dc779aSAndroid Build Coastguard Worker
809*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *frame = &(self->bs_frame);
810*15dc779aSAndroid Build Coastguard Worker alignment = it_bit_buff->cnt_bits;
811*15dc779aSAndroid Build Coastguard Worker if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
812*15dc779aSAndroid Build Coastguard Worker
813*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets_prev = self->num_parameter_sets;
814*15dc779aSAndroid Build Coastguard Worker
815*15dc779aSAndroid Build Coastguard Worker bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1);
816*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1;
817*15dc779aSAndroid Build Coastguard Worker
818*15dc779aSAndroid Build Coastguard Worker if (self->time_slots == 32)
819*15dc779aSAndroid Build Coastguard Worker bits_param_slot = 5;
820*15dc779aSAndroid Build Coastguard Worker else if (self->time_slots == 64)
821*15dc779aSAndroid Build Coastguard Worker bits_param_slot = 6;
822*15dc779aSAndroid Build Coastguard Worker else if (self->time_slots == 8)
823*15dc779aSAndroid Build Coastguard Worker bits_param_slot = 3;
824*15dc779aSAndroid Build Coastguard Worker else if (self->time_slots == 16 || self->time_slots == 15)
825*15dc779aSAndroid Build Coastguard Worker bits_param_slot = 4;
826*15dc779aSAndroid Build Coastguard Worker
827*15dc779aSAndroid Build Coastguard Worker if (bs_frame_type) {
828*15dc779aSAndroid Build Coastguard Worker WORD32 prev_param_slot = -1;
829*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
830*15dc779aSAndroid Build Coastguard Worker self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot);
831*15dc779aSAndroid Build Coastguard Worker
832*15dc779aSAndroid Build Coastguard Worker if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
833*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
834*15dc779aSAndroid Build Coastguard Worker }
835*15dc779aSAndroid Build Coastguard Worker prev_param_slot = self->param_slots[i];
836*15dc779aSAndroid Build Coastguard Worker }
837*15dc779aSAndroid Build Coastguard Worker } else {
838*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->num_parameter_sets; i++) {
839*15dc779aSAndroid Build Coastguard Worker self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
840*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets) -
841*15dc779aSAndroid Build Coastguard Worker 1;
842*15dc779aSAndroid Build Coastguard Worker }
843*15dc779aSAndroid Build Coastguard Worker }
844*15dc779aSAndroid Build Coastguard Worker
845*15dc779aSAndroid Build Coastguard Worker frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
846*15dc779aSAndroid Build Coastguard Worker
847*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
848*15dc779aSAndroid Build Coastguard Worker ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD,
849*15dc779aSAndroid Build Coastguard Worker 0);
850*15dc779aSAndroid Build Coastguard Worker }
851*15dc779aSAndroid Build Coastguard Worker
852*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.bs_one_icc) {
853*15dc779aSAndroid Build Coastguard Worker ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC,
854*15dc779aSAndroid Build Coastguard Worker 0);
855*15dc779aSAndroid Build Coastguard Worker } else {
856*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
857*15dc779aSAndroid Build Coastguard Worker if (!self->ldmps_config.ott_mode_lfe[i])
858*15dc779aSAndroid Build Coastguard Worker ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx,
859*15dc779aSAndroid Build Coastguard Worker ICC, 0);
860*15dc779aSAndroid Build Coastguard Worker }
861*15dc779aSAndroid Build Coastguard Worker }
862*15dc779aSAndroid Build Coastguard Worker
863*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < self->num_parameter_sets; ps++) {
864*15dc779aSAndroid Build Coastguard Worker frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
865*15dc779aSAndroid Build Coastguard Worker if (frame->bs_smooth_mode[ps] >= 2) {
866*15dc779aSAndroid Build Coastguard Worker frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
867*15dc779aSAndroid Build Coastguard Worker }
868*15dc779aSAndroid Build Coastguard Worker if (frame->bs_smooth_mode[ps] == 3) {
869*15dc779aSAndroid Build Coastguard Worker frame->bs_freq_res_stride_smg[ps] =
870*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
871*15dc779aSAndroid Build Coastguard Worker data_bands =
872*15dc779aSAndroid Build Coastguard Worker (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) /
873*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
874*15dc779aSAndroid Build Coastguard Worker 1;
875*15dc779aSAndroid Build Coastguard Worker for (pg = 0; pg < data_bands; pg++) {
876*15dc779aSAndroid Build Coastguard Worker frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1);
877*15dc779aSAndroid Build Coastguard Worker }
878*15dc779aSAndroid Build Coastguard Worker }
879*15dc779aSAndroid Build Coastguard Worker }
880*15dc779aSAndroid Build Coastguard Worker
881*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
882*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_stp[i] = 0;
883*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_ges[i] = 0;
884*15dc779aSAndroid Build Coastguard Worker }
885*15dc779aSAndroid Build Coastguard Worker
886*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.bs_temp_shape_config != 0) {
887*15dc779aSAndroid Build Coastguard Worker bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1);
888*15dc779aSAndroid Build Coastguard Worker if (bs_temp_shape_enable) {
889*15dc779aSAndroid Build Coastguard Worker num_of_temp_shape_ch = 2;
890*15dc779aSAndroid Build Coastguard Worker switch (self->ldmps_config.bs_temp_shape_config) {
891*15dc779aSAndroid Build Coastguard Worker case 1:
892*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_temp_shape_ch; i++) {
893*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_stp[i] =
894*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 1);
895*15dc779aSAndroid Build Coastguard Worker }
896*15dc779aSAndroid Build Coastguard Worker break;
897*15dc779aSAndroid Build Coastguard Worker case 2:
898*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_temp_shape_ch; i++) {
899*15dc779aSAndroid Build Coastguard Worker self->temp_shape_enable_ch_ges[i] =
900*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 1);
901*15dc779aSAndroid Build Coastguard Worker }
902*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_temp_shape_ch; i++) {
903*15dc779aSAndroid Build Coastguard Worker if (self->temp_shape_enable_ch_ges[i]) {
904*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data,
905*15dc779aSAndroid Build Coastguard Worker self->time_slots);
906*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
907*15dc779aSAndroid Build Coastguard Worker self->env_shape_data[i][ts] = (FLOAT32)pow(
908*15dc779aSAndroid Build Coastguard Worker 2, (FLOAT32)env_shape_data[ts] /
909*15dc779aSAndroid Build Coastguard Worker (self->ldmps_config.bs_env_quant_mode + 2) -
910*15dc779aSAndroid Build Coastguard Worker 1);
911*15dc779aSAndroid Build Coastguard Worker }
912*15dc779aSAndroid Build Coastguard Worker }
913*15dc779aSAndroid Build Coastguard Worker }
914*15dc779aSAndroid Build Coastguard Worker break;
915*15dc779aSAndroid Build Coastguard Worker default:
916*15dc779aSAndroid Build Coastguard Worker if (self->ec_flag == 0) {
917*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
918*15dc779aSAndroid Build Coastguard Worker }
919*15dc779aSAndroid Build Coastguard Worker break;
920*15dc779aSAndroid Build Coastguard Worker }
921*15dc779aSAndroid Build Coastguard Worker }
922*15dc779aSAndroid Build Coastguard Worker }
923*15dc779aSAndroid Build Coastguard Worker
924*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.bs_arbitrary_downmix != 0) {
925*15dc779aSAndroid Build Coastguard Worker for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) {
926*15dc779aSAndroid Build Coastguard Worker ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx,
927*15dc779aSAndroid Build Coastguard Worker CLD, 0);
928*15dc779aSAndroid Build Coastguard Worker }
929*15dc779aSAndroid Build Coastguard Worker }
930*15dc779aSAndroid Build Coastguard Worker
931*15dc779aSAndroid Build Coastguard Worker ixheaacd_byte_align(it_bit_buff, &alignment);
932*15dc779aSAndroid Build Coastguard Worker
933*15dc779aSAndroid Build Coastguard Worker while (it_bit_buff->cnt_bits > 8) {
934*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 8);
935*15dc779aSAndroid Build Coastguard Worker }
936*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
937*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
938*15dc779aSAndroid Build Coastguard Worker }
939*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS+1],WORD32 band_start,WORD32 band_stop,WORD32 ch_fac)940*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1],
941*15dc779aSAndroid Build Coastguard Worker WORD32 band_start, WORD32 band_stop,
942*15dc779aSAndroid Build Coastguard Worker WORD32 ch_fac) {
943*15dc779aSAndroid Build Coastguard Worker WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
944*15dc779aSAndroid Build Coastguard Worker WORD32 vdk[MAX_PARAMETER_BANDS + 1];
945*15dc779aSAndroid Build Coastguard Worker input_bands = band_stop - band_start;
946*15dc779aSAndroid Build Coastguard Worker out_bands = (input_bands - 1) / ch_fac + 1;
947*15dc779aSAndroid Build Coastguard Worker if (out_bands < 1) {
948*15dc779aSAndroid Build Coastguard Worker out_bands = 1;
949*15dc779aSAndroid Build Coastguard Worker }
950*15dc779aSAndroid Build Coastguard Worker
951*15dc779aSAndroid Build Coastguard Worker bands_achived = out_bands * ch_fac;
952*15dc779aSAndroid Build Coastguard Worker bands_diff = input_bands - bands_achived;
953*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < out_bands; i++) {
954*15dc779aSAndroid Build Coastguard Worker vdk[i] = ch_fac;
955*15dc779aSAndroid Build Coastguard Worker }
956*15dc779aSAndroid Build Coastguard Worker
957*15dc779aSAndroid Build Coastguard Worker if (bands_diff > 0) {
958*15dc779aSAndroid Build Coastguard Worker incr = -1;
959*15dc779aSAndroid Build Coastguard Worker k = out_bands - 1;
960*15dc779aSAndroid Build Coastguard Worker } else {
961*15dc779aSAndroid Build Coastguard Worker incr = 1;
962*15dc779aSAndroid Build Coastguard Worker k = 0;
963*15dc779aSAndroid Build Coastguard Worker }
964*15dc779aSAndroid Build Coastguard Worker
965*15dc779aSAndroid Build Coastguard Worker while (bands_diff != 0) {
966*15dc779aSAndroid Build Coastguard Worker vdk[k] = vdk[k] - incr;
967*15dc779aSAndroid Build Coastguard Worker k = k + incr;
968*15dc779aSAndroid Build Coastguard Worker bands_diff = bands_diff + incr;
969*15dc779aSAndroid Build Coastguard Worker if (k >= out_bands) {
970*15dc779aSAndroid Build Coastguard Worker if (bands_diff > 0) {
971*15dc779aSAndroid Build Coastguard Worker k = out_bands - 1;
972*15dc779aSAndroid Build Coastguard Worker } else if (bands_diff < 0) {
973*15dc779aSAndroid Build Coastguard Worker k = 0;
974*15dc779aSAndroid Build Coastguard Worker }
975*15dc779aSAndroid Build Coastguard Worker }
976*15dc779aSAndroid Build Coastguard Worker }
977*15dc779aSAndroid Build Coastguard Worker map[0] = band_start;
978*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < out_bands; i++) {
979*15dc779aSAndroid Build Coastguard Worker map[i + 1] = map[i] + vdk[i];
980*15dc779aSAndroid Build Coastguard Worker }
981*15dc779aSAndroid Build Coastguard Worker }
982*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mapfrequency(WORD32 * in,WORD32 * out,WORD32 * map,WORD32 data_bands)983*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map,
984*15dc779aSAndroid Build Coastguard Worker WORD32 data_bands) {
985*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, band_start, band_stop, value;
986*15dc779aSAndroid Build Coastguard Worker WORD32 start_band_0 = map[0];
987*15dc779aSAndroid Build Coastguard Worker
988*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < data_bands; i++) {
989*15dc779aSAndroid Build Coastguard Worker value = in[i + start_band_0];
990*15dc779aSAndroid Build Coastguard Worker
991*15dc779aSAndroid Build Coastguard Worker band_start = map[i];
992*15dc779aSAndroid Build Coastguard Worker band_stop = map[i + 1];
993*15dc779aSAndroid Build Coastguard Worker for (j = band_start; j < band_stop; j++) {
994*15dc779aSAndroid Build Coastguard Worker out[j] = value;
995*15dc779aSAndroid Build Coastguard Worker }
996*15dc779aSAndroid Build Coastguard Worker }
997*15dc779aSAndroid Build Coastguard Worker }
998*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_de_quantize(WORD32 value,WORD32 param_type)999*15dc779aSAndroid Build Coastguard Worker static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) {
1000*15dc779aSAndroid Build Coastguard Worker switch (param_type) {
1001*15dc779aSAndroid Build Coastguard Worker case CLD:
1002*15dc779aSAndroid Build Coastguard Worker return ixheaacd_cld_de_quant_table[(value + 15)];
1003*15dc779aSAndroid Build Coastguard Worker
1004*15dc779aSAndroid Build Coastguard Worker case ICC:
1005*15dc779aSAndroid Build Coastguard Worker return ixheaacd_icc_de_quant_table[value];
1006*15dc779aSAndroid Build Coastguard Worker
1007*15dc779aSAndroid Build Coastguard Worker case IPD:
1008*15dc779aSAndroid Build Coastguard Worker return ixheaacd_ipd_de_quant_table[(value & 15)];
1009*15dc779aSAndroid Build Coastguard Worker
1010*15dc779aSAndroid Build Coastguard Worker default:
1011*15dc779aSAndroid Build Coastguard Worker return 0;
1012*15dc779aSAndroid Build Coastguard Worker return 0;
1013*15dc779aSAndroid Build Coastguard Worker }
1014*15dc779aSAndroid Build Coastguard Worker }
1015*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mapindexdata(ia_mps_dec_state_struct * self,ia_mps_data_struct * frame_xxx_data,FLOAT32 out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],WORD32 out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],WORD32 cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],WORD32 idx_prev[MAX_PARAMETER_BANDS],WORD32 param_type)1016*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaacd_mps_mapindexdata(
1017*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self, ia_mps_data_struct *frame_xxx_data,
1018*15dc779aSAndroid Build Coastguard Worker FLOAT32 out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1019*15dc779aSAndroid Build Coastguard Worker WORD32 out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1020*15dc779aSAndroid Build Coastguard Worker WORD32 cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1021*15dc779aSAndroid Build Coastguard Worker WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) {
1022*15dc779aSAndroid Build Coastguard Worker WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0};
1023*15dc779aSAndroid Build Coastguard Worker WORD32 map[MAX_PARAMETER_BANDS + 1];
1024*15dc779aSAndroid Build Coastguard Worker
1025*15dc779aSAndroid Build Coastguard Worker WORD32 set_index, i, band, parm_slot;
1026*15dc779aSAndroid Build Coastguard Worker WORD32 data_bands, ch_fac;
1027*15dc779aSAndroid Build Coastguard Worker WORD32 ps;
1028*15dc779aSAndroid Build Coastguard Worker
1029*15dc779aSAndroid Build Coastguard Worker WORD32 i1, i2, x1, xi, x2;
1030*15dc779aSAndroid Build Coastguard Worker WORD32 band_start = 0;
1031*15dc779aSAndroid Build Coastguard Worker WORD32 ext_frame_flag = self->ext_frame_flag;
1032*15dc779aSAndroid Build Coastguard Worker WORD32 *param_slots = self->param_slots;
1033*15dc779aSAndroid Build Coastguard Worker WORD32 num_parameter_sets = self->num_parameter_sets;
1034*15dc779aSAndroid Build Coastguard Worker WORD32 band_stop = self->bs_param_bands;
1035*15dc779aSAndroid Build Coastguard Worker WORD32 default_val = 0;
1036*15dc779aSAndroid Build Coastguard Worker
1037*15dc779aSAndroid Build Coastguard Worker set_index = 0;
1038*15dc779aSAndroid Build Coastguard Worker
1039*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_parameter_sets; i++) {
1040*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
1041*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1042*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1043*15dc779aSAndroid Build Coastguard Worker out_idx_data[i][band] = default_val;
1044*15dc779aSAndroid Build Coastguard Worker }
1045*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1046*15dc779aSAndroid Build Coastguard Worker idx_prev[band] = out_idx_data[i][band];
1047*15dc779aSAndroid Build Coastguard Worker }
1048*15dc779aSAndroid Build Coastguard Worker
1049*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx_prev = 0;
1050*15dc779aSAndroid Build Coastguard Worker }
1051*15dc779aSAndroid Build Coastguard Worker
1052*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 1) {
1053*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1054*15dc779aSAndroid Build Coastguard Worker out_idx_data[i][band] = idx_prev[band];
1055*15dc779aSAndroid Build Coastguard Worker }
1056*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->quant_coarse_xxx_flag[i] =
1057*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx_prev;
1058*15dc779aSAndroid Build Coastguard Worker }
1059*15dc779aSAndroid Build Coastguard Worker
1060*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 2) {
1061*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1062*15dc779aSAndroid Build Coastguard Worker out_idx_data[i][band] = idx_prev[band];
1063*15dc779aSAndroid Build Coastguard Worker }
1064*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->quant_coarse_xxx_flag[i] =
1065*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx_prev;
1066*15dc779aSAndroid Build Coastguard Worker interpolate_local[i] = 1;
1067*15dc779aSAndroid Build Coastguard Worker } else {
1068*15dc779aSAndroid Build Coastguard Worker interpolate_local[i] = 0;
1069*15dc779aSAndroid Build Coastguard Worker }
1070*15dc779aSAndroid Build Coastguard Worker
1071*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
1072*15dc779aSAndroid Build Coastguard Worker parm_slot = i;
1073*15dc779aSAndroid Build Coastguard Worker ch_fac =
1074*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_stride_table[frame_xxx_data
1075*15dc779aSAndroid Build Coastguard Worker ->bs_freq_res_stride_xxx[set_index]];
1076*15dc779aSAndroid Build Coastguard Worker data_bands = (band_stop - band_start - 1) / ch_fac + 1;
1077*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac);
1078*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0],
1079*15dc779aSAndroid Build Coastguard Worker &out_idx_data[parm_slot][0], map, data_bands);
1080*15dc779aSAndroid Build Coastguard Worker
1081*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1082*15dc779aSAndroid Build Coastguard Worker idx_prev[band] = out_idx_data[parm_slot][band];
1083*15dc779aSAndroid Build Coastguard Worker }
1084*15dc779aSAndroid Build Coastguard Worker
1085*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx_prev =
1086*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index];
1087*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->quant_coarse_xxx_flag[i] =
1088*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->bs_quant_coarse_xxx[set_index];
1089*15dc779aSAndroid Build Coastguard Worker
1090*15dc779aSAndroid Build Coastguard Worker set_index++;
1091*15dc779aSAndroid Build Coastguard Worker }
1092*15dc779aSAndroid Build Coastguard Worker }
1093*15dc779aSAndroid Build Coastguard Worker
1094*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_parameter_sets; i++) {
1095*15dc779aSAndroid Build Coastguard Worker if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) {
1096*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start,
1097*15dc779aSAndroid Build Coastguard Worker band_stop - band_start);
1098*15dc779aSAndroid Build Coastguard Worker frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1099*15dc779aSAndroid Build Coastguard Worker }
1100*15dc779aSAndroid Build Coastguard Worker }
1101*15dc779aSAndroid Build Coastguard Worker
1102*15dc779aSAndroid Build Coastguard Worker i1 = -1;
1103*15dc779aSAndroid Build Coastguard Worker x1 = 0;
1104*15dc779aSAndroid Build Coastguard Worker i2 = 0;
1105*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_parameter_sets; i++) {
1106*15dc779aSAndroid Build Coastguard Worker if (interpolate_local[i] != 1) {
1107*15dc779aSAndroid Build Coastguard Worker i1 = i;
1108*15dc779aSAndroid Build Coastguard Worker }
1109*15dc779aSAndroid Build Coastguard Worker i2 = i;
1110*15dc779aSAndroid Build Coastguard Worker while (interpolate_local[i2] == 1) {
1111*15dc779aSAndroid Build Coastguard Worker i2++;
1112*15dc779aSAndroid Build Coastguard Worker }
1113*15dc779aSAndroid Build Coastguard Worker if (i1 == -1) {
1114*15dc779aSAndroid Build Coastguard Worker x1 = 0;
1115*15dc779aSAndroid Build Coastguard Worker i1 = 0;
1116*15dc779aSAndroid Build Coastguard Worker } else {
1117*15dc779aSAndroid Build Coastguard Worker x1 = param_slots[i1];
1118*15dc779aSAndroid Build Coastguard Worker }
1119*15dc779aSAndroid Build Coastguard Worker xi = param_slots[i];
1120*15dc779aSAndroid Build Coastguard Worker x2 = param_slots[i2];
1121*15dc779aSAndroid Build Coastguard Worker
1122*15dc779aSAndroid Build Coastguard Worker if (interpolate_local[i] == 1) {
1123*15dc779aSAndroid Build Coastguard Worker if (i2 < num_parameter_sets) {
1124*15dc779aSAndroid Build Coastguard Worker if (self->ec_flag == 0) {
1125*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
1126*15dc779aSAndroid Build Coastguard Worker }
1127*15dc779aSAndroid Build Coastguard Worker }
1128*15dc779aSAndroid Build Coastguard Worker
1129*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1130*15dc779aSAndroid Build Coastguard Worker WORD32 yi, y1, y2;
1131*15dc779aSAndroid Build Coastguard Worker yi = 0;
1132*15dc779aSAndroid Build Coastguard Worker y1 = out_idx_data[i1][band];
1133*15dc779aSAndroid Build Coastguard Worker y2 = out_idx_data[i2][band];
1134*15dc779aSAndroid Build Coastguard Worker if (param_type == IPD) {
1135*15dc779aSAndroid Build Coastguard Worker if (y2 - y1 > 8) y1 += 16;
1136*15dc779aSAndroid Build Coastguard Worker if (y1 - y2 > 8) y2 += 16;
1137*15dc779aSAndroid Build Coastguard Worker
1138*15dc779aSAndroid Build Coastguard Worker if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
1139*15dc779aSAndroid Build Coastguard Worker } else {
1140*15dc779aSAndroid Build Coastguard Worker if (x2 != x1) {
1141*15dc779aSAndroid Build Coastguard Worker yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1142*15dc779aSAndroid Build Coastguard Worker }
1143*15dc779aSAndroid Build Coastguard Worker }
1144*15dc779aSAndroid Build Coastguard Worker out_idx_data[i][band] = yi;
1145*15dc779aSAndroid Build Coastguard Worker }
1146*15dc779aSAndroid Build Coastguard Worker }
1147*15dc779aSAndroid Build Coastguard Worker }
1148*15dc779aSAndroid Build Coastguard Worker
1149*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < num_parameter_sets; ps++) {
1150*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1151*15dc779aSAndroid Build Coastguard Worker if (param_type == CLD) {
1152*15dc779aSAndroid Build Coastguard Worker out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15);
1153*15dc779aSAndroid Build Coastguard Worker } else if (param_type == ICC)
1154*15dc779aSAndroid Build Coastguard Worker {
1155*15dc779aSAndroid Build Coastguard Worker out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7);
1156*15dc779aSAndroid Build Coastguard Worker }
1157*15dc779aSAndroid Build Coastguard Worker out_data[ps][band] =
1158*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type);
1159*15dc779aSAndroid Build Coastguard Worker }
1160*15dc779aSAndroid Build Coastguard Worker }
1161*15dc779aSAndroid Build Coastguard Worker
1162*15dc779aSAndroid Build Coastguard Worker if (ext_frame_flag) {
1163*15dc779aSAndroid Build Coastguard Worker for (band = band_start; band < band_stop; band++) {
1164*15dc779aSAndroid Build Coastguard Worker out_data[num_parameter_sets][band] =
1165*15dc779aSAndroid Build Coastguard Worker out_data[num_parameter_sets - 1][band];
1166*15dc779aSAndroid Build Coastguard Worker out_idx_data[num_parameter_sets][band] =
1167*15dc779aSAndroid Build Coastguard Worker out_idx_data[num_parameter_sets - 1][band];
1168*15dc779aSAndroid Build Coastguard Worker }
1169*15dc779aSAndroid Build Coastguard Worker }
1170*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1171*15dc779aSAndroid Build Coastguard Worker }
1172*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_dec_and_mapframeott(ia_mps_dec_state_struct * self)1173*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott(
1174*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self) {
1175*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame);
1176*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = 0;
1177*15dc779aSAndroid Build Coastguard Worker
1178*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_mps_mapindexdata(
1179*15dc779aSAndroid Build Coastguard Worker self, &cur_bit_stream_ptr->cld_data, self->cld_data,
1180*15dc779aSAndroid Build Coastguard Worker cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx,
1181*15dc779aSAndroid Build Coastguard Worker cur_bit_stream_ptr->cld_idx_pre, CLD);
1182*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) return err_code;
1183*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_mps_mapindexdata(
1184*15dc779aSAndroid Build Coastguard Worker self, &cur_bit_stream_ptr->icc_data, self->icc_data,
1185*15dc779aSAndroid Build Coastguard Worker cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx,
1186*15dc779aSAndroid Build Coastguard Worker cur_bit_stream_ptr->icc_idx_pre, ICC);
1187*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) return err_code;
1188*15dc779aSAndroid Build Coastguard Worker if ((self->config->bs_phase_coding)) {
1189*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_mps_mapindexdata(
1190*15dc779aSAndroid Build Coastguard Worker self, &cur_bit_stream_ptr->ipd_data, self->ipd_data,
1191*15dc779aSAndroid Build Coastguard Worker cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data,
1192*15dc779aSAndroid Build Coastguard Worker cur_bit_stream_ptr->ipd_idx_prev, IPD);
1193*15dc779aSAndroid Build Coastguard Worker
1194*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) return err_code;
1195*15dc779aSAndroid Build Coastguard Worker }
1196*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1197*15dc779aSAndroid Build Coastguard Worker }
1198*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct * self)1199*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) {
1200*15dc779aSAndroid Build Coastguard Worker WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop,
1201*15dc779aSAndroid Build Coastguard Worker group_to_band[MAX_PARAMETER_BANDS + 1];
1202*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *frame = &(self->bs_frame);
1203*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < self->num_parameter_sets; ps++) {
1204*15dc779aSAndroid Build Coastguard Worker switch (frame->bs_smooth_mode[ps]) {
1205*15dc779aSAndroid Build Coastguard Worker case 0:
1206*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[ps] = 256;
1207*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
1208*15dc779aSAndroid Build Coastguard Worker
1209*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1210*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[ps][pb] = 0;
1211*15dc779aSAndroid Build Coastguard Worker }
1212*15dc779aSAndroid Build Coastguard Worker break;
1213*15dc779aSAndroid Build Coastguard Worker
1214*15dc779aSAndroid Build Coastguard Worker case 1:
1215*15dc779aSAndroid Build Coastguard Worker if (ps > 0) {
1216*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[ps] = self->smoothing_time[ps - 1];
1217*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1];
1218*15dc779aSAndroid Build Coastguard Worker } else {
1219*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time;
1220*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[ps] =
1221*15dc779aSAndroid Build Coastguard Worker self->smoothing_filt_state.inv_prev_smg_time;
1222*15dc779aSAndroid Build Coastguard Worker }
1223*15dc779aSAndroid Build Coastguard Worker
1224*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1225*15dc779aSAndroid Build Coastguard Worker if (ps > 0)
1226*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb];
1227*15dc779aSAndroid Build Coastguard Worker else
1228*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[ps][pb] =
1229*15dc779aSAndroid Build Coastguard Worker self->smoothing_filt_state.prev_smg_data[pb];
1230*15dc779aSAndroid Build Coastguard Worker }
1231*15dc779aSAndroid Build Coastguard Worker break;
1232*15dc779aSAndroid Build Coastguard Worker
1233*15dc779aSAndroid Build Coastguard Worker case 2:
1234*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[ps] =
1235*15dc779aSAndroid Build Coastguard Worker ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1236*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[ps] =
1237*15dc779aSAndroid Build Coastguard Worker ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1238*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1239*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[ps][pb] = 1;
1240*15dc779aSAndroid Build Coastguard Worker }
1241*15dc779aSAndroid Build Coastguard Worker break;
1242*15dc779aSAndroid Build Coastguard Worker
1243*15dc779aSAndroid Build Coastguard Worker case 3:
1244*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[ps] =
1245*15dc779aSAndroid Build Coastguard Worker ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1246*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[ps] =
1247*15dc779aSAndroid Build Coastguard Worker ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1248*15dc779aSAndroid Build Coastguard Worker
1249*15dc779aSAndroid Build Coastguard Worker ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
1250*15dc779aSAndroid Build Coastguard Worker data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
1251*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands,
1252*15dc779aSAndroid Build Coastguard Worker ch_fac);
1253*15dc779aSAndroid Build Coastguard Worker for (pg = 0; pg < data_bands; pg++) {
1254*15dc779aSAndroid Build Coastguard Worker param_band_start = group_to_band[pg];
1255*15dc779aSAndroid Build Coastguard Worker param_band_stop = group_to_band[pg + 1];
1256*15dc779aSAndroid Build Coastguard Worker for (pb = param_band_start; pb < param_band_stop; pb++) {
1257*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg];
1258*15dc779aSAndroid Build Coastguard Worker }
1259*15dc779aSAndroid Build Coastguard Worker }
1260*15dc779aSAndroid Build Coastguard Worker break;
1261*15dc779aSAndroid Build Coastguard Worker }
1262*15dc779aSAndroid Build Coastguard Worker }
1263*15dc779aSAndroid Build Coastguard Worker
1264*15dc779aSAndroid Build Coastguard Worker self->smoothing_filt_state.prev_smg_time =
1265*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[self->num_parameter_sets - 1];
1266*15dc779aSAndroid Build Coastguard Worker self->smoothing_filt_state.inv_prev_smg_time =
1267*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[self->num_parameter_sets - 1];
1268*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1269*15dc779aSAndroid Build Coastguard Worker self->smoothing_filt_state.prev_smg_data[pb] =
1270*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[self->num_parameter_sets - 1][pb];
1271*15dc779aSAndroid Build Coastguard Worker }
1272*15dc779aSAndroid Build Coastguard Worker
1273*15dc779aSAndroid Build Coastguard Worker if (self->ext_frame_flag) {
1274*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[self->num_parameter_sets] =
1275*15dc779aSAndroid Build Coastguard Worker self->smoothing_time[self->num_parameter_sets - 1];
1276*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[self->num_parameter_sets] =
1277*15dc779aSAndroid Build Coastguard Worker self->inv_smoothing_time[self->num_parameter_sets - 1];
1278*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1279*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[self->num_parameter_sets][pb] =
1280*15dc779aSAndroid Build Coastguard Worker self->smoothing_data[self->num_parameter_sets - 1][pb];
1281*15dc779aSAndroid Build Coastguard Worker }
1282*15dc779aSAndroid Build Coastguard Worker }
1283*15dc779aSAndroid Build Coastguard Worker }
1284*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_frame_decode(ia_mps_dec_state_struct * self)1285*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) {
1286*15dc779aSAndroid Build Coastguard Worker WORD32 i;
1287*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = 0;
1288*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.ldmps_present_flag != 1)
1289*15dc779aSAndroid Build Coastguard Worker if (self->parse_nxt_frame == 1) return err_code;
1290*15dc779aSAndroid Build Coastguard Worker self->ext_frame_flag = 0;
1291*15dc779aSAndroid Build Coastguard Worker if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) {
1292*15dc779aSAndroid Build Coastguard Worker self->ext_frame_flag = 1;
1293*15dc779aSAndroid Build Coastguard Worker }
1294*15dc779aSAndroid Build Coastguard Worker
1295*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_mps_dec_and_mapframeott(self);
1296*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) return err_code;
1297*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_dec_and_mapframesmg(self);
1298*15dc779aSAndroid Build Coastguard Worker
1299*15dc779aSAndroid Build Coastguard Worker if (self->ext_frame_flag) {
1300*15dc779aSAndroid Build Coastguard Worker self->num_parameter_sets++;
1301*15dc779aSAndroid Build Coastguard Worker self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1;
1302*15dc779aSAndroid Build Coastguard Worker }
1303*15dc779aSAndroid Build Coastguard Worker self->param_slot_diff[0] = self->param_slots[0] + 1;
1304*15dc779aSAndroid Build Coastguard Worker if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) {
1305*15dc779aSAndroid Build Coastguard Worker if (self->ec_flag == 0) {
1306*15dc779aSAndroid Build Coastguard Worker return -1;
1307*15dc779aSAndroid Build Coastguard Worker } else {
1308*15dc779aSAndroid Build Coastguard Worker self->param_slot_diff[0] = MAX_TIME_SLOTS;
1309*15dc779aSAndroid Build Coastguard Worker }
1310*15dc779aSAndroid Build Coastguard Worker }
1311*15dc779aSAndroid Build Coastguard Worker self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0];
1312*15dc779aSAndroid Build Coastguard Worker self->inv_param_slot_diff_Q30[0] =
1313*15dc779aSAndroid Build Coastguard Worker (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5);
1314*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < self->num_parameter_sets; i++) {
1315*15dc779aSAndroid Build Coastguard Worker self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1];
1316*15dc779aSAndroid Build Coastguard Worker if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) ||
1317*15dc779aSAndroid Build Coastguard Worker (self->param_slot_diff[i] == 0)) {
1318*15dc779aSAndroid Build Coastguard Worker if (self->ec_flag == 0) {
1319*15dc779aSAndroid Build Coastguard Worker return -1;
1320*15dc779aSAndroid Build Coastguard Worker } else {
1321*15dc779aSAndroid Build Coastguard Worker self->param_slot_diff[i] = 1;
1322*15dc779aSAndroid Build Coastguard Worker self->inv_param_slot_diff[i] = 1;
1323*15dc779aSAndroid Build Coastguard Worker }
1324*15dc779aSAndroid Build Coastguard Worker }
1325*15dc779aSAndroid Build Coastguard Worker self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i];
1326*15dc779aSAndroid Build Coastguard Worker self->inv_param_slot_diff_Q30[i] =
1327*15dc779aSAndroid Build Coastguard Worker (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
1328*15dc779aSAndroid Build Coastguard Worker }
1329*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1330*15dc779aSAndroid Build Coastguard Worker }
1331*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_header_decode(ia_mps_dec_state_struct * self)1332*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
1333*15dc779aSAndroid Build Coastguard Worker WORD32 samp_freq;
1334*15dc779aSAndroid Build Coastguard Worker WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
1335*15dc779aSAndroid Build Coastguard Worker 24000, 22050, 16000, 12000, 11025, 8000,
1336*15dc779aSAndroid Build Coastguard Worker 7350, 0, 0, 0};
1337*15dc779aSAndroid Build Coastguard Worker
1338*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.ldmps_present_flag == 1)
1339*15dc779aSAndroid Build Coastguard Worker self->time_slots = self->frame_length + 1;
1340*15dc779aSAndroid Build Coastguard Worker else
1341*15dc779aSAndroid Build Coastguard Worker self->time_slots = self->frame_length;
1342*15dc779aSAndroid Build Coastguard Worker
1343*15dc779aSAndroid Build Coastguard Worker self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
1344*15dc779aSAndroid Build Coastguard Worker
1345*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.ldmps_present_flag == 1) {
1346*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.bs_sampling_freq_index == 15) {
1347*15dc779aSAndroid Build Coastguard Worker samp_freq = self->ldmps_config.bs_fampling_frequency;
1348*15dc779aSAndroid Build Coastguard Worker } else {
1349*15dc779aSAndroid Build Coastguard Worker samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index];
1350*15dc779aSAndroid Build Coastguard Worker }
1351*15dc779aSAndroid Build Coastguard Worker
1352*15dc779aSAndroid Build Coastguard Worker if (samp_freq < 27713.0) {
1353*15dc779aSAndroid Build Coastguard Worker self->qmf_band_count = 32;
1354*15dc779aSAndroid Build Coastguard Worker } else if (samp_freq >= 55426.0) {
1355*15dc779aSAndroid Build Coastguard Worker self->qmf_band_count = 128;
1356*15dc779aSAndroid Build Coastguard Worker } else {
1357*15dc779aSAndroid Build Coastguard Worker self->qmf_band_count = 64;
1358*15dc779aSAndroid Build Coastguard Worker }
1359*15dc779aSAndroid Build Coastguard Worker }
1360*15dc779aSAndroid Build Coastguard Worker
1361*15dc779aSAndroid Build Coastguard Worker if (self->object_type == AOT_ER_AAC_ELD ||
1362*15dc779aSAndroid Build Coastguard Worker self->object_type == AOT_ER_AAC_LD) {
1363*15dc779aSAndroid Build Coastguard Worker self->bs_param_bands =
1364*15dc779aSAndroid Build Coastguard Worker ixheaacd_freq_res_table_ld[self->config->bs_freq_res];
1365*15dc779aSAndroid Build Coastguard Worker self->hyb_band_count_max = self->qmf_band_count;
1366*15dc779aSAndroid Build Coastguard Worker } else
1367*15dc779aSAndroid Build Coastguard Worker self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
1368*15dc779aSAndroid Build Coastguard Worker
1369*15dc779aSAndroid Build Coastguard Worker if (self->object_type == AOT_ER_AAC_ELD ||
1370*15dc779aSAndroid Build Coastguard Worker self->object_type == AOT_ER_AAC_LD) {
1371*15dc779aSAndroid Build Coastguard Worker switch (self->bs_param_bands) {
1372*15dc779aSAndroid Build Coastguard Worker case 4:
1373*15dc779aSAndroid Build Coastguard Worker
1374*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1375*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_4_map;
1376*15dc779aSAndroid Build Coastguard Worker break;
1377*15dc779aSAndroid Build Coastguard Worker case 5:
1378*15dc779aSAndroid Build Coastguard Worker
1379*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1380*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_5_map;
1381*15dc779aSAndroid Build Coastguard Worker break;
1382*15dc779aSAndroid Build Coastguard Worker case 7:
1383*15dc779aSAndroid Build Coastguard Worker
1384*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1385*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_7_map;
1386*15dc779aSAndroid Build Coastguard Worker break;
1387*15dc779aSAndroid Build Coastguard Worker case 9:
1388*15dc779aSAndroid Build Coastguard Worker
1389*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1390*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_9_map;
1391*15dc779aSAndroid Build Coastguard Worker break;
1392*15dc779aSAndroid Build Coastguard Worker case 12:
1393*15dc779aSAndroid Build Coastguard Worker
1394*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1395*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_12_map;
1396*15dc779aSAndroid Build Coastguard Worker break;
1397*15dc779aSAndroid Build Coastguard Worker case 15:
1398*15dc779aSAndroid Build Coastguard Worker
1399*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1400*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_15_map;
1401*15dc779aSAndroid Build Coastguard Worker break;
1402*15dc779aSAndroid Build Coastguard Worker case 23:
1403*15dc779aSAndroid Build Coastguard Worker
1404*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1405*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_64_to_processing_band_23_map;
1406*15dc779aSAndroid Build Coastguard Worker break;
1407*15dc779aSAndroid Build Coastguard Worker default:
1408*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table = NULL;
1409*15dc779aSAndroid Build Coastguard Worker return -1;
1410*15dc779aSAndroid Build Coastguard Worker break;
1411*15dc779aSAndroid Build Coastguard Worker }
1412*15dc779aSAndroid Build Coastguard Worker } else {
1413*15dc779aSAndroid Build Coastguard Worker switch (self->bs_param_bands) {
1414*15dc779aSAndroid Build Coastguard Worker case 4:
1415*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1416*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_4_map;
1417*15dc779aSAndroid Build Coastguard Worker break;
1418*15dc779aSAndroid Build Coastguard Worker case 5:
1419*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1420*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_5_map;
1421*15dc779aSAndroid Build Coastguard Worker break;
1422*15dc779aSAndroid Build Coastguard Worker case 7:
1423*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1424*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_7_map;
1425*15dc779aSAndroid Build Coastguard Worker break;
1426*15dc779aSAndroid Build Coastguard Worker case 10:
1427*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1428*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_10_map;
1429*15dc779aSAndroid Build Coastguard Worker break;
1430*15dc779aSAndroid Build Coastguard Worker case 14:
1431*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1432*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_14_map;
1433*15dc779aSAndroid Build Coastguard Worker break;
1434*15dc779aSAndroid Build Coastguard Worker case 20:
1435*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1436*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_20_map;
1437*15dc779aSAndroid Build Coastguard Worker break;
1438*15dc779aSAndroid Build Coastguard Worker case 28:
1439*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table =
1440*15dc779aSAndroid Build Coastguard Worker ixheaacd_hybrid_band_71_to_processing_band_28_map;
1441*15dc779aSAndroid Build Coastguard Worker break;
1442*15dc779aSAndroid Build Coastguard Worker default:
1443*15dc779aSAndroid Build Coastguard Worker self->hyb_band_to_processing_band_table = NULL;
1444*15dc779aSAndroid Build Coastguard Worker return -1;
1445*15dc779aSAndroid Build Coastguard Worker break;
1446*15dc779aSAndroid Build Coastguard Worker }
1447*15dc779aSAndroid Build Coastguard Worker }
1448*15dc779aSAndroid Build Coastguard Worker self->in_ch_count = 1;
1449*15dc779aSAndroid Build Coastguard Worker self->out_ch_count = 2;
1450*15dc779aSAndroid Build Coastguard Worker
1451*15dc779aSAndroid Build Coastguard Worker self->input_gain =
1452*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx];
1453*15dc779aSAndroid Build Coastguard Worker
1454*15dc779aSAndroid Build Coastguard Worker if (self->config->bs_ott_bands_phase_present) {
1455*15dc779aSAndroid Build Coastguard Worker self->num_bands_ipd = self->config->bs_ott_bands_phase;
1456*15dc779aSAndroid Build Coastguard Worker } else {
1457*15dc779aSAndroid Build Coastguard Worker if (!(self->object_type == AOT_ER_AAC_ELD ||
1458*15dc779aSAndroid Build Coastguard Worker self->object_type == AOT_ER_AAC_LD)) {
1459*15dc779aSAndroid Build Coastguard Worker switch (self->bs_param_bands) {
1460*15dc779aSAndroid Build Coastguard Worker case 4:
1461*15dc779aSAndroid Build Coastguard Worker case 5:
1462*15dc779aSAndroid Build Coastguard Worker self->num_bands_ipd = 2;
1463*15dc779aSAndroid Build Coastguard Worker break;
1464*15dc779aSAndroid Build Coastguard Worker case 7:
1465*15dc779aSAndroid Build Coastguard Worker self->num_bands_ipd = 3;
1466*15dc779aSAndroid Build Coastguard Worker break;
1467*15dc779aSAndroid Build Coastguard Worker case 10:
1468*15dc779aSAndroid Build Coastguard Worker self->num_bands_ipd = 5;
1469*15dc779aSAndroid Build Coastguard Worker break;
1470*15dc779aSAndroid Build Coastguard Worker case 14:
1471*15dc779aSAndroid Build Coastguard Worker self->num_bands_ipd = 7;
1472*15dc779aSAndroid Build Coastguard Worker break;
1473*15dc779aSAndroid Build Coastguard Worker case 20:
1474*15dc779aSAndroid Build Coastguard Worker case 28:
1475*15dc779aSAndroid Build Coastguard Worker self->num_bands_ipd = 10;
1476*15dc779aSAndroid Build Coastguard Worker break;
1477*15dc779aSAndroid Build Coastguard Worker default:
1478*15dc779aSAndroid Build Coastguard Worker return -1;
1479*15dc779aSAndroid Build Coastguard Worker break;
1480*15dc779aSAndroid Build Coastguard Worker }
1481*15dc779aSAndroid Build Coastguard Worker }
1482*15dc779aSAndroid Build Coastguard Worker }
1483*15dc779aSAndroid Build Coastguard Worker
1484*15dc779aSAndroid Build Coastguard Worker if (self->residual_coding) {
1485*15dc779aSAndroid Build Coastguard Worker self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd);
1486*15dc779aSAndroid Build Coastguard Worker self->max_res_bands = 0;
1487*15dc779aSAndroid Build Coastguard Worker if (self->bs_residual_present) {
1488*15dc779aSAndroid Build Coastguard Worker self->res_bands = self->bs_residual_bands;
1489*15dc779aSAndroid Build Coastguard Worker if (self->res_bands > self->max_res_bands) {
1490*15dc779aSAndroid Build Coastguard Worker self->max_res_bands = self->res_bands;
1491*15dc779aSAndroid Build Coastguard Worker }
1492*15dc779aSAndroid Build Coastguard Worker } else {
1493*15dc779aSAndroid Build Coastguard Worker self->res_bands = 0;
1494*15dc779aSAndroid Build Coastguard Worker }
1495*15dc779aSAndroid Build Coastguard Worker }
1496*15dc779aSAndroid Build Coastguard Worker
1497*15dc779aSAndroid Build Coastguard Worker if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1;
1498*15dc779aSAndroid Build Coastguard Worker
1499*15dc779aSAndroid Build Coastguard Worker self->dir_sig_count = 1;
1500*15dc779aSAndroid Build Coastguard Worker self->decor_sig_count = 1;
1501*15dc779aSAndroid Build Coastguard Worker
1502*15dc779aSAndroid Build Coastguard Worker self->bs_high_rate_mode = self->config->bs_high_rate_mode;
1503*15dc779aSAndroid Build Coastguard Worker self->pre_mix_req = 1;
1504*15dc779aSAndroid Build Coastguard Worker
1505*15dc779aSAndroid Build Coastguard Worker return 0;
1506*15dc779aSAndroid Build Coastguard Worker }
1507