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 <stddef.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
25*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
26*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
36*15dc779aSAndroid Build Coastguard Worker
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_dynamic_bits.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_qc_data.h"
39*15dc779aSAndroid Build Coastguard Worker
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_channel_map.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_block_switch.h"
42*15dc779aSAndroid Build Coastguard Worker
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_data.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_interface.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_write_bitstream.h"
46*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_count_ms_mask_bits(WORD32 sfb_cnt,WORD32 sfb_per_group,WORD32 max_sfb_per_grp,ixheaace_tools_info * pstr_tools_info)47*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_count_ms_mask_bits(WORD32 sfb_cnt, WORD32 sfb_per_group,
48*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb_per_grp,
49*15dc779aSAndroid Build Coastguard Worker ixheaace_tools_info *pstr_tools_info) {
50*15dc779aSAndroid Build Coastguard Worker WORD32 ms_bits = 0, sfb_off;
51*15dc779aSAndroid Build Coastguard Worker
52*15dc779aSAndroid Build Coastguard Worker switch (pstr_tools_info->ms_digest) {
53*15dc779aSAndroid Build Coastguard Worker case MS_NONE:
54*15dc779aSAndroid Build Coastguard Worker case MS_ALL:
55*15dc779aSAndroid Build Coastguard Worker break;
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker case MS_SOME:
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker for (sfb_off = 0; sfb_off < sfb_cnt; sfb_off += sfb_per_group) {
60*15dc779aSAndroid Build Coastguard Worker ms_bits += max_sfb_per_grp;
61*15dc779aSAndroid Build Coastguard Worker }
62*15dc779aSAndroid Build Coastguard Worker break;
63*15dc779aSAndroid Build Coastguard Worker }
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker return ms_bits;
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_tns_count(ixheaace_temporal_noise_shaping_params * pstr_tns_info,WORD32 block_type)68*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_tns_count(ixheaace_temporal_noise_shaping_params *pstr_tns_info,
69*15dc779aSAndroid Build Coastguard Worker WORD32 block_type) {
70*15dc779aSAndroid Build Coastguard Worker WORD32 i, k;
71*15dc779aSAndroid Build Coastguard Worker WORD32 tns_present;
72*15dc779aSAndroid Build Coastguard Worker WORD32 num_windows;
73*15dc779aSAndroid Build Coastguard Worker WORD32 count;
74*15dc779aSAndroid Build Coastguard Worker WORD32 coef_bits;
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker count = 0;
77*15dc779aSAndroid Build Coastguard Worker num_windows = (block_type == 2 ? 8 : 1);
78*15dc779aSAndroid Build Coastguard Worker tns_present = 0;
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_windows; i++) {
81*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info->tns_active[i] == 1) {
82*15dc779aSAndroid Build Coastguard Worker tns_present = 1;
83*15dc779aSAndroid Build Coastguard Worker }
84*15dc779aSAndroid Build Coastguard Worker }
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker if (tns_present == 1) {
87*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_windows; i++) {
88*15dc779aSAndroid Build Coastguard Worker count += (block_type == SHORT_WINDOW ? 1 : 2);
89*15dc779aSAndroid Build Coastguard Worker
90*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info->tns_active[i]) {
91*15dc779aSAndroid Build Coastguard Worker count += (block_type == SHORT_WINDOW ? 8 : 12);
92*15dc779aSAndroid Build Coastguard Worker
93*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info->order[i]) {
94*15dc779aSAndroid Build Coastguard Worker count += 2; /*coef_compression */
95*15dc779aSAndroid Build Coastguard Worker
96*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info->coef_res[i] == 4) {
97*15dc779aSAndroid Build Coastguard Worker coef_bits = 3;
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_tns_info->order[i]; k++) {
100*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info->coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] > 3 ||
101*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] < -4) {
102*15dc779aSAndroid Build Coastguard Worker coef_bits = 4;
103*15dc779aSAndroid Build Coastguard Worker break;
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker }
106*15dc779aSAndroid Build Coastguard Worker } else {
107*15dc779aSAndroid Build Coastguard Worker coef_bits = 2;
108*15dc779aSAndroid Build Coastguard Worker
109*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_tns_info->order[i]; k++) {
110*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info->coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] > 1 ||
111*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] < -2) {
112*15dc779aSAndroid Build Coastguard Worker coef_bits = 3;
113*15dc779aSAndroid Build Coastguard Worker break;
114*15dc779aSAndroid Build Coastguard Worker }
115*15dc779aSAndroid Build Coastguard Worker }
116*15dc779aSAndroid Build Coastguard Worker }
117*15dc779aSAndroid Build Coastguard Worker
118*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_tns_info->order[i]; k++) {
119*15dc779aSAndroid Build Coastguard Worker count += coef_bits;
120*15dc779aSAndroid Build Coastguard Worker }
121*15dc779aSAndroid Build Coastguard Worker }
122*15dc779aSAndroid Build Coastguard Worker }
123*15dc779aSAndroid Build Coastguard Worker }
124*15dc779aSAndroid Build Coastguard Worker }
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker return count;
127*15dc779aSAndroid Build Coastguard Worker }
128*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_count_tns_bits(ixheaace_temporal_noise_shaping_params * pstr_tns_info,WORD32 block_type)129*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_count_tns_bits(
130*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_params *pstr_tns_info, WORD32 block_type) {
131*15dc779aSAndroid Build Coastguard Worker return (ia_enhaacplus_enc_tns_count(pstr_tns_info, block_type));
132*15dc779aSAndroid Build Coastguard Worker }
133*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_count_static_bitdemand(ixheaace_psy_out_channel ** psy_out_ch,ixheaace_psy_out_element * pstr_psy_out_element,WORD32 channels,WORD32 aot,WORD32 adts_flag,WORD32 stat_bits_flag,WORD32 flag_last_element)134*15dc779aSAndroid Build Coastguard Worker WORD32 ia_enhaacplus_enc_count_static_bitdemand(
135*15dc779aSAndroid Build Coastguard Worker ixheaace_psy_out_channel **psy_out_ch,
136*15dc779aSAndroid Build Coastguard Worker ixheaace_psy_out_element *pstr_psy_out_element, WORD32 channels, WORD32 aot, WORD32 adts_flag,
137*15dc779aSAndroid Build Coastguard Worker WORD32 stat_bits_flag, WORD32 flag_last_element) {
138*15dc779aSAndroid Build Coastguard Worker WORD32 static_bits = 0;
139*15dc779aSAndroid Build Coastguard Worker WORD32 ch;
140*15dc779aSAndroid Build Coastguard Worker
141*15dc779aSAndroid Build Coastguard Worker switch (channels) {
142*15dc779aSAndroid Build Coastguard Worker case 1:
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker static_bits += SI_ID_BITS + SI_SCE_BITS + SI_ICS_BITS;
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker static_bits += ia_enhaacplus_enc_count_tns_bits(&(psy_out_ch[0]->tns_info),
147*15dc779aSAndroid Build Coastguard Worker psy_out_ch[0]->window_sequence);
148*15dc779aSAndroid Build Coastguard Worker switch (psy_out_ch[0]->window_sequence) {
149*15dc779aSAndroid Build Coastguard Worker case LONG_WINDOW:
150*15dc779aSAndroid Build Coastguard Worker case START_WINDOW:
151*15dc779aSAndroid Build Coastguard Worker case STOP_WINDOW:
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker static_bits += SI_ICS_INFO_BITS_LONG;
154*15dc779aSAndroid Build Coastguard Worker break;
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker case SHORT_WINDOW:
157*15dc779aSAndroid Build Coastguard Worker
158*15dc779aSAndroid Build Coastguard Worker static_bits += SI_ICS_INFO_BITS_SHORT;
159*15dc779aSAndroid Build Coastguard Worker break;
160*15dc779aSAndroid Build Coastguard Worker }
161*15dc779aSAndroid Build Coastguard Worker break;
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker case 2:
164*15dc779aSAndroid Build Coastguard Worker static_bits += SI_ID_BITS + SI_CPE_BITS + 2 * SI_ICS_BITS;
165*15dc779aSAndroid Build Coastguard Worker
166*15dc779aSAndroid Build Coastguard Worker static_bits += SI_CPE_MS_MASK_BITS;
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker static_bits += ia_enhaacplus_enc_count_ms_mask_bits(
169*15dc779aSAndroid Build Coastguard Worker psy_out_ch[0]->sfb_count, psy_out_ch[0]->sfb_per_group, psy_out_ch[0]->max_sfb_per_grp,
170*15dc779aSAndroid Build Coastguard Worker &pstr_psy_out_element->tools_info);
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker switch (psy_out_ch[0]->window_sequence) {
173*15dc779aSAndroid Build Coastguard Worker case LONG_WINDOW:
174*15dc779aSAndroid Build Coastguard Worker case START_WINDOW:
175*15dc779aSAndroid Build Coastguard Worker case STOP_WINDOW:
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker static_bits += SI_ICS_INFO_BITS_LONG;
178*15dc779aSAndroid Build Coastguard Worker break;
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker case SHORT_WINDOW:
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker static_bits += SI_ICS_INFO_BITS_SHORT;
183*15dc779aSAndroid Build Coastguard Worker break;
184*15dc779aSAndroid Build Coastguard Worker }
185*15dc779aSAndroid Build Coastguard Worker
186*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < 2; ch++) {
187*15dc779aSAndroid Build Coastguard Worker static_bits += ia_enhaacplus_enc_count_tns_bits(&(psy_out_ch[ch]->tns_info),
188*15dc779aSAndroid Build Coastguard Worker psy_out_ch[ch]->window_sequence);
189*15dc779aSAndroid Build Coastguard Worker }
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker break;
192*15dc779aSAndroid Build Coastguard Worker }
193*15dc779aSAndroid Build Coastguard Worker
194*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
195*15dc779aSAndroid Build Coastguard Worker if (!(adts_flag)) {
196*15dc779aSAndroid Build Coastguard Worker return static_bits + stat_bits_flag * 8;
197*15dc779aSAndroid Build Coastguard Worker }
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker if (adts_flag && (stat_bits_flag) && (flag_last_element)) {
200*15dc779aSAndroid Build Coastguard Worker return static_bits + 56;
201*15dc779aSAndroid Build Coastguard Worker } else {
202*15dc779aSAndroid Build Coastguard Worker return static_bits;
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker } else {
205*15dc779aSAndroid Build Coastguard Worker return static_bits; // Default Case
206*15dc779aSAndroid Build Coastguard Worker }
207*15dc779aSAndroid Build Coastguard Worker }
208