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 <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <string.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 "impd_drc_common_enc.h"
26*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_fix.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_defines.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_buf.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_lib.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_main_structure.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_bitstream.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_onset_detect.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_filter.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_param_extract.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_static_gain.h"
46*15dc779aSAndroid Build Coastguard Worker
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_dmx_tdom_enh.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_tools_rom.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_qmf.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_struct_def.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_polyphase.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_hybfilter.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_spatial_bitstream.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_tree.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_rom.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_delay.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_frame_windowing.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_structure.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_memory.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_enc.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
64*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_space_get_num_qmf_bands(const UWORD32 num_sample_rate)65*15dc779aSAndroid Build Coastguard Worker static UWORD8 ixheaace_mps_212_space_get_num_qmf_bands(const UWORD32 num_sample_rate) {
66*15dc779aSAndroid Build Coastguard Worker UWORD8 num_qmf_bands = 0;
67*15dc779aSAndroid Build Coastguard Worker if (num_sample_rate < 27713)
68*15dc779aSAndroid Build Coastguard Worker num_qmf_bands = 32;
69*15dc779aSAndroid Build Coastguard Worker else if (num_sample_rate < 55426)
70*15dc779aSAndroid Build Coastguard Worker num_qmf_bands = 64;
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker return num_qmf_bands;
73*15dc779aSAndroid Build Coastguard Worker }
74*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_space_tree_open(ixheaace_mps_pstr_space_tree * pstr_ph_space_tree,ixheaace_mps_212_memory_struct * pstr_mps_memory)75*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_space_tree_open(ixheaace_mps_pstr_space_tree *pstr_ph_space_tree,
76*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_memory_struct *pstr_mps_memory) {
77*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_space_tree pstr_space_tree = NULL;
78*15dc779aSAndroid Build Coastguard Worker WORD32 box;
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker pstr_space_tree = &pstr_mps_memory->spacce_tree;
81*15dc779aSAndroid Build Coastguard Worker
82*15dc779aSAndroid Build Coastguard Worker for (box = 0; box < IXHEAACE_MPS_MAX_NUM_BOXES; box++) {
83*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_tto_box pstr_tto_box = NULL;
84*15dc779aSAndroid Build Coastguard Worker pstr_tto_box = &pstr_mps_memory->tto_box;
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker if (NULL != pstr_space_tree) {
87*15dc779aSAndroid Build Coastguard Worker pstr_space_tree->pstr_tto_box[box] = pstr_tto_box;
88*15dc779aSAndroid Build Coastguard Worker }
89*15dc779aSAndroid Build Coastguard Worker }
90*15dc779aSAndroid Build Coastguard Worker *pstr_ph_space_tree = pstr_space_tree;
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_init_num_param_bands(ixheaace_mps_pstr_space_structure pstr_space_enc,const WORD32 num_param_bands)93*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_init_num_param_bands(
94*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_space_structure pstr_space_enc, const WORD32 num_param_bands) {
95*15dc779aSAndroid Build Coastguard Worker WORD32 k = 0;
96*15dc779aSAndroid Build Coastguard Worker const WORD32 n = sizeof(valid_bands_ld) / sizeof(UWORD8);
97*15dc779aSAndroid Build Coastguard Worker const UWORD8 *p_bands = valid_bands_ld;
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker while (k < n && p_bands[k] != (UWORD8)num_param_bands) ++k;
100*15dc779aSAndroid Build Coastguard Worker if (k == n) {
101*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_param_bands = IXHEAACE_MPS_SAC_BANDS_INVALID;
102*15dc779aSAndroid Build Coastguard Worker } else {
103*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_param_bands = num_param_bands;
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker }
106*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_configure(ixheaace_mps_pstr_space_structure pstr_space_enc,const ixheaace_mps_pstr_spece_enc_setup pstr_h_set_up)107*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_configure(
108*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_space_structure pstr_space_enc,
109*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_pstr_spece_enc_setup pstr_h_set_up) {
110*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_sample_rate = pstr_h_set_up->sample_rate;
113*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_qmf_bands =
114*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_space_get_num_qmf_bands(pstr_space_enc->num_sample_rate);
115*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->time_alignment = pstr_h_set_up->time_alignment;
116*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->quant_mode = pstr_h_set_up->quant_mode;
117*15dc779aSAndroid Build Coastguard Worker
118*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->use_coarse_quant_cld = pstr_h_set_up->b_use_coarse_quant;
119*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->use_coarse_quant_cpc = pstr_h_set_up->b_use_coarse_quant;
120*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->use_frame_keep = (pstr_h_set_up->b_ld_mode == 2);
121*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->use_coarse_quant_icc = 0;
122*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->use_coarse_quant_arb_dmx = 0;
123*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_factor = pstr_h_set_up->independency_factor;
124*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_count = 0;
125*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_flag = 1;
126*15dc779aSAndroid Build Coastguard Worker
127*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_hybrid_bands = pstr_space_enc->num_qmf_bands;
128*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_frame_time_slots = pstr_h_set_up->frame_time_slots;
129*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_init_num_param_bands(pstr_space_enc, pstr_h_set_up->num_param_bands);
130*15dc779aSAndroid Build Coastguard Worker
131*15dc779aSAndroid Build Coastguard Worker return error;
132*15dc779aSAndroid Build Coastguard Worker }
133*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_get_analysis_length_time_slots(FLOAT32 * ptr_frame_window_ana,WORD32 num_time_slots)134*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_212_get_analysis_length_time_slots(FLOAT32 *ptr_frame_window_ana,
135*15dc779aSAndroid Build Coastguard Worker WORD32 num_time_slots) {
136*15dc779aSAndroid Build Coastguard Worker WORD32 i;
137*15dc779aSAndroid Build Coastguard Worker for (i = num_time_slots - 1; i >= 0; i--) {
138*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_window_ana[i] != 0) {
139*15dc779aSAndroid Build Coastguard Worker break;
140*15dc779aSAndroid Build Coastguard Worker }
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker num_time_slots = i + 1;
143*15dc779aSAndroid Build Coastguard Worker return num_time_slots;
144*15dc779aSAndroid Build Coastguard Worker }
145*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_get_analysis_start_time_slot(FLOAT32 * ptr_frame_window_ana,WORD32 num_time_slots)146*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_212_get_analysis_start_time_slot(FLOAT32 *ptr_frame_window_ana,
147*15dc779aSAndroid Build Coastguard Worker WORD32 num_time_slots) {
148*15dc779aSAndroid Build Coastguard Worker WORD32 start_time_slot = 0;
149*15dc779aSAndroid Build Coastguard Worker WORD32 i;
150*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_time_slots; i++) {
151*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_window_ana[i] != 0) {
152*15dc779aSAndroid Build Coastguard Worker break;
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker start_time_slot = i;
156*15dc779aSAndroid Build Coastguard Worker return start_time_slot;
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_memcpy_flex_pcm(FLOAT32 * const ptr_dst,const WORD32 dst_stride,const FLOAT32 * const ptr_src,const WORD32 src_stride,const WORD32 num_samples)159*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_memcpy_flex_pcm(FLOAT32 *const ptr_dst, const WORD32 dst_stride,
160*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const ptr_src,
161*15dc779aSAndroid Build Coastguard Worker const WORD32 src_stride, const WORD32 num_samples) {
162*15dc779aSAndroid Build Coastguard Worker WORD32 i;
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_samples; i++) {
165*15dc779aSAndroid Build Coastguard Worker ptr_dst[i * dst_stride] = ptr_src[i * src_stride];
166*15dc779aSAndroid Build Coastguard Worker }
167*15dc779aSAndroid Build Coastguard Worker }
168*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_feed_de_inter_pre_scale(ixheaace_mps_pstr_space_structure pstr_space_enc,FLOAT32 const * const ptr_samples,FLOAT32 * const ptr_output_samples,WORD32 const num_samples,UWORD32 const is_input_inter_leaved,UWORD32 const input_buffer_size_per_channel,UWORD32 * const ptr_n_samples_fed)169*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_feed_de_inter_pre_scale(
170*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_space_structure pstr_space_enc, FLOAT32 const *const ptr_samples,
171*15dc779aSAndroid Build Coastguard Worker FLOAT32 *const ptr_output_samples, WORD32 const num_samples,
172*15dc779aSAndroid Build Coastguard Worker UWORD32 const is_input_inter_leaved, UWORD32 const input_buffer_size_per_channel,
173*15dc779aSAndroid Build Coastguard Worker UWORD32 *const ptr_n_samples_fed) {
174*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
175*15dc779aSAndroid Build Coastguard Worker WORD32 ch;
176*15dc779aSAndroid Build Coastguard Worker const WORD32 num_ch_in = pstr_space_enc->n_input_channels;
177*15dc779aSAndroid Build Coastguard Worker const WORD32 num_ch_in_with_dmx = num_ch_in;
178*15dc779aSAndroid Build Coastguard Worker const WORD32 samples_to_feed =
179*15dc779aSAndroid Build Coastguard Worker MIN(num_samples, pstr_space_enc->n_samples_next - pstr_space_enc->n_samples_valid);
180*15dc779aSAndroid Build Coastguard Worker const WORD32 num_samples_per_channel = samples_to_feed / num_ch_in_with_dmx;
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker if ((samples_to_feed < 0) || (samples_to_feed % num_ch_in_with_dmx != 0) ||
183*15dc779aSAndroid Build Coastguard Worker (samples_to_feed > num_ch_in_with_dmx * (WORD32)pstr_space_enc->n_frame_length)) {
184*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
185*15dc779aSAndroid Build Coastguard Worker }
186*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *p_input_mps;
187*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *p_input_2_mps;
188*15dc779aSAndroid Build Coastguard Worker {
189*15dc779aSAndroid Build Coastguard Worker p_input_mps = ptr_samples;
190*15dc779aSAndroid Build Coastguard Worker p_input_2_mps = ptr_samples + (pstr_space_enc->n_input_delay * num_ch_in_with_dmx);
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_ch_in; ch++) {
193*15dc779aSAndroid Build Coastguard Worker memcpy(&(pstr_space_enc->time_signal_in[ch][0]),
194*15dc779aSAndroid Build Coastguard Worker &(pstr_space_enc->time_signal_delay_in[ch][0]),
195*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_surround_analysis_buffer_delay * sizeof(FLOAT32));
196*15dc779aSAndroid Build Coastguard Worker
197*15dc779aSAndroid Build Coastguard Worker if (is_input_inter_leaved) {
198*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_memcpy_flex_pcm(
199*15dc779aSAndroid Build Coastguard Worker &(pstr_space_enc->time_signal_in[ch][pstr_space_enc->n_surround_analysis_buffer_delay]),
200*15dc779aSAndroid Build Coastguard Worker 1, p_input_mps + ch, num_ch_in_with_dmx, pstr_space_enc->n_input_delay);
201*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_memcpy_flex_pcm(
202*15dc779aSAndroid Build Coastguard Worker &(pstr_space_enc->time_signal_in[ch][pstr_space_enc->n_surround_analysis_buffer_delay +
203*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_input_delay]),
204*15dc779aSAndroid Build Coastguard Worker 1, p_input_2_mps + ch, num_ch_in_with_dmx,
205*15dc779aSAndroid Build Coastguard Worker num_samples_per_channel - pstr_space_enc->n_input_delay);
206*15dc779aSAndroid Build Coastguard Worker } else {
207*15dc779aSAndroid Build Coastguard Worker memcpy(
208*15dc779aSAndroid Build Coastguard Worker &(pstr_space_enc->time_signal_in[ch][pstr_space_enc->n_surround_analysis_buffer_delay]),
209*15dc779aSAndroid Build Coastguard Worker p_input_mps + ch * input_buffer_size_per_channel,
210*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_input_delay * sizeof(FLOAT32));
211*15dc779aSAndroid Build Coastguard Worker memcpy(
212*15dc779aSAndroid Build Coastguard Worker &(pstr_space_enc->time_signal_in[ch][pstr_space_enc->n_surround_analysis_buffer_delay +
213*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_input_delay]),
214*15dc779aSAndroid Build Coastguard Worker p_input_2_mps + ch * input_buffer_size_per_channel,
215*15dc779aSAndroid Build Coastguard Worker (num_samples_per_channel - pstr_space_enc->n_input_delay) * sizeof(FLOAT32));
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker memcpy(&(pstr_space_enc->time_signal_delay_in[ch][0]),
219*15dc779aSAndroid Build Coastguard Worker &(pstr_space_enc->time_signal_in[ch][pstr_space_enc->n_frame_length]),
220*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_surround_analysis_buffer_delay * sizeof(FLOAT32));
221*15dc779aSAndroid Build Coastguard Worker }
222*15dc779aSAndroid Build Coastguard Worker
223*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_apply_enhanced_time_domain_dmx(
224*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_enhanced_time_dmx, pstr_space_enc->time_signal_in, ptr_output_samples,
225*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_surround_analysis_buffer_delay);
226*15dc779aSAndroid Build Coastguard Worker if (error) {
227*15dc779aSAndroid Build Coastguard Worker return error;
228*15dc779aSAndroid Build Coastguard Worker }
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_samples_valid += samples_to_feed;
231*15dc779aSAndroid Build Coastguard Worker
232*15dc779aSAndroid Build Coastguard Worker *ptr_n_samples_fed = samples_to_feed;
233*15dc779aSAndroid Build Coastguard Worker return error;
234*15dc779aSAndroid Build Coastguard Worker }
235*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_init_delay_compensation(ixheaace_mps_pstr_space_structure pstr_space_enc,const WORD32 core_coder_delay,WORD32 aot)236*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_init_delay_compensation(
237*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_space_structure pstr_space_enc, const WORD32 core_coder_delay, WORD32 aot) {
238*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
239*15dc779aSAndroid Build Coastguard Worker WORD32 i;
240*15dc779aSAndroid Build Coastguard Worker memset(&pstr_space_enc->pstr_delay->delay_config, 0,
241*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_space_enc->pstr_delay->delay_config));
242*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->core_coder_delay = core_coder_delay;
243*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->delay_config.num_qmf_len = pstr_space_enc->num_qmf_bands;
244*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->delay_config.num_frame_len = pstr_space_enc->n_frame_length;
245*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->delay_config.num_core_coder_delay = core_coder_delay;
246*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->delay_config.num_sac_stream_mux_delay =
247*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->time_alignment;
248*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->delay_config.b_dmx_align = 0;
249*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->delay_config.b_minimize_delay = 1;
250*15dc779aSAndroid Build Coastguard Worker
251*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_delay_sub_calculate_buffer_delays(pstr_space_enc->pstr_delay);
252*15dc779aSAndroid Build Coastguard Worker
253*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_bitstream_delay_buffer =
254*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->num_bitstream_frame_buffer_size;
255*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_output_buffer_delay = pstr_space_enc->pstr_delay->num_output_audio_buffer;
256*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_surround_analysis_buffer_delay =
257*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->num_surround_analysis_buffer;
258*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_bitstream_buffer_read = 0;
259*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_bitstream_buffer_write = pstr_space_enc->n_bitstream_delay_buffer - 1;
260*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_discard_out_frames = pstr_space_enc->pstr_delay->num_discard_out_frames;
261*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_input_delay = pstr_space_enc->pstr_delay->num_dmx_align_buffer;
262*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_count = 0;
263*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_flag = 1;
264*15dc779aSAndroid Build Coastguard Worker
265*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_space_enc->n_bitstream_delay_buffer - 1; i++) {
266*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_spatial_frame *pstr_frame_data = NULL;
267*15dc779aSAndroid Build Coastguard Worker pstr_frame_data = &pstr_space_enc->pstr_bitstream_formatter->frame;
268*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->bs_independency_flag = 1;
269*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->framing_info.num_param_sets = 1;
270*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->framing_info.bs_framing_type = 0;
271*15dc779aSAndroid Build Coastguard Worker
272*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_write_spatial_frame(
273*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->bit_stream_delay_buffer[i], MAX_MPEGS_BYTES,
274*15dc779aSAndroid Build Coastguard Worker &pstr_space_enc->pn_output_bits[i], pstr_space_enc->pstr_bitstream_formatter, aot);
275*15dc779aSAndroid Build Coastguard Worker if (error) {
276*15dc779aSAndroid Build Coastguard Worker return error;
277*15dc779aSAndroid Build Coastguard Worker }
278*15dc779aSAndroid Build Coastguard Worker }
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker if ((pstr_space_enc->n_input_delay > MAX_DELAY_INPUT) ||
281*15dc779aSAndroid Build Coastguard Worker (pstr_space_enc->n_output_buffer_delay > MAX_DELAY_OUTPUT) ||
282*15dc779aSAndroid Build Coastguard Worker (pstr_space_enc->n_surround_analysis_buffer_delay > MAX_DELAY_SURROUND_ANALYSIS) ||
283*15dc779aSAndroid Build Coastguard Worker (pstr_space_enc->n_bitstream_delay_buffer > MAX_BITSTREAM_DELAY)) {
284*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_MPS_INIT_FAILED;
285*15dc779aSAndroid Build Coastguard Worker }
286*15dc779aSAndroid Build Coastguard Worker return error;
287*15dc779aSAndroid Build Coastguard Worker }
288*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_fill_spatial_specific_config(const ixheaace_mps_pstr_space_structure pstr_space_enc,ixheaace_mps_spatial_specific_config * const pstr_h_ssc)289*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_fill_spatial_specific_config(
290*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_pstr_space_structure pstr_space_enc,
291*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_spatial_specific_config *const pstr_h_ssc) {
292*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
293*15dc779aSAndroid Build Coastguard Worker
294*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_space_tree_description space_tree_description;
295*15dc779aSAndroid Build Coastguard Worker WORD32 i;
296*15dc779aSAndroid Build Coastguard Worker space_tree_description = pstr_space_enc->pstr_space_tree->descr;
297*15dc779aSAndroid Build Coastguard Worker memset(pstr_h_ssc, 0, sizeof(ixheaace_mps_spatial_specific_config));
298*15dc779aSAndroid Build Coastguard Worker
299*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->num_bands = pstr_space_enc->space_tree_setup.num_param_bands;
300*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->tree_description.num_ott_boxes = space_tree_description.num_ott_boxes;
301*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->tree_description.num_in_chan = space_tree_description.num_in_channels;
302*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->tree_description.num_out_chan = space_tree_description.num_out_channels;
303*15dc779aSAndroid Build Coastguard Worker
304*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < IXHEAACE_MPS_MAX_NUM_BOXES; i++) {
305*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->ott_config[i].bs_ott_bands = pstr_h_ssc->num_bands;
306*15dc779aSAndroid Build Coastguard Worker }
307*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_tree_config = IXHEAACE_MPS_TREE_212;
308*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_sampling_frequency = pstr_space_enc->num_sample_rate;
309*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_frame_length = pstr_space_enc->num_frame_time_slots - 1;
310*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_decorr_config = IXHEAACE_MPS_DECORR_QMFSPLIT0;
311*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_quant_mode = pstr_space_enc->quant_mode;
312*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->pstr_static_gain->fixed_gain_dmx > IXHEAACE_MPS_MAX_FIXED_GAIN_DMX) {
313*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_fixed_gain_dmx = IXHEAACE_MPS_FIXED_GAIN_DMX_INVALID;
314*15dc779aSAndroid Build Coastguard Worker } else {
315*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_fixed_gain_dmx = pstr_space_enc->pstr_static_gain->fixed_gain_dmx;
316*15dc779aSAndroid Build Coastguard Worker }
317*15dc779aSAndroid Build Coastguard Worker pstr_h_ssc->bs_env_quant_mode = 0;
318*15dc779aSAndroid Build Coastguard Worker return error;
319*15dc779aSAndroid Build Coastguard Worker }
320*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_fill_space_tree_setup(const ixheaace_mps_pstr_space_structure pstr_space_enc,ixheaace_mps_space_tree_setup * const ptr_space_tree_setup)321*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_fill_space_tree_setup(
322*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_pstr_space_structure pstr_space_enc,
323*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_space_tree_setup *const ptr_space_tree_setup) {
324*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
325*15dc779aSAndroid Build Coastguard Worker
326*15dc779aSAndroid Build Coastguard Worker ptr_space_tree_setup->num_param_bands = pstr_space_enc->num_param_bands;
327*15dc779aSAndroid Build Coastguard Worker ptr_space_tree_setup->use_coarse_quant_tto_cld_flag = pstr_space_enc->use_coarse_quant_cld;
328*15dc779aSAndroid Build Coastguard Worker ptr_space_tree_setup->use_coarse_quant_tto_icc_flag = pstr_space_enc->use_coarse_quant_icc;
329*15dc779aSAndroid Build Coastguard Worker ptr_space_tree_setup->quant_mode = pstr_space_enc->quant_mode;
330*15dc779aSAndroid Build Coastguard Worker ptr_space_tree_setup->num_hybrid_bands_max = pstr_space_enc->num_hybrid_bands;
331*15dc779aSAndroid Build Coastguard Worker ptr_space_tree_setup->num_channels_in_max = 2;
332*15dc779aSAndroid Build Coastguard Worker return error;
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_get_info(const ixheaace_mps_pstr_space_structure pstr_space_enc,ixheaace_mps_space_info * const pstr_space_info)335*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_get_info(const ixheaace_mps_pstr_space_structure pstr_space_enc,
336*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_space_info *const pstr_space_info) {
337*15dc779aSAndroid Build Coastguard Worker pstr_space_info->num_sample_rate = pstr_space_enc->num_sample_rate;
338*15dc779aSAndroid Build Coastguard Worker pstr_space_info->num_samples_frame = pstr_space_enc->n_frame_length;
339*15dc779aSAndroid Build Coastguard Worker pstr_space_info->num_total_input_channels = pstr_space_enc->n_input_channels;
340*15dc779aSAndroid Build Coastguard Worker pstr_space_info->dmx_delay = pstr_space_enc->pstr_delay->num_info_dmx_delay;
341*15dc779aSAndroid Build Coastguard Worker pstr_space_info->codec_delay = pstr_space_enc->pstr_delay->num_info_codec_delay;
342*15dc779aSAndroid Build Coastguard Worker pstr_space_info->decoder_delay = pstr_space_enc->pstr_delay->num_info_decoder_delay;
343*15dc779aSAndroid Build Coastguard Worker pstr_space_info->pay_load_delay =
344*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay->num_bitstream_frame_buffer_size - 1;
345*15dc779aSAndroid Build Coastguard Worker pstr_space_info->num_discard_out_frames = pstr_space_enc->num_discard_out_frames;
346*15dc779aSAndroid Build Coastguard Worker pstr_space_info->p_ssc_buf = &pstr_space_enc->ssc_buf;
347*15dc779aSAndroid Build Coastguard Worker }
348*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_duplicate_parameter_set(const ixheaace_mps_spatial_frame * const pstr_spatial_frame_from,const WORD32 set_from,ixheaace_mps_spatial_frame * const pstr_spatial_frame_to,const WORD32 set_to)349*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_duplicate_parameter_set(
350*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_spatial_frame *const pstr_spatial_frame_from, const WORD32 set_from,
351*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_spatial_frame *const pstr_spatial_frame_to, const WORD32 set_to) {
352*15dc779aSAndroid Build Coastguard Worker WORD32 box;
353*15dc779aSAndroid Build Coastguard Worker for (box = 0; box < IXHEAACE_MPS_MAX_NUM_BOXES; box++) {
354*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_spatial_frame_to->ott_data.cld[box][set_to],
355*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->ott_data.cld[box][set_from],
356*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_spatial_frame_from->ott_data.cld[0][0]));
357*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->cld_lossless_data.bs_xxx_data_mode[box][set_to] =
358*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->cld_lossless_data.bs_xxx_data_mode[box][set_from];
359*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->cld_lossless_data.bs_data_pair[box][set_to] =
360*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->cld_lossless_data.bs_data_pair[box][set_from];
361*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->cld_lossless_data.bs_quant_coarse_xxx[box][set_to] =
362*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->cld_lossless_data.bs_quant_coarse_xxx[box][set_from];
363*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->cld_lossless_data.bs_freq_res_stride_xxx[box][set_to] =
364*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->cld_lossless_data.bs_freq_res_stride_xxx[box][set_from];
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_spatial_frame_to->ott_data.icc[box][set_to],
367*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->ott_data.icc[box][set_from],
368*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_spatial_frame_from->ott_data.icc[0][0]));
369*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->icc_lossless_data.bs_xxx_data_mode[box][set_to] =
370*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->icc_lossless_data.bs_xxx_data_mode[box][set_from];
371*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->icc_lossless_data.bs_data_pair[box][set_to] =
372*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->icc_lossless_data.bs_data_pair[box][set_from];
373*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->icc_lossless_data.bs_quant_coarse_xxx[box][set_to] =
374*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->icc_lossless_data.bs_quant_coarse_xxx[box][set_from];
375*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_to->icc_lossless_data.bs_freq_res_stride_xxx[box][set_to] =
376*15dc779aSAndroid Build Coastguard Worker pstr_spatial_frame_from->icc_lossless_data.bs_freq_res_stride_xxx[box][set_from];
377*15dc779aSAndroid Build Coastguard Worker }
378*15dc779aSAndroid Build Coastguard Worker }
379*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_encode(const ixheaace_mps_pstr_space_structure pstr_space_enc,const ixheaace_mps_buf_descr * ptr_in_buf_desc,const ixheaace_mps_buf_descr * ptr_out_buf_desc,const ixheaace_mps_in_args * pstr_in_args,ixheaace_mps_out_args * pstr_out_args,WORD32 aot,WORD8 * ptr_scratch)380*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_encode(
381*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_pstr_space_structure pstr_space_enc,
382*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_buf_descr *ptr_in_buf_desc, const ixheaace_mps_buf_descr *ptr_out_buf_desc,
383*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_in_args *pstr_in_args, ixheaace_mps_out_args *pstr_out_args, WORD32 aot,
384*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_scratch) {
385*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
386*15dc779aSAndroid Build Coastguard Worker WORD32 num_output_samples;
387*15dc779aSAndroid Build Coastguard Worker WORD32 i, ch, ps, win_cnt, ts, slot;
388*15dc779aSAndroid Build Coastguard Worker WORD32 curr_trans_pos = -1;
389*15dc779aSAndroid Build Coastguard Worker WORD32 num_ch_in;
390*15dc779aSAndroid Build Coastguard Worker WORD32 num_ch_in_with_dmx;
391*15dc779aSAndroid Build Coastguard Worker WORD32 num_ch_out;
392*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples_per_channel;
393*15dc779aSAndroid Build Coastguard Worker WORD32 num_output_samples_max;
394*15dc779aSAndroid Build Coastguard Worker WORD32 num_frame_time_slots;
395*15dc779aSAndroid Build Coastguard Worker WORD32 num_frame_time_slots_reduction;
396*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_spatial_frame *pstr_frame_data = NULL;
397*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_bitstream_delay_buffer;
398*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_input_samples =
399*15dc779aSAndroid Build Coastguard Worker (const FLOAT32 *)ptr_in_buf_desc->pp_base[IXHEAACE_MPS_INPUT_BUFFER_IDX];
400*15dc779aSAndroid Build Coastguard Worker
401*15dc779aSAndroid Build Coastguard Worker FLOAT32 *const ptr_output_samples =
402*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ptr_out_buf_desc->pp_base[IXHEAACE_MPS_OUTUT_BUFFER_IDX];
403*15dc779aSAndroid Build Coastguard Worker
404*15dc779aSAndroid Build Coastguard Worker const WORD32 num_output_samples_buffer_size =
405*15dc779aSAndroid Build Coastguard Worker ptr_out_buf_desc->p_buf_size[IXHEAACE_MPS_OUTUT_BUFFER_IDX] /
406*15dc779aSAndroid Build Coastguard Worker ptr_out_buf_desc->p_ele_size[IXHEAACE_MPS_OUTUT_BUFFER_IDX];
407*15dc779aSAndroid Build Coastguard Worker num_ch_in = pstr_space_enc->n_input_channels;
408*15dc779aSAndroid Build Coastguard Worker num_ch_in_with_dmx = num_ch_in;
409*15dc779aSAndroid Build Coastguard Worker num_ch_out = pstr_space_enc->n_output_channels;
410*15dc779aSAndroid Build Coastguard Worker num_samples_per_channel = pstr_in_args->num_input_samples / num_ch_in_with_dmx;
411*15dc779aSAndroid Build Coastguard Worker num_output_samples_max = num_samples_per_channel * num_ch_out;
412*15dc779aSAndroid Build Coastguard Worker num_frame_time_slots = pstr_space_enc->num_frame_time_slots;
413*15dc779aSAndroid Build Coastguard Worker num_frame_time_slots_reduction = pstr_space_enc->num_frame_time_slots >> 1;
414*15dc779aSAndroid Build Coastguard Worker if ((0 != pstr_in_args->num_input_samples % num_ch_in_with_dmx)) {
415*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
416*15dc779aSAndroid Build Coastguard Worker }
417*15dc779aSAndroid Build Coastguard Worker pstr_frame_data = &pstr_space_enc->pstr_bitstream_formatter->frame;
418*15dc779aSAndroid Build Coastguard Worker
419*15dc779aSAndroid Build Coastguard Worker if (aot != AOT_USAC) {
420*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->num_discard_out_frames > 0) {
421*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_count = 0;
422*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_flag = 1;
423*15dc779aSAndroid Build Coastguard Worker } else {
424*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_flag = (pstr_space_enc->independency_count == 0) ? 1 : 0;
425*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->independency_factor > 0) {
426*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_count++;
427*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_count =
428*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_count % ((WORD32)pstr_space_enc->independency_factor);
429*15dc779aSAndroid Build Coastguard Worker } else {
430*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->independency_count = -1;
431*15dc779aSAndroid Build Coastguard Worker }
432*15dc779aSAndroid Build Coastguard Worker }
433*15dc779aSAndroid Build Coastguard Worker }
434*15dc779aSAndroid Build Coastguard Worker
435*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_feed_de_inter_pre_scale(
436*15dc779aSAndroid Build Coastguard Worker pstr_space_enc, ptr_input_samples, ptr_output_samples, pstr_in_args->num_input_samples,
437*15dc779aSAndroid Build Coastguard Worker pstr_in_args->is_input_inter_leaved, pstr_in_args->input_buffer_size_per_channel,
438*15dc779aSAndroid Build Coastguard Worker &pstr_out_args->num_samples_consumed);
439*15dc779aSAndroid Build Coastguard Worker if (error) {
440*15dc779aSAndroid Build Coastguard Worker return error;
441*15dc779aSAndroid Build Coastguard Worker }
442*15dc779aSAndroid Build Coastguard Worker
443*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->n_samples_next != pstr_space_enc->n_samples_valid) {
444*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
445*15dc779aSAndroid Build Coastguard Worker }
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_ch_in; ch++) {
448*15dc779aSAndroid Build Coastguard Worker for (slot = 0; slot < num_frame_time_slots; slot++) {
449*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str *pstr_cmplx_data;
450*15dc779aSAndroid Build Coastguard Worker
451*15dc779aSAndroid Build Coastguard Worker pstr_cmplx_data =
452*15dc779aSAndroid Build Coastguard Worker pstr_space_enc
453*15dc779aSAndroid Build Coastguard Worker ->cmplx_hybrid_in[ch][pstr_space_enc->n_update_hybrid_position_time_slots +
454*15dc779aSAndroid Build Coastguard Worker num_frame_time_slots - num_frame_time_slots_reduction + slot];
455*15dc779aSAndroid Build Coastguard Worker memset(pstr_cmplx_data, 0, 2 * pstr_space_enc->num_hybrid_bands * sizeof(WORD32));
456*15dc779aSAndroid Build Coastguard Worker }
457*15dc779aSAndroid Build Coastguard Worker }
458*15dc779aSAndroid Build Coastguard Worker
459*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_ch_in; ch++) {
460*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_in_real[MAX_QMF_BANDS];
461*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_in_imag[MAX_QMF_BANDS];
462*15dc779aSAndroid Build Coastguard Worker FLOAT32 p_work_buffer[MAX_QMF_BANDS << 1];
463*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_pre_gain = pstr_space_enc->pstr_static_gain->pre_gain;
464*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < num_frame_time_slots; ts++) {
465*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_spec_real;
466*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_spec_imag;
467*15dc779aSAndroid Build Coastguard Worker
468*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_time_in =
469*15dc779aSAndroid Build Coastguard Worker &pstr_space_enc->time_signal_in[ch][(ts * pstr_space_enc->num_qmf_bands)];
470*15dc779aSAndroid Build Coastguard Worker
471*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_apply_dc_filter(pstr_space_enc->pstr_dc_filter[ch], ptr_time_in,
472*15dc779aSAndroid Build Coastguard Worker ptr_time_in, pstr_space_enc->num_qmf_bands);
473*15dc779aSAndroid Build Coastguard Worker
474*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_qmf_analysis_filtering_slot(pstr_space_enc->pstr_qmf_filter_in[ch],
475*15dc779aSAndroid Build Coastguard Worker qmf_in_real, qmf_in_imag, ptr_time_in,
476*15dc779aSAndroid Build Coastguard Worker 1, p_work_buffer, ptr_scratch);
477*15dc779aSAndroid Build Coastguard Worker if (error != IA_NO_ERROR) {
478*15dc779aSAndroid Build Coastguard Worker return error;
479*15dc779aSAndroid Build Coastguard Worker }
480*15dc779aSAndroid Build Coastguard Worker
481*15dc779aSAndroid Build Coastguard Worker ptr_spec_real = qmf_in_real;
482*15dc779aSAndroid Build Coastguard Worker ptr_spec_imag = qmf_in_imag;
483*15dc779aSAndroid Build Coastguard Worker if (1.0f != ptr_pre_gain[ch]) {
484*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_space_enc->num_hybrid_bands; i++) {
485*15dc779aSAndroid Build Coastguard Worker pstr_space_enc
486*15dc779aSAndroid Build Coastguard Worker ->cmplx_hybrid_in[ch][pstr_space_enc->n_analysis_lookahead_time_slots + ts][i]
487*15dc779aSAndroid Build Coastguard Worker .re = ptr_spec_real[i] * ptr_pre_gain[ch];
488*15dc779aSAndroid Build Coastguard Worker pstr_space_enc
489*15dc779aSAndroid Build Coastguard Worker ->cmplx_hybrid_in[ch][pstr_space_enc->n_analysis_lookahead_time_slots + ts][i]
490*15dc779aSAndroid Build Coastguard Worker .im = ptr_spec_imag[i] * ptr_pre_gain[ch];
491*15dc779aSAndroid Build Coastguard Worker }
492*15dc779aSAndroid Build Coastguard Worker } else {
493*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_space_enc->num_hybrid_bands; i++) {
494*15dc779aSAndroid Build Coastguard Worker pstr_space_enc
495*15dc779aSAndroid Build Coastguard Worker ->cmplx_hybrid_in[ch][pstr_space_enc->n_analysis_lookahead_time_slots + ts][i]
496*15dc779aSAndroid Build Coastguard Worker .re = ptr_spec_real[i];
497*15dc779aSAndroid Build Coastguard Worker pstr_space_enc
498*15dc779aSAndroid Build Coastguard Worker ->cmplx_hybrid_in[ch][pstr_space_enc->n_analysis_lookahead_time_slots + ts][i]
499*15dc779aSAndroid Build Coastguard Worker .im = ptr_spec_imag[i];
500*15dc779aSAndroid Build Coastguard Worker }
501*15dc779aSAndroid Build Coastguard Worker }
502*15dc779aSAndroid Build Coastguard Worker }
503*15dc779aSAndroid Build Coastguard Worker }
504*15dc779aSAndroid Build Coastguard Worker
505*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_ch_in; ch++) {
506*15dc779aSAndroid Build Coastguard Worker for (slot = 0; slot < (WORD32)(pstr_space_enc->n_update_hybrid_position_time_slots +
507*15dc779aSAndroid Build Coastguard Worker num_frame_time_slots - num_frame_time_slots_reduction);
508*15dc779aSAndroid Build Coastguard Worker slot++) {
509*15dc779aSAndroid Build Coastguard Worker memmove(pstr_space_enc->cmplx_hybrid_in[ch][slot],
510*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->cmplx_hybrid_in_static[ch][slot],
511*15dc779aSAndroid Build Coastguard Worker sizeof(ixheaace_cmplx_str) * pstr_space_enc->num_hybrid_bands);
512*15dc779aSAndroid Build Coastguard Worker }
513*15dc779aSAndroid Build Coastguard Worker
514*15dc779aSAndroid Build Coastguard Worker for (slot = 0; slot < (WORD32)(pstr_space_enc->n_update_hybrid_position_time_slots +
515*15dc779aSAndroid Build Coastguard Worker num_frame_time_slots - num_frame_time_slots_reduction);
516*15dc779aSAndroid Build Coastguard Worker slot++) {
517*15dc779aSAndroid Build Coastguard Worker memmove(pstr_space_enc->cmplx_hybrid_in_static[ch][slot],
518*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->cmplx_hybrid_in[ch][num_frame_time_slots + slot],
519*15dc779aSAndroid Build Coastguard Worker sizeof(ixheaace_cmplx_str) * pstr_space_enc->num_hybrid_bands);
520*15dc779aSAndroid Build Coastguard Worker }
521*15dc779aSAndroid Build Coastguard Worker
522*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_onset_detect_apply(
523*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_onset_detect[ch], num_frame_time_slots,
524*15dc779aSAndroid Build Coastguard Worker &pstr_space_enc->cmplx_hybrid_in[ch][pstr_space_enc->n_analysis_lookahead_time_slots],
525*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->tr_prev_pos[1], pstr_space_enc->pp_tr_curr_pos[ch]);
526*15dc779aSAndroid Build Coastguard Worker if (error) {
527*15dc779aSAndroid Build Coastguard Worker return error;
528*15dc779aSAndroid Build Coastguard Worker }
529*15dc779aSAndroid Build Coastguard Worker
530*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->use_frame_keep == 0) {
531*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pp_tr_curr_pos[ch][0] = -1;
532*15dc779aSAndroid Build Coastguard Worker }
533*15dc779aSAndroid Build Coastguard Worker
534*15dc779aSAndroid Build Coastguard Worker if ((pstr_space_enc->pp_tr_curr_pos[ch][0] >= 0) &&
535*15dc779aSAndroid Build Coastguard Worker ((curr_trans_pos < 0) || (pstr_space_enc->pp_tr_curr_pos[ch][0] < curr_trans_pos))) {
536*15dc779aSAndroid Build Coastguard Worker curr_trans_pos = pstr_space_enc->pp_tr_curr_pos[ch][0];
537*15dc779aSAndroid Build Coastguard Worker }
538*15dc779aSAndroid Build Coastguard Worker }
539*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->use_frame_keep == 1) {
540*15dc779aSAndroid Build Coastguard Worker if ((curr_trans_pos != -1) || (pstr_space_enc->independency_flag == 1)) {
541*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->avoid_keep = NUM_KEEP_WINDOWS;
542*15dc779aSAndroid Build Coastguard Worker curr_trans_pos = -1;
543*15dc779aSAndroid Build Coastguard Worker }
544*15dc779aSAndroid Build Coastguard Worker }
545*15dc779aSAndroid Build Coastguard Worker
546*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->tr_prev_pos[0] = MAX(-1, pstr_space_enc->tr_prev_pos[1] - num_frame_time_slots);
547*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->tr_prev_pos[1] = curr_trans_pos;
548*15dc779aSAndroid Build Coastguard Worker
549*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_ch_in; ch++) {
550*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_onset_detect_update(pstr_space_enc->pstr_onset_detect[ch],
551*15dc779aSAndroid Build Coastguard Worker num_frame_time_slots);
552*15dc779aSAndroid Build Coastguard Worker if (error) {
553*15dc779aSAndroid Build Coastguard Worker return error;
554*15dc779aSAndroid Build Coastguard Worker }
555*15dc779aSAndroid Build Coastguard Worker }
556*15dc779aSAndroid Build Coastguard Worker
557*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_frame_window_get_window(
558*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->h_frame_window, pstr_space_enc->tr_prev_pos, num_frame_time_slots,
559*15dc779aSAndroid Build Coastguard Worker &pstr_frame_data->framing_info, pstr_space_enc->ptr_frame_window_ana,
560*15dc779aSAndroid Build Coastguard Worker &pstr_space_enc->frame_win_list, pstr_space_enc->avoid_keep);
561*15dc779aSAndroid Build Coastguard Worker
562*15dc779aSAndroid Build Coastguard Worker for (ps = 0, win_cnt = 0; ps < pstr_space_enc->frame_win_list.win_list_cnt; ++ps) {
563*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->frame_win_list.dat[ps].hold == IXHEAACE_MPS_FRAME_WINDOWING_HOLD) {
564*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_duplicate_parameter_set(&pstr_space_enc->save_frame, 0, pstr_frame_data,
565*15dc779aSAndroid Build Coastguard Worker ps);
566*15dc779aSAndroid Build Coastguard Worker } else {
567*15dc779aSAndroid Build Coastguard Worker WORD32 num_analysis_length_time_slots, analysis_start_time_slot;
568*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_frame_window_ana;
569*15dc779aSAndroid Build Coastguard Worker num_analysis_length_time_slots = ixheaace_mps_212_get_analysis_length_time_slots(
570*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->ptr_frame_window_ana[win_cnt],
571*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_analysis_length_time_slots);
572*15dc779aSAndroid Build Coastguard Worker
573*15dc779aSAndroid Build Coastguard Worker analysis_start_time_slot = ixheaace_mps_212_get_analysis_start_time_slot(
574*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->ptr_frame_window_ana[win_cnt],
575*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_analysis_length_time_slots);
576*15dc779aSAndroid Build Coastguard Worker
577*15dc779aSAndroid Build Coastguard Worker ptr_frame_window_ana = pstr_space_enc->ptr_frame_window_ana[win_cnt];
578*15dc779aSAndroid Build Coastguard Worker
579*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_space_tree_apply(
580*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_space_tree, ps, num_ch_in, num_analysis_length_time_slots,
581*15dc779aSAndroid Build Coastguard Worker analysis_start_time_slot, pstr_space_enc->num_hybrid_bands, ptr_frame_window_ana,
582*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->cmplx_hybrid_in, pstr_space_enc->cmplx_hybrid_in, pstr_frame_data,
583*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->avoid_keep);
584*15dc779aSAndroid Build Coastguard Worker if (error) {
585*15dc779aSAndroid Build Coastguard Worker return error;
586*15dc779aSAndroid Build Coastguard Worker }
587*15dc779aSAndroid Build Coastguard Worker
588*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_duplicate_parameter_set(pstr_frame_data, ps, &pstr_space_enc->save_frame,
589*15dc779aSAndroid Build Coastguard Worker 0);
590*15dc779aSAndroid Build Coastguard Worker ++win_cnt;
591*15dc779aSAndroid Build Coastguard Worker }
592*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->avoid_keep > 0) {
593*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->avoid_keep--;
594*15dc779aSAndroid Build Coastguard Worker }
595*15dc779aSAndroid Build Coastguard Worker }
596*15dc779aSAndroid Build Coastguard Worker
597*15dc779aSAndroid Build Coastguard Worker memset(&pstr_frame_data->smg_data, 0, sizeof(pstr_frame_data->smg_data));
598*15dc779aSAndroid Build Coastguard Worker
599*15dc779aSAndroid Build Coastguard Worker ptr_bitstream_delay_buffer =
600*15dc779aSAndroid Build Coastguard Worker (UWORD8 *)ptr_out_buf_desc->pp_base[IXHEAACE_MPS_BITSTREAM_BUFFER_IDX];
601*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->bs_independency_flag = pstr_space_enc->independency_flag;
602*15dc779aSAndroid Build Coastguard Worker
603*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_write_spatial_frame(
604*15dc779aSAndroid Build Coastguard Worker ptr_bitstream_delay_buffer, MAX_MPEGS_BYTES,
605*15dc779aSAndroid Build Coastguard Worker &pstr_space_enc->pn_output_bits[pstr_space_enc->n_bitstream_buffer_write],
606*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_bitstream_formatter, aot);
607*15dc779aSAndroid Build Coastguard Worker if (error) {
608*15dc779aSAndroid Build Coastguard Worker return error;
609*15dc779aSAndroid Build Coastguard Worker }
610*15dc779aSAndroid Build Coastguard Worker
611*15dc779aSAndroid Build Coastguard Worker if ((pstr_space_enc->num_discard_out_frames == 0) &&
612*15dc779aSAndroid Build Coastguard Worker (IXHEAACE_MPS_BITSTREAM_BUFFER_IDX != -1)) {
613*15dc779aSAndroid Build Coastguard Worker const WORD32 idx = IXHEAACE_MPS_BITSTREAM_BUFFER_IDX;
614*15dc779aSAndroid Build Coastguard Worker const WORD32 out_bits =
615*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pn_output_bits[pstr_space_enc->n_bitstream_buffer_read];
616*15dc779aSAndroid Build Coastguard Worker
617*15dc779aSAndroid Build Coastguard Worker if (((out_bits + 7) / 8) >
618*15dc779aSAndroid Build Coastguard Worker (WORD32)(ptr_out_buf_desc->p_buf_size[idx] / ptr_out_buf_desc->p_ele_size[idx])) {
619*15dc779aSAndroid Build Coastguard Worker pstr_out_args->num_output_bits = 0;
620*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_MPS_ENCODE_ERROR;
621*15dc779aSAndroid Build Coastguard Worker }
622*15dc779aSAndroid Build Coastguard Worker pstr_out_args->num_output_bits = out_bits;
623*15dc779aSAndroid Build Coastguard Worker } else {
624*15dc779aSAndroid Build Coastguard Worker pstr_out_args->num_output_bits = 0;
625*15dc779aSAndroid Build Coastguard Worker }
626*15dc779aSAndroid Build Coastguard Worker
627*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_bitstream_buffer_read =
628*15dc779aSAndroid Build Coastguard Worker (pstr_space_enc->n_bitstream_buffer_read + 1) % pstr_space_enc->n_bitstream_delay_buffer;
629*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_bitstream_buffer_write =
630*15dc779aSAndroid Build Coastguard Worker (pstr_space_enc->n_bitstream_buffer_write + 1) % pstr_space_enc->n_bitstream_delay_buffer;
631*15dc779aSAndroid Build Coastguard Worker
632*15dc779aSAndroid Build Coastguard Worker num_output_samples =
633*15dc779aSAndroid Build Coastguard Worker (pstr_space_enc->num_discard_out_frames == 0) ? (num_output_samples_max) : 0;
634*15dc779aSAndroid Build Coastguard Worker if (num_output_samples > num_output_samples_buffer_size) {
635*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
636*15dc779aSAndroid Build Coastguard Worker }
637*15dc779aSAndroid Build Coastguard Worker pstr_out_args->num_output_samples = num_output_samples;
638*15dc779aSAndroid Build Coastguard Worker
639*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->num_discard_out_frames > 0) {
640*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_discard_out_frames--;
641*15dc779aSAndroid Build Coastguard Worker }
642*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_samples_valid = 0;
643*15dc779aSAndroid Build Coastguard Worker
644*15dc779aSAndroid Build Coastguard Worker return error;
645*15dc779aSAndroid Build Coastguard Worker }
646*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_init(ixheaace_mps_pstr_space_structure pstr_space_enc,const WORD32 dmx_delay,WORD32 aot)647*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_init(ixheaace_mps_pstr_space_structure pstr_space_enc,
648*15dc779aSAndroid Build Coastguard Worker const WORD32 dmx_delay, WORD32 aot) {
649*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
650*15dc779aSAndroid Build Coastguard Worker WORD32 ch;
651*15dc779aSAndroid Build Coastguard Worker WORD32 num_ch_in_arb_dmx;
652*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_space_tree_description space_tree_description;
653*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_onset_detect_config onset_detect_config;
654*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_frame_win_config frame_window_config;
655*15dc779aSAndroid Build Coastguard Worker
656*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_configure(pstr_space_enc, &pstr_space_enc->user);
657*15dc779aSAndroid Build Coastguard Worker if (error) {
658*15dc779aSAndroid Build Coastguard Worker return error;
659*15dc779aSAndroid Build Coastguard Worker }
660*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->b_enc_mode_212_only = pstr_space_enc->setup->b_enc_mode_212;
661*15dc779aSAndroid Build Coastguard Worker
662*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->num_frame_time_slots < 1) {
663*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
664*15dc779aSAndroid Build Coastguard Worker }
665*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_frame_length =
666*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_qmf_bands * pstr_space_enc->num_frame_time_slots;
667*15dc779aSAndroid Build Coastguard Worker
668*15dc779aSAndroid Build Coastguard Worker if (pstr_space_enc->use_frame_keep == 1) {
669*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_analysis_length_time_slots = 3 * pstr_space_enc->num_frame_time_slots;
670*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_update_hybrid_position_time_slots = pstr_space_enc->num_frame_time_slots;
671*15dc779aSAndroid Build Coastguard Worker } else {
672*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_analysis_length_time_slots = 2 * pstr_space_enc->num_frame_time_slots;
673*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_update_hybrid_position_time_slots = 0;
674*15dc779aSAndroid Build Coastguard Worker }
675*15dc779aSAndroid Build Coastguard Worker
676*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_analysis_lookahead_time_slots =
677*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_analysis_length_time_slots -
678*15dc779aSAndroid Build Coastguard Worker 3 * pstr_space_enc->num_frame_time_slots / 2;
679*15dc779aSAndroid Build Coastguard Worker
680*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_calc_parameter_band_to_hybrid_band_offset(
681*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_hybrid_bands, pstr_space_enc->ptr_parameter_band_2_hybrid_band_offset,
682*15dc779aSAndroid Build Coastguard Worker aot);
683*15dc779aSAndroid Build Coastguard Worker
684*15dc779aSAndroid Build Coastguard Worker error =
685*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_fill_space_tree_setup(pstr_space_enc, &pstr_space_enc->space_tree_setup);
686*15dc779aSAndroid Build Coastguard Worker if (error) {
687*15dc779aSAndroid Build Coastguard Worker return error;
688*15dc779aSAndroid Build Coastguard Worker }
689*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_space_tree_init(
690*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_space_tree, &pstr_space_enc->space_tree_setup,
691*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->ptr_parameter_band_2_hybrid_band_offset, pstr_space_enc->use_frame_keep,
692*15dc779aSAndroid Build Coastguard Worker aot);
693*15dc779aSAndroid Build Coastguard Worker if (error) {
694*15dc779aSAndroid Build Coastguard Worker return error;
695*15dc779aSAndroid Build Coastguard Worker }
696*15dc779aSAndroid Build Coastguard Worker
697*15dc779aSAndroid Build Coastguard Worker space_tree_description = pstr_space_enc->pstr_space_tree->descr;
698*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_input_channels = space_tree_description.num_out_channels;
699*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_output_channels = space_tree_description.num_in_channels;
700*15dc779aSAndroid Build Coastguard Worker frame_window_config.num_time_slots_max = pstr_space_enc->num_frame_time_slots;
701*15dc779aSAndroid Build Coastguard Worker frame_window_config.frame_keep_flag = pstr_space_enc->use_frame_keep;
702*15dc779aSAndroid Build Coastguard Worker onset_detect_config.max_time_slots = pstr_space_enc->num_frame_time_slots;
703*15dc779aSAndroid Build Coastguard Worker onset_detect_config.lower_bound_onset_detection =
704*15dc779aSAndroid Build Coastguard Worker ((2 * 1725 * pstr_space_enc->num_qmf_bands) / pstr_space_enc->num_sample_rate);
705*15dc779aSAndroid Build Coastguard Worker onset_detect_config.upper_bound_onset_detection = pstr_space_enc->num_hybrid_bands;
706*15dc779aSAndroid Build Coastguard Worker num_ch_in_arb_dmx = 0;
707*15dc779aSAndroid Build Coastguard Worker
708*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < pstr_space_enc->n_input_channels; ch++) {
709*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_qmf_init_filter_bank(
710*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_qmf_filter_in[ch],
711*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_qmf_filter_in[ch]->ptr_filter_states, 1,
712*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_qmf_bands, pstr_space_enc->num_qmf_bands,
713*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_qmf_bands);
714*15dc779aSAndroid Build Coastguard Worker if (error) {
715*15dc779aSAndroid Build Coastguard Worker return error;
716*15dc779aSAndroid Build Coastguard Worker }
717*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_init_dc_filter(pstr_space_enc->pstr_dc_filter[ch],
718*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->num_sample_rate);
719*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_onset_detect_init(pstr_space_enc->pstr_onset_detect[ch],
720*15dc779aSAndroid Build Coastguard Worker &onset_detect_config, 1);
721*15dc779aSAndroid Build Coastguard Worker if (error) {
722*15dc779aSAndroid Build Coastguard Worker return error;
723*15dc779aSAndroid Build Coastguard Worker }
724*15dc779aSAndroid Build Coastguard Worker }
725*15dc779aSAndroid Build Coastguard Worker
726*15dc779aSAndroid Build Coastguard Worker error =
727*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_frame_window_init(pstr_space_enc->h_frame_window, &frame_window_config);
728*15dc779aSAndroid Build Coastguard Worker if (error) {
729*15dc779aSAndroid Build Coastguard Worker return error;
730*15dc779aSAndroid Build Coastguard Worker }
731*15dc779aSAndroid Build Coastguard Worker
732*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_static_gain_init(pstr_space_enc->pstr_static_gain,
733*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_static_gain_config);
734*15dc779aSAndroid Build Coastguard Worker if (error) {
735*15dc779aSAndroid Build Coastguard Worker return error;
736*15dc779aSAndroid Build Coastguard Worker }
737*15dc779aSAndroid Build Coastguard Worker
738*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_init_enhanced_time_domain_dmx(
739*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_enhanced_time_dmx, pstr_space_enc->pstr_static_gain->pre_gain,
740*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_static_gain->post_gain, pstr_space_enc->n_frame_length);
741*15dc779aSAndroid Build Coastguard Worker if (error) {
742*15dc779aSAndroid Build Coastguard Worker return error;
743*15dc779aSAndroid Build Coastguard Worker }
744*15dc779aSAndroid Build Coastguard Worker
745*15dc779aSAndroid Build Coastguard Worker memset(pstr_space_enc->pstr_bitstream_formatter, 0, sizeof(ixheaace_mps_spatial_frame));
746*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_bitstream_formatter->frame.bs_independency_flag = 1;
747*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_bitstream_formatter->frame.framing_info.num_param_sets = 1;
748*15dc779aSAndroid Build Coastguard Worker
749*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_fill_spatial_specific_config(
750*15dc779aSAndroid Build Coastguard Worker pstr_space_enc, &pstr_space_enc->pstr_bitstream_formatter->spatial_specific_config);
751*15dc779aSAndroid Build Coastguard Worker if (error) {
752*15dc779aSAndroid Build Coastguard Worker return error;
753*15dc779aSAndroid Build Coastguard Worker }
754*15dc779aSAndroid Build Coastguard Worker
755*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_write_spatial_specific_config(
756*15dc779aSAndroid Build Coastguard Worker &pstr_space_enc->pstr_bitstream_formatter->spatial_specific_config,
757*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->ssc_buf.ptr_ssc, MAX_SSC_BYTES, &pstr_space_enc->ssc_buf.num_ssc_size_bits,
758*15dc779aSAndroid Build Coastguard Worker aot);
759*15dc779aSAndroid Build Coastguard Worker if (error) {
760*15dc779aSAndroid Build Coastguard Worker return error;
761*15dc779aSAndroid Build Coastguard Worker }
762*15dc779aSAndroid Build Coastguard Worker
763*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_init_delay_compensation(pstr_space_enc, dmx_delay, aot);
764*15dc779aSAndroid Build Coastguard Worker if (error) {
765*15dc779aSAndroid Build Coastguard Worker return error;
766*15dc779aSAndroid Build Coastguard Worker }
767*15dc779aSAndroid Build Coastguard Worker
768*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_samples_next =
769*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_frame_length * (pstr_space_enc->n_input_channels + num_ch_in_arb_dmx);
770*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->n_samples_valid = 0;
771*15dc779aSAndroid Build Coastguard Worker
772*15dc779aSAndroid Build Coastguard Worker return error;
773*15dc779aSAndroid Build Coastguard Worker }
774*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_open(ixheaace_mps_pstr_space_structure * pstr_space_enc_structure,ixheaace_mps_212_memory_struct * pstr_mps_memory)775*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_open(ixheaace_mps_pstr_space_structure *pstr_space_enc_structure,
776*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_memory_struct *pstr_mps_memory) {
777*15dc779aSAndroid Build Coastguard Worker WORD32 ch;
778*15dc779aSAndroid Build Coastguard Worker WORD32 param;
779*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_space_structure pstr_space_enc = NULL;
780*15dc779aSAndroid Build Coastguard Worker pstr_space_enc = &pstr_mps_memory->mp4_space_encoder_instance;
781*15dc779aSAndroid Build Coastguard Worker if (NULL != pstr_space_enc) {
782*15dc779aSAndroid Build Coastguard Worker memset(pstr_space_enc, 0, sizeof(struct ixheaace_mps_space_structure));
783*15dc779aSAndroid Build Coastguard Worker }
784*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup = &pstr_mps_memory->setup;
785*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_sampling_rate = MAX_SAMPLING_RATE;
786*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_frame_time_slots = MAX_FRAME_TIME_SLOT;
787*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_analysis_length_time_slots =
788*15dc779aSAndroid Build Coastguard Worker 3 * pstr_space_enc->setup->max_frame_time_slots;
789*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_qmf_bands =
790*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_space_get_num_qmf_bands(pstr_space_enc->setup->max_sampling_rate);
791*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_hybrid_bands = pstr_space_enc->setup->max_qmf_bands;
792*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_frame_length =
793*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_qmf_bands * pstr_space_enc->setup->max_frame_time_slots;
794*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_ch_in = 2;
795*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_ch_out = 1;
796*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_ch_tot_out = pstr_space_enc->setup->max_ch_out;
797*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->b_enc_mode_212 = 1;
798*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_hybrid_in_static_slots = 24;
799*15dc779aSAndroid Build Coastguard Worker
800*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_static_gain_config = &pstr_mps_memory->static_gain_config;
801*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_enhanced_time_dmx = &pstr_mps_memory->enhanced_time_dmx;
802*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_enhanced_time_dmx->sinus_window = pstr_mps_memory->sinus_window_flt;
803*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->ptr_parameter_band_2_hybrid_band_offset =
804*15dc779aSAndroid Build Coastguard Worker pstr_mps_memory->parameter_band_2_hybrid_band_offset;
805*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_space_tree_open(&pstr_space_enc->pstr_space_tree, pstr_mps_memory);
806*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_qmf_filter_in = pstr_mps_memory->pstr_qmf_filter_bank;
807*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < pstr_space_enc->setup->max_ch_in; ch++) {
808*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_qmf_filter_in[ch] = &pstr_mps_memory->qmf_filter_bank[ch];
809*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_qmf_filter_in[ch]->ptr_filter_states =
810*15dc779aSAndroid Build Coastguard Worker &pstr_mps_memory->ptr_filter_states[ch];
811*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_dc_filter[ch] = &pstr_mps_memory->dc_filter[ch];
812*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_onset_detect[ch] = &pstr_mps_memory->onset_detect[ch];
813*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_onset_detect[ch]->p_energy_hist =
814*15dc779aSAndroid Build Coastguard Worker &pstr_mps_memory->energy_hist_float[ch][0];
815*15dc779aSAndroid Build Coastguard Worker }
816*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->h_frame_window = &pstr_mps_memory->frame_window;
817*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_static_gain = &pstr_mps_memory->static_gain;
818*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_bitstream_formatter = &pstr_mps_memory->bitstream;
819*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->ssc_buf.ptr_ssc = pstr_mps_memory->ssc;
820*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_delay = &pstr_mps_memory->delay;
821*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pn_output_bits = pstr_mps_memory->n_output_bits;
822*15dc779aSAndroid Build Coastguard Worker for (param = 0; param < MAX_NUM_PARAMS; param++) {
823*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->ptr_frame_window_ana[param] =
824*15dc779aSAndroid Build Coastguard Worker &pstr_mps_memory->frame_window_ana_flt[param][0];
825*15dc779aSAndroid Build Coastguard Worker }
826*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_enhanced_time_dmx->max_frame_length =
827*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_frame_length;
828*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < pstr_space_enc->setup->max_ch_in; ch++) {
829*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_onset_detect[ch]->max_time_slots =
830*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->setup->max_frame_time_slots;
831*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_onset_detect[ch]->min_trans_dist = 8;
832*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_onset_detect[ch]->avg_energy_dist = 16;
833*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_onset_detect[ch]->avg_energy_dist_scale = 4;
834*15dc779aSAndroid Build Coastguard Worker }
835*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_static_gain_config->fixed_gain_dmx = IXHEAACE_MPS_DMX_GAIN_DEFAULT;
836*15dc779aSAndroid Build Coastguard Worker pstr_space_enc->pstr_static_gain_config->pre_gain_factor_db = 0;
837*15dc779aSAndroid Build Coastguard Worker
838*15dc779aSAndroid Build Coastguard Worker if (NULL != pstr_space_enc_structure) {
839*15dc779aSAndroid Build Coastguard Worker *pstr_space_enc_structure = pstr_space_enc;
840*15dc779aSAndroid Build Coastguard Worker }
841*15dc779aSAndroid Build Coastguard Worker }
842*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_get_closest_bit_rate(const WORD32 audio_object_type,const UWORD32 sampling_rate,const UWORD32 sbr_ratio,UWORD32 bitrate)843*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_212_get_closest_bit_rate(const WORD32 audio_object_type,
844*15dc779aSAndroid Build Coastguard Worker const UWORD32 sampling_rate,
845*15dc779aSAndroid Build Coastguard Worker const UWORD32 sbr_ratio, UWORD32 bitrate) {
846*15dc779aSAndroid Build Coastguard Worker UWORD32 idx;
847*15dc779aSAndroid Build Coastguard Worker WORD32 target_bitrate = -1;
848*15dc779aSAndroid Build Coastguard Worker
849*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < sizeof(mps_config_tab) / sizeof(ixheaace_mps_config_table); idx++) {
850*15dc779aSAndroid Build Coastguard Worker if ((mps_config_tab[idx].sampling_rate == sampling_rate) &&
851*15dc779aSAndroid Build Coastguard Worker (mps_config_tab[idx].audio_object_type == audio_object_type) &&
852*15dc779aSAndroid Build Coastguard Worker (mps_config_tab[idx].sbr_ratio == sbr_ratio)) {
853*15dc779aSAndroid Build Coastguard Worker target_bitrate =
854*15dc779aSAndroid Build Coastguard Worker MIN(MAX(bitrate, mps_config_tab[idx].bitrate_min), mps_config_tab[idx].bitrate_max);
855*15dc779aSAndroid Build Coastguard Worker }
856*15dc779aSAndroid Build Coastguard Worker }
857*15dc779aSAndroid Build Coastguard Worker
858*15dc779aSAndroid Build Coastguard Worker return target_bitrate;
859*15dc779aSAndroid Build Coastguard Worker }
860*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_write_spatial_specific_config_data(ixheaace_mps_pstr_struct pstr_mps_enc,ixheaace_bit_buf_handle pstr_bit_buf)861*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_mps_212_write_spatial_specific_config_data(
862*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_struct pstr_mps_enc, ixheaace_bit_buf_handle pstr_bit_buf) {
863*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
864*15dc779aSAndroid Build Coastguard Worker WORD32 ssc_bits = 0;
865*15dc779aSAndroid Build Coastguard Worker WORD32 written_bits = 0;
866*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_space_info pstr_space_encoder_info;
867*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_get_info(pstr_mps_enc->ptr_sac_encoder, &pstr_space_encoder_info);
868*15dc779aSAndroid Build Coastguard Worker
869*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx<pstr_space_encoder_info.p_ssc_buf->num_ssc_size_bits>> 3; idx++) {
870*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_buf, pstr_space_encoder_info.p_ssc_buf->ptr_ssc[idx], 8);
871*15dc779aSAndroid Build Coastguard Worker written_bits += 8;
872*15dc779aSAndroid Build Coastguard Worker }
873*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(
874*15dc779aSAndroid Build Coastguard Worker pstr_bit_buf, pstr_space_encoder_info.p_ssc_buf->ptr_ssc[idx],
875*15dc779aSAndroid Build Coastguard Worker (UWORD8)(pstr_space_encoder_info.p_ssc_buf->num_ssc_size_bits - written_bits));
876*15dc779aSAndroid Build Coastguard Worker
877*15dc779aSAndroid Build Coastguard Worker ssc_bits = pstr_space_encoder_info.p_ssc_buf->num_ssc_size_bits;
878*15dc779aSAndroid Build Coastguard Worker return ssc_bits;
879*15dc779aSAndroid Build Coastguard Worker }
880*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_open(VOID ** pstr_handle_mps,ixheaace_mps_212_memory_struct * pstr_mps_memory)881*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_mps_212_open(VOID **pstr_handle_mps,
882*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_memory_struct *pstr_mps_memory) {
883*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_struct pstr_mps_enc = NULL;
884*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc = &pstr_mps_memory->mps_encoder_instance;
885*15dc779aSAndroid Build Coastguard Worker memset(pstr_mps_enc, 0, sizeof(ixheaace_mps_struct));
886*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_open(&pstr_mps_enc->ptr_sac_encoder, pstr_mps_memory);
887*15dc779aSAndroid Build Coastguard Worker *pstr_handle_mps = pstr_mps_enc;
888*15dc779aSAndroid Build Coastguard Worker }
889*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_close(VOID ** pstr_handle_mps)890*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_mps_212_close(VOID **pstr_handle_mps) {
891*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_struct *pstr_mps_enc = (ixheaace_mps_pstr_struct *)pstr_handle_mps;
892*15dc779aSAndroid Build Coastguard Worker if (*pstr_mps_enc != NULL) {
893*15dc779aSAndroid Build Coastguard Worker *pstr_mps_enc = NULL;
894*15dc779aSAndroid Build Coastguard Worker }
895*15dc779aSAndroid Build Coastguard Worker }
896*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_initialise(VOID * pstr_handle_mps,const WORD32 audio_object_type,const UWORD32 sampling_rate,WORD32 * ptr_bitrate,const UWORD32 sbr_ratio,const UWORD32 frame_length,const UWORD32 input_buffer_size_per_channel,const UWORD32 core_coder_delay,WORD8 * ptr_scratch)897*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_initialise(VOID *pstr_handle_mps, const WORD32 audio_object_type,
898*15dc779aSAndroid Build Coastguard Worker const UWORD32 sampling_rate, WORD32 *ptr_bitrate,
899*15dc779aSAndroid Build Coastguard Worker const UWORD32 sbr_ratio, const UWORD32 frame_length,
900*15dc779aSAndroid Build Coastguard Worker const UWORD32 input_buffer_size_per_channel,
901*15dc779aSAndroid Build Coastguard Worker const UWORD32 core_coder_delay, WORD8 *ptr_scratch) {
902*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
903*15dc779aSAndroid Build Coastguard Worker const UWORD32 fs_low = 27713;
904*15dc779aSAndroid Build Coastguard Worker const UWORD32 fs_high = 55426;
905*15dc779aSAndroid Build Coastguard Worker const UWORD32 no_inter_frame_coding = 0;
906*15dc779aSAndroid Build Coastguard Worker UWORD32 num_time_slots = 0, num_qmf_bands_ld = 0;
907*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_struct pstr_mps_enc = (ixheaace_mps_pstr_struct)pstr_handle_mps;
908*15dc779aSAndroid Build Coastguard Worker switch (sbr_ratio) {
909*15dc779aSAndroid Build Coastguard Worker case 1:
910*15dc779aSAndroid Build Coastguard Worker if (!(sampling_rate < fs_low)) {
911*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_MPS_INIT_FAILED;
912*15dc779aSAndroid Build Coastguard Worker }
913*15dc779aSAndroid Build Coastguard Worker break;
914*15dc779aSAndroid Build Coastguard Worker case 2:
915*15dc779aSAndroid Build Coastguard Worker case 4:
916*15dc779aSAndroid Build Coastguard Worker if (!((sampling_rate >= fs_low) && (sampling_rate < fs_high))) {
917*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_MPS_INIT_FAILED;
918*15dc779aSAndroid Build Coastguard Worker }
919*15dc779aSAndroid Build Coastguard Worker break;
920*15dc779aSAndroid Build Coastguard Worker case 0:
921*15dc779aSAndroid Build Coastguard Worker default:;
922*15dc779aSAndroid Build Coastguard Worker }
923*15dc779aSAndroid Build Coastguard Worker
924*15dc779aSAndroid Build Coastguard Worker num_qmf_bands_ld = (sampling_rate < fs_low) ? 5 : ((sampling_rate > fs_high) ? 7 : 6);
925*15dc779aSAndroid Build Coastguard Worker num_time_slots = frame_length >> num_qmf_bands_ld;
926*15dc779aSAndroid Build Coastguard Worker *ptr_bitrate = ixheaace_mps_212_get_closest_bit_rate(audio_object_type, sampling_rate,
927*15dc779aSAndroid Build Coastguard Worker sbr_ratio, *ptr_bitrate);
928*15dc779aSAndroid Build Coastguard Worker
929*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.b_ld_mode = ((no_inter_frame_coding == 1) ? 1 : 2);
930*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.sample_rate = sampling_rate;
931*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.frame_time_slots = num_time_slots;
932*15dc779aSAndroid Build Coastguard Worker if (audio_object_type == AOT_AAC_ELD) {
933*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.num_param_bands = IXHEAACE_MPS_SAC_BANDS_ld;
934*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.independency_factor = 20;
935*15dc779aSAndroid Build Coastguard Worker } else {
936*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.num_param_bands = IXHEAACE_MPS_SAC_BANDS_usac;
937*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.independency_factor = 25;
938*15dc779aSAndroid Build Coastguard Worker }
939*15dc779aSAndroid Build Coastguard Worker
940*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.b_use_coarse_quant = 0;
941*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.quant_mode = IXHEAACE_MPS_QUANTMODE_FINE;
942*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_sac_encoder->user.time_alignment = 0;
943*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->audio_object_type = audio_object_type;
944*15dc779aSAndroid Build Coastguard Worker error =
945*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_init(pstr_mps_enc->ptr_sac_encoder, core_coder_delay, audio_object_type);
946*15dc779aSAndroid Build Coastguard Worker if (error) {
947*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_MPS_INIT_FAILED;
948*15dc779aSAndroid Build Coastguard Worker }
949*15dc779aSAndroid Build Coastguard Worker
950*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_buf_desc.pp_base = (VOID **)&pstr_mps_enc->p_in_buffer;
951*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_buf_desc.p_buf_size = pstr_mps_enc->p_in_buffer_size;
952*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_buf_desc.p_ele_size = pstr_mps_enc->p_in_buffer_el_size;
953*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_buf_desc.p_buf_type = pstr_mps_enc->p_in_buffer_type;
954*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_buf_desc.num_bufs = 1;
955*15dc779aSAndroid Build Coastguard Worker
956*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->out_buf_desc.pp_base = (VOID **)&pstr_mps_enc->p_out_buffer;
957*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->out_buf_desc.p_buf_size = pstr_mps_enc->p_out_buffer_size;
958*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->out_buf_desc.p_ele_size = pstr_mps_enc->p_out_buffer_el_size;
959*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->out_buf_desc.p_buf_type = pstr_mps_enc->p_out_buffer_type;
960*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->out_buf_desc.num_bufs = 2;
961*15dc779aSAndroid Build Coastguard Worker
962*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_in_buffer[0] = NULL;
963*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_in_buffer_size[0] = 0;
964*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_in_buffer_el_size[0] = sizeof(FLOAT32);
965*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_in_buffer_type[0] = IXHEAACE_MPS_INPUT_BUFFER_IDX;
966*15dc779aSAndroid Build Coastguard Worker
967*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer[0] = NULL;
968*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_size[0] = 0;
969*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_el_size[0] = sizeof(FLOAT32);
970*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_type[0] = IXHEAACE_MPS_OUTUT_BUFFER_IDX;
971*15dc779aSAndroid Build Coastguard Worker
972*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer[1] = NULL;
973*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_size[1] = 0;
974*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_el_size[1] = sizeof(UWORD8);
975*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_type[1] = IXHEAACE_MPS_BITSTREAM_BUFFER_IDX;
976*15dc779aSAndroid Build Coastguard Worker
977*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_args.is_input_inter_leaved = 0;
978*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_args.input_buffer_size_per_channel = input_buffer_size_per_channel;
979*15dc779aSAndroid Build Coastguard Worker
980*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->ptr_scratch = ptr_scratch;
981*15dc779aSAndroid Build Coastguard Worker
982*15dc779aSAndroid Build Coastguard Worker return error;
983*15dc779aSAndroid Build Coastguard Worker }
984*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_process(VOID * pstr_handle_mps,FLOAT32 * const ptr_audio_samples,const WORD32 num_audio_samples,ixheaace_mps_enc_ext_payload * pstr_mps_ext_payload)985*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_process(VOID *pstr_handle_mps, FLOAT32 *const ptr_audio_samples,
986*15dc779aSAndroid Build Coastguard Worker const WORD32 num_audio_samples,
987*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_enc_ext_payload *pstr_mps_ext_payload) {
988*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
989*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_struct pstr_mps_enc = (ixheaace_mps_pstr_struct)pstr_handle_mps;
990*15dc779aSAndroid Build Coastguard Worker WORD32 aot = pstr_mps_enc->audio_object_type;
991*15dc779aSAndroid Build Coastguard Worker WORD32 sac_header_flag = 0;
992*15dc779aSAndroid Build Coastguard Worker WORD32 sac_out_buffer_offset = 0;
993*15dc779aSAndroid Build Coastguard Worker
994*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_ELD) {
995*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->sac_out_buffer[0] = (sac_header_flag == 0) ? 0x3 : 0x7;
996*15dc779aSAndroid Build Coastguard Worker sac_out_buffer_offset += 1;
997*15dc779aSAndroid Build Coastguard Worker }
998*15dc779aSAndroid Build Coastguard Worker
999*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_in_buffer[0] = (VOID *)ptr_audio_samples;
1000*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in_args.num_input_samples = num_audio_samples;
1001*15dc779aSAndroid Build Coastguard Worker
1002*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer[0] = (VOID *)ptr_audio_samples;
1003*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_size[0] = sizeof(FLOAT32) * ((WORD32)num_audio_samples) / 2;
1004*15dc779aSAndroid Build Coastguard Worker
1005*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer[1] = (VOID *)&pstr_mps_enc->sac_out_buffer[sac_out_buffer_offset];
1006*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->p_out_buffer_size[1] =
1007*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_mps_enc->sac_out_buffer) - sac_out_buffer_offset;
1008*15dc779aSAndroid Build Coastguard Worker
1009*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_encode(pstr_mps_enc->ptr_sac_encoder, &pstr_mps_enc->in_buf_desc,
1010*15dc779aSAndroid Build Coastguard Worker &pstr_mps_enc->out_buf_desc, &pstr_mps_enc->in_args,
1011*15dc779aSAndroid Build Coastguard Worker &pstr_mps_enc->out_args, aot, pstr_mps_enc->ptr_scratch);
1012*15dc779aSAndroid Build Coastguard Worker if (error) {
1013*15dc779aSAndroid Build Coastguard Worker return error;
1014*15dc779aSAndroid Build Coastguard Worker }
1015*15dc779aSAndroid Build Coastguard Worker
1016*15dc779aSAndroid Build Coastguard Worker pstr_mps_ext_payload->p_data = (UWORD8 *)pstr_mps_enc->sac_out_buffer;
1017*15dc779aSAndroid Build Coastguard Worker pstr_mps_ext_payload->data_size = pstr_mps_enc->out_args.num_output_bits;
1018*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_ELD) {
1019*15dc779aSAndroid Build Coastguard Worker pstr_mps_ext_payload->data_size += 8 * (sac_out_buffer_offset - 1);
1020*15dc779aSAndroid Build Coastguard Worker }
1021*15dc779aSAndroid Build Coastguard Worker pstr_mps_ext_payload->data_type = IXHEAACE_MPS_EXT_LDSAC_DATA;
1022*15dc779aSAndroid Build Coastguard Worker pstr_mps_ext_payload->associated_ch_element = -1;
1023*15dc779aSAndroid Build Coastguard Worker
1024*15dc779aSAndroid Build Coastguard Worker return error;
1025*15dc779aSAndroid Build Coastguard Worker }
1026*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_get_spatial_specific_config(VOID * pstr_handle_mps,WORD8 * ptr_out_buffer,WORD32 buf_size,WORD32 aot)1027*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaace_mps_212_get_spatial_specific_config(VOID *pstr_handle_mps, WORD8 *ptr_out_buffer,
1028*15dc779aSAndroid Build Coastguard Worker WORD32 buf_size, WORD32 aot) {
1029*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf bit_buf;
1030*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_buf =
1031*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_create_bitbuffer(&bit_buf, (UWORD8 *)ptr_out_buffer, buf_size);
1032*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_write_spatial_specific_config_data(pstr_handle_mps, pstr_bit_buf);
1033*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_ELD) {
1034*15dc779aSAndroid Build Coastguard Worker ixheaace_byte_align_buffer(pstr_bit_buf);
1035*15dc779aSAndroid Build Coastguard Worker }
1036*15dc779aSAndroid Build Coastguard Worker return ia_enhaacplus_enc_get_bits_available(pstr_bit_buf);
1037*15dc779aSAndroid Build Coastguard Worker }
1038*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_515_scratch_size(VOID)1039*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaace_mps_515_scratch_size(VOID) {
1040*15dc779aSAndroid Build Coastguard Worker WORD32 size = 0;
1041*15dc779aSAndroid Build Coastguard Worker size += ((MAX_INPUT_CHANNELS * MAX_BUFFER_SIZE) * sizeof(FLOAT32));
1042*15dc779aSAndroid Build Coastguard Worker size += ((MAX_OUTPUT_CHANNELS * MAX_BUFFER_SIZE) * sizeof(FLOAT32));
1043*15dc779aSAndroid Build Coastguard Worker size +=
1044*15dc779aSAndroid Build Coastguard Worker (((MAX_INPUT_CHANNELS * MAX_BUFFER_SIZE) + (2 * MAX_BUFFER_SIZE) + (2 * MAX_BUFFER_SIZE)) *
1045*15dc779aSAndroid Build Coastguard Worker sizeof(FLOAT32));
1046*15dc779aSAndroid Build Coastguard Worker size += (((6 * MAX_TIME_SLOTS * NUM_QMF_BANDS) + (6 * MAX_TIME_SLOTS * NUM_QMF_BANDS) +
1047*15dc779aSAndroid Build Coastguard Worker (6 * MAX_TIME_SLOTS * NUM_QMF_BANDS) + (6 * MAX_TIME_SLOTS * NUM_QMF_BANDS) +
1048*15dc779aSAndroid Build Coastguard Worker (6 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS) + (6 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS)) *
1049*15dc779aSAndroid Build Coastguard Worker sizeof(FLOAT32));
1050*15dc779aSAndroid Build Coastguard Worker size += (INPUT_LEN_DOWNSAMPLE * IXHEAACE_MAX_CH_IN_BS_ELE * UPSAMPLE_FAC * sizeof(FLOAT32));
1051*15dc779aSAndroid Build Coastguard Worker size += (INPUT_LEN_DOWNSAMPLE * IXHEAACE_MAX_CH_IN_BS_ELE * UPSAMPLE_FAC * sizeof(FLOAT32));
1052*15dc779aSAndroid Build Coastguard Worker size = IXHEAAC_GET_SIZE_ALIGNED(size, BYTE_ALIGN_8);
1053*15dc779aSAndroid Build Coastguard Worker return size;
1054*15dc779aSAndroid Build Coastguard Worker }
1055*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_515_open(VOID ** pstr_handle_mps,WORD32 sample_freq,WORD32 tree_config,ixheaace_bit_buf_handle pstr_bitstream,WORD32 * ptr_bits_written,ixheaace_mps_515_memory_struct * pstr_mps_memory,WORD32 flag_480)1056*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_515_open(VOID **pstr_handle_mps, WORD32 sample_freq, WORD32 tree_config,
1057*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bitstream,
1058*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_bits_written,
1059*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_memory_struct *pstr_mps_memory,
1060*15dc779aSAndroid Build Coastguard Worker WORD32 flag_480) {
1061*15dc779aSAndroid Build Coastguard Worker WORD32 i;
1062*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
1063*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_sac_specific_config *pstr_mps_specific_config;
1064*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_sac_pstr_enc pstr_mps_enc = &pstr_mps_memory->spatial_enc_instance;
1065*15dc779aSAndroid Build Coastguard Worker
1066*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_sac_pstr_qmf_ana_filter_bank pstr_qmf_ana_bank = &pstr_mps_enc->qmf_fltbank;
1067*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_bank =
1068*15dc779aSAndroid Build Coastguard Worker &pstr_mps_enc->qmf_synth_fltbank;
1069*15dc779aSAndroid Build Coastguard Worker
1070*15dc779aSAndroid Build Coastguard Worker memset(pstr_mps_enc, 0, sizeof(ixheaace_mps_sac_enc));
1071*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->tree_config = tree_config;
1072*15dc779aSAndroid Build Coastguard Worker switch (tree_config) {
1073*15dc779aSAndroid Build Coastguard Worker case 5151:
1074*15dc779aSAndroid Build Coastguard Worker case 5152:
1075*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->output_channels = 1;
1076*15dc779aSAndroid Build Coastguard Worker break;
1077*15dc779aSAndroid Build Coastguard Worker case 525:
1078*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->output_channels = 2;
1079*15dc779aSAndroid Build Coastguard Worker }
1080*15dc779aSAndroid Build Coastguard Worker if (flag_480) {
1081*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots = 15;
1082*15dc779aSAndroid Build Coastguard Worker } else {
1083*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots = 16;
1084*15dc779aSAndroid Build Coastguard Worker }
1085*15dc779aSAndroid Build Coastguard Worker
1086*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->frame_size = NUM_QMF_BANDS * pstr_mps_enc->time_slots;
1087*15dc779aSAndroid Build Coastguard Worker
1088*15dc779aSAndroid Build Coastguard Worker pstr_qmf_ana_bank->p_filter = ia_mps_enc_qmf_64_640;
1089*15dc779aSAndroid Build Coastguard Worker
1090*15dc779aSAndroid Build Coastguard Worker pstr_qmf_synth_bank->p_filter = ia_mps_enc_qmf_64_640;
1091*15dc779aSAndroid Build Coastguard Worker pstr_qmf_synth_bank->alt_sin_twiddle = sbr_alt_sin_twiddle;
1092*15dc779aSAndroid Build Coastguard Worker pstr_qmf_synth_bank->cos_twiddle = sbr_cos_twiddle;
1093*15dc779aSAndroid Build Coastguard Worker pstr_qmf_synth_bank->sin_twiddle = sbr_sin_twiddle;
1094*15dc779aSAndroid Build Coastguard Worker
1095*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 6; i++) {
1096*15dc779aSAndroid Build Coastguard Worker memset(&pstr_mps_enc->filterbank[i], 0, sizeof(ixheaace_mps_sac_sbr_encoder_ana_filter_bank));
1097*15dc779aSAndroid Build Coastguard Worker
1098*15dc779aSAndroid Build Coastguard Worker memset(&pstr_mps_enc->hyb_state[i], 0, sizeof(ixheaace_mps_hyb_filter_state));
1099*15dc779aSAndroid Build Coastguard Worker }
1100*15dc779aSAndroid Build Coastguard Worker
1101*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->bitstream_formatter = &pstr_mps_memory->bsf_memory_instance;
1102*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config = &pstr_mps_enc->bitstream_formatter->spatial_specific_config;
1103*15dc779aSAndroid Build Coastguard Worker
1104*15dc779aSAndroid Build Coastguard Worker memset(pstr_mps_specific_config, 0, sizeof(ixheaace_mps_sac_specific_config));
1105*15dc779aSAndroid Build Coastguard Worker
1106*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->bitstream_formatter->current_frame.bs_independency_flag_count = 0;
1107*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_sampling_frequency = sample_freq;
1108*15dc779aSAndroid Build Coastguard Worker
1109*15dc779aSAndroid Build Coastguard Worker switch (tree_config) {
1110*15dc779aSAndroid Build Coastguard Worker case 5151:
1111*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_tree_config = IXHEAACE_MPS_TREE_5151;
1112*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->ott_config[4].bs_ott_bands = 2;
1113*15dc779aSAndroid Build Coastguard Worker break;
1114*15dc779aSAndroid Build Coastguard Worker
1115*15dc779aSAndroid Build Coastguard Worker case 5152:
1116*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_tree_config = IXHEAACE_MPS_TREE_5152;
1117*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->ott_config[2].bs_ott_bands = 2;
1118*15dc779aSAndroid Build Coastguard Worker break;
1119*15dc779aSAndroid Build Coastguard Worker
1120*15dc779aSAndroid Build Coastguard Worker case 525:
1121*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_tree_config = IXHEAACE_MPS_TREE_525;
1122*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->ott_config[0].bs_ott_bands = 2;
1123*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->ttt_config->bs_ttt_bands_low = PARAMETER_BANDS;
1124*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->ttt_config->bs_ttt_mode_low = 5;
1125*15dc779aSAndroid Build Coastguard Worker }
1126*15dc779aSAndroid Build Coastguard Worker
1127*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_frame_length = pstr_mps_enc->time_slots - 1;
1128*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_freq_res = 2;
1129*15dc779aSAndroid Build Coastguard Worker
1130*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_fixed_gain_sur = 2;
1131*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_fixed_gain_lfe = 1;
1132*15dc779aSAndroid Build Coastguard Worker pstr_mps_specific_config->bs_fixed_gain_dmx = 0;
1133*15dc779aSAndroid Build Coastguard Worker
1134*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_515_write_spatial_specific_config(pstr_bitstream,
1135*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->bitstream_formatter);
1136*15dc779aSAndroid Build Coastguard Worker
1137*15dc779aSAndroid Build Coastguard Worker *ptr_bits_written = ia_enhaacplus_enc_get_bits_available(pstr_bitstream);
1138*15dc779aSAndroid Build Coastguard Worker *pstr_handle_mps = pstr_mps_enc;
1139*15dc779aSAndroid Build Coastguard Worker return error;
1140*15dc779aSAndroid Build Coastguard Worker }
1141*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_515_apply(ixheaace_mps_sac_enc * pstr_mps_enc,FLOAT32 * ptr_audio_input,FLOAT32 * ptr_audio_output,ixheaace_bit_buf_handle pstr_bitstream,VOID * ptr_scratch)1142*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_515_apply(ixheaace_mps_sac_enc *pstr_mps_enc, FLOAT32 *ptr_audio_input,
1143*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_audio_output,
1144*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bitstream, VOID *ptr_scratch) {
1145*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
1146*15dc779aSAndroid Build Coastguard Worker FLOAT32 *pstr_scratch = (FLOAT32 *)ptr_scratch;
1147*15dc779aSAndroid Build Coastguard Worker
1148*15dc779aSAndroid Build Coastguard Worker FLOAT32 *in = (FLOAT32 *)pstr_scratch;
1149*15dc779aSAndroid Build Coastguard Worker memset(in, 0, sizeof(*in) * MAX_INPUT_CHANNELS * MAX_BUFFER_SIZE);
1150*15dc779aSAndroid Build Coastguard Worker pstr_scratch += MAX_INPUT_CHANNELS * MAX_BUFFER_SIZE;
1151*15dc779aSAndroid Build Coastguard Worker
1152*15dc779aSAndroid Build Coastguard Worker FLOAT32 *out = (FLOAT32 *)pstr_scratch;
1153*15dc779aSAndroid Build Coastguard Worker memset(out, 0, sizeof(*out) * 2 * MAX_BUFFER_SIZE);
1154*15dc779aSAndroid Build Coastguard Worker pstr_scratch += 2 * MAX_BUFFER_SIZE;
1155*15dc779aSAndroid Build Coastguard Worker
1156*15dc779aSAndroid Build Coastguard Worker FLOAT32 *out1 = (FLOAT32 *)pstr_scratch;
1157*15dc779aSAndroid Build Coastguard Worker memset(out1, 0, sizeof(*out1) * 2 * MAX_BUFFER_SIZE);
1158*15dc779aSAndroid Build Coastguard Worker pstr_scratch += 2 * MAX_BUFFER_SIZE;
1159*15dc779aSAndroid Build Coastguard Worker
1160*15dc779aSAndroid Build Coastguard Worker FLOAT32 *m_qmf_real = (FLOAT32 *)pstr_scratch;
1161*15dc779aSAndroid Build Coastguard Worker memset(m_qmf_real, 0, sizeof(*m_qmf_real) * 6 * MAX_TIME_SLOTS * NUM_QMF_BANDS);
1162*15dc779aSAndroid Build Coastguard Worker pstr_scratch += 6 * MAX_TIME_SLOTS * NUM_QMF_BANDS;
1163*15dc779aSAndroid Build Coastguard Worker
1164*15dc779aSAndroid Build Coastguard Worker FLOAT32 *m_qmf_imag = (FLOAT32 *)pstr_scratch;
1165*15dc779aSAndroid Build Coastguard Worker memset(m_qmf_imag, 0, sizeof(*m_qmf_imag) * 6 * MAX_TIME_SLOTS * NUM_QMF_BANDS);
1166*15dc779aSAndroid Build Coastguard Worker pstr_scratch += 6 * MAX_TIME_SLOTS * NUM_QMF_BANDS;
1167*15dc779aSAndroid Build Coastguard Worker
1168*15dc779aSAndroid Build Coastguard Worker FLOAT32 *m_hybrid_real = (FLOAT32 *)pstr_scratch;
1169*15dc779aSAndroid Build Coastguard Worker memset(m_hybrid_real, 0, sizeof(*m_hybrid_real) * 6 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS);
1170*15dc779aSAndroid Build Coastguard Worker pstr_scratch += 6 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS;
1171*15dc779aSAndroid Build Coastguard Worker
1172*15dc779aSAndroid Build Coastguard Worker FLOAT32 *m_hybrid_imag = (FLOAT32 *)pstr_scratch;
1173*15dc779aSAndroid Build Coastguard Worker memset(m_hybrid_imag, 0, sizeof(*m_hybrid_imag) * 6 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS);
1174*15dc779aSAndroid Build Coastguard Worker pstr_scratch += 6 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS;
1175*15dc779aSAndroid Build Coastguard Worker
1176*15dc779aSAndroid Build Coastguard Worker FLOAT32 *m_qmf_real_out = (FLOAT32 *)pstr_scratch;
1177*15dc779aSAndroid Build Coastguard Worker memset(m_qmf_real_out, 0, sizeof(*m_qmf_real_out) * 6 * MAX_TIME_SLOTS * NUM_QMF_BANDS);
1178*15dc779aSAndroid Build Coastguard Worker pstr_scratch += 6 * MAX_TIME_SLOTS * NUM_QMF_BANDS;
1179*15dc779aSAndroid Build Coastguard Worker
1180*15dc779aSAndroid Build Coastguard Worker FLOAT32 *m_qmf_imag_out = (FLOAT32 *)pstr_scratch;
1181*15dc779aSAndroid Build Coastguard Worker memset(m_qmf_imag_out, 0, sizeof(*m_qmf_imag_out) * 6 * MAX_TIME_SLOTS * NUM_QMF_BANDS);
1182*15dc779aSAndroid Build Coastguard Worker
1183*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_sac_spatial_frame *pstr_frame_data;
1184*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_sac_pstr_qmf_ana_filter_bank pstr_qmf_ana_bank = &pstr_mps_enc->qmf_fltbank;
1185*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_bank =
1186*15dc779aSAndroid Build Coastguard Worker &pstr_mps_enc->qmf_synth_fltbank;
1187*15dc779aSAndroid Build Coastguard Worker
1188*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, l;
1189*15dc779aSAndroid Build Coastguard Worker
1190*15dc779aSAndroid Build Coastguard Worker FLOAT32 p_pre_scale[6] = {1.f, 1.f, 1.f, 0.3162f, 0.7071f, 0.7071f};
1191*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < DELAY_COMPENSATION; i++) {
1192*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 6; j++) {
1193*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in1[j][i] = pstr_mps_enc->in1[j][i + pstr_mps_enc->frame_size];
1194*15dc779aSAndroid Build Coastguard Worker }
1195*15dc779aSAndroid Build Coastguard Worker }
1196*15dc779aSAndroid Build Coastguard Worker
1197*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_mps_enc->frame_size; i++) {
1198*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 6; j++) {
1199*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->in1[j][i + DELAY_COMPENSATION] = ptr_audio_input[i * 6 + j] * p_pre_scale[j];
1200*15dc779aSAndroid Build Coastguard Worker }
1201*15dc779aSAndroid Build Coastguard Worker }
1202*15dc779aSAndroid Build Coastguard Worker
1203*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_mps_enc->frame_size; i++) {
1204*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 6; j++) {
1205*15dc779aSAndroid Build Coastguard Worker in[j * MAX_BUFFER_SIZE + i] = ptr_audio_input[i * 6 + j] * p_pre_scale[j];
1206*15dc779aSAndroid Build Coastguard Worker }
1207*15dc779aSAndroid Build Coastguard Worker }
1208*15dc779aSAndroid Build Coastguard Worker
1209*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_mps_enc->frame_size; i++) {
1210*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_enc->output_channels == 1)
1211*15dc779aSAndroid Build Coastguard Worker out1[i] = in[i] + in[MAX_BUFFER_SIZE + i] + in[2 * MAX_BUFFER_SIZE + i] +
1212*15dc779aSAndroid Build Coastguard Worker in[3 * MAX_BUFFER_SIZE + i] + in[4 * MAX_BUFFER_SIZE + i] +
1213*15dc779aSAndroid Build Coastguard Worker in[5 * MAX_BUFFER_SIZE + i];
1214*15dc779aSAndroid Build Coastguard Worker else {
1215*15dc779aSAndroid Build Coastguard Worker out1[i] = in[i] + 0.7071f * (in[2 * MAX_BUFFER_SIZE + i] + in[3 * MAX_BUFFER_SIZE + i]) +
1216*15dc779aSAndroid Build Coastguard Worker in[4 * MAX_BUFFER_SIZE + i];
1217*15dc779aSAndroid Build Coastguard Worker out1[MAX_BUFFER_SIZE + i] =
1218*15dc779aSAndroid Build Coastguard Worker in[MAX_BUFFER_SIZE + i] +
1219*15dc779aSAndroid Build Coastguard Worker 0.7071f * (in[2 * MAX_BUFFER_SIZE + i] + in[3 * MAX_BUFFER_SIZE + i]) +
1220*15dc779aSAndroid Build Coastguard Worker in[5 * MAX_BUFFER_SIZE + i];
1221*15dc779aSAndroid Build Coastguard Worker }
1222*15dc779aSAndroid Build Coastguard Worker }
1223*15dc779aSAndroid Build Coastguard Worker
1224*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_mps_enc->frame_size; i++) {
1225*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 6; j++) {
1226*15dc779aSAndroid Build Coastguard Worker in[j * MAX_BUFFER_SIZE + i] = pstr_mps_enc->in1[j][i];
1227*15dc779aSAndroid Build Coastguard Worker }
1228*15dc779aSAndroid Build Coastguard Worker }
1229*15dc779aSAndroid Build Coastguard Worker
1230*15dc779aSAndroid Build Coastguard Worker for (l = 0; l < pstr_mps_enc->time_slots; l++) {
1231*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 6; j++) {
1232*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_calculate_ana_filterbank(
1233*15dc779aSAndroid Build Coastguard Worker &pstr_mps_enc->filterbank[j], in + (j * MAX_BUFFER_SIZE) + (l * 64),
1234*15dc779aSAndroid Build Coastguard Worker m_qmf_real + (j * MAX_TIME_SLOTS * NUM_QMF_BANDS) + (l * NUM_QMF_BANDS),
1235*15dc779aSAndroid Build Coastguard Worker m_qmf_imag + (j * MAX_TIME_SLOTS * NUM_QMF_BANDS) + (l * NUM_QMF_BANDS),
1236*15dc779aSAndroid Build Coastguard Worker pstr_qmf_ana_bank);
1237*15dc779aSAndroid Build Coastguard Worker }
1238*15dc779aSAndroid Build Coastguard Worker }
1239*15dc779aSAndroid Build Coastguard Worker
1240*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 6; k++) {
1241*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_apply_ana_hyb_filterbank(
1242*15dc779aSAndroid Build Coastguard Worker &pstr_mps_enc->hyb_state[k], m_qmf_real + (k * MAX_TIME_SLOTS * NUM_QMF_BANDS),
1243*15dc779aSAndroid Build Coastguard Worker m_qmf_imag + (k * MAX_TIME_SLOTS * NUM_QMF_BANDS), pstr_mps_enc->time_slots,
1244*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + (k * MAX_TIME_SLOTS * MAX_HYBRID_BANDS),
1245*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + k * MAX_TIME_SLOTS * MAX_HYBRID_BANDS);
1246*15dc779aSAndroid Build Coastguard Worker }
1247*15dc779aSAndroid Build Coastguard Worker
1248*15dc779aSAndroid Build Coastguard Worker pstr_frame_data = &pstr_mps_enc->bitstream_formatter->current_frame;
1249*15dc779aSAndroid Build Coastguard Worker switch (pstr_mps_enc->tree_config) {
1250*15dc779aSAndroid Build Coastguard Worker case 5151:
1251*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1252*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1253*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1254*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[3][0],
1255*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.icc[3][0]);
1256*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(
1257*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots, m_hybrid_real + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1258*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1259*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 5 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1260*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 5 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1261*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[2][0], pstr_frame_data->ott_data.icc[2][0]);
1262*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(
1263*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots, m_hybrid_real + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1264*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1265*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 3 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1266*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 3 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1267*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[4][0], pstr_frame_data->ott_data.icc[4][0]);
1268*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1269*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1270*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1271*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[1][0],
1272*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.icc[1][0]);
1273*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1274*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1275*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1276*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[0][0],
1277*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.icc[0][0]);
1278*15dc779aSAndroid Build Coastguard Worker
1279*15dc779aSAndroid Build Coastguard Worker break;
1280*15dc779aSAndroid Build Coastguard Worker case 5152:
1281*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1282*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1283*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1284*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[3][0],
1285*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.icc[3][0]);
1286*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(
1287*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots, m_hybrid_real + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1288*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1289*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 5 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1290*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 5 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1291*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[4][0], pstr_frame_data->ott_data.icc[4][0]);
1292*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(
1293*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots, m_hybrid_real + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1294*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1295*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 3 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1296*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 3 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1297*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[2][0], pstr_frame_data->ott_data.icc[2][0]);
1298*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1299*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1300*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1301*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[1][0],
1302*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.icc[1][0]);
1303*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1304*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1305*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1306*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[0][0],
1307*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.icc[0][0]);
1308*15dc779aSAndroid Build Coastguard Worker break;
1309*15dc779aSAndroid Build Coastguard Worker case 525:
1310*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1311*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1312*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 4 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1313*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[1][0],
1314*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.icc[1][0]);
1315*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(
1316*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots, m_hybrid_real + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1317*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1318*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 5 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1319*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 5 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1320*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[2][0], pstr_frame_data->ott_data.icc[2][0]);
1321*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ott_box(
1322*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots, m_hybrid_real + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1323*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1324*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 3 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1325*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 3 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1326*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ott_data.cld[0][0], pstr_frame_data->ott_data.icc[0][0]);
1327*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_ttt_box(pstr_mps_enc->time_slots, m_hybrid_real, m_hybrid_imag,
1328*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1329*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1330*15dc779aSAndroid Build Coastguard Worker m_hybrid_real + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1331*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + 2 * MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1332*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ttt_data.cpc_cld1[0][0],
1333*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->ttt_data.cpc_cld2[0][0]);
1334*15dc779aSAndroid Build Coastguard Worker }
1335*15dc779aSAndroid Build Coastguard Worker
1336*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->framing_info.bs_framing_type = 1;
1337*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->framing_info.bs_num_param_sets = 1;
1338*15dc779aSAndroid Build Coastguard Worker
1339*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->framing_info.bs_param_slots[0] = 31;
1340*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_data->bs_independency_flag_count == 0) {
1341*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->bs_independency_flag = 1;
1342*15dc779aSAndroid Build Coastguard Worker }
1343*15dc779aSAndroid Build Coastguard Worker pstr_frame_data->bs_independency_flag_count =
1344*15dc779aSAndroid Build Coastguard Worker (pstr_frame_data->bs_independency_flag_count + 1) % 10;
1345*15dc779aSAndroid Build Coastguard Worker
1346*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_515_write_spatial_frame(pstr_bitstream, pstr_mps_enc->bitstream_formatter);
1347*15dc779aSAndroid Build Coastguard Worker if (error) {
1348*15dc779aSAndroid Build Coastguard Worker return error;
1349*15dc779aSAndroid Build Coastguard Worker }
1350*15dc779aSAndroid Build Coastguard Worker
1351*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_enc->output_channels == 1) {
1352*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_apply_syn_hyb_filterbank(
1353*15dc779aSAndroid Build Coastguard Worker m_hybrid_real, m_hybrid_imag, pstr_mps_enc->time_slots, m_qmf_real_out, m_qmf_imag_out);
1354*15dc779aSAndroid Build Coastguard Worker
1355*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_calculate_sbr_syn_filterbank(m_qmf_real_out, m_qmf_imag_out, out, 0,
1356*15dc779aSAndroid Build Coastguard Worker pstr_qmf_synth_bank, pstr_mps_enc->time_slots,
1357*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->sbr_qmf_states_synthesis);
1358*15dc779aSAndroid Build Coastguard Worker
1359*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_mps_enc->frame_size; j++) {
1360*15dc779aSAndroid Build Coastguard Worker ptr_audio_output[j] = out1[j];
1361*15dc779aSAndroid Build Coastguard Worker }
1362*15dc779aSAndroid Build Coastguard Worker } else {
1363*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_apply_syn_hyb_filterbank(
1364*15dc779aSAndroid Build Coastguard Worker m_hybrid_real, m_hybrid_imag, pstr_mps_enc->time_slots, m_qmf_real_out, m_qmf_imag_out);
1365*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_apply_syn_hyb_filterbank(m_hybrid_real + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1366*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1367*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->time_slots,
1368*15dc779aSAndroid Build Coastguard Worker m_qmf_real_out + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1369*15dc779aSAndroid Build Coastguard Worker m_qmf_imag_out + MAX_TIME_SLOTS * MAX_HYBRID_BANDS);
1370*15dc779aSAndroid Build Coastguard Worker
1371*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_calculate_sbr_syn_filterbank(m_qmf_real_out, m_qmf_imag_out, out, 0,
1372*15dc779aSAndroid Build Coastguard Worker pstr_qmf_synth_bank, pstr_mps_enc->time_slots,
1373*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->sbr_qmf_states_synthesis);
1374*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_515_calculate_sbr_syn_filterbank(
1375*15dc779aSAndroid Build Coastguard Worker m_qmf_real_out + MAX_TIME_SLOTS * MAX_HYBRID_BANDS,
1376*15dc779aSAndroid Build Coastguard Worker m_qmf_imag_out + MAX_TIME_SLOTS * MAX_HYBRID_BANDS, out + MAX_BUFFER_SIZE, 1,
1377*15dc779aSAndroid Build Coastguard Worker pstr_qmf_synth_bank, pstr_mps_enc->time_slots, pstr_mps_enc->sbr_qmf_states_synthesis);
1378*15dc779aSAndroid Build Coastguard Worker
1379*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_mps_enc->frame_size; j++) {
1380*15dc779aSAndroid Build Coastguard Worker ptr_audio_output[2 * j] = out1[j];
1381*15dc779aSAndroid Build Coastguard Worker ptr_audio_output[2 * j + 1] = out1[MAX_BUFFER_SIZE + j];
1382*15dc779aSAndroid Build Coastguard Worker }
1383*15dc779aSAndroid Build Coastguard Worker }
1384*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1385*15dc779aSAndroid Build Coastguard Worker }
1386*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_515_close(ixheaace_mps_sac_enc * pstr_mps_enc)1387*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_mps_515_close(ixheaace_mps_sac_enc *pstr_mps_enc) {
1388*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_enc != NULL) {
1389*15dc779aSAndroid Build Coastguard Worker pstr_mps_enc->bitstream_formatter = NULL;
1390*15dc779aSAndroid Build Coastguard Worker }
1391*15dc779aSAndroid Build Coastguard Worker }
1392