xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_mps_nlc_enc.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker  */
20*15dc779aSAndroid Build Coastguard Worker 
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
23*15dc779aSAndroid Build Coastguard Worker #include <math.h>
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_fix.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_defines.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_nlc_enc.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_huff_tab.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_param_extract.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_nlc_enc.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_bitstream.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_struct_def.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_polyphase.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_nlc_enc.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_hybfilter.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_spatial_bitstream.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_tree.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_rom.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
48*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_sym_check(WORD16 data[2],const WORD16 lav,WORD16 * const p_sym_bits)49*15dc779aSAndroid Build Coastguard Worker static UWORD8 ixheaace_mps_212_sym_check(WORD16 data[2], const WORD16 lav,
50*15dc779aSAndroid Build Coastguard Worker                                          WORD16 *const p_sym_bits) {
51*15dc779aSAndroid Build Coastguard Worker   UWORD8 sym_bits = 0;
52*15dc779aSAndroid Build Coastguard Worker   UWORD8 num_sbits = 0;
53*15dc779aSAndroid Build Coastguard Worker   WORD16 sum_val = data[0] + data[1];
54*15dc779aSAndroid Build Coastguard Worker   WORD16 diff_val = data[0] - data[1];
55*15dc779aSAndroid Build Coastguard Worker 
56*15dc779aSAndroid Build Coastguard Worker   if (sum_val != 0) {
57*15dc779aSAndroid Build Coastguard Worker     WORD8 sum_neg = (sum_val < 0) ? 1 : 0;
58*15dc779aSAndroid Build Coastguard Worker     if (sum_neg) {
59*15dc779aSAndroid Build Coastguard Worker       sum_val = -sum_val;
60*15dc779aSAndroid Build Coastguard Worker       diff_val = -diff_val;
61*15dc779aSAndroid Build Coastguard Worker     }
62*15dc779aSAndroid Build Coastguard Worker     sym_bits = (sym_bits << 1) | sum_neg;
63*15dc779aSAndroid Build Coastguard Worker     num_sbits++;
64*15dc779aSAndroid Build Coastguard Worker   }
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker   if (diff_val != 0) {
67*15dc779aSAndroid Build Coastguard Worker     WORD8 diff_neg = (diff_val < 0) ? 1 : 0;
68*15dc779aSAndroid Build Coastguard Worker     if (diff_neg) {
69*15dc779aSAndroid Build Coastguard Worker       diff_val = -diff_val;
70*15dc779aSAndroid Build Coastguard Worker     }
71*15dc779aSAndroid Build Coastguard Worker     sym_bits = (sym_bits << 1) | diff_neg;
72*15dc779aSAndroid Build Coastguard Worker     num_sbits++;
73*15dc779aSAndroid Build Coastguard Worker   }
74*15dc779aSAndroid Build Coastguard Worker   *p_sym_bits = sym_bits;
75*15dc779aSAndroid Build Coastguard Worker 
76*15dc779aSAndroid Build Coastguard Worker   if (!(sum_val % 2)) {
77*15dc779aSAndroid Build Coastguard Worker     data[0] = (sum_val / 2);
78*15dc779aSAndroid Build Coastguard Worker     data[1] = (diff_val / 2);
79*15dc779aSAndroid Build Coastguard Worker   } else {
80*15dc779aSAndroid Build Coastguard Worker     data[0] = (lav - sum_val / 2);
81*15dc779aSAndroid Build Coastguard Worker     data[1] = (lav - diff_val / 2);
82*15dc779aSAndroid Build Coastguard Worker   }
83*15dc779aSAndroid Build Coastguard Worker 
84*15dc779aSAndroid Build Coastguard Worker   return num_sbits;
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_calc_pcm_bits(const WORD16 num_val,const WORD16 n_levels)87*15dc779aSAndroid Build Coastguard Worker static WORD16 ixheaace_mps_212_calc_pcm_bits(const WORD16 num_val, const WORD16 n_levels) {
88*15dc779aSAndroid Build Coastguard Worker   WORD16 num_complete_chunks = 0, rest_chunk_size = 0;
89*15dc779aSAndroid Build Coastguard Worker   WORD16 max_grp_len = 0, bits_pcm = 0;
90*15dc779aSAndroid Build Coastguard Worker   WORD32 chunk_levels, lvl;
91*15dc779aSAndroid Build Coastguard Worker 
92*15dc779aSAndroid Build Coastguard Worker   switch (n_levels) {
93*15dc779aSAndroid Build Coastguard Worker     case 7:
94*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 6;
95*15dc779aSAndroid Build Coastguard Worker       break;
96*15dc779aSAndroid Build Coastguard Worker     case 3:
97*15dc779aSAndroid Build Coastguard Worker     case 6:
98*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 5;
99*15dc779aSAndroid Build Coastguard Worker       break;
100*15dc779aSAndroid Build Coastguard Worker     case 13:
101*15dc779aSAndroid Build Coastguard Worker     case 19:
102*15dc779aSAndroid Build Coastguard Worker     case 51:
103*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 4;
104*15dc779aSAndroid Build Coastguard Worker       break;
105*15dc779aSAndroid Build Coastguard Worker     case 25:
106*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 3;
107*15dc779aSAndroid Build Coastguard Worker       break;
108*15dc779aSAndroid Build Coastguard Worker     case 11:
109*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 2;
110*15dc779aSAndroid Build Coastguard Worker       break;
111*15dc779aSAndroid Build Coastguard Worker     default:
112*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 1;
113*15dc779aSAndroid Build Coastguard Worker   }
114*15dc779aSAndroid Build Coastguard Worker 
115*15dc779aSAndroid Build Coastguard Worker   num_complete_chunks = num_val / max_grp_len;
116*15dc779aSAndroid Build Coastguard Worker   rest_chunk_size = num_val % max_grp_len;
117*15dc779aSAndroid Build Coastguard Worker 
118*15dc779aSAndroid Build Coastguard Worker   chunk_levels = 1;
119*15dc779aSAndroid Build Coastguard Worker   for (lvl = 1; lvl <= max_grp_len; lvl++) {
120*15dc779aSAndroid Build Coastguard Worker     chunk_levels *= n_levels;
121*15dc779aSAndroid Build Coastguard Worker   }
122*15dc779aSAndroid Build Coastguard Worker   bits_pcm = (WORD16)(round(log(chunk_levels) / log(2)) * num_complete_chunks);
123*15dc779aSAndroid Build Coastguard Worker   bits_pcm += (WORD16)(round(log(chunk_levels) / log(2)) * rest_chunk_size);
124*15dc779aSAndroid Build Coastguard Worker 
125*15dc779aSAndroid Build Coastguard Worker   return bits_pcm;
126*15dc779aSAndroid Build Coastguard Worker }
127*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_apply_pcm_coding(ixheaace_bit_buf_handle pstr_bit_buf,const WORD16 * const in_data_1,const WORD16 * const in_data_2,const WORD16 offset,const WORD16 num_val,const WORD16 n_levels)128*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_apply_pcm_coding(ixheaace_bit_buf_handle pstr_bit_buf,
129*15dc779aSAndroid Build Coastguard Worker                                               const WORD16 *const in_data_1,
130*15dc779aSAndroid Build Coastguard Worker                                               const WORD16 *const in_data_2, const WORD16 offset,
131*15dc779aSAndroid Build Coastguard Worker                                               const WORD16 num_val, const WORD16 n_levels) {
132*15dc779aSAndroid Build Coastguard Worker   WORD16 val = 0, lvl = 0, idx = 0;
133*15dc779aSAndroid Build Coastguard Worker   WORD16 max_grp_len = 0, grp_len = 0, next_val = 0;
134*15dc779aSAndroid Build Coastguard Worker   WORD32 grp_val = 0, chunk_levels = 0;
135*15dc779aSAndroid Build Coastguard Worker   UWORD8 pcm_block_size[7] = {0};
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker   switch (n_levels) {
138*15dc779aSAndroid Build Coastguard Worker     case 7:
139*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 6;
140*15dc779aSAndroid Build Coastguard Worker       break;
141*15dc779aSAndroid Build Coastguard Worker     case 3:
142*15dc779aSAndroid Build Coastguard Worker     case 6:
143*15dc779aSAndroid Build Coastguard Worker     case 9:
144*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 5;
145*15dc779aSAndroid Build Coastguard Worker       break;
146*15dc779aSAndroid Build Coastguard Worker     case 13:
147*15dc779aSAndroid Build Coastguard Worker     case 19:
148*15dc779aSAndroid Build Coastguard Worker     case 51:
149*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 4;
150*15dc779aSAndroid Build Coastguard Worker       break;
151*15dc779aSAndroid Build Coastguard Worker     case 5:
152*15dc779aSAndroid Build Coastguard Worker     case 25:
153*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 3;
154*15dc779aSAndroid Build Coastguard Worker       break;
155*15dc779aSAndroid Build Coastguard Worker     case 11:
156*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 2;
157*15dc779aSAndroid Build Coastguard Worker       break;
158*15dc779aSAndroid Build Coastguard Worker     default:
159*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 1;
160*15dc779aSAndroid Build Coastguard Worker   }
161*15dc779aSAndroid Build Coastguard Worker 
162*15dc779aSAndroid Build Coastguard Worker   chunk_levels = 1;
163*15dc779aSAndroid Build Coastguard Worker   for (lvl = 1; lvl <= max_grp_len; lvl++) {
164*15dc779aSAndroid Build Coastguard Worker     chunk_levels *= n_levels;
165*15dc779aSAndroid Build Coastguard Worker     pcm_block_size[lvl] = (UWORD8)round(log(chunk_levels) / log(2));
166*15dc779aSAndroid Build Coastguard Worker   }
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker   for (val = 0; val < num_val; val += max_grp_len) {
169*15dc779aSAndroid Build Coastguard Worker     grp_len = MIN(max_grp_len, num_val - val);
170*15dc779aSAndroid Build Coastguard Worker     grp_val = 0;
171*15dc779aSAndroid Build Coastguard Worker     for (lvl = 0; lvl < grp_len; lvl++) {
172*15dc779aSAndroid Build Coastguard Worker       idx = val + lvl;
173*15dc779aSAndroid Build Coastguard Worker       next_val = (in_data_2 == NULL)
174*15dc779aSAndroid Build Coastguard Worker                      ? in_data_1[idx]
175*15dc779aSAndroid Build Coastguard Worker                      : (in_data_1 == NULL)
176*15dc779aSAndroid Build Coastguard Worker                            ? in_data_2[idx]
177*15dc779aSAndroid Build Coastguard Worker                            : ((idx & 01) ? in_data_2[idx >> 1] : in_data_1[idx >> 1]);
178*15dc779aSAndroid Build Coastguard Worker       grp_val = grp_val * n_levels + next_val + offset;
179*15dc779aSAndroid Build Coastguard Worker     }
180*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, grp_val, pcm_block_size[grp_len]);
181*15dc779aSAndroid Build Coastguard Worker   }
182*15dc779aSAndroid Build Coastguard Worker }
183*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_huff_enc_1_d(ixheaace_bit_buf_handle pstr_bit_buf,const WORD32 data_type,const WORD32 dim_1,WORD16 * const in_data,const WORD16 num_bands,const WORD16 part_0_flag,UWORD16 * huff_code_bits)184*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_huff_enc_1_d(ixheaace_bit_buf_handle pstr_bit_buf,
185*15dc779aSAndroid Build Coastguard Worker                                                   const WORD32 data_type, const WORD32 dim_1,
186*15dc779aSAndroid Build Coastguard Worker                                                   WORD16 *const in_data, const WORD16 num_bands,
187*15dc779aSAndroid Build Coastguard Worker                                                   const WORD16 part_0_flag,
188*15dc779aSAndroid Build Coastguard Worker                                                   UWORD16 *huff_code_bits) {
189*15dc779aSAndroid Build Coastguard Worker   WORD32 band, offset = 0;
190*15dc779aSAndroid Build Coastguard Worker   UWORD16 huff_bits = 0;
191*15dc779aSAndroid Build Coastguard Worker   ixheaace_mps_huff_entry part0;
192*15dc779aSAndroid Build Coastguard Worker   const ixheaace_mps_huff_entry *p_huff_tab = NULL;
193*15dc779aSAndroid Build Coastguard Worker 
194*15dc779aSAndroid Build Coastguard Worker   *huff_code_bits = 0;
195*15dc779aSAndroid Build Coastguard Worker   if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
196*15dc779aSAndroid Build Coastguard Worker     p_huff_tab = ixheaace_mps_212_huff_icc_tab.h1_d[dim_1];
197*15dc779aSAndroid Build Coastguard Worker   } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
198*15dc779aSAndroid Build Coastguard Worker     p_huff_tab = ixheaace_mps_212_huff_cld_tab.h1_d[dim_1];
199*15dc779aSAndroid Build Coastguard Worker   } else {
200*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
201*15dc779aSAndroid Build Coastguard Worker   }
202*15dc779aSAndroid Build Coastguard Worker 
203*15dc779aSAndroid Build Coastguard Worker   if (part_0_flag) {
204*15dc779aSAndroid Build Coastguard Worker     if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
205*15dc779aSAndroid Build Coastguard Worker       part0 = ixheaace_mps_212_huff_part_0_tab.icc[in_data[0]];
206*15dc779aSAndroid Build Coastguard Worker     } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
207*15dc779aSAndroid Build Coastguard Worker       part0 = ixheaace_mps_212_huff_part_0_tab.cld[in_data[0]];
208*15dc779aSAndroid Build Coastguard Worker     } else {
209*15dc779aSAndroid Build Coastguard Worker       return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
210*15dc779aSAndroid Build Coastguard Worker     }
211*15dc779aSAndroid Build Coastguard Worker     huff_bits += ixheaace_write_bits(pstr_bit_buf, part0.value, part0.length);
212*15dc779aSAndroid Build Coastguard Worker     offset = 1;
213*15dc779aSAndroid Build Coastguard Worker   }
214*15dc779aSAndroid Build Coastguard Worker 
215*15dc779aSAndroid Build Coastguard Worker   for (band = offset; band < num_bands; band++) {
216*15dc779aSAndroid Build Coastguard Worker     WORD32 id_sign = 0;
217*15dc779aSAndroid Build Coastguard Worker     WORD32 id = in_data[band];
218*15dc779aSAndroid Build Coastguard Worker 
219*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
220*15dc779aSAndroid Build Coastguard Worker       id_sign = 0;
221*15dc779aSAndroid Build Coastguard Worker       if (id < 0) {
222*15dc779aSAndroid Build Coastguard Worker         id = -id;
223*15dc779aSAndroid Build Coastguard Worker         id_sign = 1;
224*15dc779aSAndroid Build Coastguard Worker       }
225*15dc779aSAndroid Build Coastguard Worker     }
226*15dc779aSAndroid Build Coastguard Worker 
227*15dc779aSAndroid Build Coastguard Worker     huff_bits += ixheaace_write_bits(pstr_bit_buf, p_huff_tab[id].value, p_huff_tab[id].length);
228*15dc779aSAndroid Build Coastguard Worker 
229*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
230*15dc779aSAndroid Build Coastguard Worker       huff_bits += ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
231*15dc779aSAndroid Build Coastguard Worker     }
232*15dc779aSAndroid Build Coastguard Worker   }
233*15dc779aSAndroid Build Coastguard Worker 
234*15dc779aSAndroid Build Coastguard Worker   *huff_code_bits = huff_bits;
235*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
236*15dc779aSAndroid Build Coastguard Worker }
237*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_get_huff_entry(const WORD32 lav,const WORD32 data_type,const WORD32 band,WORD16 tab_idx_2_d[2],WORD16 in_data[][2],ixheaace_mps_huff_entry * const pstr_huff_entry,ixheaace_mps_huff_entry * const pstr_huff_escape)238*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_get_huff_entry(const WORD32 lav, const WORD32 data_type,
239*15dc779aSAndroid Build Coastguard Worker                                             const WORD32 band, WORD16 tab_idx_2_d[2],
240*15dc779aSAndroid Build Coastguard Worker                                             WORD16 in_data[][2],
241*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_mps_huff_entry *const pstr_huff_entry,
242*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_mps_huff_entry *const pstr_huff_escape) {
243*15dc779aSAndroid Build Coastguard Worker   const ixheaace_mps_huff_cld_tab_2d *pstr_huff_cld_tab_2d =
244*15dc779aSAndroid Build Coastguard Worker       &ixheaace_mps_212_huff_cld_tab.h2_d[tab_idx_2_d[0]][tab_idx_2_d[1]];
245*15dc779aSAndroid Build Coastguard Worker   const ixheaace_mps_huff_icc_tab_2d *pstr_huff_icc_tab_2d =
246*15dc779aSAndroid Build Coastguard Worker       &ixheaace_mps_212_huff_icc_tab.h2_d[tab_idx_2_d[0]][tab_idx_2_d[1]];
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker   switch (lav) {
249*15dc779aSAndroid Build Coastguard Worker     case 9: {
250*15dc779aSAndroid Build Coastguard Worker       *pstr_huff_entry = pstr_huff_cld_tab_2d->lav9.entry[in_data[band][0]][in_data[band][1]];
251*15dc779aSAndroid Build Coastguard Worker       *pstr_huff_escape = pstr_huff_cld_tab_2d->lav9.escape;
252*15dc779aSAndroid Build Coastguard Worker     } break;
253*15dc779aSAndroid Build Coastguard Worker     case 7: {
254*15dc779aSAndroid Build Coastguard Worker       switch (data_type) {
255*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
256*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_entry = pstr_huff_cld_tab_2d->lav7.entry[in_data[band][0]][in_data[band][1]];
257*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_escape = pstr_huff_cld_tab_2d->lav7.escape;
258*15dc779aSAndroid Build Coastguard Worker           break;
259*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
260*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_entry = pstr_huff_icc_tab_2d->lav7.entry[in_data[band][0]][in_data[band][1]];
261*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_escape = pstr_huff_icc_tab_2d->lav7.escape;
262*15dc779aSAndroid Build Coastguard Worker           break;
263*15dc779aSAndroid Build Coastguard Worker       }
264*15dc779aSAndroid Build Coastguard Worker     } break;
265*15dc779aSAndroid Build Coastguard Worker     case 5: {
266*15dc779aSAndroid Build Coastguard Worker       switch (data_type) {
267*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
268*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_entry = pstr_huff_cld_tab_2d->lav5.entry[in_data[band][0]][in_data[band][1]];
269*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_escape = pstr_huff_cld_tab_2d->lav5.escape;
270*15dc779aSAndroid Build Coastguard Worker           break;
271*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
272*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_entry = pstr_huff_icc_tab_2d->lav5.entry[in_data[band][0]][in_data[band][1]];
273*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_escape = pstr_huff_icc_tab_2d->lav5.escape;
274*15dc779aSAndroid Build Coastguard Worker           break;
275*15dc779aSAndroid Build Coastguard Worker       }
276*15dc779aSAndroid Build Coastguard Worker     } break;
277*15dc779aSAndroid Build Coastguard Worker     case 3: {
278*15dc779aSAndroid Build Coastguard Worker       switch (data_type) {
279*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
280*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_entry = pstr_huff_cld_tab_2d->lav3.entry[in_data[band][0]][in_data[band][1]];
281*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_escape = pstr_huff_cld_tab_2d->lav3.escape;
282*15dc779aSAndroid Build Coastguard Worker           break;
283*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
284*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_entry = pstr_huff_icc_tab_2d->lav3.entry[in_data[band][0]][in_data[band][1]];
285*15dc779aSAndroid Build Coastguard Worker           *pstr_huff_escape = pstr_huff_icc_tab_2d->lav3.escape;
286*15dc779aSAndroid Build Coastguard Worker           break;
287*15dc779aSAndroid Build Coastguard Worker       }
288*15dc779aSAndroid Build Coastguard Worker     } break;
289*15dc779aSAndroid Build Coastguard Worker     case 1: {
290*15dc779aSAndroid Build Coastguard Worker       *pstr_huff_entry = pstr_huff_icc_tab_2d->lav1.entry[in_data[band][0]][in_data[band][1]];
291*15dc779aSAndroid Build Coastguard Worker       *pstr_huff_escape = pstr_huff_icc_tab_2d->lav1.escape;
292*15dc779aSAndroid Build Coastguard Worker     } break;
293*15dc779aSAndroid Build Coastguard Worker   }
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_huff_enc_2_d(ixheaace_bit_buf_handle pstr_bit_buf,const WORD32 data_type,WORD16 tab_idx_2_d[2],WORD16 lav_idx,WORD16 in_data[][2],WORD16 num_bands,WORD16 stride,WORD16 * p_0_data[2],UWORD16 * huff_bits)296*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_huff_enc_2_d(ixheaace_bit_buf_handle pstr_bit_buf,
297*15dc779aSAndroid Build Coastguard Worker                                                   const WORD32 data_type, WORD16 tab_idx_2_d[2],
298*15dc779aSAndroid Build Coastguard Worker                                                   WORD16 lav_idx, WORD16 in_data[][2],
299*15dc779aSAndroid Build Coastguard Worker                                                   WORD16 num_bands, WORD16 stride,
300*15dc779aSAndroid Build Coastguard Worker                                                   WORD16 *p_0_data[2], UWORD16 *huff_bits) {
301*15dc779aSAndroid Build Coastguard Worker   WORD16 band = 0, lav = 0, sym_bits = 0, esc_idx = 0;
302*15dc779aSAndroid Build Coastguard Worker   UWORD8 num_sbits = 0;
303*15dc779aSAndroid Build Coastguard Worker   WORD16 esc_data[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {{0}};
304*15dc779aSAndroid Build Coastguard Worker 
305*15dc779aSAndroid Build Coastguard Worker   *huff_bits = 0;
306*15dc779aSAndroid Build Coastguard Worker   const ixheaace_mps_huff_entry *pstr_huff_entry = NULL;
307*15dc779aSAndroid Build Coastguard Worker   if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
308*15dc779aSAndroid Build Coastguard Worker     lav = 2 * lav_idx + 1;
309*15dc779aSAndroid Build Coastguard Worker     pstr_huff_entry = ixheaace_mps_212_huff_part_0_tab.icc;
310*15dc779aSAndroid Build Coastguard Worker   } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
311*15dc779aSAndroid Build Coastguard Worker     lav = 2 * lav_idx + 3;
312*15dc779aSAndroid Build Coastguard Worker     pstr_huff_entry = ixheaace_mps_212_huff_part_0_tab.cld;
313*15dc779aSAndroid Build Coastguard Worker   } else {
314*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
315*15dc779aSAndroid Build Coastguard Worker   }
316*15dc779aSAndroid Build Coastguard Worker 
317*15dc779aSAndroid Build Coastguard Worker   if (p_0_data[0] != NULL) {
318*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_huff_entry entry = pstr_huff_entry[*p_0_data[0]];
319*15dc779aSAndroid Build Coastguard Worker     *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
320*15dc779aSAndroid Build Coastguard Worker   }
321*15dc779aSAndroid Build Coastguard Worker   if (p_0_data[1] != NULL) {
322*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_huff_entry entry = pstr_huff_entry[*p_0_data[1]];
323*15dc779aSAndroid Build Coastguard Worker     *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
324*15dc779aSAndroid Build Coastguard Worker   }
325*15dc779aSAndroid Build Coastguard Worker 
326*15dc779aSAndroid Build Coastguard Worker   for (band = 0; band < num_bands; band += stride) {
327*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_huff_entry entry = {0};
328*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_huff_entry escape = {0};
329*15dc779aSAndroid Build Coastguard Worker 
330*15dc779aSAndroid Build Coastguard Worker     esc_data[0][esc_idx] = in_data[band][0] + lav;
331*15dc779aSAndroid Build Coastguard Worker     esc_data[1][esc_idx] = in_data[band][1] + lav;
332*15dc779aSAndroid Build Coastguard Worker 
333*15dc779aSAndroid Build Coastguard Worker     num_sbits = ixheaace_mps_212_sym_check(in_data[band], lav, &sym_bits);
334*15dc779aSAndroid Build Coastguard Worker 
335*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_212_get_huff_entry(lav, data_type, band, tab_idx_2_d, in_data, &entry, &escape);
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker     *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
338*15dc779aSAndroid Build Coastguard Worker 
339*15dc779aSAndroid Build Coastguard Worker     if ((entry.value == escape.value) && (entry.length == escape.length)) {
340*15dc779aSAndroid Build Coastguard Worker       esc_idx++;
341*15dc779aSAndroid Build Coastguard Worker     } else {
342*15dc779aSAndroid Build Coastguard Worker       *huff_bits += ixheaace_write_bits(pstr_bit_buf, sym_bits, num_sbits);
343*15dc779aSAndroid Build Coastguard Worker     }
344*15dc779aSAndroid Build Coastguard Worker   }
345*15dc779aSAndroid Build Coastguard Worker   if (esc_idx > 0) {
346*15dc779aSAndroid Build Coastguard Worker     *huff_bits += ixheaace_mps_212_calc_pcm_bits(2 * esc_idx, (2 * lav + 1));
347*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, esc_data[0], esc_data[1], 0, 2 * esc_idx,
348*15dc779aSAndroid Build Coastguard Worker                                       (2 * lav + 1));
349*15dc779aSAndroid Build Coastguard Worker   }
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
352*15dc779aSAndroid Build Coastguard Worker }
353*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_get_next_lav_step(const WORD32 lav,const WORD32 data_type)354*15dc779aSAndroid Build Coastguard Worker static WORD8 ixheaace_mps_212_get_next_lav_step(const WORD32 lav, const WORD32 data_type) {
355*15dc779aSAndroid Build Coastguard Worker   WORD8 lav_step = 0;
356*15dc779aSAndroid Build Coastguard Worker   if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
357*15dc779aSAndroid Build Coastguard Worker     lav_step = (lav > 7) ? -1 : lav_step_icc[lav];
358*15dc779aSAndroid Build Coastguard Worker   } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
359*15dc779aSAndroid Build Coastguard Worker     lav_step = (lav > 9) ? -1 : lav_step_cld[lav];
360*15dc779aSAndroid Build Coastguard Worker   } else {
361*15dc779aSAndroid Build Coastguard Worker     lav_step = 0;
362*15dc779aSAndroid Build Coastguard Worker   }
363*15dc779aSAndroid Build Coastguard Worker 
364*15dc779aSAndroid Build Coastguard Worker   return lav_step;
365*15dc779aSAndroid Build Coastguard Worker }
366*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_calc_huff_bits(WORD16 * in_data_1,WORD16 * in_data_2,const WORD32 data_type,const WORD32 diff_type_1,const WORD32 diff_type_2,const WORD16 num_bands,WORD16 * const lav_idx,WORD16 * bit_count,WORD16 * const huff_dim,WORD16 * const huff_pair_type)367*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_calc_huff_bits(
368*15dc779aSAndroid Build Coastguard Worker     WORD16 *in_data_1, WORD16 *in_data_2, const WORD32 data_type, const WORD32 diff_type_1,
369*15dc779aSAndroid Build Coastguard Worker     const WORD32 diff_type_2, const WORD16 num_bands, WORD16 *const lav_idx, WORD16 *bit_count,
370*15dc779aSAndroid Build Coastguard Worker     WORD16 *const huff_dim, WORD16 *const huff_pair_type) {
371*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error;
372*15dc779aSAndroid Build Coastguard Worker   WORD16 band = 0;
373*15dc779aSAndroid Build Coastguard Worker   WORD16 bit_count_1_d = 0;
374*15dc779aSAndroid Build Coastguard Worker   WORD16 bit_count_2_d_freq = 0;
375*15dc779aSAndroid Build Coastguard Worker   WORD16 bit_count_min = 0;
376*15dc779aSAndroid Build Coastguard Worker   WORD16 num_band_short_data_1 = 0;
377*15dc779aSAndroid Build Coastguard Worker   WORD16 num_band_short_data_2 = 0;
378*15dc779aSAndroid Build Coastguard Worker   UWORD16 huff_bits;
379*15dc779aSAndroid Build Coastguard Worker   WORD16 tab_idx_2_d[2][2] = {{0}};
380*15dc779aSAndroid Build Coastguard Worker   WORD16 tab_idx_1_d[2] = {0};
381*15dc779aSAndroid Build Coastguard Worker   WORD16 df_rest_flag[2] = {0};
382*15dc779aSAndroid Build Coastguard Worker   WORD16 part_0_flag[2] = {0};
383*15dc779aSAndroid Build Coastguard Worker   WORD16 lav_fp[2] = {0};
384*15dc779aSAndroid Build Coastguard Worker   WORD16 pair_vec[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS][2] = {{0}};
385*15dc779aSAndroid Build Coastguard Worker   WORD16 *part_0_data_1[2] = {NULL};
386*15dc779aSAndroid Build Coastguard Worker   WORD16 *part_0_data_2[2] = {NULL};
387*15dc779aSAndroid Build Coastguard Worker   WORD16 *in_short_data_1 = NULL;
388*15dc779aSAndroid Build Coastguard Worker   WORD16 *in_short_data_2 = NULL;
389*15dc779aSAndroid Build Coastguard Worker 
390*15dc779aSAndroid Build Coastguard Worker   bit_count_1_d = 1;
391*15dc779aSAndroid Build Coastguard Worker   bit_count_2_d_freq = 1;
392*15dc779aSAndroid Build Coastguard Worker   num_band_short_data_1 = num_bands;
393*15dc779aSAndroid Build Coastguard Worker   num_band_short_data_2 = num_bands;
394*15dc779aSAndroid Build Coastguard Worker 
395*15dc779aSAndroid Build Coastguard Worker   tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
396*15dc779aSAndroid Build Coastguard Worker   tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
397*15dc779aSAndroid Build Coastguard Worker 
398*15dc779aSAndroid Build Coastguard Worker   part_0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
399*15dc779aSAndroid Build Coastguard Worker   part_0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
400*15dc779aSAndroid Build Coastguard Worker 
401*15dc779aSAndroid Build Coastguard Worker   if (in_data_1 != NULL) {
402*15dc779aSAndroid Build Coastguard Worker     in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
403*15dc779aSAndroid Build Coastguard Worker     error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[0], in_short_data_1,
404*15dc779aSAndroid Build Coastguard Worker                                           num_band_short_data_1, part_0_flag[0], &huff_bits);
405*15dc779aSAndroid Build Coastguard Worker     if (error) {
406*15dc779aSAndroid Build Coastguard Worker       return error;
407*15dc779aSAndroid Build Coastguard Worker     }
408*15dc779aSAndroid Build Coastguard Worker     bit_count_1_d += huff_bits;
409*15dc779aSAndroid Build Coastguard Worker   }
410*15dc779aSAndroid Build Coastguard Worker   if (in_data_2 != NULL) {
411*15dc779aSAndroid Build Coastguard Worker     in_short_data_2 = in_data_2 + (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
412*15dc779aSAndroid Build Coastguard Worker     error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[1], in_short_data_2,
413*15dc779aSAndroid Build Coastguard Worker                                           num_band_short_data_2, part_0_flag[1], &huff_bits);
414*15dc779aSAndroid Build Coastguard Worker     if (error) {
415*15dc779aSAndroid Build Coastguard Worker       return error;
416*15dc779aSAndroid Build Coastguard Worker     }
417*15dc779aSAndroid Build Coastguard Worker     bit_count_1_d += huff_bits;
418*15dc779aSAndroid Build Coastguard Worker   }
419*15dc779aSAndroid Build Coastguard Worker 
420*15dc779aSAndroid Build Coastguard Worker   bit_count_min = bit_count_1_d;
421*15dc779aSAndroid Build Coastguard Worker   *huff_dim = IXHEAACE_MPS_SAC_HUFF_1D;
422*15dc779aSAndroid Build Coastguard Worker   lav_idx[0] = lav_idx[1] = -1;
423*15dc779aSAndroid Build Coastguard Worker 
424*15dc779aSAndroid Build Coastguard Worker   if (in_data_1 != NULL) {
425*15dc779aSAndroid Build Coastguard Worker     if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
426*15dc779aSAndroid Build Coastguard Worker       part_0_data_1[0] = &in_data_1[0];
427*15dc779aSAndroid Build Coastguard Worker       part_0_data_1[1] = NULL;
428*15dc779aSAndroid Build Coastguard Worker 
429*15dc779aSAndroid Build Coastguard Worker       num_band_short_data_1 -= 1;
430*15dc779aSAndroid Build Coastguard Worker       in_short_data_1 += 1;
431*15dc779aSAndroid Build Coastguard Worker     }
432*15dc779aSAndroid Build Coastguard Worker 
433*15dc779aSAndroid Build Coastguard Worker     df_rest_flag[0] = num_band_short_data_1 % 2;
434*15dc779aSAndroid Build Coastguard Worker 
435*15dc779aSAndroid Build Coastguard Worker     if (df_rest_flag[0]) {
436*15dc779aSAndroid Build Coastguard Worker       num_band_short_data_1 -= 1;
437*15dc779aSAndroid Build Coastguard Worker     }
438*15dc779aSAndroid Build Coastguard Worker 
439*15dc779aSAndroid Build Coastguard Worker     for (band = 0; band < num_band_short_data_1 - 1; band += 2) {
440*15dc779aSAndroid Build Coastguard Worker       pair_vec[band][0] = in_short_data_1[band];
441*15dc779aSAndroid Build Coastguard Worker       pair_vec[band][1] = in_short_data_1[band + 1];
442*15dc779aSAndroid Build Coastguard Worker 
443*15dc779aSAndroid Build Coastguard Worker       lav_fp[0] = (WORD16)MAX(lav_fp[0], abs(pair_vec[band][0]));
444*15dc779aSAndroid Build Coastguard Worker       lav_fp[0] = (WORD16)MAX(lav_fp[0], abs(pair_vec[band][1]));
445*15dc779aSAndroid Build Coastguard Worker     }
446*15dc779aSAndroid Build Coastguard Worker 
447*15dc779aSAndroid Build Coastguard Worker     tab_idx_2_d[0][0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
448*15dc779aSAndroid Build Coastguard Worker     tab_idx_2_d[0][1] = 0;
449*15dc779aSAndroid Build Coastguard Worker 
450*15dc779aSAndroid Build Coastguard Worker     tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
451*15dc779aSAndroid Build Coastguard Worker 
452*15dc779aSAndroid Build Coastguard Worker     lav_fp[0] = ixheaace_mps_212_get_next_lav_step(lav_fp[0], data_type);
453*15dc779aSAndroid Build Coastguard Worker 
454*15dc779aSAndroid Build Coastguard Worker     if (lav_fp[0] != -1) {
455*15dc779aSAndroid Build Coastguard Worker       bit_count_2_d_freq += lav_huff_len[lav_fp[0]];
456*15dc779aSAndroid Build Coastguard Worker     }
457*15dc779aSAndroid Build Coastguard Worker   }
458*15dc779aSAndroid Build Coastguard Worker 
459*15dc779aSAndroid Build Coastguard Worker   if (in_data_2 != NULL) {
460*15dc779aSAndroid Build Coastguard Worker     if (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
461*15dc779aSAndroid Build Coastguard Worker       part_0_data_2[0] = NULL;
462*15dc779aSAndroid Build Coastguard Worker       part_0_data_2[1] = &in_data_2[0];
463*15dc779aSAndroid Build Coastguard Worker 
464*15dc779aSAndroid Build Coastguard Worker       num_band_short_data_2 -= 1;
465*15dc779aSAndroid Build Coastguard Worker       in_short_data_2 += 1;
466*15dc779aSAndroid Build Coastguard Worker     }
467*15dc779aSAndroid Build Coastguard Worker 
468*15dc779aSAndroid Build Coastguard Worker     df_rest_flag[1] = num_band_short_data_2 % 2;
469*15dc779aSAndroid Build Coastguard Worker 
470*15dc779aSAndroid Build Coastguard Worker     if (df_rest_flag[1]) {
471*15dc779aSAndroid Build Coastguard Worker       num_band_short_data_2 -= 1;
472*15dc779aSAndroid Build Coastguard Worker     }
473*15dc779aSAndroid Build Coastguard Worker 
474*15dc779aSAndroid Build Coastguard Worker     for (band = 0; band < num_band_short_data_2 - 1; band += 2) {
475*15dc779aSAndroid Build Coastguard Worker       pair_vec[band + 1][0] = in_short_data_2[band];
476*15dc779aSAndroid Build Coastguard Worker       pair_vec[band + 1][1] = in_short_data_2[band + 1];
477*15dc779aSAndroid Build Coastguard Worker 
478*15dc779aSAndroid Build Coastguard Worker       lav_fp[1] = (WORD16)MAX(lav_fp[1], abs(pair_vec[band + 1][0]));
479*15dc779aSAndroid Build Coastguard Worker       lav_fp[1] = (WORD16)MAX(lav_fp[1], abs(pair_vec[band + 1][1]));
480*15dc779aSAndroid Build Coastguard Worker     }
481*15dc779aSAndroid Build Coastguard Worker 
482*15dc779aSAndroid Build Coastguard Worker     tab_idx_2_d[1][0] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
483*15dc779aSAndroid Build Coastguard Worker     tab_idx_2_d[1][1] = 0;
484*15dc779aSAndroid Build Coastguard Worker 
485*15dc779aSAndroid Build Coastguard Worker     tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
486*15dc779aSAndroid Build Coastguard Worker 
487*15dc779aSAndroid Build Coastguard Worker     lav_fp[1] = ixheaace_mps_212_get_next_lav_step(lav_fp[1], data_type);
488*15dc779aSAndroid Build Coastguard Worker 
489*15dc779aSAndroid Build Coastguard Worker     if (lav_fp[1] != -1) bit_count_2_d_freq += lav_huff_len[lav_fp[1]];
490*15dc779aSAndroid Build Coastguard Worker   }
491*15dc779aSAndroid Build Coastguard Worker 
492*15dc779aSAndroid Build Coastguard Worker   if ((lav_fp[0] != -1) && (lav_fp[1] != -1)) {
493*15dc779aSAndroid Build Coastguard Worker     if (in_data_1 != NULL) {
494*15dc779aSAndroid Build Coastguard Worker       error = ixheaace_mps_212_huff_enc_2_d(NULL, data_type, tab_idx_2_d[0], lav_fp[0], pair_vec,
495*15dc779aSAndroid Build Coastguard Worker                                             num_band_short_data_1, 2, part_0_data_1, &huff_bits);
496*15dc779aSAndroid Build Coastguard Worker       if (error) {
497*15dc779aSAndroid Build Coastguard Worker         return error;
498*15dc779aSAndroid Build Coastguard Worker       }
499*15dc779aSAndroid Build Coastguard Worker 
500*15dc779aSAndroid Build Coastguard Worker       bit_count_2_d_freq += huff_bits;
501*15dc779aSAndroid Build Coastguard Worker     }
502*15dc779aSAndroid Build Coastguard Worker     if (in_data_2 != NULL) {
503*15dc779aSAndroid Build Coastguard Worker       error =
504*15dc779aSAndroid Build Coastguard Worker           ixheaace_mps_212_huff_enc_2_d(NULL, data_type, tab_idx_2_d[1], lav_fp[1], pair_vec + 1,
505*15dc779aSAndroid Build Coastguard Worker                                         num_band_short_data_2, 2, part_0_data_2, &huff_bits);
506*15dc779aSAndroid Build Coastguard Worker       if (error) {
507*15dc779aSAndroid Build Coastguard Worker         return error;
508*15dc779aSAndroid Build Coastguard Worker       }
509*15dc779aSAndroid Build Coastguard Worker       bit_count_2_d_freq += huff_bits;
510*15dc779aSAndroid Build Coastguard Worker     }
511*15dc779aSAndroid Build Coastguard Worker     if (in_data_1 != NULL) {
512*15dc779aSAndroid Build Coastguard Worker       if (df_rest_flag[0]) {
513*15dc779aSAndroid Build Coastguard Worker         error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[0],
514*15dc779aSAndroid Build Coastguard Worker                                               in_short_data_1 + num_band_short_data_1, 1, 0,
515*15dc779aSAndroid Build Coastguard Worker                                               &huff_bits);
516*15dc779aSAndroid Build Coastguard Worker         if (error) {
517*15dc779aSAndroid Build Coastguard Worker           return error;
518*15dc779aSAndroid Build Coastguard Worker         }
519*15dc779aSAndroid Build Coastguard Worker         bit_count_2_d_freq += huff_bits;
520*15dc779aSAndroid Build Coastguard Worker       }
521*15dc779aSAndroid Build Coastguard Worker     }
522*15dc779aSAndroid Build Coastguard Worker     if (in_data_2 != NULL) {
523*15dc779aSAndroid Build Coastguard Worker       if (df_rest_flag[1]) {
524*15dc779aSAndroid Build Coastguard Worker         error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[1],
525*15dc779aSAndroid Build Coastguard Worker                                               in_short_data_2 + num_band_short_data_2, 1, 0,
526*15dc779aSAndroid Build Coastguard Worker                                               &huff_bits);
527*15dc779aSAndroid Build Coastguard Worker         if (error) {
528*15dc779aSAndroid Build Coastguard Worker           return error;
529*15dc779aSAndroid Build Coastguard Worker         }
530*15dc779aSAndroid Build Coastguard Worker         bit_count_2_d_freq += huff_bits;
531*15dc779aSAndroid Build Coastguard Worker       }
532*15dc779aSAndroid Build Coastguard Worker     }
533*15dc779aSAndroid Build Coastguard Worker 
534*15dc779aSAndroid Build Coastguard Worker     if (bit_count_2_d_freq < bit_count_min) {
535*15dc779aSAndroid Build Coastguard Worker       bit_count_min = bit_count_2_d_freq;
536*15dc779aSAndroid Build Coastguard Worker       *huff_dim = IXHEAACE_MPS_SAC_HUFF_2D;
537*15dc779aSAndroid Build Coastguard Worker       *huff_pair_type = IXHEAACE_MPS_SAC_FREQ_PAIR;
538*15dc779aSAndroid Build Coastguard Worker       lav_idx[0] = lav_fp[0];
539*15dc779aSAndroid Build Coastguard Worker       lav_idx[1] = lav_fp[1];
540*15dc779aSAndroid Build Coastguard Worker     }
541*15dc779aSAndroid Build Coastguard Worker   }
542*15dc779aSAndroid Build Coastguard Worker 
543*15dc779aSAndroid Build Coastguard Worker   *bit_count = bit_count_min;
544*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
545*15dc779aSAndroid Build Coastguard Worker }
546*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_apply_huff_coding(ixheaace_bit_buf_handle pstr_bit_buf,WORD16 * const in_data_1,WORD16 * const in_data_2,const WORD32 data_type,const WORD32 diff_type_1,const WORD32 diff_type_2,const WORD16 bands,const WORD16 * const lav_idx,WORD16 huff_dim,WORD16 huff_pair_type)547*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_apply_huff_coding(
548*15dc779aSAndroid Build Coastguard Worker     ixheaace_bit_buf_handle pstr_bit_buf, WORD16 *const in_data_1, WORD16 *const in_data_2,
549*15dc779aSAndroid Build Coastguard Worker     const WORD32 data_type, const WORD32 diff_type_1, const WORD32 diff_type_2,
550*15dc779aSAndroid Build Coastguard Worker     const WORD16 bands, const WORD16 *const lav_idx, WORD16 huff_dim, WORD16 huff_pair_type) {
551*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error;
552*15dc779aSAndroid Build Coastguard Worker   WORD16 band = 0;
553*15dc779aSAndroid Build Coastguard Worker   WORD16 num_band_short_data_1 = bands;
554*15dc779aSAndroid Build Coastguard Worker   WORD16 num_band_short_data_2 = bands;
555*15dc779aSAndroid Build Coastguard Worker   UWORD16 huff_bits;
556*15dc779aSAndroid Build Coastguard Worker 
557*15dc779aSAndroid Build Coastguard Worker   WORD16 df_rest_flag[2] = {0};
558*15dc779aSAndroid Build Coastguard Worker   WORD16 part_0_flag[2] = {0};
559*15dc779aSAndroid Build Coastguard Worker   WORD16 tab_idx_1_d[2] = {0};
560*15dc779aSAndroid Build Coastguard Worker   WORD16 tab_idx_2_d[2][2] = {{0}};
561*15dc779aSAndroid Build Coastguard Worker   WORD16 pair_vec[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS][2] = {{0}};
562*15dc779aSAndroid Build Coastguard Worker 
563*15dc779aSAndroid Build Coastguard Worker   WORD16 *part_0_data_1[2] = {NULL};
564*15dc779aSAndroid Build Coastguard Worker   WORD16 *part_0_data_2[2] = {NULL};
565*15dc779aSAndroid Build Coastguard Worker   WORD16 *in_short_data_1 = NULL;
566*15dc779aSAndroid Build Coastguard Worker   WORD16 *in_short_data_2 = NULL;
567*15dc779aSAndroid Build Coastguard Worker 
568*15dc779aSAndroid Build Coastguard Worker   ixheaace_write_bits(pstr_bit_buf, huff_dim, 1);
569*15dc779aSAndroid Build Coastguard Worker   if (huff_dim == IXHEAACE_MPS_SAC_HUFF_1D) {
570*15dc779aSAndroid Build Coastguard Worker     part_0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
571*15dc779aSAndroid Build Coastguard Worker     part_0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
572*15dc779aSAndroid Build Coastguard Worker 
573*15dc779aSAndroid Build Coastguard Worker     tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
574*15dc779aSAndroid Build Coastguard Worker     tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
575*15dc779aSAndroid Build Coastguard Worker 
576*15dc779aSAndroid Build Coastguard Worker     if (in_data_1 != NULL) {
577*15dc779aSAndroid Build Coastguard Worker       in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
578*15dc779aSAndroid Build Coastguard Worker       error =
579*15dc779aSAndroid Build Coastguard Worker           ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[0], in_short_data_1,
580*15dc779aSAndroid Build Coastguard Worker                                         num_band_short_data_1, part_0_flag[0], &huff_bits);
581*15dc779aSAndroid Build Coastguard Worker       if (error) {
582*15dc779aSAndroid Build Coastguard Worker         return error;
583*15dc779aSAndroid Build Coastguard Worker       }
584*15dc779aSAndroid Build Coastguard Worker     }
585*15dc779aSAndroid Build Coastguard Worker     if (in_data_2 != NULL) {
586*15dc779aSAndroid Build Coastguard Worker       in_short_data_2 = in_data_2 + (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
587*15dc779aSAndroid Build Coastguard Worker       error =
588*15dc779aSAndroid Build Coastguard Worker           ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[1], in_short_data_2,
589*15dc779aSAndroid Build Coastguard Worker                                         num_band_short_data_2, part_0_flag[1], &huff_bits);
590*15dc779aSAndroid Build Coastguard Worker       if (error) {
591*15dc779aSAndroid Build Coastguard Worker         return error;
592*15dc779aSAndroid Build Coastguard Worker       }
593*15dc779aSAndroid Build Coastguard Worker     }
594*15dc779aSAndroid Build Coastguard Worker   } else {
595*15dc779aSAndroid Build Coastguard Worker     if (huff_pair_type == IXHEAACE_MPS_SAC_FREQ_PAIR) {
596*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL) {
597*15dc779aSAndroid Build Coastguard Worker         in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
598*15dc779aSAndroid Build Coastguard Worker         if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
599*15dc779aSAndroid Build Coastguard Worker           part_0_data_1[0] = &in_data_1[0];
600*15dc779aSAndroid Build Coastguard Worker           part_0_data_1[1] = NULL;
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker           num_band_short_data_1 -= 1;
603*15dc779aSAndroid Build Coastguard Worker           in_short_data_1 += 1;
604*15dc779aSAndroid Build Coastguard Worker         }
605*15dc779aSAndroid Build Coastguard Worker 
606*15dc779aSAndroid Build Coastguard Worker         df_rest_flag[0] = num_band_short_data_1 % 2;
607*15dc779aSAndroid Build Coastguard Worker 
608*15dc779aSAndroid Build Coastguard Worker         if (df_rest_flag[0]) num_band_short_data_1 -= 1;
609*15dc779aSAndroid Build Coastguard Worker 
610*15dc779aSAndroid Build Coastguard Worker         for (band = 0; band < num_band_short_data_1 - 1; band += 2) {
611*15dc779aSAndroid Build Coastguard Worker           pair_vec[band][0] = in_short_data_1[band];
612*15dc779aSAndroid Build Coastguard Worker           pair_vec[band][1] = in_short_data_1[band + 1];
613*15dc779aSAndroid Build Coastguard Worker         }
614*15dc779aSAndroid Build Coastguard Worker 
615*15dc779aSAndroid Build Coastguard Worker         tab_idx_2_d[0][0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
616*15dc779aSAndroid Build Coastguard Worker         tab_idx_2_d[0][1] = 0;
617*15dc779aSAndroid Build Coastguard Worker 
618*15dc779aSAndroid Build Coastguard Worker         tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
619*15dc779aSAndroid Build Coastguard Worker       }
620*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL) {
621*15dc779aSAndroid Build Coastguard Worker         in_short_data_2 = in_data_2 + (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
622*15dc779aSAndroid Build Coastguard Worker         if (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
623*15dc779aSAndroid Build Coastguard Worker           part_0_data_2[0] = NULL;
624*15dc779aSAndroid Build Coastguard Worker           part_0_data_2[1] = &in_data_2[0];
625*15dc779aSAndroid Build Coastguard Worker 
626*15dc779aSAndroid Build Coastguard Worker           num_band_short_data_2 -= 1;
627*15dc779aSAndroid Build Coastguard Worker           in_short_data_2 += 1;
628*15dc779aSAndroid Build Coastguard Worker         }
629*15dc779aSAndroid Build Coastguard Worker 
630*15dc779aSAndroid Build Coastguard Worker         df_rest_flag[1] = num_band_short_data_2 % 2;
631*15dc779aSAndroid Build Coastguard Worker 
632*15dc779aSAndroid Build Coastguard Worker         if (df_rest_flag[1]) num_band_short_data_2 -= 1;
633*15dc779aSAndroid Build Coastguard Worker 
634*15dc779aSAndroid Build Coastguard Worker         for (band = 0; band < num_band_short_data_2 - 1; band += 2) {
635*15dc779aSAndroid Build Coastguard Worker           pair_vec[band + 1][0] = in_short_data_2[band];
636*15dc779aSAndroid Build Coastguard Worker           pair_vec[band + 1][1] = in_short_data_2[band + 1];
637*15dc779aSAndroid Build Coastguard Worker         }
638*15dc779aSAndroid Build Coastguard Worker 
639*15dc779aSAndroid Build Coastguard Worker         tab_idx_2_d[1][0] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
640*15dc779aSAndroid Build Coastguard Worker         tab_idx_2_d[1][1] = 0;
641*15dc779aSAndroid Build Coastguard Worker 
642*15dc779aSAndroid Build Coastguard Worker         tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
643*15dc779aSAndroid Build Coastguard Worker       }
644*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL) {
645*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, lav_huff_val[lav_idx[0]], lav_huff_len[lav_idx[0]]);
646*15dc779aSAndroid Build Coastguard Worker         error = ixheaace_mps_212_huff_enc_2_d(pstr_bit_buf, data_type, tab_idx_2_d[0], lav_idx[0],
647*15dc779aSAndroid Build Coastguard Worker                                               pair_vec, num_band_short_data_1, 2, part_0_data_1,
648*15dc779aSAndroid Build Coastguard Worker                                               &huff_bits);
649*15dc779aSAndroid Build Coastguard Worker         if (error) {
650*15dc779aSAndroid Build Coastguard Worker           return error;
651*15dc779aSAndroid Build Coastguard Worker         }
652*15dc779aSAndroid Build Coastguard Worker         if (df_rest_flag[0]) {
653*15dc779aSAndroid Build Coastguard Worker           error = ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[0],
654*15dc779aSAndroid Build Coastguard Worker                                                 in_short_data_1 + num_band_short_data_1, 1, 0,
655*15dc779aSAndroid Build Coastguard Worker                                                 &huff_bits);
656*15dc779aSAndroid Build Coastguard Worker           if (error) {
657*15dc779aSAndroid Build Coastguard Worker             return error;
658*15dc779aSAndroid Build Coastguard Worker           }
659*15dc779aSAndroid Build Coastguard Worker         }
660*15dc779aSAndroid Build Coastguard Worker       }
661*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL) {
662*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, lav_huff_val[lav_idx[1]], lav_huff_len[lav_idx[1]]);
663*15dc779aSAndroid Build Coastguard Worker         error = ixheaace_mps_212_huff_enc_2_d(pstr_bit_buf, data_type, tab_idx_2_d[1], lav_idx[1],
664*15dc779aSAndroid Build Coastguard Worker                                               pair_vec + 1, num_band_short_data_2, 2,
665*15dc779aSAndroid Build Coastguard Worker                                               part_0_data_2, &huff_bits);
666*15dc779aSAndroid Build Coastguard Worker         if (error) {
667*15dc779aSAndroid Build Coastguard Worker           return error;
668*15dc779aSAndroid Build Coastguard Worker         }
669*15dc779aSAndroid Build Coastguard Worker         if (df_rest_flag[1]) {
670*15dc779aSAndroid Build Coastguard Worker           error = ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[1],
671*15dc779aSAndroid Build Coastguard Worker                                                 in_short_data_2 + num_band_short_data_2, 1, 0,
672*15dc779aSAndroid Build Coastguard Worker                                                 &huff_bits);
673*15dc779aSAndroid Build Coastguard Worker           if (error) {
674*15dc779aSAndroid Build Coastguard Worker             return error;
675*15dc779aSAndroid Build Coastguard Worker           }
676*15dc779aSAndroid Build Coastguard Worker         }
677*15dc779aSAndroid Build Coastguard Worker       }
678*15dc779aSAndroid Build Coastguard Worker     } else {
679*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 == NULL || in_data_2 == NULL || in_short_data_1 == NULL ||
680*15dc779aSAndroid Build Coastguard Worker           in_short_data_2 == NULL) {
681*15dc779aSAndroid Build Coastguard Worker         return IA_EXHEAACE_EXE_FATAL_MPS_NULL_DATA_HANDLE;
682*15dc779aSAndroid Build Coastguard Worker       }
683*15dc779aSAndroid Build Coastguard Worker 
684*15dc779aSAndroid Build Coastguard Worker       if ((diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ||
685*15dc779aSAndroid Build Coastguard Worker           (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ)) {
686*15dc779aSAndroid Build Coastguard Worker         part_0_data_1[0] = &in_data_1[0];
687*15dc779aSAndroid Build Coastguard Worker         part_0_data_1[1] = &in_data_2[0];
688*15dc779aSAndroid Build Coastguard Worker 
689*15dc779aSAndroid Build Coastguard Worker         in_short_data_1 += 1;
690*15dc779aSAndroid Build Coastguard Worker         in_short_data_2 += 1;
691*15dc779aSAndroid Build Coastguard Worker 
692*15dc779aSAndroid Build Coastguard Worker         num_band_short_data_1 -= 1;
693*15dc779aSAndroid Build Coastguard Worker       }
694*15dc779aSAndroid Build Coastguard Worker 
695*15dc779aSAndroid Build Coastguard Worker       for (band = 0; band < num_band_short_data_1; band++) {
696*15dc779aSAndroid Build Coastguard Worker         pair_vec[band][0] = in_short_data_1[band];
697*15dc779aSAndroid Build Coastguard Worker         pair_vec[band][1] = in_short_data_2[band];
698*15dc779aSAndroid Build Coastguard Worker       }
699*15dc779aSAndroid Build Coastguard Worker       tab_idx_2_d[0][0] = ((diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ||
700*15dc779aSAndroid Build Coastguard Worker                            (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME))
701*15dc779aSAndroid Build Coastguard Worker                               ? 1
702*15dc779aSAndroid Build Coastguard Worker                               : 0;
703*15dc779aSAndroid Build Coastguard Worker       tab_idx_2_d[0][1] = 1;
704*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, lav_huff_val[lav_idx[0]], lav_huff_len[lav_idx[0]]);
705*15dc779aSAndroid Build Coastguard Worker       error = ixheaace_mps_212_huff_enc_2_d(pstr_bit_buf, data_type, tab_idx_2_d[0], lav_idx[0],
706*15dc779aSAndroid Build Coastguard Worker                                             pair_vec, num_band_short_data_1, 1, part_0_data_1,
707*15dc779aSAndroid Build Coastguard Worker                                             &huff_bits);
708*15dc779aSAndroid Build Coastguard Worker       if (error) {
709*15dc779aSAndroid Build Coastguard Worker         return error;
710*15dc779aSAndroid Build Coastguard Worker       }
711*15dc779aSAndroid Build Coastguard Worker     }
712*15dc779aSAndroid Build Coastguard Worker   }
713*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
714*15dc779aSAndroid Build Coastguard Worker }
715*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_split_lsb(WORD32 * in_data,WORD32 offset,WORD32 num_lsb,WORD32 num_val,WORD32 * out_data_lsb,WORD32 * out_data_msb)716*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_515_split_lsb(WORD32 *in_data, WORD32 offset, WORD32 num_lsb,
717*15dc779aSAndroid Build Coastguard Worker                                          WORD32 num_val, WORD32 *out_data_lsb,
718*15dc779aSAndroid Build Coastguard Worker                                          WORD32 *out_data_msb) {
719*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, val = 0, lsb = 0, msb = 0;
720*15dc779aSAndroid Build Coastguard Worker 
721*15dc779aSAndroid Build Coastguard Worker   UWORD32 mask = (1 << num_lsb) - 1;
722*15dc779aSAndroid Build Coastguard Worker   WORD32 no_lsb_bits = 0;
723*15dc779aSAndroid Build Coastguard Worker 
724*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_val; i++) {
725*15dc779aSAndroid Build Coastguard Worker     val = in_data[i] + offset;
726*15dc779aSAndroid Build Coastguard Worker 
727*15dc779aSAndroid Build Coastguard Worker     lsb = val & mask;
728*15dc779aSAndroid Build Coastguard Worker     msb = val >> num_lsb;
729*15dc779aSAndroid Build Coastguard Worker 
730*15dc779aSAndroid Build Coastguard Worker     if (out_data_lsb != NULL) out_data_lsb[i] = lsb;
731*15dc779aSAndroid Build Coastguard Worker     if (out_data_msb != NULL) out_data_msb[i] = msb;
732*15dc779aSAndroid Build Coastguard Worker 
733*15dc779aSAndroid Build Coastguard Worker     no_lsb_bits += num_lsb;
734*15dc779aSAndroid Build Coastguard Worker   }
735*15dc779aSAndroid Build Coastguard Worker 
736*15dc779aSAndroid Build Coastguard Worker   return no_lsb_bits;
737*15dc779aSAndroid Build Coastguard Worker }
738*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_apply_lsb_coding(ixheaace_bit_buf_handle pstr_bit_buf,WORD32 * in_data_lsb,UWORD8 num_lsb,WORD32 num_val)739*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_apply_lsb_coding(ixheaace_bit_buf_handle pstr_bit_buf,
740*15dc779aSAndroid Build Coastguard Worker                                               WORD32 *in_data_lsb, UWORD8 num_lsb,
741*15dc779aSAndroid Build Coastguard Worker                                               WORD32 num_val) {
742*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0;
743*15dc779aSAndroid Build Coastguard Worker 
744*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_val; i++) {
745*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, in_data_lsb[i], num_lsb);
746*15dc779aSAndroid Build Coastguard Worker   }
747*15dc779aSAndroid Build Coastguard Worker }
748*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_calc_diff_freq(WORD32 * in_data,WORD32 * out_data,WORD32 num_val)749*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_calc_diff_freq(WORD32 *in_data, WORD32 *out_data, WORD32 num_val) {
750*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0;
751*15dc779aSAndroid Build Coastguard Worker 
752*15dc779aSAndroid Build Coastguard Worker   out_data[0] = in_data[0];
753*15dc779aSAndroid Build Coastguard Worker 
754*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < num_val; i++) {
755*15dc779aSAndroid Build Coastguard Worker     out_data[i] = in_data[i] - in_data[i - 1];
756*15dc779aSAndroid Build Coastguard Worker   }
757*15dc779aSAndroid Build Coastguard Worker }
758*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_calc_diff_time(WORD32 * in_data,WORD32 * prev_data,WORD32 * out_data,WORD32 direction,WORD32 num_val)759*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_calc_diff_time(WORD32 *in_data, WORD32 *prev_data, WORD32 *out_data,
760*15dc779aSAndroid Build Coastguard Worker                                             WORD32 direction, WORD32 num_val) {
761*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0;
762*15dc779aSAndroid Build Coastguard Worker 
763*15dc779aSAndroid Build Coastguard Worker   out_data[-1] = (direction == IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS) ? in_data[0] : prev_data[0];
764*15dc779aSAndroid Build Coastguard Worker 
765*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_val; i++) {
766*15dc779aSAndroid Build Coastguard Worker     out_data[i] = in_data[i] - prev_data[i];
767*15dc779aSAndroid Build Coastguard Worker   }
768*15dc779aSAndroid Build Coastguard Worker }
769*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_calc_pcm_bits(WORD32 num_val,WORD32 n_levels)770*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_515_calc_pcm_bits(WORD32 num_val, WORD32 n_levels) {
771*15dc779aSAndroid Build Coastguard Worker   WORD32 num_complete_chunks = 0, rest_chunk_size = 0;
772*15dc779aSAndroid Build Coastguard Worker   WORD32 max_grp_len = 0, bits_pcm = 0;
773*15dc779aSAndroid Build Coastguard Worker 
774*15dc779aSAndroid Build Coastguard Worker   FLOAT32 num_ld_levels = 0.f;
775*15dc779aSAndroid Build Coastguard Worker 
776*15dc779aSAndroid Build Coastguard Worker   switch (n_levels) {
777*15dc779aSAndroid Build Coastguard Worker     case 3:
778*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 5;
779*15dc779aSAndroid Build Coastguard Worker       break;
780*15dc779aSAndroid Build Coastguard Worker     case 7:
781*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 6;
782*15dc779aSAndroid Build Coastguard Worker       break;
783*15dc779aSAndroid Build Coastguard Worker     case 11:
784*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 2;
785*15dc779aSAndroid Build Coastguard Worker       break;
786*15dc779aSAndroid Build Coastguard Worker     case 13:
787*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 4;
788*15dc779aSAndroid Build Coastguard Worker       break;
789*15dc779aSAndroid Build Coastguard Worker     case 19:
790*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 4;
791*15dc779aSAndroid Build Coastguard Worker       break;
792*15dc779aSAndroid Build Coastguard Worker     case 25:
793*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 3;
794*15dc779aSAndroid Build Coastguard Worker       break;
795*15dc779aSAndroid Build Coastguard Worker     case 51:
796*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 4;
797*15dc779aSAndroid Build Coastguard Worker       break;
798*15dc779aSAndroid Build Coastguard Worker 
799*15dc779aSAndroid Build Coastguard Worker     case 4:
800*15dc779aSAndroid Build Coastguard Worker     case 8:
801*15dc779aSAndroid Build Coastguard Worker     case 15:
802*15dc779aSAndroid Build Coastguard Worker     case 26:
803*15dc779aSAndroid Build Coastguard Worker     case 31:
804*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 1;
805*15dc779aSAndroid Build Coastguard Worker       break;
806*15dc779aSAndroid Build Coastguard Worker     default:
807*15dc779aSAndroid Build Coastguard Worker       return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_LEVELS;
808*15dc779aSAndroid Build Coastguard Worker   }
809*15dc779aSAndroid Build Coastguard Worker 
810*15dc779aSAndroid Build Coastguard Worker   num_ld_levels = (FLOAT32)(log((FLOAT32)n_levels) / log(2.f));
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker   num_complete_chunks = num_val / max_grp_len;
813*15dc779aSAndroid Build Coastguard Worker   rest_chunk_size = num_val % max_grp_len;
814*15dc779aSAndroid Build Coastguard Worker 
815*15dc779aSAndroid Build Coastguard Worker   bits_pcm = ((WORD32)ceil((FLOAT32)(max_grp_len)*num_ld_levels)) * num_complete_chunks;
816*15dc779aSAndroid Build Coastguard Worker   bits_pcm += (WORD32)ceil((FLOAT32)(rest_chunk_size)*num_ld_levels);
817*15dc779aSAndroid Build Coastguard Worker 
818*15dc779aSAndroid Build Coastguard Worker   return bits_pcm;
819*15dc779aSAndroid Build Coastguard Worker }
820*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_apply_pcm_coding(ixheaace_bit_buf_handle pstr_bit_buf,WORD32 * in_data_1,WORD32 * in_data_2,WORD32 offset,WORD32 num_val,WORD32 n_levels)821*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_apply_pcm_coding(ixheaace_bit_buf_handle pstr_bit_buf,
822*15dc779aSAndroid Build Coastguard Worker                                               WORD32 *in_data_1, WORD32 *in_data_2, WORD32 offset,
823*15dc779aSAndroid Build Coastguard Worker                                               WORD32 num_val, WORD32 n_levels) {
824*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, j = 0, idx = 0;
825*15dc779aSAndroid Build Coastguard Worker   WORD32 max_grp_len = 1, grp_len = 0, next_val = 0, grp_val = 0;
826*15dc779aSAndroid Build Coastguard Worker 
827*15dc779aSAndroid Build Coastguard Worker   FLOAT32 num_ld_levels = 0.f;
828*15dc779aSAndroid Build Coastguard Worker 
829*15dc779aSAndroid Build Coastguard Worker   UWORD8 pcm_block_size[7] = {0};
830*15dc779aSAndroid Build Coastguard Worker   switch (n_levels) {
831*15dc779aSAndroid Build Coastguard Worker     case 4:
832*15dc779aSAndroid Build Coastguard Worker       num_ld_levels = 2.00000000f;
833*15dc779aSAndroid Build Coastguard Worker       break;
834*15dc779aSAndroid Build Coastguard Worker     case 8:
835*15dc779aSAndroid Build Coastguard Worker       num_ld_levels = 3.00000000f;
836*15dc779aSAndroid Build Coastguard Worker       break;
837*15dc779aSAndroid Build Coastguard Worker     case 15:
838*15dc779aSAndroid Build Coastguard Worker       num_ld_levels = 3.90689060f;
839*15dc779aSAndroid Build Coastguard Worker       break;
840*15dc779aSAndroid Build Coastguard Worker     case 26:
841*15dc779aSAndroid Build Coastguard Worker       num_ld_levels = 4.70043972f;
842*15dc779aSAndroid Build Coastguard Worker       break;
843*15dc779aSAndroid Build Coastguard Worker     case 31:
844*15dc779aSAndroid Build Coastguard Worker       num_ld_levels = 4.95419645f;
845*15dc779aSAndroid Build Coastguard Worker       break;
846*15dc779aSAndroid Build Coastguard Worker     case 51:
847*15dc779aSAndroid Build Coastguard Worker       max_grp_len = 4;
848*15dc779aSAndroid Build Coastguard Worker       num_ld_levels = 5.67242534f;
849*15dc779aSAndroid Build Coastguard Worker       break;
850*15dc779aSAndroid Build Coastguard Worker   }
851*15dc779aSAndroid Build Coastguard Worker 
852*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i <= max_grp_len; i++) {
853*15dc779aSAndroid Build Coastguard Worker     pcm_block_size[i] = (UWORD8)ceil((FLOAT32)(i)*num_ld_levels);
854*15dc779aSAndroid Build Coastguard Worker   }
855*15dc779aSAndroid Build Coastguard Worker 
856*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_val; i += max_grp_len) {
857*15dc779aSAndroid Build Coastguard Worker     grp_len = MIN(max_grp_len, num_val - i);
858*15dc779aSAndroid Build Coastguard Worker     grp_val = 0;
859*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < grp_len; j++) {
860*15dc779aSAndroid Build Coastguard Worker       idx = i + j;
861*15dc779aSAndroid Build Coastguard Worker       next_val = (in_data_2 == NULL)
862*15dc779aSAndroid Build Coastguard Worker                      ? in_data_1[idx]
863*15dc779aSAndroid Build Coastguard Worker                      : (in_data_1 == NULL)
864*15dc779aSAndroid Build Coastguard Worker                            ? in_data_2[idx]
865*15dc779aSAndroid Build Coastguard Worker                            : ((idx & 01) ? in_data_2[idx >> 1] : in_data_1[idx >> 1]);
866*15dc779aSAndroid Build Coastguard Worker       grp_val = grp_val * n_levels + next_val + offset;
867*15dc779aSAndroid Build Coastguard Worker     }
868*15dc779aSAndroid Build Coastguard Worker 
869*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, grp_val, pcm_block_size[grp_len]);
870*15dc779aSAndroid Build Coastguard Worker   }
871*15dc779aSAndroid Build Coastguard Worker }
872*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_count_huff_cld(const ixheaace_mps_sac_huff_cld_tab * pstr_huff_cld_tab_pt0,const ixheaace_mps_sac_huff_cld_tab * pstr_huff_cld_tab_diff,WORD32 * in_data,WORD32 num_val,WORD32 p0_flag)873*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_515_count_huff_cld(
874*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_pt0,
875*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_diff, WORD32 *in_data, WORD32 num_val,
876*15dc779aSAndroid Build Coastguard Worker     WORD32 p0_flag) {
877*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, id = 0;
878*15dc779aSAndroid Build Coastguard Worker   WORD32 huff_bits = 0;
879*15dc779aSAndroid Build Coastguard Worker   WORD32 offset = 0;
880*15dc779aSAndroid Build Coastguard Worker   if (p0_flag) {
881*15dc779aSAndroid Build Coastguard Worker     huff_bits += pstr_huff_cld_tab_pt0->length[in_data[0]];
882*15dc779aSAndroid Build Coastguard Worker     offset = 1;
883*15dc779aSAndroid Build Coastguard Worker   }
884*15dc779aSAndroid Build Coastguard Worker 
885*15dc779aSAndroid Build Coastguard Worker   for (i = offset; i < num_val; i++) {
886*15dc779aSAndroid Build Coastguard Worker     id = in_data[i];
887*15dc779aSAndroid Build Coastguard Worker 
888*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
889*15dc779aSAndroid Build Coastguard Worker       if (id < 0) {
890*15dc779aSAndroid Build Coastguard Worker         id = -id;
891*15dc779aSAndroid Build Coastguard Worker       }
892*15dc779aSAndroid Build Coastguard Worker       huff_bits += 1;
893*15dc779aSAndroid Build Coastguard Worker     }
894*15dc779aSAndroid Build Coastguard Worker 
895*15dc779aSAndroid Build Coastguard Worker     huff_bits += pstr_huff_cld_tab_diff->length[id];
896*15dc779aSAndroid Build Coastguard Worker   }
897*15dc779aSAndroid Build Coastguard Worker 
898*15dc779aSAndroid Build Coastguard Worker   return huff_bits;
899*15dc779aSAndroid Build Coastguard Worker }
900*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_count_huff_icc(const ixheaace_mps_sac_huff_icc_tab * pstr_huff_icc_tab_pt0,const ixheaace_mps_sac_huff_icc_tab * pstr_huff_icc_tab_diff,WORD32 * in_data,WORD32 num_val,WORD32 p0_flag)901*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_515_count_huff_icc(
902*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_pt0,
903*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_diff, WORD32 *in_data, WORD32 num_val,
904*15dc779aSAndroid Build Coastguard Worker     WORD32 p0_flag) {
905*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, id = 0;
906*15dc779aSAndroid Build Coastguard Worker   WORD32 huff_bits = 0;
907*15dc779aSAndroid Build Coastguard Worker   WORD32 offset = 0;
908*15dc779aSAndroid Build Coastguard Worker 
909*15dc779aSAndroid Build Coastguard Worker   if (p0_flag) {
910*15dc779aSAndroid Build Coastguard Worker     huff_bits += pstr_huff_icc_tab_pt0->length[in_data[0]];
911*15dc779aSAndroid Build Coastguard Worker     offset = 1;
912*15dc779aSAndroid Build Coastguard Worker   }
913*15dc779aSAndroid Build Coastguard Worker 
914*15dc779aSAndroid Build Coastguard Worker   for (i = offset; i < num_val; i++) {
915*15dc779aSAndroid Build Coastguard Worker     id = in_data[i];
916*15dc779aSAndroid Build Coastguard Worker 
917*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
918*15dc779aSAndroid Build Coastguard Worker       if (id < 0) {
919*15dc779aSAndroid Build Coastguard Worker         id = -id;
920*15dc779aSAndroid Build Coastguard Worker       }
921*15dc779aSAndroid Build Coastguard Worker       huff_bits += 1;
922*15dc779aSAndroid Build Coastguard Worker     }
923*15dc779aSAndroid Build Coastguard Worker 
924*15dc779aSAndroid Build Coastguard Worker     huff_bits += pstr_huff_icc_tab_diff->length[id];
925*15dc779aSAndroid Build Coastguard Worker   }
926*15dc779aSAndroid Build Coastguard Worker 
927*15dc779aSAndroid Build Coastguard Worker   return huff_bits;
928*15dc779aSAndroid Build Coastguard Worker }
929*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_count_huff_cpc(const ixheaace_mps_sac_huff_cpc_tab * pstr_huff_cpc_tab_pt0,const ixheaace_mps_sac_huff_cpc_tab * pstr_huff_cpc_tab_diff,WORD32 * in_data,WORD32 num_val,WORD32 p0_flag)930*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_515_count_huff_cpc(
931*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_pt0,
932*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_diff, WORD32 *in_data, WORD32 num_val,
933*15dc779aSAndroid Build Coastguard Worker     WORD32 p0_flag) {
934*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, id = 0;
935*15dc779aSAndroid Build Coastguard Worker   WORD32 huff_bits = 0;
936*15dc779aSAndroid Build Coastguard Worker   WORD32 offset = 0;
937*15dc779aSAndroid Build Coastguard Worker 
938*15dc779aSAndroid Build Coastguard Worker   if (p0_flag) {
939*15dc779aSAndroid Build Coastguard Worker     huff_bits += pstr_huff_cpc_tab_pt0->length[in_data[0]];
940*15dc779aSAndroid Build Coastguard Worker     offset = 1;
941*15dc779aSAndroid Build Coastguard Worker   }
942*15dc779aSAndroid Build Coastguard Worker 
943*15dc779aSAndroid Build Coastguard Worker   for (i = offset; i < num_val; i++) {
944*15dc779aSAndroid Build Coastguard Worker     id = in_data[i];
945*15dc779aSAndroid Build Coastguard Worker 
946*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
947*15dc779aSAndroid Build Coastguard Worker       if (id < 0) {
948*15dc779aSAndroid Build Coastguard Worker         id = -id;
949*15dc779aSAndroid Build Coastguard Worker       }
950*15dc779aSAndroid Build Coastguard Worker       huff_bits += 1;
951*15dc779aSAndroid Build Coastguard Worker     }
952*15dc779aSAndroid Build Coastguard Worker 
953*15dc779aSAndroid Build Coastguard Worker     huff_bits += pstr_huff_cpc_tab_diff->length[id];
954*15dc779aSAndroid Build Coastguard Worker   }
955*15dc779aSAndroid Build Coastguard Worker 
956*15dc779aSAndroid Build Coastguard Worker   return huff_bits;
957*15dc779aSAndroid Build Coastguard Worker }
958*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_huff_enc_cld(ixheaace_bit_buf_handle pstr_bit_buf,const ixheaace_mps_sac_huff_cld_tab * pstr_huff_cld_tab_pt0,const ixheaace_mps_sac_huff_cld_tab * pstr_huff_cld_tab_diff,WORD32 * in_data,WORD32 num_val,WORD32 p0_flag)959*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_huff_enc_cld(
960*15dc779aSAndroid Build Coastguard Worker     ixheaace_bit_buf_handle pstr_bit_buf,
961*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_pt0,
962*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_diff, WORD32 *in_data, WORD32 num_val,
963*15dc779aSAndroid Build Coastguard Worker     WORD32 p0_flag) {
964*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, id = 0, id_sign = 0;
965*15dc779aSAndroid Build Coastguard Worker   WORD32 offset = 0;
966*15dc779aSAndroid Build Coastguard Worker 
967*15dc779aSAndroid Build Coastguard Worker   if (p0_flag) {
968*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, pstr_huff_cld_tab_pt0->value[in_data[0]],
969*15dc779aSAndroid Build Coastguard Worker                         pstr_huff_cld_tab_pt0->length[in_data[0]]);
970*15dc779aSAndroid Build Coastguard Worker     offset = 1;
971*15dc779aSAndroid Build Coastguard Worker   }
972*15dc779aSAndroid Build Coastguard Worker 
973*15dc779aSAndroid Build Coastguard Worker   for (i = offset; i < num_val; i++) {
974*15dc779aSAndroid Build Coastguard Worker     id = in_data[i];
975*15dc779aSAndroid Build Coastguard Worker 
976*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
977*15dc779aSAndroid Build Coastguard Worker       id_sign = 0;
978*15dc779aSAndroid Build Coastguard Worker       if (id < 0) {
979*15dc779aSAndroid Build Coastguard Worker         id = -id;
980*15dc779aSAndroid Build Coastguard Worker         id_sign = 1;
981*15dc779aSAndroid Build Coastguard Worker       }
982*15dc779aSAndroid Build Coastguard Worker     }
983*15dc779aSAndroid Build Coastguard Worker 
984*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, pstr_huff_cld_tab_diff->value[id],
985*15dc779aSAndroid Build Coastguard Worker                         pstr_huff_cld_tab_diff->length[id]);
986*15dc779aSAndroid Build Coastguard Worker 
987*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
988*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
989*15dc779aSAndroid Build Coastguard Worker     }
990*15dc779aSAndroid Build Coastguard Worker   }
991*15dc779aSAndroid Build Coastguard Worker }
992*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_huff_enc_icc(ixheaace_bit_buf_handle pstr_bit_buf,const ixheaace_mps_sac_huff_icc_tab * pstr_huff_icc_tab_pt0,const ixheaace_mps_sac_huff_icc_tab * pstr_huff_icc_tab_diff,WORD32 * in_data,WORD32 num_val,WORD32 p0_flag)993*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_huff_enc_icc(
994*15dc779aSAndroid Build Coastguard Worker     ixheaace_bit_buf_handle pstr_bit_buf,
995*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_pt0,
996*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_diff, WORD32 *in_data, WORD32 num_val,
997*15dc779aSAndroid Build Coastguard Worker     WORD32 p0_flag) {
998*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, id = 0, id_sign = 0;
999*15dc779aSAndroid Build Coastguard Worker   WORD32 offset = 0;
1000*15dc779aSAndroid Build Coastguard Worker 
1001*15dc779aSAndroid Build Coastguard Worker   if (p0_flag) {
1002*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, pstr_huff_icc_tab_pt0->value[in_data[0]],
1003*15dc779aSAndroid Build Coastguard Worker                         pstr_huff_icc_tab_pt0->length[in_data[0]]);
1004*15dc779aSAndroid Build Coastguard Worker     offset = 1;
1005*15dc779aSAndroid Build Coastguard Worker   }
1006*15dc779aSAndroid Build Coastguard Worker 
1007*15dc779aSAndroid Build Coastguard Worker   for (i = offset; i < num_val; i++) {
1008*15dc779aSAndroid Build Coastguard Worker     id = in_data[i];
1009*15dc779aSAndroid Build Coastguard Worker 
1010*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
1011*15dc779aSAndroid Build Coastguard Worker       id_sign = 0;
1012*15dc779aSAndroid Build Coastguard Worker       if (id < 0) {
1013*15dc779aSAndroid Build Coastguard Worker         id = -id;
1014*15dc779aSAndroid Build Coastguard Worker         id_sign = 1;
1015*15dc779aSAndroid Build Coastguard Worker       }
1016*15dc779aSAndroid Build Coastguard Worker     }
1017*15dc779aSAndroid Build Coastguard Worker 
1018*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, pstr_huff_icc_tab_diff->value[id],
1019*15dc779aSAndroid Build Coastguard Worker                         pstr_huff_icc_tab_diff->length[id]);
1020*15dc779aSAndroid Build Coastguard Worker 
1021*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
1022*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
1023*15dc779aSAndroid Build Coastguard Worker     }
1024*15dc779aSAndroid Build Coastguard Worker   }
1025*15dc779aSAndroid Build Coastguard Worker }
1026*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_huff_enc_cpc(ixheaace_bit_buf_handle pstr_bit_buf,const ixheaace_mps_sac_huff_cpc_tab * pstr_huff_cpc_tab_pt0,const ixheaace_mps_sac_huff_cpc_tab * pstr_huff_cpc_tab_diff,WORD32 * in_data,WORD32 num_val,WORD32 p0_flag)1027*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_huff_enc_cpc(
1028*15dc779aSAndroid Build Coastguard Worker     ixheaace_bit_buf_handle pstr_bit_buf,
1029*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_pt0,
1030*15dc779aSAndroid Build Coastguard Worker     const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_diff, WORD32 *in_data, WORD32 num_val,
1031*15dc779aSAndroid Build Coastguard Worker     WORD32 p0_flag) {
1032*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0, id = 0, id_sign = 0;
1033*15dc779aSAndroid Build Coastguard Worker   WORD32 offset = 0;
1034*15dc779aSAndroid Build Coastguard Worker 
1035*15dc779aSAndroid Build Coastguard Worker   if (p0_flag) {
1036*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, pstr_huff_cpc_tab_pt0->value[in_data[0]],
1037*15dc779aSAndroid Build Coastguard Worker                         pstr_huff_cpc_tab_pt0->length[in_data[0]]);
1038*15dc779aSAndroid Build Coastguard Worker     offset = 1;
1039*15dc779aSAndroid Build Coastguard Worker   }
1040*15dc779aSAndroid Build Coastguard Worker 
1041*15dc779aSAndroid Build Coastguard Worker   for (i = offset; i < num_val; i++) {
1042*15dc779aSAndroid Build Coastguard Worker     id = in_data[i];
1043*15dc779aSAndroid Build Coastguard Worker 
1044*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
1045*15dc779aSAndroid Build Coastguard Worker       id_sign = 0;
1046*15dc779aSAndroid Build Coastguard Worker       if (id < 0) {
1047*15dc779aSAndroid Build Coastguard Worker         id = -id;
1048*15dc779aSAndroid Build Coastguard Worker         id_sign = 1;
1049*15dc779aSAndroid Build Coastguard Worker       }
1050*15dc779aSAndroid Build Coastguard Worker     }
1051*15dc779aSAndroid Build Coastguard Worker 
1052*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(pstr_bit_buf, pstr_huff_cpc_tab_diff->value[id],
1053*15dc779aSAndroid Build Coastguard Worker                         pstr_huff_cpc_tab_diff->length[id]);
1054*15dc779aSAndroid Build Coastguard Worker 
1055*15dc779aSAndroid Build Coastguard Worker     if (id != 0) {
1056*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
1057*15dc779aSAndroid Build Coastguard Worker     }
1058*15dc779aSAndroid Build Coastguard Worker   }
1059*15dc779aSAndroid Build Coastguard Worker }
1060*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_calc_huff_bits(WORD32 * in_data_1,WORD32 * in_data_2,WORD32 data_type,WORD32 diff_type_1,WORD32 diff_type_2,WORD32 num_val)1061*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_515_calc_huff_bits(WORD32 *in_data_1, WORD32 *in_data_2,
1062*15dc779aSAndroid Build Coastguard Worker                                               WORD32 data_type, WORD32 diff_type_1,
1063*15dc779aSAndroid Build Coastguard Worker                                               WORD32 diff_type_2, WORD32 num_val) {
1064*15dc779aSAndroid Build Coastguard Worker   WORD32 p0_flag[2];
1065*15dc779aSAndroid Build Coastguard Worker 
1066*15dc779aSAndroid Build Coastguard Worker   WORD32 offset_1 = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
1067*15dc779aSAndroid Build Coastguard Worker   WORD32 offset_2 = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
1068*15dc779aSAndroid Build Coastguard Worker 
1069*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_count_huff = 0;
1070*15dc779aSAndroid Build Coastguard Worker 
1071*15dc779aSAndroid Build Coastguard Worker   WORD32 num_val_1_int = 0;
1072*15dc779aSAndroid Build Coastguard Worker   WORD32 num_val_2_int = 0;
1073*15dc779aSAndroid Build Coastguard Worker 
1074*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_data_1_int = in_data_1 + offset_1;
1075*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_data_2_int = in_data_2 + offset_2;
1076*15dc779aSAndroid Build Coastguard Worker 
1077*15dc779aSAndroid Build Coastguard Worker   bit_count_huff = 1;
1078*15dc779aSAndroid Build Coastguard Worker 
1079*15dc779aSAndroid Build Coastguard Worker   num_val_1_int = num_val;
1080*15dc779aSAndroid Build Coastguard Worker   num_val_2_int = num_val;
1081*15dc779aSAndroid Build Coastguard Worker 
1082*15dc779aSAndroid Build Coastguard Worker   p0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1083*15dc779aSAndroid Build Coastguard Worker   p0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1084*15dc779aSAndroid Build Coastguard Worker 
1085*15dc779aSAndroid Build Coastguard Worker   switch (data_type) {
1086*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1087*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL)
1088*15dc779aSAndroid Build Coastguard Worker         bit_count_huff +=
1089*15dc779aSAndroid Build Coastguard Worker             ixheaace_mps_515_count_huff_cld(&ixheaace_mps_515_huff_cld_tab.huff_pt0,
1090*15dc779aSAndroid Build Coastguard Worker                                             &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_1],
1091*15dc779aSAndroid Build Coastguard Worker                                             in_data_1_int, num_val_1_int, p0_flag[0]);
1092*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL)
1093*15dc779aSAndroid Build Coastguard Worker         bit_count_huff +=
1094*15dc779aSAndroid Build Coastguard Worker             ixheaace_mps_515_count_huff_cld(&ixheaace_mps_515_huff_cld_tab.huff_pt0,
1095*15dc779aSAndroid Build Coastguard Worker                                             &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_2],
1096*15dc779aSAndroid Build Coastguard Worker                                             in_data_2_int, num_val_2_int, p0_flag[1]);
1097*15dc779aSAndroid Build Coastguard Worker       break;
1098*15dc779aSAndroid Build Coastguard Worker 
1099*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1100*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL)
1101*15dc779aSAndroid Build Coastguard Worker         bit_count_huff +=
1102*15dc779aSAndroid Build Coastguard Worker             ixheaace_mps_515_count_huff_icc(&ixheaace_mps_515_huff_icc_tab.huff_pt0,
1103*15dc779aSAndroid Build Coastguard Worker                                             &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_1],
1104*15dc779aSAndroid Build Coastguard Worker                                             in_data_1_int, num_val_1_int, p0_flag[0]);
1105*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL)
1106*15dc779aSAndroid Build Coastguard Worker         bit_count_huff +=
1107*15dc779aSAndroid Build Coastguard Worker             ixheaace_mps_515_count_huff_icc(&ixheaace_mps_515_huff_icc_tab.huff_pt0,
1108*15dc779aSAndroid Build Coastguard Worker                                             &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_2],
1109*15dc779aSAndroid Build Coastguard Worker                                             in_data_2_int, num_val_2_int, p0_flag[1]);
1110*15dc779aSAndroid Build Coastguard Worker       break;
1111*15dc779aSAndroid Build Coastguard Worker 
1112*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_CPC:
1113*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL)
1114*15dc779aSAndroid Build Coastguard Worker         bit_count_huff +=
1115*15dc779aSAndroid Build Coastguard Worker             ixheaace_mps_515_count_huff_cpc(&ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1116*15dc779aSAndroid Build Coastguard Worker                                             &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_1],
1117*15dc779aSAndroid Build Coastguard Worker                                             in_data_1_int, num_val_1_int, p0_flag[0]);
1118*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL)
1119*15dc779aSAndroid Build Coastguard Worker         bit_count_huff +=
1120*15dc779aSAndroid Build Coastguard Worker             ixheaace_mps_515_count_huff_cpc(&ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1121*15dc779aSAndroid Build Coastguard Worker                                             &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_2],
1122*15dc779aSAndroid Build Coastguard Worker                                             in_data_2_int, num_val_2_int, p0_flag[1]);
1123*15dc779aSAndroid Build Coastguard Worker       break;
1124*15dc779aSAndroid Build Coastguard Worker 
1125*15dc779aSAndroid Build Coastguard Worker     default:
1126*15dc779aSAndroid Build Coastguard Worker       break;
1127*15dc779aSAndroid Build Coastguard Worker   }
1128*15dc779aSAndroid Build Coastguard Worker 
1129*15dc779aSAndroid Build Coastguard Worker   return bit_count_huff;
1130*15dc779aSAndroid Build Coastguard Worker }
1131*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_apply_huff_coding(ixheaace_bit_buf_handle pstr_bit_buf,WORD32 * in_data_1,WORD32 * in_data_2,WORD32 data_type,WORD32 diff_type_1,WORD32 diff_type_2,WORD32 num_val)1132*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_515_apply_huff_coding(ixheaace_bit_buf_handle pstr_bit_buf,
1133*15dc779aSAndroid Build Coastguard Worker                                                WORD32 *in_data_1, WORD32 *in_data_2,
1134*15dc779aSAndroid Build Coastguard Worker                                                WORD32 data_type, WORD32 diff_type_1,
1135*15dc779aSAndroid Build Coastguard Worker                                                WORD32 diff_type_2, WORD32 num_val) {
1136*15dc779aSAndroid Build Coastguard Worker   WORD32 p0_flag[2];
1137*15dc779aSAndroid Build Coastguard Worker 
1138*15dc779aSAndroid Build Coastguard Worker   WORD32 num_val_1_int = num_val;
1139*15dc779aSAndroid Build Coastguard Worker   WORD32 num_val_2_int = num_val;
1140*15dc779aSAndroid Build Coastguard Worker 
1141*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_data_1_int = in_data_1;
1142*15dc779aSAndroid Build Coastguard Worker   WORD32 *in_data_2_int = in_data_2;
1143*15dc779aSAndroid Build Coastguard Worker 
1144*15dc779aSAndroid Build Coastguard Worker   if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) in_data_1_int += 1;
1145*15dc779aSAndroid Build Coastguard Worker   if (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) in_data_2_int += 1;
1146*15dc779aSAndroid Build Coastguard Worker 
1147*15dc779aSAndroid Build Coastguard Worker   ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_HUFF_1D, 1);
1148*15dc779aSAndroid Build Coastguard Worker 
1149*15dc779aSAndroid Build Coastguard Worker   p0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1150*15dc779aSAndroid Build Coastguard Worker   p0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1151*15dc779aSAndroid Build Coastguard Worker 
1152*15dc779aSAndroid Build Coastguard Worker   switch (data_type) {
1153*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1154*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL)
1155*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_huff_enc_cld(pstr_bit_buf, &ixheaace_mps_515_huff_cld_tab.huff_pt0,
1156*15dc779aSAndroid Build Coastguard Worker                                       &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_1],
1157*15dc779aSAndroid Build Coastguard Worker                                       in_data_1_int, num_val_1_int, p0_flag[0]);
1158*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL)
1159*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_huff_enc_cld(pstr_bit_buf, &ixheaace_mps_515_huff_cld_tab.huff_pt0,
1160*15dc779aSAndroid Build Coastguard Worker                                       &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_2],
1161*15dc779aSAndroid Build Coastguard Worker                                       in_data_2_int, num_val_2_int, p0_flag[1]);
1162*15dc779aSAndroid Build Coastguard Worker       break;
1163*15dc779aSAndroid Build Coastguard Worker 
1164*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1165*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL)
1166*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_huff_enc_icc(pstr_bit_buf, &ixheaace_mps_515_huff_icc_tab.huff_pt0,
1167*15dc779aSAndroid Build Coastguard Worker                                       &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_1],
1168*15dc779aSAndroid Build Coastguard Worker                                       in_data_1_int, num_val_1_int, p0_flag[0]);
1169*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL)
1170*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_huff_enc_icc(pstr_bit_buf, &ixheaace_mps_515_huff_icc_tab.huff_pt0,
1171*15dc779aSAndroid Build Coastguard Worker                                       &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_2],
1172*15dc779aSAndroid Build Coastguard Worker                                       in_data_2_int, num_val_2_int, p0_flag[1]);
1173*15dc779aSAndroid Build Coastguard Worker       break;
1174*15dc779aSAndroid Build Coastguard Worker 
1175*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_CPC:
1176*15dc779aSAndroid Build Coastguard Worker       if (in_data_1 != NULL)
1177*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_huff_enc_cpc(pstr_bit_buf, &ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1178*15dc779aSAndroid Build Coastguard Worker                                       &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_1],
1179*15dc779aSAndroid Build Coastguard Worker                                       in_data_1_int, num_val_1_int, p0_flag[0]);
1180*15dc779aSAndroid Build Coastguard Worker       if (in_data_2 != NULL)
1181*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_huff_enc_cpc(pstr_bit_buf, &ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1182*15dc779aSAndroid Build Coastguard Worker                                       &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_2],
1183*15dc779aSAndroid Build Coastguard Worker                                       in_data_2_int, num_val_2_int, p0_flag[1]);
1184*15dc779aSAndroid Build Coastguard Worker       break;
1185*15dc779aSAndroid Build Coastguard Worker 
1186*15dc779aSAndroid Build Coastguard Worker     default:
1187*15dc779aSAndroid Build Coastguard Worker       break;
1188*15dc779aSAndroid Build Coastguard Worker   }
1189*15dc779aSAndroid Build Coastguard Worker }
1190*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_ec_data_pair_enc(ixheaace_bit_buf_handle pstr_bit_buf,WORD16 pp_in_data[][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],WORD16 p_in_data[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],const WORD32 data_type,const WORD32 set_idx,const WORD32 start_band,const WORD16 data_bands,const WORD32 coarse_flag,const WORD32 independency_flag)1191*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_ec_data_pair_enc(
1192*15dc779aSAndroid Build Coastguard Worker     ixheaace_bit_buf_handle pstr_bit_buf, WORD16 pp_in_data[][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],
1193*15dc779aSAndroid Build Coastguard Worker     WORD16 p_in_data[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS], const WORD32 data_type,
1194*15dc779aSAndroid Build Coastguard Worker     const WORD32 set_idx, const WORD32 start_band, const WORD16 data_bands,
1195*15dc779aSAndroid Build Coastguard Worker     const WORD32 coarse_flag, const WORD32 independency_flag) {
1196*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error;
1197*15dc779aSAndroid Build Coastguard Worker   WORD16 band = 0;
1198*15dc779aSAndroid Build Coastguard Worker   WORD16 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1199*15dc779aSAndroid Build Coastguard Worker   WORD16 pcm_coding_flag = 0;
1200*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_all = 0;
1201*15dc779aSAndroid Build Coastguard Worker   WORD16 min_found = 0;
1202*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_dim_df_df = 0;
1203*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_pair_type_df_df = 0;
1204*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_dim_df_dt = 0;
1205*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_pair_type_df_dt = 0;
1206*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_dim_dtbw_df = 0;
1207*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_pair_type_dtbw_df = 0;
1208*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_dim_dt_dt = 0;
1209*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_pair_type_dt_dt = 0;
1210*15dc779aSAndroid Build Coastguard Worker   WORD16 num_pcm_bits = -1;
1211*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_df_df = -1;
1212*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_df_dt = -1;
1213*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_dtbw_df = -1;
1214*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_dt_dt = -1;
1215*15dc779aSAndroid Build Coastguard Worker   WORD16 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1216*15dc779aSAndroid Build Coastguard Worker 
1217*15dc779aSAndroid Build Coastguard Worker   WORD16 quant_data_msb[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {{0}};
1218*15dc779aSAndroid Build Coastguard Worker   WORD16 quant_data_hist_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1219*15dc779aSAndroid Build Coastguard Worker   WORD16 data_diff_freq[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {{0}};
1220*15dc779aSAndroid Build Coastguard Worker   WORD16 data_diff_time[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS + 2];
1221*15dc779aSAndroid Build Coastguard Worker   WORD16 lav_df_df[2] = {-1, -1};
1222*15dc779aSAndroid Build Coastguard Worker   WORD16 lav_df_dt[2] = {-1, -1};
1223*15dc779aSAndroid Build Coastguard Worker   WORD16 lav_dtbw_df[2] = {-1, -1};
1224*15dc779aSAndroid Build Coastguard Worker   WORD16 lav_dt_dt[2] = {-1, -1};
1225*15dc779aSAndroid Build Coastguard Worker   WORD16 *p_quant_data_msb[2] = {NULL, NULL};
1226*15dc779aSAndroid Build Coastguard Worker   WORD16 *p_quant_data_hist_msb = NULL;
1227*15dc779aSAndroid Build Coastguard Worker 
1228*15dc779aSAndroid Build Coastguard Worker   if (data_bands <= 0) {
1229*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_EXE_NONFATAL_MPS_INVALID_DATA_BANDS;
1230*15dc779aSAndroid Build Coastguard Worker   }
1231*15dc779aSAndroid Build Coastguard Worker 
1232*15dc779aSAndroid Build Coastguard Worker   if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
1233*15dc779aSAndroid Build Coastguard Worker     if (coarse_flag) {
1234*15dc779aSAndroid Build Coastguard Worker       quant_levels = 4;
1235*15dc779aSAndroid Build Coastguard Worker       quant_offset = 0;
1236*15dc779aSAndroid Build Coastguard Worker     } else {
1237*15dc779aSAndroid Build Coastguard Worker       quant_levels = 8;
1238*15dc779aSAndroid Build Coastguard Worker       quant_offset = 0;
1239*15dc779aSAndroid Build Coastguard Worker     }
1240*15dc779aSAndroid Build Coastguard Worker   } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
1241*15dc779aSAndroid Build Coastguard Worker     if (coarse_flag) {
1242*15dc779aSAndroid Build Coastguard Worker       quant_levels = 15;
1243*15dc779aSAndroid Build Coastguard Worker       quant_offset = 7;
1244*15dc779aSAndroid Build Coastguard Worker     } else {
1245*15dc779aSAndroid Build Coastguard Worker       quant_levels = 31;
1246*15dc779aSAndroid Build Coastguard Worker       quant_offset = 15;
1247*15dc779aSAndroid Build Coastguard Worker     }
1248*15dc779aSAndroid Build Coastguard Worker   } else {
1249*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
1250*15dc779aSAndroid Build Coastguard Worker   }
1251*15dc779aSAndroid Build Coastguard Worker   if (quant_offset != 0) {
1252*15dc779aSAndroid Build Coastguard Worker     for (band = 0; band < data_bands; band++) {
1253*15dc779aSAndroid Build Coastguard Worker       quant_data_msb[0][band] = pp_in_data[set_idx][start_band + band] + quant_offset;
1254*15dc779aSAndroid Build Coastguard Worker       quant_data_msb[1][band] = pp_in_data[set_idx + 1][start_band + band] + quant_offset;
1255*15dc779aSAndroid Build Coastguard Worker     }
1256*15dc779aSAndroid Build Coastguard Worker     p_quant_data_msb[0] = quant_data_msb[0];
1257*15dc779aSAndroid Build Coastguard Worker     p_quant_data_msb[1] = quant_data_msb[1];
1258*15dc779aSAndroid Build Coastguard Worker   } else {
1259*15dc779aSAndroid Build Coastguard Worker     p_quant_data_msb[0] = pp_in_data[set_idx] + start_band;
1260*15dc779aSAndroid Build Coastguard Worker     p_quant_data_msb[1] = pp_in_data[set_idx + 1] + start_band;
1261*15dc779aSAndroid Build Coastguard Worker   }
1262*15dc779aSAndroid Build Coastguard Worker 
1263*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1264*15dc779aSAndroid Build Coastguard Worker     if (quant_offset != 0) {
1265*15dc779aSAndroid Build Coastguard Worker       for (band = 0; band < data_bands; band++) {
1266*15dc779aSAndroid Build Coastguard Worker         quant_data_hist_msb[band] = p_in_data[start_band + band] + quant_offset;
1267*15dc779aSAndroid Build Coastguard Worker       }
1268*15dc779aSAndroid Build Coastguard Worker       p_quant_data_hist_msb = quant_data_hist_msb;
1269*15dc779aSAndroid Build Coastguard Worker     } else {
1270*15dc779aSAndroid Build Coastguard Worker       p_quant_data_hist_msb = p_in_data + start_band;
1271*15dc779aSAndroid Build Coastguard Worker     }
1272*15dc779aSAndroid Build Coastguard Worker   }
1273*15dc779aSAndroid Build Coastguard Worker 
1274*15dc779aSAndroid Build Coastguard Worker   data_diff_freq[0][0] = p_quant_data_msb[0][0];
1275*15dc779aSAndroid Build Coastguard Worker   data_diff_freq[1][0] = p_quant_data_msb[1][0];
1276*15dc779aSAndroid Build Coastguard Worker 
1277*15dc779aSAndroid Build Coastguard Worker   for (band = 1; band < data_bands; band++) {
1278*15dc779aSAndroid Build Coastguard Worker     data_diff_freq[0][band] = p_quant_data_msb[0][band] - p_quant_data_msb[0][band - 1];
1279*15dc779aSAndroid Build Coastguard Worker     data_diff_freq[1][band] = p_quant_data_msb[1][band] - p_quant_data_msb[1][band - 1];
1280*15dc779aSAndroid Build Coastguard Worker   }
1281*15dc779aSAndroid Build Coastguard Worker 
1282*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1283*15dc779aSAndroid Build Coastguard Worker     data_diff_time[0][0] = p_quant_data_msb[0][0];
1284*15dc779aSAndroid Build Coastguard Worker     data_diff_time[0][1] = p_quant_data_hist_msb[0];
1285*15dc779aSAndroid Build Coastguard Worker 
1286*15dc779aSAndroid Build Coastguard Worker     for (band = 0; band < data_bands; band++) {
1287*15dc779aSAndroid Build Coastguard Worker       data_diff_time[0][band + 2] = p_quant_data_msb[0][band] - p_quant_data_hist_msb[band];
1288*15dc779aSAndroid Build Coastguard Worker     }
1289*15dc779aSAndroid Build Coastguard Worker   }
1290*15dc779aSAndroid Build Coastguard Worker 
1291*15dc779aSAndroid Build Coastguard Worker   data_diff_time[1][0] = p_quant_data_msb[1][0];
1292*15dc779aSAndroid Build Coastguard Worker   data_diff_time[1][1] = p_quant_data_msb[0][0];
1293*15dc779aSAndroid Build Coastguard Worker 
1294*15dc779aSAndroid Build Coastguard Worker   for (band = 0; band < data_bands; band++) {
1295*15dc779aSAndroid Build Coastguard Worker     data_diff_time[1][band + 2] = p_quant_data_msb[1][band] - p_quant_data_msb[0][band];
1296*15dc779aSAndroid Build Coastguard Worker   }
1297*15dc779aSAndroid Build Coastguard Worker 
1298*15dc779aSAndroid Build Coastguard Worker   num_pcm_bits = ixheaace_mps_212_calc_pcm_bits((WORD16)(2 * data_bands), quant_levels);
1299*15dc779aSAndroid Build Coastguard Worker   num_pcm_val = (WORD16)(2 * data_bands);
1300*15dc779aSAndroid Build Coastguard Worker 
1301*15dc779aSAndroid Build Coastguard Worker   min_bits_all = num_pcm_bits;
1302*15dc779aSAndroid Build Coastguard Worker 
1303*15dc779aSAndroid Build Coastguard Worker   error = ixheaace_mps_212_calc_huff_bits(data_diff_freq[0], data_diff_freq[1], data_type,
1304*15dc779aSAndroid Build Coastguard Worker                                           IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_FREQ,
1305*15dc779aSAndroid Build Coastguard Worker                                           data_bands, lav_df_df, &min_bits_df_df, &huff_dim_df_df,
1306*15dc779aSAndroid Build Coastguard Worker                                           &huff_pair_type_df_df);
1307*15dc779aSAndroid Build Coastguard Worker   if (error) {
1308*15dc779aSAndroid Build Coastguard Worker     return error;
1309*15dc779aSAndroid Build Coastguard Worker   }
1310*15dc779aSAndroid Build Coastguard Worker 
1311*15dc779aSAndroid Build Coastguard Worker   min_bits_df_df += 2;
1312*15dc779aSAndroid Build Coastguard Worker 
1313*15dc779aSAndroid Build Coastguard Worker   if (min_bits_df_df < min_bits_all) {
1314*15dc779aSAndroid Build Coastguard Worker     min_bits_all = min_bits_df_df;
1315*15dc779aSAndroid Build Coastguard Worker   }
1316*15dc779aSAndroid Build Coastguard Worker   error = ixheaace_mps_212_calc_huff_bits(data_diff_freq[0], data_diff_time[1], data_type,
1317*15dc779aSAndroid Build Coastguard Worker                                           IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_TIME,
1318*15dc779aSAndroid Build Coastguard Worker                                           data_bands, lav_df_dt, &min_bits_df_dt, &huff_dim_df_dt,
1319*15dc779aSAndroid Build Coastguard Worker                                           &huff_pair_type_df_dt);
1320*15dc779aSAndroid Build Coastguard Worker   if (error) {
1321*15dc779aSAndroid Build Coastguard Worker     return error;
1322*15dc779aSAndroid Build Coastguard Worker   }
1323*15dc779aSAndroid Build Coastguard Worker 
1324*15dc779aSAndroid Build Coastguard Worker   min_bits_df_dt += 2;
1325*15dc779aSAndroid Build Coastguard Worker 
1326*15dc779aSAndroid Build Coastguard Worker   if (min_bits_df_dt < min_bits_all) {
1327*15dc779aSAndroid Build Coastguard Worker     min_bits_all = min_bits_df_dt;
1328*15dc779aSAndroid Build Coastguard Worker   }
1329*15dc779aSAndroid Build Coastguard Worker 
1330*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1331*15dc779aSAndroid Build Coastguard Worker     error = ixheaace_mps_212_calc_huff_bits(
1332*15dc779aSAndroid Build Coastguard Worker         data_diff_time[0], data_diff_freq[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1333*15dc779aSAndroid Build Coastguard Worker         IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_dtbw_df, &min_bits_dtbw_df, &huff_dim_dtbw_df,
1334*15dc779aSAndroid Build Coastguard Worker         &huff_pair_type_dtbw_df);
1335*15dc779aSAndroid Build Coastguard Worker     if (error) {
1336*15dc779aSAndroid Build Coastguard Worker       return error;
1337*15dc779aSAndroid Build Coastguard Worker     }
1338*15dc779aSAndroid Build Coastguard Worker 
1339*15dc779aSAndroid Build Coastguard Worker     min_bits_dtbw_df += 2;
1340*15dc779aSAndroid Build Coastguard Worker 
1341*15dc779aSAndroid Build Coastguard Worker     if (min_bits_dtbw_df < min_bits_all) {
1342*15dc779aSAndroid Build Coastguard Worker       min_bits_all = min_bits_dtbw_df;
1343*15dc779aSAndroid Build Coastguard Worker     }
1344*15dc779aSAndroid Build Coastguard Worker 
1345*15dc779aSAndroid Build Coastguard Worker     error = ixheaace_mps_212_calc_huff_bits(
1346*15dc779aSAndroid Build Coastguard Worker         data_diff_time[0], data_diff_time[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1347*15dc779aSAndroid Build Coastguard Worker         IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_dt_dt, &min_bits_dt_dt, &huff_dim_dt_dt,
1348*15dc779aSAndroid Build Coastguard Worker         &huff_pair_type_dt_dt);
1349*15dc779aSAndroid Build Coastguard Worker     if (error) {
1350*15dc779aSAndroid Build Coastguard Worker       return error;
1351*15dc779aSAndroid Build Coastguard Worker     }
1352*15dc779aSAndroid Build Coastguard Worker 
1353*15dc779aSAndroid Build Coastguard Worker     min_bits_dt_dt += 2;
1354*15dc779aSAndroid Build Coastguard Worker 
1355*15dc779aSAndroid Build Coastguard Worker     if (min_bits_dt_dt < min_bits_all) {
1356*15dc779aSAndroid Build Coastguard Worker       min_bits_all = min_bits_dt_dt;
1357*15dc779aSAndroid Build Coastguard Worker     }
1358*15dc779aSAndroid Build Coastguard Worker   }
1359*15dc779aSAndroid Build Coastguard Worker 
1360*15dc779aSAndroid Build Coastguard Worker   pcm_coding_flag = (min_bits_all == num_pcm_bits);
1361*15dc779aSAndroid Build Coastguard Worker 
1362*15dc779aSAndroid Build Coastguard Worker   ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1363*15dc779aSAndroid Build Coastguard Worker 
1364*15dc779aSAndroid Build Coastguard Worker   if (pcm_coding_flag) {
1365*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, pp_in_data[set_idx] + start_band,
1366*15dc779aSAndroid Build Coastguard Worker                                       pp_in_data[set_idx + 1] + start_band, quant_offset,
1367*15dc779aSAndroid Build Coastguard Worker                                       num_pcm_val, quant_levels);
1368*15dc779aSAndroid Build Coastguard Worker   } else {
1369*15dc779aSAndroid Build Coastguard Worker     min_found = 0;
1370*15dc779aSAndroid Build Coastguard Worker 
1371*15dc779aSAndroid Build Coastguard Worker     if (min_bits_all == min_bits_df_df) {
1372*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1373*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1374*15dc779aSAndroid Build Coastguard Worker 
1375*15dc779aSAndroid Build Coastguard Worker       error = ixheaace_mps_212_apply_huff_coding(
1376*15dc779aSAndroid Build Coastguard Worker           pstr_bit_buf, data_diff_freq[0], data_diff_freq[1], data_type,
1377*15dc779aSAndroid Build Coastguard Worker           IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_df_df,
1378*15dc779aSAndroid Build Coastguard Worker           huff_dim_df_df, huff_pair_type_df_df);
1379*15dc779aSAndroid Build Coastguard Worker       if (error) {
1380*15dc779aSAndroid Build Coastguard Worker         return error;
1381*15dc779aSAndroid Build Coastguard Worker       }
1382*15dc779aSAndroid Build Coastguard Worker       min_found = 1;
1383*15dc779aSAndroid Build Coastguard Worker     }
1384*15dc779aSAndroid Build Coastguard Worker 
1385*15dc779aSAndroid Build Coastguard Worker     if (!min_found && (min_bits_all == min_bits_df_dt)) {
1386*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1387*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1388*15dc779aSAndroid Build Coastguard Worker 
1389*15dc779aSAndroid Build Coastguard Worker       error = ixheaace_mps_212_apply_huff_coding(
1390*15dc779aSAndroid Build Coastguard Worker           pstr_bit_buf, data_diff_freq[0], data_diff_time[1], data_type,
1391*15dc779aSAndroid Build Coastguard Worker           IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_df_dt,
1392*15dc779aSAndroid Build Coastguard Worker           huff_dim_df_dt, huff_pair_type_df_dt);
1393*15dc779aSAndroid Build Coastguard Worker       if (error) {
1394*15dc779aSAndroid Build Coastguard Worker         return error;
1395*15dc779aSAndroid Build Coastguard Worker       }
1396*15dc779aSAndroid Build Coastguard Worker       min_found = 1;
1397*15dc779aSAndroid Build Coastguard Worker     }
1398*15dc779aSAndroid Build Coastguard Worker 
1399*15dc779aSAndroid Build Coastguard Worker     if (allow_diff_time_back_flag) {
1400*15dc779aSAndroid Build Coastguard Worker       if (!min_found && (min_bits_all == min_bits_dtbw_df)) {
1401*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1402*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1403*15dc779aSAndroid Build Coastguard Worker 
1404*15dc779aSAndroid Build Coastguard Worker         error = ixheaace_mps_212_apply_huff_coding(
1405*15dc779aSAndroid Build Coastguard Worker             pstr_bit_buf, data_diff_time[0], data_diff_freq[1], data_type,
1406*15dc779aSAndroid Build Coastguard Worker             IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_dtbw_df,
1407*15dc779aSAndroid Build Coastguard Worker             huff_dim_dtbw_df, huff_pair_type_dtbw_df);
1408*15dc779aSAndroid Build Coastguard Worker         if (error) {
1409*15dc779aSAndroid Build Coastguard Worker           return error;
1410*15dc779aSAndroid Build Coastguard Worker         }
1411*15dc779aSAndroid Build Coastguard Worker         min_found = 1;
1412*15dc779aSAndroid Build Coastguard Worker       }
1413*15dc779aSAndroid Build Coastguard Worker       if (!min_found && (min_bits_all == min_bits_dt_dt)) {
1414*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1415*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1416*15dc779aSAndroid Build Coastguard Worker 
1417*15dc779aSAndroid Build Coastguard Worker         error = ixheaace_mps_212_apply_huff_coding(
1418*15dc779aSAndroid Build Coastguard Worker             pstr_bit_buf, data_diff_time[0], data_diff_time[1], data_type,
1419*15dc779aSAndroid Build Coastguard Worker             IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_dt_dt,
1420*15dc779aSAndroid Build Coastguard Worker             huff_dim_dt_dt, huff_pair_type_dt_dt);
1421*15dc779aSAndroid Build Coastguard Worker         if (error) {
1422*15dc779aSAndroid Build Coastguard Worker           return error;
1423*15dc779aSAndroid Build Coastguard Worker         }
1424*15dc779aSAndroid Build Coastguard Worker       }
1425*15dc779aSAndroid Build Coastguard Worker     }
1426*15dc779aSAndroid Build Coastguard Worker   }
1427*15dc779aSAndroid Build Coastguard Worker 
1428*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
1429*15dc779aSAndroid Build Coastguard Worker }
1430*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_212_ec_data_single_enc(ixheaace_bit_buf_handle pstr_bit_buf,WORD16 pp_in_data[][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],WORD16 p_in_data[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],const WORD32 data_type,const WORD32 set_idx,const WORD32 start_band,const WORD16 data_bands,const WORD32 coarse_flag,const WORD32 independency_flag)1431*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_ec_data_single_enc(
1432*15dc779aSAndroid Build Coastguard Worker     ixheaace_bit_buf_handle pstr_bit_buf, WORD16 pp_in_data[][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],
1433*15dc779aSAndroid Build Coastguard Worker     WORD16 p_in_data[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS], const WORD32 data_type,
1434*15dc779aSAndroid Build Coastguard Worker     const WORD32 set_idx, const WORD32 start_band, const WORD16 data_bands,
1435*15dc779aSAndroid Build Coastguard Worker     const WORD32 coarse_flag, const WORD32 independency_flag) {
1436*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error;
1437*15dc779aSAndroid Build Coastguard Worker   WORD16 band = 0;
1438*15dc779aSAndroid Build Coastguard Worker   WORD16 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1439*15dc779aSAndroid Build Coastguard Worker   WORD16 pcm_coding_flag = 0;
1440*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_all = 0;
1441*15dc779aSAndroid Build Coastguard Worker   WORD16 min_found = 0;
1442*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_dim_df = 0;
1443*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_pair_type_df = 0;
1444*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_dim_dt = 0;
1445*15dc779aSAndroid Build Coastguard Worker   WORD16 huff_pair_type_dt = 0;
1446*15dc779aSAndroid Build Coastguard Worker   WORD16 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1447*15dc779aSAndroid Build Coastguard Worker   WORD16 num_pcm_bits = -1;
1448*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_df = -1;
1449*15dc779aSAndroid Build Coastguard Worker   WORD16 min_bits_dt = -1;
1450*15dc779aSAndroid Build Coastguard Worker 
1451*15dc779aSAndroid Build Coastguard Worker   WORD16 quant_data_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1452*15dc779aSAndroid Build Coastguard Worker   WORD16 quant_data_hist_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1453*15dc779aSAndroid Build Coastguard Worker   WORD16 data_diff_freq[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1454*15dc779aSAndroid Build Coastguard Worker   WORD16 data_diff_time[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS + 2] = {0};
1455*15dc779aSAndroid Build Coastguard Worker   WORD16 *p_quant_data_msb;
1456*15dc779aSAndroid Build Coastguard Worker   WORD16 *p_quant_data_hist_msb = NULL;
1457*15dc779aSAndroid Build Coastguard Worker   WORD16 lav_df[2] = {-1, -1};
1458*15dc779aSAndroid Build Coastguard Worker   WORD16 lav_dt[2] = {-1, -1};
1459*15dc779aSAndroid Build Coastguard Worker 
1460*15dc779aSAndroid Build Coastguard Worker   if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
1461*15dc779aSAndroid Build Coastguard Worker     if (coarse_flag) {
1462*15dc779aSAndroid Build Coastguard Worker       quant_levels = 4;
1463*15dc779aSAndroid Build Coastguard Worker       quant_offset = 0;
1464*15dc779aSAndroid Build Coastguard Worker     } else {
1465*15dc779aSAndroid Build Coastguard Worker       quant_levels = 8;
1466*15dc779aSAndroid Build Coastguard Worker       quant_offset = 0;
1467*15dc779aSAndroid Build Coastguard Worker     }
1468*15dc779aSAndroid Build Coastguard Worker   } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
1469*15dc779aSAndroid Build Coastguard Worker     if (coarse_flag) {
1470*15dc779aSAndroid Build Coastguard Worker       quant_levels = 15;
1471*15dc779aSAndroid Build Coastguard Worker       quant_offset = 7;
1472*15dc779aSAndroid Build Coastguard Worker     } else {
1473*15dc779aSAndroid Build Coastguard Worker       quant_levels = 31;
1474*15dc779aSAndroid Build Coastguard Worker       quant_offset = 15;
1475*15dc779aSAndroid Build Coastguard Worker     }
1476*15dc779aSAndroid Build Coastguard Worker   } else {
1477*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
1478*15dc779aSAndroid Build Coastguard Worker   }
1479*15dc779aSAndroid Build Coastguard Worker   if (quant_offset != 0) {
1480*15dc779aSAndroid Build Coastguard Worker     for (band = 0; band < data_bands; band++) {
1481*15dc779aSAndroid Build Coastguard Worker       quant_data_msb[band] = pp_in_data[set_idx][start_band + band] + quant_offset;
1482*15dc779aSAndroid Build Coastguard Worker     }
1483*15dc779aSAndroid Build Coastguard Worker     p_quant_data_msb = quant_data_msb;
1484*15dc779aSAndroid Build Coastguard Worker   } else {
1485*15dc779aSAndroid Build Coastguard Worker     p_quant_data_msb = pp_in_data[set_idx] + start_band;
1486*15dc779aSAndroid Build Coastguard Worker   }
1487*15dc779aSAndroid Build Coastguard Worker 
1488*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1489*15dc779aSAndroid Build Coastguard Worker     if (quant_offset != 0) {
1490*15dc779aSAndroid Build Coastguard Worker       for (band = 0; band < data_bands; band++) {
1491*15dc779aSAndroid Build Coastguard Worker         quant_data_hist_msb[band] = p_in_data[start_band + band] + quant_offset;
1492*15dc779aSAndroid Build Coastguard Worker       }
1493*15dc779aSAndroid Build Coastguard Worker       p_quant_data_hist_msb = quant_data_hist_msb;
1494*15dc779aSAndroid Build Coastguard Worker     } else {
1495*15dc779aSAndroid Build Coastguard Worker       p_quant_data_hist_msb = p_in_data + start_band;
1496*15dc779aSAndroid Build Coastguard Worker     }
1497*15dc779aSAndroid Build Coastguard Worker   }
1498*15dc779aSAndroid Build Coastguard Worker 
1499*15dc779aSAndroid Build Coastguard Worker   data_diff_freq[0] = p_quant_data_msb[0];
1500*15dc779aSAndroid Build Coastguard Worker 
1501*15dc779aSAndroid Build Coastguard Worker   for (band = 1; band < data_bands; band++) {
1502*15dc779aSAndroid Build Coastguard Worker     data_diff_freq[band] = p_quant_data_msb[band] - p_quant_data_msb[band - 1];
1503*15dc779aSAndroid Build Coastguard Worker   }
1504*15dc779aSAndroid Build Coastguard Worker 
1505*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1506*15dc779aSAndroid Build Coastguard Worker     data_diff_time[0] = p_quant_data_msb[0];
1507*15dc779aSAndroid Build Coastguard Worker     data_diff_time[1] = p_quant_data_hist_msb[0];
1508*15dc779aSAndroid Build Coastguard Worker 
1509*15dc779aSAndroid Build Coastguard Worker     for (band = 0; band < data_bands; band++) {
1510*15dc779aSAndroid Build Coastguard Worker       data_diff_time[band + 2] = p_quant_data_msb[band] - p_quant_data_hist_msb[band];
1511*15dc779aSAndroid Build Coastguard Worker     }
1512*15dc779aSAndroid Build Coastguard Worker   }
1513*15dc779aSAndroid Build Coastguard Worker 
1514*15dc779aSAndroid Build Coastguard Worker   num_pcm_bits = ixheaace_mps_212_calc_pcm_bits(data_bands, quant_levels);
1515*15dc779aSAndroid Build Coastguard Worker   num_pcm_val = data_bands;
1516*15dc779aSAndroid Build Coastguard Worker   min_bits_all = num_pcm_bits;
1517*15dc779aSAndroid Build Coastguard Worker 
1518*15dc779aSAndroid Build Coastguard Worker   error = ixheaace_mps_212_calc_huff_bits(
1519*15dc779aSAndroid Build Coastguard Worker       data_diff_freq, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_FREQ,
1520*15dc779aSAndroid Build Coastguard Worker       data_bands, lav_df, &min_bits_df, &huff_dim_df, &huff_pair_type_df);
1521*15dc779aSAndroid Build Coastguard Worker   if (error) {
1522*15dc779aSAndroid Build Coastguard Worker     return error;
1523*15dc779aSAndroid Build Coastguard Worker   }
1524*15dc779aSAndroid Build Coastguard Worker 
1525*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) min_bits_df += 1;
1526*15dc779aSAndroid Build Coastguard Worker 
1527*15dc779aSAndroid Build Coastguard Worker   if (min_bits_df < min_bits_all) {
1528*15dc779aSAndroid Build Coastguard Worker     min_bits_all = min_bits_df;
1529*15dc779aSAndroid Build Coastguard Worker   }
1530*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1531*15dc779aSAndroid Build Coastguard Worker     error = ixheaace_mps_212_calc_huff_bits(
1532*15dc779aSAndroid Build Coastguard Worker         data_diff_time, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_TIME,
1533*15dc779aSAndroid Build Coastguard Worker         data_bands, lav_dt, &min_bits_dt, &huff_dim_dt, &huff_pair_type_dt);
1534*15dc779aSAndroid Build Coastguard Worker     if (error) {
1535*15dc779aSAndroid Build Coastguard Worker       return error;
1536*15dc779aSAndroid Build Coastguard Worker     }
1537*15dc779aSAndroid Build Coastguard Worker 
1538*15dc779aSAndroid Build Coastguard Worker     min_bits_dt += 1;
1539*15dc779aSAndroid Build Coastguard Worker 
1540*15dc779aSAndroid Build Coastguard Worker     if (min_bits_dt < min_bits_all) {
1541*15dc779aSAndroid Build Coastguard Worker       min_bits_all = min_bits_dt;
1542*15dc779aSAndroid Build Coastguard Worker     }
1543*15dc779aSAndroid Build Coastguard Worker   }
1544*15dc779aSAndroid Build Coastguard Worker   pcm_coding_flag = (min_bits_all == num_pcm_bits);
1545*15dc779aSAndroid Build Coastguard Worker 
1546*15dc779aSAndroid Build Coastguard Worker   ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1547*15dc779aSAndroid Build Coastguard Worker 
1548*15dc779aSAndroid Build Coastguard Worker   if (pcm_coding_flag) {
1549*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, pp_in_data[set_idx] + start_band, NULL,
1550*15dc779aSAndroid Build Coastguard Worker                                       quant_offset, num_pcm_val, quant_levels);
1551*15dc779aSAndroid Build Coastguard Worker   } else {
1552*15dc779aSAndroid Build Coastguard Worker     min_found = 0;
1553*15dc779aSAndroid Build Coastguard Worker     if (min_bits_all == min_bits_df) {
1554*15dc779aSAndroid Build Coastguard Worker       if (allow_diff_time_back_flag) {
1555*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1556*15dc779aSAndroid Build Coastguard Worker       }
1557*15dc779aSAndroid Build Coastguard Worker 
1558*15dc779aSAndroid Build Coastguard Worker       error = ixheaace_mps_212_apply_huff_coding(
1559*15dc779aSAndroid Build Coastguard Worker           pstr_bit_buf, data_diff_freq, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1560*15dc779aSAndroid Build Coastguard Worker           IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_df, huff_dim_df, huff_pair_type_df);
1561*15dc779aSAndroid Build Coastguard Worker       if (error) {
1562*15dc779aSAndroid Build Coastguard Worker         return error;
1563*15dc779aSAndroid Build Coastguard Worker       }
1564*15dc779aSAndroid Build Coastguard Worker       min_found = 1;
1565*15dc779aSAndroid Build Coastguard Worker     }
1566*15dc779aSAndroid Build Coastguard Worker 
1567*15dc779aSAndroid Build Coastguard Worker     if (allow_diff_time_back_flag) {
1568*15dc779aSAndroid Build Coastguard Worker       if (!min_found && (min_bits_all == min_bits_dt)) {
1569*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1570*15dc779aSAndroid Build Coastguard Worker 
1571*15dc779aSAndroid Build Coastguard Worker         error = ixheaace_mps_212_apply_huff_coding(
1572*15dc779aSAndroid Build Coastguard Worker             pstr_bit_buf, data_diff_time, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1573*15dc779aSAndroid Build Coastguard Worker             IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_dt, huff_dim_dt, huff_pair_type_dt);
1574*15dc779aSAndroid Build Coastguard Worker         if (error) {
1575*15dc779aSAndroid Build Coastguard Worker           return error;
1576*15dc779aSAndroid Build Coastguard Worker         }
1577*15dc779aSAndroid Build Coastguard Worker       }
1578*15dc779aSAndroid Build Coastguard Worker     }
1579*15dc779aSAndroid Build Coastguard Worker   }
1580*15dc779aSAndroid Build Coastguard Worker 
1581*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
1582*15dc779aSAndroid Build Coastguard Worker }
1583*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mps_515_ec_data_pair_enc(ixheaace_bit_buf_handle pstr_bit_buf,WORD32 pp_in_data[][MAXBANDS],WORD32 p_in_data[MAXBANDS],WORD32 data_type,WORD32 set_idx,WORD32 start_band,WORD32 data_bands,WORD32 pair_flag,WORD32 coarse_flag,WORD32 independency_flag)1584*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_mps_515_ec_data_pair_enc(ixheaace_bit_buf_handle pstr_bit_buf,
1585*15dc779aSAndroid Build Coastguard Worker                                          WORD32 pp_in_data[][MAXBANDS],
1586*15dc779aSAndroid Build Coastguard Worker                                          WORD32 p_in_data[MAXBANDS], WORD32 data_type,
1587*15dc779aSAndroid Build Coastguard Worker                                          WORD32 set_idx, WORD32 start_band, WORD32 data_bands,
1588*15dc779aSAndroid Build Coastguard Worker                                          WORD32 pair_flag, WORD32 coarse_flag,
1589*15dc779aSAndroid Build Coastguard Worker                                          WORD32 independency_flag) {
1590*15dc779aSAndroid Build Coastguard Worker   WORD32 dummy = 0;
1591*15dc779aSAndroid Build Coastguard Worker   WORD32 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1592*15dc779aSAndroid Build Coastguard Worker 
1593*15dc779aSAndroid Build Coastguard Worker   WORD32 split_lsb_flag = 0;
1594*15dc779aSAndroid Build Coastguard Worker   WORD32 pcm_coding_flag = 0;
1595*15dc779aSAndroid Build Coastguard Worker 
1596*15dc779aSAndroid Build Coastguard Worker   WORD32 min_bits_df_df = -1;
1597*15dc779aSAndroid Build Coastguard Worker   WORD32 min_bits_df_dt = -1;
1598*15dc779aSAndroid Build Coastguard Worker   WORD32 min_bits_dtbw_df = -1;
1599*15dc779aSAndroid Build Coastguard Worker   WORD32 min_bits_dtfw_df = -1;
1600*15dc779aSAndroid Build Coastguard Worker 
1601*15dc779aSAndroid Build Coastguard Worker   WORD32 min_bits_dt_dt = -1;
1602*15dc779aSAndroid Build Coastguard Worker   WORD32 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1603*15dc779aSAndroid Build Coastguard Worker 
1604*15dc779aSAndroid Build Coastguard Worker   WORD32 num_lsb_bits[2] = {0, 0};
1605*15dc779aSAndroid Build Coastguard Worker   WORD32 num_pcm_bits = 0;
1606*15dc779aSAndroid Build Coastguard Worker 
1607*15dc779aSAndroid Build Coastguard Worker   WORD32 a_data_hist[MAXBANDS] = {0};
1608*15dc779aSAndroid Build Coastguard Worker   WORD32 aa_data_pair[2][MAXBANDS] = {{0}};
1609*15dc779aSAndroid Build Coastguard Worker 
1610*15dc779aSAndroid Build Coastguard Worker   WORD32 quant_data_lsb[2][MAXBANDS] = {{0}};
1611*15dc779aSAndroid Build Coastguard Worker   WORD32 quant_data_msb[2][MAXBANDS] = {{0}};
1612*15dc779aSAndroid Build Coastguard Worker 
1613*15dc779aSAndroid Build Coastguard Worker   WORD32 quant_data_hist_lsb[MAXBANDS] = {0};
1614*15dc779aSAndroid Build Coastguard Worker   WORD32 quant_data_hist_msb[MAXBANDS] = {0};
1615*15dc779aSAndroid Build Coastguard Worker 
1616*15dc779aSAndroid Build Coastguard Worker   WORD32 data_diff_freq[2][MAXBANDS] = {{0}};
1617*15dc779aSAndroid Build Coastguard Worker   WORD32 data_diff_time_bw[2][MAXBANDS + 1] = {{0}};
1618*15dc779aSAndroid Build Coastguard Worker   WORD32 data_diff_time_fw[MAXBANDS + 1] = {0};
1619*15dc779aSAndroid Build Coastguard Worker 
1620*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_data_pcm[2] = {NULL};
1621*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_data_diff_freq[2] = {NULL};
1622*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_data_diff_time_bw[2] = {NULL};
1623*15dc779aSAndroid Build Coastguard Worker   WORD32 *p_data_diff_time_fw = NULL;
1624*15dc779aSAndroid Build Coastguard Worker 
1625*15dc779aSAndroid Build Coastguard Worker   WORD32 min_bits_all = 0;
1626*15dc779aSAndroid Build Coastguard Worker   WORD32 min_found = 0;
1627*15dc779aSAndroid Build Coastguard Worker 
1628*15dc779aSAndroid Build Coastguard Worker   switch (data_type) {
1629*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1630*15dc779aSAndroid Build Coastguard Worker       if (coarse_flag) {
1631*15dc779aSAndroid Build Coastguard Worker         split_lsb_flag = 0;
1632*15dc779aSAndroid Build Coastguard Worker         quant_levels = 15;
1633*15dc779aSAndroid Build Coastguard Worker         quant_offset = 7;
1634*15dc779aSAndroid Build Coastguard Worker       } else {
1635*15dc779aSAndroid Build Coastguard Worker         split_lsb_flag = 0;
1636*15dc779aSAndroid Build Coastguard Worker         quant_levels = 31;
1637*15dc779aSAndroid Build Coastguard Worker         quant_offset = 15;
1638*15dc779aSAndroid Build Coastguard Worker       }
1639*15dc779aSAndroid Build Coastguard Worker 
1640*15dc779aSAndroid Build Coastguard Worker       break;
1641*15dc779aSAndroid Build Coastguard Worker 
1642*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1643*15dc779aSAndroid Build Coastguard Worker       if (coarse_flag) {
1644*15dc779aSAndroid Build Coastguard Worker         split_lsb_flag = 0;
1645*15dc779aSAndroid Build Coastguard Worker         quant_levels = 4;
1646*15dc779aSAndroid Build Coastguard Worker         quant_offset = 0;
1647*15dc779aSAndroid Build Coastguard Worker       } else {
1648*15dc779aSAndroid Build Coastguard Worker         split_lsb_flag = 0;
1649*15dc779aSAndroid Build Coastguard Worker         quant_levels = 8;
1650*15dc779aSAndroid Build Coastguard Worker         quant_offset = 0;
1651*15dc779aSAndroid Build Coastguard Worker       }
1652*15dc779aSAndroid Build Coastguard Worker 
1653*15dc779aSAndroid Build Coastguard Worker       break;
1654*15dc779aSAndroid Build Coastguard Worker 
1655*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_MPS_SAC_DATA_TYPE_CPC:
1656*15dc779aSAndroid Build Coastguard Worker       if (coarse_flag) {
1657*15dc779aSAndroid Build Coastguard Worker         split_lsb_flag = 0;
1658*15dc779aSAndroid Build Coastguard Worker         quant_levels = 26;
1659*15dc779aSAndroid Build Coastguard Worker         quant_offset = 0;
1660*15dc779aSAndroid Build Coastguard Worker       } else {
1661*15dc779aSAndroid Build Coastguard Worker         split_lsb_flag = 1;
1662*15dc779aSAndroid Build Coastguard Worker         quant_levels = 51;
1663*15dc779aSAndroid Build Coastguard Worker         quant_offset = 0;
1664*15dc779aSAndroid Build Coastguard Worker       }
1665*15dc779aSAndroid Build Coastguard Worker 
1666*15dc779aSAndroid Build Coastguard Worker       break;
1667*15dc779aSAndroid Build Coastguard Worker 
1668*15dc779aSAndroid Build Coastguard Worker     default:
1669*15dc779aSAndroid Build Coastguard Worker       return;
1670*15dc779aSAndroid Build Coastguard Worker   }
1671*15dc779aSAndroid Build Coastguard Worker 
1672*15dc779aSAndroid Build Coastguard Worker   memcpy(a_data_hist, p_in_data + start_band, sizeof(WORD32) * data_bands);
1673*15dc779aSAndroid Build Coastguard Worker 
1674*15dc779aSAndroid Build Coastguard Worker   memcpy(aa_data_pair[0], pp_in_data[set_idx] + start_band, sizeof(int) * data_bands);
1675*15dc779aSAndroid Build Coastguard Worker   p_data_pcm[0] = aa_data_pair[0];
1676*15dc779aSAndroid Build Coastguard Worker   if (pair_flag) {
1677*15dc779aSAndroid Build Coastguard Worker     memcpy(aa_data_pair[1], pp_in_data[set_idx + 1] + start_band, sizeof(int) * data_bands);
1678*15dc779aSAndroid Build Coastguard Worker     p_data_pcm[1] = aa_data_pair[1];
1679*15dc779aSAndroid Build Coastguard Worker   }
1680*15dc779aSAndroid Build Coastguard Worker 
1681*15dc779aSAndroid Build Coastguard Worker   num_lsb_bits[0] =
1682*15dc779aSAndroid Build Coastguard Worker       ixheaace_mps_515_split_lsb(aa_data_pair[0], quant_offset, split_lsb_flag ? 1 : 0,
1683*15dc779aSAndroid Build Coastguard Worker                                  data_bands, quant_data_lsb[0], quant_data_msb[0]);
1684*15dc779aSAndroid Build Coastguard Worker 
1685*15dc779aSAndroid Build Coastguard Worker   if (pair_flag) {
1686*15dc779aSAndroid Build Coastguard Worker     num_lsb_bits[1] =
1687*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_split_lsb(aa_data_pair[1], quant_offset, split_lsb_flag ? 1 : 0,
1688*15dc779aSAndroid Build Coastguard Worker                                    data_bands, quant_data_lsb[1], quant_data_msb[1]);
1689*15dc779aSAndroid Build Coastguard Worker   }
1690*15dc779aSAndroid Build Coastguard Worker   (VOID) num_lsb_bits;
1691*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1692*15dc779aSAndroid Build Coastguard Worker     dummy = ixheaace_mps_515_split_lsb(a_data_hist, quant_offset, split_lsb_flag ? 1 : 0,
1693*15dc779aSAndroid Build Coastguard Worker                                        data_bands, quant_data_hist_lsb, quant_data_hist_msb);
1694*15dc779aSAndroid Build Coastguard Worker     (VOID) dummy;
1695*15dc779aSAndroid Build Coastguard Worker   }
1696*15dc779aSAndroid Build Coastguard Worker 
1697*15dc779aSAndroid Build Coastguard Worker   ixheaace_mps_515_calc_diff_freq(quant_data_msb[0], data_diff_freq[0], data_bands);
1698*15dc779aSAndroid Build Coastguard Worker   p_data_diff_freq[0] = data_diff_freq[0];
1699*15dc779aSAndroid Build Coastguard Worker 
1700*15dc779aSAndroid Build Coastguard Worker   if (pair_flag) {
1701*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_515_calc_diff_freq(quant_data_msb[1], data_diff_freq[1], data_bands);
1702*15dc779aSAndroid Build Coastguard Worker     p_data_diff_freq[1] = data_diff_freq[1];
1703*15dc779aSAndroid Build Coastguard Worker   }
1704*15dc779aSAndroid Build Coastguard Worker 
1705*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1706*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_515_calc_diff_time(quant_data_msb[0], quant_data_hist_msb,
1707*15dc779aSAndroid Build Coastguard Worker                                     data_diff_time_bw[0] + 1,
1708*15dc779aSAndroid Build Coastguard Worker                                     IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS, data_bands);
1709*15dc779aSAndroid Build Coastguard Worker     p_data_diff_time_bw[0] = data_diff_time_bw[0];
1710*15dc779aSAndroid Build Coastguard Worker   }
1711*15dc779aSAndroid Build Coastguard Worker 
1712*15dc779aSAndroid Build Coastguard Worker   if (pair_flag) {
1713*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_515_calc_diff_time(quant_data_msb[1], quant_data_msb[0],
1714*15dc779aSAndroid Build Coastguard Worker                                     data_diff_time_bw[1] + 1,
1715*15dc779aSAndroid Build Coastguard Worker                                     IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS, data_bands);
1716*15dc779aSAndroid Build Coastguard Worker     p_data_diff_time_bw[1] = data_diff_time_bw[1];
1717*15dc779aSAndroid Build Coastguard Worker 
1718*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_515_calc_diff_time(quant_data_msb[1], quant_data_msb[0], data_diff_time_fw + 1,
1719*15dc779aSAndroid Build Coastguard Worker                                     IXHEAACE_MPS_SAC_DIRECTION_FORWARDS, data_bands);
1720*15dc779aSAndroid Build Coastguard Worker     p_data_diff_time_fw = data_diff_time_fw;
1721*15dc779aSAndroid Build Coastguard Worker   }
1722*15dc779aSAndroid Build Coastguard Worker 
1723*15dc779aSAndroid Build Coastguard Worker   if (pair_flag) {
1724*15dc779aSAndroid Build Coastguard Worker     num_pcm_bits = ixheaace_mps_515_calc_pcm_bits(2 * data_bands, quant_levels);
1725*15dc779aSAndroid Build Coastguard Worker     num_pcm_val = 2 * data_bands;
1726*15dc779aSAndroid Build Coastguard Worker   } else {
1727*15dc779aSAndroid Build Coastguard Worker     num_pcm_bits = ixheaace_mps_515_calc_pcm_bits(data_bands, quant_levels);
1728*15dc779aSAndroid Build Coastguard Worker     num_pcm_val = data_bands;
1729*15dc779aSAndroid Build Coastguard Worker   }
1730*15dc779aSAndroid Build Coastguard Worker 
1731*15dc779aSAndroid Build Coastguard Worker   min_bits_all = num_pcm_bits;
1732*15dc779aSAndroid Build Coastguard Worker 
1733*15dc779aSAndroid Build Coastguard Worker   if ((p_data_diff_freq[0] != NULL) || (p_data_diff_freq[1] != NULL)) {
1734*15dc779aSAndroid Build Coastguard Worker     min_bits_df_df = ixheaace_mps_515_calc_huff_bits(p_data_diff_freq[0], p_data_diff_freq[1],
1735*15dc779aSAndroid Build Coastguard Worker                                                      data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1736*15dc779aSAndroid Build Coastguard Worker                                                      IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1737*15dc779aSAndroid Build Coastguard Worker 
1738*15dc779aSAndroid Build Coastguard Worker     if (pair_flag || allow_diff_time_back_flag) min_bits_df_df += 1;
1739*15dc779aSAndroid Build Coastguard Worker     if (pair_flag) min_bits_df_df += 1;
1740*15dc779aSAndroid Build Coastguard Worker 
1741*15dc779aSAndroid Build Coastguard Worker     if (min_bits_df_df < min_bits_all) {
1742*15dc779aSAndroid Build Coastguard Worker       min_bits_all = min_bits_df_df;
1743*15dc779aSAndroid Build Coastguard Worker     }
1744*15dc779aSAndroid Build Coastguard Worker   }
1745*15dc779aSAndroid Build Coastguard Worker 
1746*15dc779aSAndroid Build Coastguard Worker   if ((p_data_diff_freq[0] != NULL) || (p_data_diff_time_bw[1] != NULL)) {
1747*15dc779aSAndroid Build Coastguard Worker     min_bits_df_dt = ixheaace_mps_515_calc_huff_bits(p_data_diff_freq[0], p_data_diff_time_bw[1],
1748*15dc779aSAndroid Build Coastguard Worker                                                      data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1749*15dc779aSAndroid Build Coastguard Worker                                                      IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1750*15dc779aSAndroid Build Coastguard Worker 
1751*15dc779aSAndroid Build Coastguard Worker     if (pair_flag || allow_diff_time_back_flag) min_bits_df_dt += 1;
1752*15dc779aSAndroid Build Coastguard Worker     if (pair_flag) min_bits_df_dt += 1;
1753*15dc779aSAndroid Build Coastguard Worker 
1754*15dc779aSAndroid Build Coastguard Worker     if (min_bits_df_dt < min_bits_all) {
1755*15dc779aSAndroid Build Coastguard Worker       min_bits_all = min_bits_df_dt;
1756*15dc779aSAndroid Build Coastguard Worker     }
1757*15dc779aSAndroid Build Coastguard Worker   }
1758*15dc779aSAndroid Build Coastguard Worker 
1759*15dc779aSAndroid Build Coastguard Worker   if ((p_data_diff_time_fw != NULL) || (p_data_diff_freq[1] != NULL)) {
1760*15dc779aSAndroid Build Coastguard Worker     min_bits_dtfw_df = ixheaace_mps_515_calc_huff_bits(p_data_diff_time_fw, p_data_diff_freq[1],
1761*15dc779aSAndroid Build Coastguard Worker                                                        data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1762*15dc779aSAndroid Build Coastguard Worker                                                        IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1763*15dc779aSAndroid Build Coastguard Worker 
1764*15dc779aSAndroid Build Coastguard Worker     if (pair_flag || allow_diff_time_back_flag) min_bits_dtfw_df += 1;
1765*15dc779aSAndroid Build Coastguard Worker     if (pair_flag && allow_diff_time_back_flag) min_bits_dtfw_df += 1;
1766*15dc779aSAndroid Build Coastguard Worker 
1767*15dc779aSAndroid Build Coastguard Worker     if (pair_flag && allow_diff_time_back_flag) {
1768*15dc779aSAndroid Build Coastguard Worker       min_bits_dtfw_df += 1;
1769*15dc779aSAndroid Build Coastguard Worker     }
1770*15dc779aSAndroid Build Coastguard Worker 
1771*15dc779aSAndroid Build Coastguard Worker     if (min_bits_dtfw_df < min_bits_all) {
1772*15dc779aSAndroid Build Coastguard Worker       min_bits_all = min_bits_dtfw_df;
1773*15dc779aSAndroid Build Coastguard Worker     }
1774*15dc779aSAndroid Build Coastguard Worker   }
1775*15dc779aSAndroid Build Coastguard Worker 
1776*15dc779aSAndroid Build Coastguard Worker   if (allow_diff_time_back_flag) {
1777*15dc779aSAndroid Build Coastguard Worker     if ((p_data_diff_time_bw[0] != NULL) || (p_data_diff_freq[1] != NULL)) {
1778*15dc779aSAndroid Build Coastguard Worker       min_bits_dtbw_df = ixheaace_mps_515_calc_huff_bits(
1779*15dc779aSAndroid Build Coastguard Worker           p_data_diff_time_bw[0], p_data_diff_freq[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1780*15dc779aSAndroid Build Coastguard Worker           IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1781*15dc779aSAndroid Build Coastguard Worker 
1782*15dc779aSAndroid Build Coastguard Worker       min_bits_dtbw_df += 1;
1783*15dc779aSAndroid Build Coastguard Worker       if (pair_flag) {
1784*15dc779aSAndroid Build Coastguard Worker         min_bits_dtbw_df += 2;
1785*15dc779aSAndroid Build Coastguard Worker       }
1786*15dc779aSAndroid Build Coastguard Worker 
1787*15dc779aSAndroid Build Coastguard Worker       if (min_bits_dtbw_df < min_bits_all) {
1788*15dc779aSAndroid Build Coastguard Worker         min_bits_all = min_bits_dtbw_df;
1789*15dc779aSAndroid Build Coastguard Worker       }
1790*15dc779aSAndroid Build Coastguard Worker     }
1791*15dc779aSAndroid Build Coastguard Worker 
1792*15dc779aSAndroid Build Coastguard Worker     if ((p_data_diff_time_bw[0] != NULL) || (p_data_diff_time_bw[1] != NULL)) {
1793*15dc779aSAndroid Build Coastguard Worker       min_bits_dt_dt = ixheaace_mps_515_calc_huff_bits(
1794*15dc779aSAndroid Build Coastguard Worker           p_data_diff_time_bw[0], p_data_diff_time_bw[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1795*15dc779aSAndroid Build Coastguard Worker           IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1796*15dc779aSAndroid Build Coastguard Worker 
1797*15dc779aSAndroid Build Coastguard Worker       min_bits_dt_dt += 1;
1798*15dc779aSAndroid Build Coastguard Worker       if (pair_flag) min_bits_dt_dt += 1;
1799*15dc779aSAndroid Build Coastguard Worker 
1800*15dc779aSAndroid Build Coastguard Worker       if (min_bits_dt_dt < min_bits_all) {
1801*15dc779aSAndroid Build Coastguard Worker         min_bits_all = min_bits_dt_dt;
1802*15dc779aSAndroid Build Coastguard Worker       }
1803*15dc779aSAndroid Build Coastguard Worker     }
1804*15dc779aSAndroid Build Coastguard Worker   }
1805*15dc779aSAndroid Build Coastguard Worker 
1806*15dc779aSAndroid Build Coastguard Worker   pcm_coding_flag = (min_bits_all == num_pcm_bits);
1807*15dc779aSAndroid Build Coastguard Worker 
1808*15dc779aSAndroid Build Coastguard Worker   ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1809*15dc779aSAndroid Build Coastguard Worker 
1810*15dc779aSAndroid Build Coastguard Worker   if (pcm_coding_flag) {
1811*15dc779aSAndroid Build Coastguard Worker     if (data_bands >= PBC_MIN_BANDS) {
1812*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bit_buf, 0, 1);
1813*15dc779aSAndroid Build Coastguard Worker     }
1814*15dc779aSAndroid Build Coastguard Worker 
1815*15dc779aSAndroid Build Coastguard Worker     ixheaace_mps_515_apply_pcm_coding(pstr_bit_buf, p_data_pcm[0], p_data_pcm[1], quant_offset,
1816*15dc779aSAndroid Build Coastguard Worker                                       num_pcm_val, quant_levels);
1817*15dc779aSAndroid Build Coastguard Worker   } else {
1818*15dc779aSAndroid Build Coastguard Worker     min_found = 0;
1819*15dc779aSAndroid Build Coastguard Worker 
1820*15dc779aSAndroid Build Coastguard Worker     if (min_bits_all == min_bits_df_df) {
1821*15dc779aSAndroid Build Coastguard Worker       if (pair_flag || allow_diff_time_back_flag) {
1822*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1823*15dc779aSAndroid Build Coastguard Worker       }
1824*15dc779aSAndroid Build Coastguard Worker 
1825*15dc779aSAndroid Build Coastguard Worker       if (pair_flag) {
1826*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1827*15dc779aSAndroid Build Coastguard Worker       }
1828*15dc779aSAndroid Build Coastguard Worker 
1829*15dc779aSAndroid Build Coastguard Worker       ixheaace_mps_515_apply_huff_coding(pstr_bit_buf, p_data_diff_freq[0], p_data_diff_freq[1],
1830*15dc779aSAndroid Build Coastguard Worker                                          data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1831*15dc779aSAndroid Build Coastguard Worker                                          IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1832*15dc779aSAndroid Build Coastguard Worker 
1833*15dc779aSAndroid Build Coastguard Worker       min_found = 1;
1834*15dc779aSAndroid Build Coastguard Worker     }
1835*15dc779aSAndroid Build Coastguard Worker 
1836*15dc779aSAndroid Build Coastguard Worker     if (!min_found && (min_bits_all == min_bits_df_dt)) {
1837*15dc779aSAndroid Build Coastguard Worker       if (pair_flag || allow_diff_time_back_flag) {
1838*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1839*15dc779aSAndroid Build Coastguard Worker       }
1840*15dc779aSAndroid Build Coastguard Worker 
1841*15dc779aSAndroid Build Coastguard Worker       if (pair_flag) {
1842*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1843*15dc779aSAndroid Build Coastguard Worker       }
1844*15dc779aSAndroid Build Coastguard Worker 
1845*15dc779aSAndroid Build Coastguard Worker       ixheaace_mps_515_apply_huff_coding(
1846*15dc779aSAndroid Build Coastguard Worker           pstr_bit_buf, p_data_diff_freq[0], p_data_diff_time_bw[1], data_type,
1847*15dc779aSAndroid Build Coastguard Worker           IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1848*15dc779aSAndroid Build Coastguard Worker 
1849*15dc779aSAndroid Build Coastguard Worker       min_found = 1;
1850*15dc779aSAndroid Build Coastguard Worker     }
1851*15dc779aSAndroid Build Coastguard Worker 
1852*15dc779aSAndroid Build Coastguard Worker     if (!min_found && (min_bits_all == min_bits_dtfw_df)) {
1853*15dc779aSAndroid Build Coastguard Worker       if (pair_flag || allow_diff_time_back_flag) {
1854*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1855*15dc779aSAndroid Build Coastguard Worker       }
1856*15dc779aSAndroid Build Coastguard Worker 
1857*15dc779aSAndroid Build Coastguard Worker       if (pair_flag && allow_diff_time_back_flag) {
1858*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1859*15dc779aSAndroid Build Coastguard Worker       }
1860*15dc779aSAndroid Build Coastguard Worker 
1861*15dc779aSAndroid Build Coastguard Worker       ixheaace_mps_515_apply_huff_coding(pstr_bit_buf, p_data_diff_time_fw, p_data_diff_freq[1],
1862*15dc779aSAndroid Build Coastguard Worker                                          data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1863*15dc779aSAndroid Build Coastguard Worker                                          IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1864*15dc779aSAndroid Build Coastguard Worker 
1865*15dc779aSAndroid Build Coastguard Worker       if (pair_flag && allow_diff_time_back_flag) {
1866*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIRECTION_FORWARDS, 1);
1867*15dc779aSAndroid Build Coastguard Worker       }
1868*15dc779aSAndroid Build Coastguard Worker 
1869*15dc779aSAndroid Build Coastguard Worker       min_found = 1;
1870*15dc779aSAndroid Build Coastguard Worker     }
1871*15dc779aSAndroid Build Coastguard Worker 
1872*15dc779aSAndroid Build Coastguard Worker     if (allow_diff_time_back_flag) {
1873*15dc779aSAndroid Build Coastguard Worker       if (!min_found && (min_bits_all == min_bits_dtbw_df)) {
1874*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1875*15dc779aSAndroid Build Coastguard Worker 
1876*15dc779aSAndroid Build Coastguard Worker         if (pair_flag) {
1877*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1878*15dc779aSAndroid Build Coastguard Worker         }
1879*15dc779aSAndroid Build Coastguard Worker 
1880*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_apply_huff_coding(
1881*15dc779aSAndroid Build Coastguard Worker             pstr_bit_buf, p_data_diff_time_bw[0], p_data_diff_freq[1], data_type,
1882*15dc779aSAndroid Build Coastguard Worker             IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1883*15dc779aSAndroid Build Coastguard Worker 
1884*15dc779aSAndroid Build Coastguard Worker         if (pair_flag) {
1885*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS, 1);
1886*15dc779aSAndroid Build Coastguard Worker         }
1887*15dc779aSAndroid Build Coastguard Worker 
1888*15dc779aSAndroid Build Coastguard Worker         min_found = 1;
1889*15dc779aSAndroid Build Coastguard Worker       }
1890*15dc779aSAndroid Build Coastguard Worker 
1891*15dc779aSAndroid Build Coastguard Worker       if (!min_found && (min_bits_all == min_bits_dt_dt)) {
1892*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1893*15dc779aSAndroid Build Coastguard Worker 
1894*15dc779aSAndroid Build Coastguard Worker         if (pair_flag) {
1895*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1896*15dc779aSAndroid Build Coastguard Worker         }
1897*15dc779aSAndroid Build Coastguard Worker 
1898*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_apply_huff_coding(
1899*15dc779aSAndroid Build Coastguard Worker             pstr_bit_buf, p_data_diff_time_bw[0], p_data_diff_time_bw[1], data_type,
1900*15dc779aSAndroid Build Coastguard Worker             IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1901*15dc779aSAndroid Build Coastguard Worker       }
1902*15dc779aSAndroid Build Coastguard Worker     }
1903*15dc779aSAndroid Build Coastguard Worker 
1904*15dc779aSAndroid Build Coastguard Worker     if (split_lsb_flag) {
1905*15dc779aSAndroid Build Coastguard Worker       ixheaace_mps_515_apply_lsb_coding(pstr_bit_buf, quant_data_lsb[0], 1, data_bands);
1906*15dc779aSAndroid Build Coastguard Worker 
1907*15dc779aSAndroid Build Coastguard Worker       if (pair_flag) {
1908*15dc779aSAndroid Build Coastguard Worker         ixheaace_mps_515_apply_lsb_coding(pstr_bit_buf, quant_data_lsb[1], 1, data_bands);
1909*15dc779aSAndroid Build Coastguard Worker       }
1910*15dc779aSAndroid Build Coastguard Worker     }
1911*15dc779aSAndroid Build Coastguard Worker   }
1912*15dc779aSAndroid Build Coastguard Worker 
1913*15dc779aSAndroid Build Coastguard Worker   return;
1914*15dc779aSAndroid Build Coastguard Worker }
1915