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