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 <limits.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stddef.h>
23*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
24*15dc779aSAndroid Build Coastguard Worker #include <string.h>
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
40*15dc779aSAndroid Build Coastguard Worker
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bits_count.h"
48*15dc779aSAndroid Build Coastguard Worker
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_dynamic_bits.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
51*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_calc_side_info_bits(WORD32 sfb_cnt,WORD32 block_type)52*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_calc_side_info_bits(WORD32 sfb_cnt, WORD32 block_type) {
53*15dc779aSAndroid Build Coastguard Worker WORD32 seg_len_bits = (block_type == SHORT_WINDOW ? 3 : 5);
54*15dc779aSAndroid Build Coastguard Worker WORD32 escape_val = (block_type == SHORT_WINDOW ? 7 : 31);
55*15dc779aSAndroid Build Coastguard Worker WORD32 side_info_bits, tmp;
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker side_info_bits = CODE_BCK_BITS;
58*15dc779aSAndroid Build Coastguard Worker tmp = sfb_cnt;
59*15dc779aSAndroid Build Coastguard Worker
60*15dc779aSAndroid Build Coastguard Worker while (tmp >= 0) {
61*15dc779aSAndroid Build Coastguard Worker side_info_bits += seg_len_bits;
62*15dc779aSAndroid Build Coastguard Worker tmp -= escape_val;
63*15dc779aSAndroid Build Coastguard Worker }
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker return (side_info_bits);
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_build_bit_look_up(const WORD16 * ptr_quant_spec,const WORD32 max_sfb,const WORD32 * ptr_sfb_offset,const UWORD16 * sfb_max,WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX+1],ixheaace_section_info * pstr_section_info,ixheaace_huffman_tables * pstr_huffman_tbl,WORD32 aot)68*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_build_bit_look_up(
69*15dc779aSAndroid Build Coastguard Worker const WORD16 *ptr_quant_spec, const WORD32 max_sfb, const WORD32 *ptr_sfb_offset,
70*15dc779aSAndroid Build Coastguard Worker const UWORD16 *sfb_max,
71*15dc779aSAndroid Build Coastguard Worker WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX + 1],
72*15dc779aSAndroid Build Coastguard Worker ixheaace_section_info *pstr_section_info, ixheaace_huffman_tables *pstr_huffman_tbl,
73*15dc779aSAndroid Build Coastguard Worker WORD32 aot) {
74*15dc779aSAndroid Build Coastguard Worker WORD8 i;
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < max_sfb; i++) {
77*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_width, max_val;
78*15dc779aSAndroid Build Coastguard Worker
79*15dc779aSAndroid Build Coastguard Worker pstr_section_info[i].sfb_cnt = 1;
80*15dc779aSAndroid Build Coastguard Worker pstr_section_info[i].sfb_start = i;
81*15dc779aSAndroid Build Coastguard Worker
82*15dc779aSAndroid Build Coastguard Worker switch (aot) {
83*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
84*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
85*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
86*15dc779aSAndroid Build Coastguard Worker pstr_section_info[i].section_bits = INVALID_BITCOUNT_LC;
87*15dc779aSAndroid Build Coastguard Worker break;
88*15dc779aSAndroid Build Coastguard Worker
89*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
90*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_ELD:
91*15dc779aSAndroid Build Coastguard Worker pstr_section_info[i].section_bits = INVALID_BITCOUNT_LD;
92*15dc779aSAndroid Build Coastguard Worker break;
93*15dc779aSAndroid Build Coastguard Worker }
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker pstr_section_info[i].code_book = -1;
96*15dc779aSAndroid Build Coastguard Worker
97*15dc779aSAndroid Build Coastguard Worker sfb_width = ptr_sfb_offset[i + 1] - ptr_sfb_offset[i];
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker max_val = sfb_max[i];
100*15dc779aSAndroid Build Coastguard Worker
101*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_bitcount(ptr_quant_spec + ptr_sfb_offset[i], sfb_width, max_val,
102*15dc779aSAndroid Build Coastguard Worker bit_look_up[i], pstr_huffman_tbl, aot);
103*15dc779aSAndroid Build Coastguard Worker }
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_find_best_book(const WORD32 * ptr_bit_cnt,WORD8 * ptr_codebook,WORD32 aot)106*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_find_best_book(const WORD32 *ptr_bit_cnt, WORD8 *ptr_codebook,
107*15dc779aSAndroid Build Coastguard Worker WORD32 aot) {
108*15dc779aSAndroid Build Coastguard Worker WORD32 min_bits = 0, temp1, temp2;
109*15dc779aSAndroid Build Coastguard Worker WORD8 temp_book = CODE_BCK_ESC_NDX;
110*15dc779aSAndroid Build Coastguard Worker WORD8 j;
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker switch (aot) {
113*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
114*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
115*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
116*15dc779aSAndroid Build Coastguard Worker min_bits = INVALID_BITCOUNT_LC;
117*15dc779aSAndroid Build Coastguard Worker break;
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
120*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_ELD:
121*15dc779aSAndroid Build Coastguard Worker min_bits = INVALID_BITCOUNT_LD;
122*15dc779aSAndroid Build Coastguard Worker break;
123*15dc779aSAndroid Build Coastguard Worker }
124*15dc779aSAndroid Build Coastguard Worker
125*15dc779aSAndroid Build Coastguard Worker for (j = 0; j <= CODE_BCK_ESC_NDX; j += 2) {
126*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_bit_cnt++;
127*15dc779aSAndroid Build Coastguard Worker temp2 = *ptr_bit_cnt++;
128*15dc779aSAndroid Build Coastguard Worker if (temp1 < min_bits) {
129*15dc779aSAndroid Build Coastguard Worker min_bits = temp1;
130*15dc779aSAndroid Build Coastguard Worker temp_book = j;
131*15dc779aSAndroid Build Coastguard Worker }
132*15dc779aSAndroid Build Coastguard Worker if (temp2 < min_bits) {
133*15dc779aSAndroid Build Coastguard Worker min_bits = temp2;
134*15dc779aSAndroid Build Coastguard Worker temp_book = j + 1;
135*15dc779aSAndroid Build Coastguard Worker }
136*15dc779aSAndroid Build Coastguard Worker }
137*15dc779aSAndroid Build Coastguard Worker
138*15dc779aSAndroid Build Coastguard Worker *ptr_codebook = temp_book;
139*15dc779aSAndroid Build Coastguard Worker return min_bits;
140*15dc779aSAndroid Build Coastguard Worker }
141*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_find_min_merge_bits(const WORD32 * ptr_bit_cnt1,const WORD32 * ptr_bit_cnt2,WORD32 aot)142*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_find_min_merge_bits(const WORD32 *ptr_bit_cnt1,
143*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_bit_cnt2, WORD32 aot) {
144*15dc779aSAndroid Build Coastguard Worker WORD32 min_bits = 0, j, temp1, temp2, temp3, temp4;
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker switch (aot) {
147*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
148*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
149*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
150*15dc779aSAndroid Build Coastguard Worker min_bits = INVALID_BITCOUNT_LC;
151*15dc779aSAndroid Build Coastguard Worker break;
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
154*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_ELD:
155*15dc779aSAndroid Build Coastguard Worker min_bits = INVALID_BITCOUNT_LD;
156*15dc779aSAndroid Build Coastguard Worker break;
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker
159*15dc779aSAndroid Build Coastguard Worker for (j = CODE_BCK_ESC_NDX; j >= 0; j -= 2) {
160*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_bit_cnt1++;
161*15dc779aSAndroid Build Coastguard Worker temp2 = *ptr_bit_cnt2++;
162*15dc779aSAndroid Build Coastguard Worker temp3 = *ptr_bit_cnt1++;
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker temp1 = temp1 + temp2;
165*15dc779aSAndroid Build Coastguard Worker
166*15dc779aSAndroid Build Coastguard Worker min_bits = MIN(temp1, min_bits);
167*15dc779aSAndroid Build Coastguard Worker temp4 = *ptr_bit_cnt2++;
168*15dc779aSAndroid Build Coastguard Worker temp1 = temp3 + temp4;
169*15dc779aSAndroid Build Coastguard Worker
170*15dc779aSAndroid Build Coastguard Worker min_bits = MIN(temp1, min_bits);
171*15dc779aSAndroid Build Coastguard Worker }
172*15dc779aSAndroid Build Coastguard Worker
173*15dc779aSAndroid Build Coastguard Worker return min_bits;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_merge_bit_look_up(WORD32 * ptr_bit_cnt1,const WORD32 * ptr_bit_cnt2,WORD32 aot)176*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_merge_bit_look_up(WORD32 *ptr_bit_cnt1, const WORD32 *ptr_bit_cnt2,
177*15dc779aSAndroid Build Coastguard Worker WORD32 aot) {
178*15dc779aSAndroid Build Coastguard Worker WORD32 j, temp1, temp2, temp3, temp4;
179*15dc779aSAndroid Build Coastguard Worker WORD32 invalid_bitcnt = 0;
180*15dc779aSAndroid Build Coastguard Worker
181*15dc779aSAndroid Build Coastguard Worker switch (aot) {
182*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
183*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
184*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
185*15dc779aSAndroid Build Coastguard Worker invalid_bitcnt = INVALID_BITCOUNT_LC;
186*15dc779aSAndroid Build Coastguard Worker break;
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
189*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_ELD:
190*15dc779aSAndroid Build Coastguard Worker invalid_bitcnt = INVALID_BITCOUNT_LD;
191*15dc779aSAndroid Build Coastguard Worker break;
192*15dc779aSAndroid Build Coastguard Worker }
193*15dc779aSAndroid Build Coastguard Worker for (j = 0; j <= CODE_BCK_ESC_NDX; j += 2) {
194*15dc779aSAndroid Build Coastguard Worker temp1 = ptr_bit_cnt1[j];
195*15dc779aSAndroid Build Coastguard Worker temp2 = ptr_bit_cnt2[j];
196*15dc779aSAndroid Build Coastguard Worker temp3 = ptr_bit_cnt1[j + 1];
197*15dc779aSAndroid Build Coastguard Worker
198*15dc779aSAndroid Build Coastguard Worker ptr_bit_cnt1[j] = MIN(temp1 + temp2, invalid_bitcnt);
199*15dc779aSAndroid Build Coastguard Worker temp4 = ptr_bit_cnt2[j + 1];
200*15dc779aSAndroid Build Coastguard Worker ptr_bit_cnt1[j + 1] = MIN(temp3 + temp4, invalid_bitcnt);
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker }
203*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_find_max_merge(const WORD32 merge_gain_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG],const ixheaace_section_info * section,const WORD32 max_sfb,WORD32 * max_ndx)204*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_find_max_merge(
205*15dc779aSAndroid Build Coastguard Worker const WORD32 merge_gain_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG],
206*15dc779aSAndroid Build Coastguard Worker const ixheaace_section_info *section, const WORD32 max_sfb, WORD32 *max_ndx) {
207*15dc779aSAndroid Build Coastguard Worker WORD32 i, max_merge_gain = 0;
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker for (i = 0; i + section[i].sfb_cnt < max_sfb; i += section[i].sfb_cnt) {
210*15dc779aSAndroid Build Coastguard Worker if (merge_gain_look_up[i] > max_merge_gain) {
211*15dc779aSAndroid Build Coastguard Worker max_merge_gain = merge_gain_look_up[i];
212*15dc779aSAndroid Build Coastguard Worker *max_ndx = i;
213*15dc779aSAndroid Build Coastguard Worker }
214*15dc779aSAndroid Build Coastguard Worker }
215*15dc779aSAndroid Build Coastguard Worker
216*15dc779aSAndroid Build Coastguard Worker return (max_merge_gain);
217*15dc779aSAndroid Build Coastguard Worker }
218*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_calc_merge_gain(const ixheaace_section_info * pstr_section_info,WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX+1],const WORD32 * pstr_side_info_tab,const WORD32 idx1,const WORD32 idx2,WORD32 aot)219*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_calc_merge_gain(
220*15dc779aSAndroid Build Coastguard Worker const ixheaace_section_info *pstr_section_info,
221*15dc779aSAndroid Build Coastguard Worker WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX + 1],
222*15dc779aSAndroid Build Coastguard Worker const WORD32 *pstr_side_info_tab, const WORD32 idx1, const WORD32 idx2, WORD32 aot) {
223*15dc779aSAndroid Build Coastguard Worker WORD32 split_bits;
224*15dc779aSAndroid Build Coastguard Worker WORD32 merge_bits;
225*15dc779aSAndroid Build Coastguard Worker WORD32 merge_gain;
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker split_bits = pstr_section_info[idx1].section_bits + pstr_section_info[idx2].section_bits;
228*15dc779aSAndroid Build Coastguard Worker
229*15dc779aSAndroid Build Coastguard Worker merge_bits =
230*15dc779aSAndroid Build Coastguard Worker pstr_side_info_tab[pstr_section_info[idx1].sfb_cnt + pstr_section_info[idx2].sfb_cnt] +
231*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_find_min_merge_bits(bit_look_up[idx1], bit_look_up[idx2], aot);
232*15dc779aSAndroid Build Coastguard Worker
233*15dc779aSAndroid Build Coastguard Worker merge_gain = split_bits - merge_bits;
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker return merge_gain;
236*15dc779aSAndroid Build Coastguard Worker }
237*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_gm_stage0(ixheaace_section_info * pstr_section,WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX+1],const WORD32 max_sfb,WORD32 aot)238*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_gm_stage0(
239*15dc779aSAndroid Build Coastguard Worker ixheaace_section_info *pstr_section,
240*15dc779aSAndroid Build Coastguard Worker WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX + 1],
241*15dc779aSAndroid Build Coastguard Worker const WORD32 max_sfb, WORD32 aot) {
242*15dc779aSAndroid Build Coastguard Worker WORD32 i = 0;
243*15dc779aSAndroid Build Coastguard Worker WORD32 invalid_bitcnt = 0;
244*15dc779aSAndroid Build Coastguard Worker
245*15dc779aSAndroid Build Coastguard Worker switch (aot) {
246*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
247*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
248*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
249*15dc779aSAndroid Build Coastguard Worker invalid_bitcnt = INVALID_BITCOUNT_LC;
250*15dc779aSAndroid Build Coastguard Worker break;
251*15dc779aSAndroid Build Coastguard Worker
252*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
253*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_ELD:
254*15dc779aSAndroid Build Coastguard Worker
255*15dc779aSAndroid Build Coastguard Worker invalid_bitcnt = INVALID_BITCOUNT_LD;
256*15dc779aSAndroid Build Coastguard Worker break;
257*15dc779aSAndroid Build Coastguard Worker }
258*15dc779aSAndroid Build Coastguard Worker while (i < max_sfb) {
259*15dc779aSAndroid Build Coastguard Worker if (pstr_section[i].section_bits == invalid_bitcnt) {
260*15dc779aSAndroid Build Coastguard Worker pstr_section[i].section_bits = (WORD16)ia_enhaacplus_enc_find_best_book(
261*15dc779aSAndroid Build Coastguard Worker bit_look_up[i], &(pstr_section[i].code_book), aot);
262*15dc779aSAndroid Build Coastguard Worker }
263*15dc779aSAndroid Build Coastguard Worker i++;
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker }
266*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_gm_stage1(ixheaace_section_info * pstr_section_info,WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX+1],const WORD32 max_sfb,const WORD32 * ptr_side_info_tab,WORD32 aot)267*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_gm_stage1(
268*15dc779aSAndroid Build Coastguard Worker ixheaace_section_info *pstr_section_info,
269*15dc779aSAndroid Build Coastguard Worker WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX + 1],
270*15dc779aSAndroid Build Coastguard Worker const WORD32 max_sfb, const WORD32 *ptr_side_info_tab, WORD32 aot) {
271*15dc779aSAndroid Build Coastguard Worker WORD32 merge_start = 0, merge_end;
272*15dc779aSAndroid Build Coastguard Worker
273*15dc779aSAndroid Build Coastguard Worker do {
274*15dc779aSAndroid Build Coastguard Worker for (merge_end = merge_start + 1; merge_end < max_sfb; merge_end++) {
275*15dc779aSAndroid Build Coastguard Worker if (pstr_section_info[merge_start].code_book != pstr_section_info[merge_end].code_book) {
276*15dc779aSAndroid Build Coastguard Worker break;
277*15dc779aSAndroid Build Coastguard Worker }
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker pstr_section_info[merge_start].sfb_cnt++;
280*15dc779aSAndroid Build Coastguard Worker
281*15dc779aSAndroid Build Coastguard Worker pstr_section_info[merge_start].section_bits += pstr_section_info[merge_end].section_bits;
282*15dc779aSAndroid Build Coastguard Worker
283*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_merge_bit_look_up(bit_look_up[merge_start], bit_look_up[merge_end], aot);
284*15dc779aSAndroid Build Coastguard Worker }
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker pstr_section_info[merge_start].section_bits +=
287*15dc779aSAndroid Build Coastguard Worker (WORD16)ptr_side_info_tab[pstr_section_info[merge_start].sfb_cnt];
288*15dc779aSAndroid Build Coastguard Worker
289*15dc779aSAndroid Build Coastguard Worker pstr_section_info[merge_end - 1].sfb_start = pstr_section_info[merge_start].sfb_start;
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker merge_start = merge_end;
292*15dc779aSAndroid Build Coastguard Worker
293*15dc779aSAndroid Build Coastguard Worker } while (merge_start < max_sfb);
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_gm_stage2(ixheaace_section_info * pstr_section_info,WORD32 merge_gain_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG],WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX+1],const WORD32 max_sfb,const WORD32 * ptr_side_info_tab,WORD32 aot)296*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_gm_stage2(
297*15dc779aSAndroid Build Coastguard Worker ixheaace_section_info *pstr_section_info,
298*15dc779aSAndroid Build Coastguard Worker WORD32 merge_gain_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG],
299*15dc779aSAndroid Build Coastguard Worker WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX + 1],
300*15dc779aSAndroid Build Coastguard Worker const WORD32 max_sfb, const WORD32 *ptr_side_info_tab, WORD32 aot) {
301*15dc779aSAndroid Build Coastguard Worker WORD32 i;
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker for (i = 0; i + pstr_section_info[i].sfb_cnt < max_sfb; i += pstr_section_info[i].sfb_cnt) {
304*15dc779aSAndroid Build Coastguard Worker merge_gain_look_up[i] =
305*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_calc_merge_gain(pstr_section_info, bit_look_up, ptr_side_info_tab, i,
306*15dc779aSAndroid Build Coastguard Worker i + pstr_section_info[i].sfb_cnt, aot);
307*15dc779aSAndroid Build Coastguard Worker }
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker while (TRUE) {
310*15dc779aSAndroid Build Coastguard Worker WORD32 max_merge_gain = 0, max_idx = 0, max_idx_next = 0, max_idx_last = 0;
311*15dc779aSAndroid Build Coastguard Worker
312*15dc779aSAndroid Build Coastguard Worker max_merge_gain = ia_enhaacplus_enc_find_max_merge(merge_gain_look_up, pstr_section_info,
313*15dc779aSAndroid Build Coastguard Worker max_sfb, &max_idx);
314*15dc779aSAndroid Build Coastguard Worker
315*15dc779aSAndroid Build Coastguard Worker if (max_merge_gain <= 0) {
316*15dc779aSAndroid Build Coastguard Worker break;
317*15dc779aSAndroid Build Coastguard Worker }
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker max_idx_next = max_idx + pstr_section_info[max_idx].sfb_cnt;
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker pstr_section_info[max_idx].sfb_cnt += pstr_section_info[max_idx_next].sfb_cnt;
322*15dc779aSAndroid Build Coastguard Worker
323*15dc779aSAndroid Build Coastguard Worker pstr_section_info[max_idx].section_bits +=
324*15dc779aSAndroid Build Coastguard Worker pstr_section_info[max_idx_next].section_bits - (WORD16)max_merge_gain;
325*15dc779aSAndroid Build Coastguard Worker
326*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_merge_bit_look_up(bit_look_up[max_idx], bit_look_up[max_idx_next], aot);
327*15dc779aSAndroid Build Coastguard Worker
328*15dc779aSAndroid Build Coastguard Worker if (max_idx != 0) {
329*15dc779aSAndroid Build Coastguard Worker max_idx_last = pstr_section_info[max_idx - 1].sfb_start;
330*15dc779aSAndroid Build Coastguard Worker
331*15dc779aSAndroid Build Coastguard Worker merge_gain_look_up[max_idx_last] = ia_enhaacplus_enc_calc_merge_gain(
332*15dc779aSAndroid Build Coastguard Worker pstr_section_info, bit_look_up, ptr_side_info_tab, max_idx_last, max_idx, aot);
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker
335*15dc779aSAndroid Build Coastguard Worker max_idx_next = max_idx + pstr_section_info[max_idx].sfb_cnt;
336*15dc779aSAndroid Build Coastguard Worker
337*15dc779aSAndroid Build Coastguard Worker pstr_section_info[max_idx_next - 1].sfb_start = pstr_section_info[max_idx].sfb_start;
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker if (max_idx_next < max_sfb) {
340*15dc779aSAndroid Build Coastguard Worker merge_gain_look_up[max_idx] = ia_enhaacplus_enc_calc_merge_gain(
341*15dc779aSAndroid Build Coastguard Worker pstr_section_info, bit_look_up, ptr_side_info_tab, max_idx, max_idx_next, aot);
342*15dc779aSAndroid Build Coastguard Worker }
343*15dc779aSAndroid Build Coastguard Worker }
344*15dc779aSAndroid Build Coastguard Worker }
345*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_noiseless_counter(ixheaace_section_data * pstr_section_data,WORD32 merge_gain_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG],WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX+1],const WORD16 * ptr_quant_spec,const UWORD16 * ptr_max_val_in_sfb,const WORD32 * ptr_sfb_offset,const WORD32 block_type,WORD32 * ptr_side_info_tab_long,WORD32 * ptr_side_info_tab_short,ixheaace_huffman_tables * pstr_huffman_tbl,WORD32 aot)346*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_noiseless_counter(
347*15dc779aSAndroid Build Coastguard Worker ixheaace_section_data *pstr_section_data,
348*15dc779aSAndroid Build Coastguard Worker WORD32 merge_gain_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG],
349*15dc779aSAndroid Build Coastguard Worker WORD32 bit_look_up[MAXIMUM_SCALE_FACTOR_BAND_LONG][CODE_BCK_ESC_NDX + 1],
350*15dc779aSAndroid Build Coastguard Worker const WORD16 *ptr_quant_spec, const UWORD16 *ptr_max_val_in_sfb, const WORD32 *ptr_sfb_offset,
351*15dc779aSAndroid Build Coastguard Worker const WORD32 block_type, WORD32 *ptr_side_info_tab_long, WORD32 *ptr_side_info_tab_short,
352*15dc779aSAndroid Build Coastguard Worker ixheaace_huffman_tables *pstr_huffman_tbl, WORD32 aot) {
353*15dc779aSAndroid Build Coastguard Worker WORD32 grp_idx;
354*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_side_info_tab = 0;
355*15dc779aSAndroid Build Coastguard Worker ixheaace_section_info *pstr_section_info;
356*15dc779aSAndroid Build Coastguard Worker WORD32 i;
357*15dc779aSAndroid Build Coastguard Worker
358*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAXIMUM_SCALE_FACTOR_BAND_LONG; i++) {
359*15dc779aSAndroid Build Coastguard Worker memset(bit_look_up[i], 0, (CODE_BCK_ESC_NDX + 1) * sizeof(bit_look_up[0][0]));
360*15dc779aSAndroid Build Coastguard Worker }
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker /* counting previous operations */
363*15dc779aSAndroid Build Coastguard Worker switch (block_type) {
364*15dc779aSAndroid Build Coastguard Worker case LONG_WINDOW:
365*15dc779aSAndroid Build Coastguard Worker case START_WINDOW:
366*15dc779aSAndroid Build Coastguard Worker case STOP_WINDOW:
367*15dc779aSAndroid Build Coastguard Worker
368*15dc779aSAndroid Build Coastguard Worker ptr_side_info_tab = ptr_side_info_tab_long;
369*15dc779aSAndroid Build Coastguard Worker break;
370*15dc779aSAndroid Build Coastguard Worker case SHORT_WINDOW:
371*15dc779aSAndroid Build Coastguard Worker
372*15dc779aSAndroid Build Coastguard Worker ptr_side_info_tab = ptr_side_info_tab_short;
373*15dc779aSAndroid Build Coastguard Worker break;
374*15dc779aSAndroid Build Coastguard Worker default:
375*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_INVALID_BLOCK_TYPE;
376*15dc779aSAndroid Build Coastguard Worker }
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker pstr_section_data->num_of_sections = 0;
379*15dc779aSAndroid Build Coastguard Worker pstr_section_data->huffman_bits = 0;
380*15dc779aSAndroid Build Coastguard Worker pstr_section_data->side_info_bits = 0;
381*15dc779aSAndroid Build Coastguard Worker
382*15dc779aSAndroid Build Coastguard Worker if (pstr_section_data->max_sfb_per_grp == 0) {
383*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
384*15dc779aSAndroid Build Coastguard Worker }
385*15dc779aSAndroid Build Coastguard Worker
386*15dc779aSAndroid Build Coastguard Worker for (grp_idx = 0; grp_idx < pstr_section_data->sfb_cnt;
387*15dc779aSAndroid Build Coastguard Worker grp_idx += pstr_section_data->sfb_per_group) {
388*15dc779aSAndroid Build Coastguard Worker pstr_section_info = pstr_section_data->section + pstr_section_data->num_of_sections;
389*15dc779aSAndroid Build Coastguard Worker
390*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_build_bit_look_up(ptr_quant_spec, pstr_section_data->max_sfb_per_grp,
391*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset + grp_idx, ptr_max_val_in_sfb + grp_idx,
392*15dc779aSAndroid Build Coastguard Worker bit_look_up, pstr_section_info, pstr_huffman_tbl, aot);
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_gm_stage0(pstr_section_info, bit_look_up,
395*15dc779aSAndroid Build Coastguard Worker pstr_section_data->max_sfb_per_grp, aot);
396*15dc779aSAndroid Build Coastguard Worker
397*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_gm_stage1(pstr_section_info, bit_look_up,
398*15dc779aSAndroid Build Coastguard Worker pstr_section_data->max_sfb_per_grp, ptr_side_info_tab, aot);
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_gm_stage2(pstr_section_info, merge_gain_look_up, bit_look_up,
401*15dc779aSAndroid Build Coastguard Worker pstr_section_data->max_sfb_per_grp, ptr_side_info_tab, aot);
402*15dc779aSAndroid Build Coastguard Worker
403*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_section_data->max_sfb_per_grp; i += pstr_section_info[i].sfb_cnt) {
404*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_find_best_book(bit_look_up[i], &(pstr_section_info[i].code_book), aot);
405*15dc779aSAndroid Build Coastguard Worker
406*15dc779aSAndroid Build Coastguard Worker pstr_section_info[i].sfb_start += (WORD8)grp_idx;
407*15dc779aSAndroid Build Coastguard Worker
408*15dc779aSAndroid Build Coastguard Worker pstr_section_data->huffman_bits +=
409*15dc779aSAndroid Build Coastguard Worker pstr_section_info[i].section_bits - ptr_side_info_tab[pstr_section_info[i].sfb_cnt];
410*15dc779aSAndroid Build Coastguard Worker
411*15dc779aSAndroid Build Coastguard Worker pstr_section_data->side_info_bits += ptr_side_info_tab[pstr_section_info[i].sfb_cnt];
412*15dc779aSAndroid Build Coastguard Worker
413*15dc779aSAndroid Build Coastguard Worker pstr_section_data->section[pstr_section_data->num_of_sections++] = pstr_section_info[i];
414*15dc779aSAndroid Build Coastguard Worker }
415*15dc779aSAndroid Build Coastguard Worker }
416*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
417*15dc779aSAndroid Build Coastguard Worker }
418*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_bit_count_scalefactor_delta(WORD32 delta,ixheaace_huffman_tables * pstr_huffman_tbl)419*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_bit_count_scalefactor_delta(
420*15dc779aSAndroid Build Coastguard Worker WORD32 delta, ixheaace_huffman_tables *pstr_huffman_tbl) {
421*15dc779aSAndroid Build Coastguard Worker return pstr_huffman_tbl->huff_ltabscf[delta + CODE_BCK_SCF_LAV];
422*15dc779aSAndroid Build Coastguard Worker }
423*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_scf_count(const WORD16 * ptr_scale_fac,const UWORD16 * ptr_max_val_in_sfb,ixheaace_section_data * pstr_section_data,ixheaace_huffman_tables * pstr_huffman_tbl)424*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_scf_count(const WORD16 *ptr_scale_fac,
425*15dc779aSAndroid Build Coastguard Worker const UWORD16 *ptr_max_val_in_sfb,
426*15dc779aSAndroid Build Coastguard Worker ixheaace_section_data *pstr_section_data,
427*15dc779aSAndroid Build Coastguard Worker ixheaace_huffman_tables *pstr_huffman_tbl) {
428*15dc779aSAndroid Build Coastguard Worker WORD32 sect_idx1 = 0;
429*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_idx1 = 0;
430*15dc779aSAndroid Build Coastguard Worker WORD32 scf_idx = 0;
431*15dc779aSAndroid Build Coastguard Worker WORD32 sect_idx2 = 0;
432*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_idx2 = 0;
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker WORD32 last_val_scf = 0;
435*15dc779aSAndroid Build Coastguard Worker WORD32 delta_scf = 0;
436*15dc779aSAndroid Build Coastguard Worker WORD32 found = 0;
437*15dc779aSAndroid Build Coastguard Worker WORD32 scf_skip_counter = 0;
438*15dc779aSAndroid Build Coastguard Worker
439*15dc779aSAndroid Build Coastguard Worker pstr_section_data->scale_fac_bits = 0;
440*15dc779aSAndroid Build Coastguard Worker
441*15dc779aSAndroid Build Coastguard Worker if (ptr_scale_fac == 0) {
442*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_INVALID_SCALE_FACTOR_GAIN;
443*15dc779aSAndroid Build Coastguard Worker }
444*15dc779aSAndroid Build Coastguard Worker last_val_scf = 0;
445*15dc779aSAndroid Build Coastguard Worker pstr_section_data->first_scf = 0;
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker for (sect_idx1 = 0; sect_idx1 < pstr_section_data->num_of_sections; sect_idx1++) {
448*15dc779aSAndroid Build Coastguard Worker if (pstr_section_data->section[sect_idx1].code_book != CODE_BCK_ZERO_NO) {
449*15dc779aSAndroid Build Coastguard Worker pstr_section_data->first_scf = pstr_section_data->section[sect_idx1].sfb_start;
450*15dc779aSAndroid Build Coastguard Worker
451*15dc779aSAndroid Build Coastguard Worker last_val_scf = ptr_scale_fac[pstr_section_data->first_scf];
452*15dc779aSAndroid Build Coastguard Worker break;
453*15dc779aSAndroid Build Coastguard Worker }
454*15dc779aSAndroid Build Coastguard Worker }
455*15dc779aSAndroid Build Coastguard Worker
456*15dc779aSAndroid Build Coastguard Worker for (sect_idx1 = 0; sect_idx1 < pstr_section_data->num_of_sections; sect_idx1++) {
457*15dc779aSAndroid Build Coastguard Worker if ((pstr_section_data->section[sect_idx1].code_book != CODE_BCK_ZERO_NO) &&
458*15dc779aSAndroid Build Coastguard Worker (pstr_section_data->section[sect_idx1].code_book != CODE_BCK_PNS_NO)) {
459*15dc779aSAndroid Build Coastguard Worker for (sfb_idx1 = pstr_section_data->section[sect_idx1].sfb_start;
460*15dc779aSAndroid Build Coastguard Worker sfb_idx1 < pstr_section_data->section[sect_idx1].sfb_start +
461*15dc779aSAndroid Build Coastguard Worker pstr_section_data->section[sect_idx1].sfb_cnt;
462*15dc779aSAndroid Build Coastguard Worker sfb_idx1++) {
463*15dc779aSAndroid Build Coastguard Worker if (ptr_max_val_in_sfb[sfb_idx1] == 0) {
464*15dc779aSAndroid Build Coastguard Worker found = 0;
465*15dc779aSAndroid Build Coastguard Worker
466*15dc779aSAndroid Build Coastguard Worker if (scf_skip_counter == 0) {
467*15dc779aSAndroid Build Coastguard Worker if (sfb_idx1 == (pstr_section_data->section[sect_idx1].sfb_start +
468*15dc779aSAndroid Build Coastguard Worker pstr_section_data->section[sect_idx1].sfb_cnt - 1)) {
469*15dc779aSAndroid Build Coastguard Worker found = 0;
470*15dc779aSAndroid Build Coastguard Worker } else {
471*15dc779aSAndroid Build Coastguard Worker for (scf_idx = (sfb_idx1 + 1);
472*15dc779aSAndroid Build Coastguard Worker scf_idx < pstr_section_data->section[sect_idx1].sfb_start +
473*15dc779aSAndroid Build Coastguard Worker pstr_section_data->section[sect_idx1].sfb_cnt;
474*15dc779aSAndroid Build Coastguard Worker scf_idx++) {
475*15dc779aSAndroid Build Coastguard Worker if (ptr_max_val_in_sfb[scf_idx] != 0) {
476*15dc779aSAndroid Build Coastguard Worker found = 1;
477*15dc779aSAndroid Build Coastguard Worker
478*15dc779aSAndroid Build Coastguard Worker if ((abs32(ptr_scale_fac[scf_idx] - last_val_scf)) < CODE_BCK_SCF_LAV) {
479*15dc779aSAndroid Build Coastguard Worker delta_scf = 0;
480*15dc779aSAndroid Build Coastguard Worker } else {
481*15dc779aSAndroid Build Coastguard Worker delta_scf = -(ptr_scale_fac[sfb_idx1] - last_val_scf);
482*15dc779aSAndroid Build Coastguard Worker
483*15dc779aSAndroid Build Coastguard Worker last_val_scf = ptr_scale_fac[sfb_idx1];
484*15dc779aSAndroid Build Coastguard Worker scf_skip_counter = 0;
485*15dc779aSAndroid Build Coastguard Worker }
486*15dc779aSAndroid Build Coastguard Worker break;
487*15dc779aSAndroid Build Coastguard Worker }
488*15dc779aSAndroid Build Coastguard Worker /* count scalefactor skip */
489*15dc779aSAndroid Build Coastguard Worker scf_skip_counter = scf_skip_counter + 1;
490*15dc779aSAndroid Build Coastguard Worker }
491*15dc779aSAndroid Build Coastguard Worker }
492*15dc779aSAndroid Build Coastguard Worker
493*15dc779aSAndroid Build Coastguard Worker /* search for the next ptr_max_val_in_sfb[] != 0 in all other sections */
494*15dc779aSAndroid Build Coastguard Worker for (sect_idx2 = (sect_idx1 + 1);
495*15dc779aSAndroid Build Coastguard Worker (sect_idx2 < pstr_section_data->num_of_sections) && (found == 0); sect_idx2++) {
496*15dc779aSAndroid Build Coastguard Worker if ((pstr_section_data->section[sect_idx2].code_book != CODE_BCK_ZERO_NO) &&
497*15dc779aSAndroid Build Coastguard Worker (pstr_section_data->section[sect_idx2].code_book != CODE_BCK_PNS_NO)) {
498*15dc779aSAndroid Build Coastguard Worker for (sfb_idx2 = pstr_section_data->section[sect_idx2].sfb_start;
499*15dc779aSAndroid Build Coastguard Worker sfb_idx2 < pstr_section_data->section[sect_idx2].sfb_start +
500*15dc779aSAndroid Build Coastguard Worker pstr_section_data->section[sect_idx2].sfb_cnt;
501*15dc779aSAndroid Build Coastguard Worker sfb_idx2++) {
502*15dc779aSAndroid Build Coastguard Worker if (ptr_max_val_in_sfb[sfb_idx2] != 0) {
503*15dc779aSAndroid Build Coastguard Worker found = 1;
504*15dc779aSAndroid Build Coastguard Worker
505*15dc779aSAndroid Build Coastguard Worker if ((abs32(ptr_scale_fac[sfb_idx2] - last_val_scf)) < CODE_BCK_SCF_LAV) {
506*15dc779aSAndroid Build Coastguard Worker delta_scf = 0;
507*15dc779aSAndroid Build Coastguard Worker } else {
508*15dc779aSAndroid Build Coastguard Worker delta_scf = -(ptr_scale_fac[sfb_idx1] - last_val_scf);
509*15dc779aSAndroid Build Coastguard Worker
510*15dc779aSAndroid Build Coastguard Worker last_val_scf = ptr_scale_fac[sfb_idx1];
511*15dc779aSAndroid Build Coastguard Worker scf_skip_counter = 0;
512*15dc779aSAndroid Build Coastguard Worker }
513*15dc779aSAndroid Build Coastguard Worker break;
514*15dc779aSAndroid Build Coastguard Worker }
515*15dc779aSAndroid Build Coastguard Worker
516*15dc779aSAndroid Build Coastguard Worker scf_skip_counter = scf_skip_counter + 1;
517*15dc779aSAndroid Build Coastguard Worker }
518*15dc779aSAndroid Build Coastguard Worker }
519*15dc779aSAndroid Build Coastguard Worker }
520*15dc779aSAndroid Build Coastguard Worker
521*15dc779aSAndroid Build Coastguard Worker if (found == 0) {
522*15dc779aSAndroid Build Coastguard Worker delta_scf = 0;
523*15dc779aSAndroid Build Coastguard Worker scf_skip_counter = 0;
524*15dc779aSAndroid Build Coastguard Worker }
525*15dc779aSAndroid Build Coastguard Worker } else {
526*15dc779aSAndroid Build Coastguard Worker delta_scf = 0;
527*15dc779aSAndroid Build Coastguard Worker
528*15dc779aSAndroid Build Coastguard Worker scf_skip_counter = scf_skip_counter - 1;
529*15dc779aSAndroid Build Coastguard Worker }
530*15dc779aSAndroid Build Coastguard Worker } else {
531*15dc779aSAndroid Build Coastguard Worker delta_scf = -(ptr_scale_fac[sfb_idx1] - last_val_scf);
532*15dc779aSAndroid Build Coastguard Worker
533*15dc779aSAndroid Build Coastguard Worker last_val_scf = ptr_scale_fac[sfb_idx1];
534*15dc779aSAndroid Build Coastguard Worker }
535*15dc779aSAndroid Build Coastguard Worker
536*15dc779aSAndroid Build Coastguard Worker pstr_section_data->scale_fac_bits +=
537*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_bit_count_scalefactor_delta(delta_scf, pstr_huffman_tbl);
538*15dc779aSAndroid Build Coastguard Worker }
539*15dc779aSAndroid Build Coastguard Worker }
540*15dc779aSAndroid Build Coastguard Worker }
541*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
542*15dc779aSAndroid Build Coastguard Worker }
543*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_dyn_bitcount(const WORD16 * ptr_quant_spec,const UWORD16 * ptr_max_val_in_sfb,const WORD16 * ptr_scale_fac,const WORD32 block_type,const WORD32 sfb_cnt,const WORD32 max_sfb_per_grp,const WORD32 sfb_per_grp,const WORD32 * ptr_sfb_offset,ixheaace_section_data * pstr_section_data,WORD32 * ptr_side_info_tab_long,WORD32 * ptr_side_info_tab_short,ixheaace_huffman_tables * ptr_huffman_tbl,WORD32 * ptr_scratch_buf,WORD32 aot,WORD32 * bit_cnt)544*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_dyn_bitcount(
545*15dc779aSAndroid Build Coastguard Worker const WORD16 *ptr_quant_spec, const UWORD16 *ptr_max_val_in_sfb, const WORD16 *ptr_scale_fac,
546*15dc779aSAndroid Build Coastguard Worker const WORD32 block_type, const WORD32 sfb_cnt, const WORD32 max_sfb_per_grp,
547*15dc779aSAndroid Build Coastguard Worker const WORD32 sfb_per_grp, const WORD32 *ptr_sfb_offset,
548*15dc779aSAndroid Build Coastguard Worker ixheaace_section_data *pstr_section_data, WORD32 *ptr_side_info_tab_long,
549*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_side_info_tab_short, ixheaace_huffman_tables *ptr_huffman_tbl,
550*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_scratch_buf, WORD32 aot, WORD32 *bit_cnt) {
551*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code;
552*15dc779aSAndroid Build Coastguard Worker WORD32(*ptr_bit_look_up)
553*15dc779aSAndroid Build Coastguard Worker [CODE_BCK_ESC_NDX + 1] = (WORD32(*)[CODE_BCK_ESC_NDX + 1]) ptr_scratch_buf;
554*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_merge_gain_look_up =
555*15dc779aSAndroid Build Coastguard Worker ptr_scratch_buf + MAXIMUM_SCALE_FACTOR_BAND_LONG * (CODE_BCK_ESC_NDX + 1);
556*15dc779aSAndroid Build Coastguard Worker *bit_cnt = 0;
557*15dc779aSAndroid Build Coastguard Worker pstr_section_data->block_type = block_type;
558*15dc779aSAndroid Build Coastguard Worker pstr_section_data->sfb_cnt = sfb_cnt;
559*15dc779aSAndroid Build Coastguard Worker pstr_section_data->sfb_per_group = sfb_per_grp;
560*15dc779aSAndroid Build Coastguard Worker
561*15dc779aSAndroid Build Coastguard Worker pstr_section_data->total_groups_cnt = sfb_cnt / sfb_per_grp;
562*15dc779aSAndroid Build Coastguard Worker
563*15dc779aSAndroid Build Coastguard Worker pstr_section_data->max_sfb_per_grp = max_sfb_per_grp;
564*15dc779aSAndroid Build Coastguard Worker
565*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_noiseless_counter(
566*15dc779aSAndroid Build Coastguard Worker pstr_section_data, ptr_merge_gain_look_up, ptr_bit_look_up, ptr_quant_spec,
567*15dc779aSAndroid Build Coastguard Worker ptr_max_val_in_sfb, ptr_sfb_offset, block_type, ptr_side_info_tab_long,
568*15dc779aSAndroid Build Coastguard Worker ptr_side_info_tab_short, ptr_huffman_tbl, aot);
569*15dc779aSAndroid Build Coastguard Worker
570*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
571*15dc779aSAndroid Build Coastguard Worker return err_code;
572*15dc779aSAndroid Build Coastguard Worker }
573*15dc779aSAndroid Build Coastguard Worker
574*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_scf_count(ptr_scale_fac, ptr_max_val_in_sfb, pstr_section_data,
575*15dc779aSAndroid Build Coastguard Worker ptr_huffman_tbl);
576*15dc779aSAndroid Build Coastguard Worker
577*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
578*15dc779aSAndroid Build Coastguard Worker return err_code;
579*15dc779aSAndroid Build Coastguard Worker }
580*15dc779aSAndroid Build Coastguard Worker
581*15dc779aSAndroid Build Coastguard Worker *bit_cnt = (pstr_section_data->huffman_bits + pstr_section_data->side_info_bits +
582*15dc779aSAndroid Build Coastguard Worker pstr_section_data->scale_fac_bits);
583*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
584*15dc779aSAndroid Build Coastguard Worker }
585*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_bitcount_init(WORD32 * side_info_tab_long,WORD32 * side_info_tab_short)586*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_bitcount_init(WORD32 *side_info_tab_long, WORD32 *side_info_tab_short) {
587*15dc779aSAndroid Build Coastguard Worker WORD32 i;
588*15dc779aSAndroid Build Coastguard Worker
589*15dc779aSAndroid Build Coastguard Worker /* side_info_tab_long[] */
590*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= MAXIMUM_SCALE_FACTOR_BAND_LONG; i++) {
591*15dc779aSAndroid Build Coastguard Worker side_info_tab_long[i] = ia_enhaacplus_enc_calc_side_info_bits(i, LONG_WINDOW);
592*15dc779aSAndroid Build Coastguard Worker }
593*15dc779aSAndroid Build Coastguard Worker
594*15dc779aSAndroid Build Coastguard Worker /* side_info_tab_short[] */
595*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= MAXIMUM_SCALE_FACTOR_BAND_SHORT; i++) {
596*15dc779aSAndroid Build Coastguard Worker side_info_tab_short[i] = ia_enhaacplus_enc_calc_side_info_bits(i, SHORT_WINDOW);
597*15dc779aSAndroid Build Coastguard Worker }
598*15dc779aSAndroid Build Coastguard Worker }
599