/src/libxaac/decoder/drc_src/impd_drc_api.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2018 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | #include <string.h> |
21 | | #include <stdlib.h> |
22 | | #include "impd_type_def.h" |
23 | | #include "impd_error_standards.h" |
24 | | #include "impd_apicmd_standards.h" |
25 | | #include "impd_memory_standards.h" |
26 | | |
27 | | #include "impd_drc_bitbuffer.h" |
28 | | #include "impd_drc_extr_delta_coded_info.h" |
29 | | #include "ixheaac_constants.h" |
30 | | #include "impd_drc_common.h" |
31 | | #include "impd_drc_struct.h" |
32 | | #include "impd_drc_interface.h" |
33 | | #include "impd_parametric_drc_dec.h" |
34 | | #include "impd_drc_gain_dec.h" |
35 | | #include "impd_drc_filter_bank.h" |
36 | | #include "impd_drc_multi_band.h" |
37 | | #include "impd_drc_process_audio.h" |
38 | | #include "impd_drc_eq.h" |
39 | | #include "impd_drc_gain_decoder.h" |
40 | | #include "impd_drc_config_params.h" |
41 | | #include "impd_drc_api_defs.h" |
42 | | #include "impd_drc_definitions.h" |
43 | | #include "impd_drc_hashdefines.h" |
44 | | #include "impd_drc_peak_limiter.h" |
45 | | |
46 | | #include "impd_drc_selection_process.h" |
47 | | #include "impd_drc_api_struct_def.h" |
48 | | #include "impd_drc_error_codes.h" |
49 | | |
50 | | WORD32 impd_init_process_audio_main_qmf(ia_drc_api_struct *p_obj_drc); |
51 | | WORD32 impd_init_process_audio_main_stft(ia_drc_api_struct *p_obj_drc); |
52 | | WORD32 impd_init_process_audio_main_td_qmf(ia_drc_api_struct *p_obj_drc); |
53 | | |
54 | | IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, |
55 | | WORD32 i_idx, pVOID pv_value); |
56 | | |
57 | | IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc); |
58 | | |
59 | | IA_ERRORCODE impd_drc_process_frame(ia_drc_api_struct *p_obj_drc); |
60 | | IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc); |
61 | | IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc); |
62 | | IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc); |
63 | | IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc); |
64 | | |
65 | 63.1k | #define NUM_DRC_TABLES 4 |
66 | | |
67 | | IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, |
68 | 555k | pVOID pv_value) { |
69 | 555k | ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj; |
70 | 555k | IA_ERRORCODE error_code = IA_NO_ERROR; |
71 | 555k | LOOPIDX i; |
72 | | |
73 | 555k | pUWORD32 pui_value = pv_value; |
74 | 555k | pUWORD32 pus_value = pv_value; |
75 | 555k | pWORD8 pb_value = pv_value; |
76 | 555k | SIZE_T *ps_value = pv_value; |
77 | 555k | pWORD32 pi_value = pv_value; |
78 | 555k | FLOAT32 *pf_value = pv_value; |
79 | | |
80 | 555k | switch (i_cmd) { |
81 | 42.1k | case IA_API_CMD_GET_MEM_INFO_SIZE: |
82 | 84.2k | case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: |
83 | 126k | case IA_API_CMD_GET_MEM_INFO_TYPE: |
84 | 126k | case IA_API_CMD_GET_MEM_INFO_PLACEMENT: |
85 | 126k | case IA_API_CMD_GET_MEM_INFO_PRIORITY: |
86 | 210k | case IA_API_CMD_SET_MEM_PTR: |
87 | 210k | case IA_API_CMD_SET_MEM_PLACEMENT: { |
88 | 210k | return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value); |
89 | 210k | } |
90 | 555k | }; |
91 | | |
92 | 345k | switch (i_cmd) { |
93 | 0 | case IA_API_CMD_GET_LIB_ID_STRINGS: { |
94 | 0 | switch (i_idx) { |
95 | 0 | case IA_CMD_TYPE_LIB_NAME: { |
96 | 0 | WORD8 lib_name[] = LIBNAME; |
97 | 0 | for (i = 0; i < IA_API_STR_LEN && lib_name[i - 1] != 0; i++) { |
98 | 0 | pb_value[i] = lib_name[i]; |
99 | 0 | } |
100 | 0 | break; |
101 | 0 | } |
102 | 0 | case IA_CMD_TYPE_LIB_VERSION: { |
103 | 0 | break; |
104 | 0 | } |
105 | | |
106 | 0 | case IA_CMD_TYPE_API_VERSION: { |
107 | 0 | } |
108 | 0 | default: { return -1; } |
109 | 0 | }; |
110 | 0 | break; |
111 | 0 | } |
112 | 24.2k | case IA_API_CMD_GET_API_SIZE: { |
113 | 24.2k | *pui_value = sizeof(ia_drc_api_struct); |
114 | | |
115 | 24.2k | break; |
116 | 0 | } |
117 | 75.5k | case IA_API_CMD_INIT: { |
118 | 75.5k | switch (i_idx) { |
119 | 21.0k | case IA_CMD_TYPE_INIT_SET_BUFF_PTR: { |
120 | 21.0k | p_obj_drc->p_state->persistent_ptr = |
121 | 21.0k | (UWORD8 *)p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] + |
122 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8); |
123 | 21.0k | error_code = impd_drc_set_struct_pointer(p_obj_drc); |
124 | 21.0k | if (error_code) return error_code; |
125 | | |
126 | 21.0k | break; |
127 | 21.0k | } |
128 | 24.2k | case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: { |
129 | 24.2k | error_code = impd_drc_set_default_config(p_obj_drc); |
130 | 24.2k | if (error_code) return error_code; |
131 | 24.2k | break; |
132 | 24.2k | } |
133 | 24.2k | case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: { |
134 | 21.0k | error_code = impd_drc_fill_mem_tables(p_obj_drc); |
135 | 21.0k | if (error_code) return error_code; |
136 | 21.0k | break; |
137 | 21.0k | } |
138 | 21.0k | case IA_CMD_TYPE_INIT_PROCESS: { |
139 | 2.13k | IA_ERRORCODE Error = 0; |
140 | | |
141 | 2.13k | if (p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) { |
142 | 0 | return (-1); |
143 | 0 | } |
144 | | |
145 | 2.13k | Error = impd_drc_init(p_obj_drc); |
146 | 2.13k | if (Error) return Error; |
147 | 783 | p_obj_drc->p_state->ui_init_done = 1; |
148 | 783 | return Error; |
149 | 0 | break; |
150 | 2.13k | } |
151 | 0 | case IA_CMD_TYPE_INIT_DONE_QUERY: { |
152 | 0 | if (p_obj_drc->p_state->ui_init_done == 1) { |
153 | 0 | *pui_value = 1; |
154 | 0 | } else { |
155 | 0 | *pui_value = 0; |
156 | 0 | } |
157 | 0 | break; |
158 | 2.13k | } |
159 | | |
160 | 0 | case IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY: { |
161 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over; |
162 | 0 | break; |
163 | 2.13k | } |
164 | 0 | case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY: { |
165 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over_ic; |
166 | 0 | break; |
167 | 2.13k | } |
168 | | |
169 | 0 | case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY: { |
170 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over_il; |
171 | 0 | break; |
172 | 2.13k | } |
173 | 0 | case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY: { |
174 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over_in; |
175 | 0 | break; |
176 | 2.13k | } |
177 | 1.89k | case IA_CMD_TYPE_INIT_CPY_BSF_BUFF: { |
178 | 1.89k | memcpy(p_obj_drc->str_bit_handler.it_bit_buf + |
179 | 1.89k | p_obj_drc->str_bit_handler.num_bytes_offset_bs, |
180 | 1.89k | p_obj_drc->pp_mem[2], p_obj_drc->str_bit_handler.num_byts_cur); |
181 | 1.89k | p_obj_drc->str_bit_handler.num_bytes_bs = |
182 | 1.89k | p_obj_drc->str_bit_handler.num_bytes_bs + |
183 | 1.89k | p_obj_drc->str_bit_handler.num_byts_cur; |
184 | 1.89k | p_obj_drc->str_bit_handler.num_bytes_offset_bs = |
185 | 1.89k | p_obj_drc->str_bit_handler.num_bytes_bs; |
186 | 1.89k | p_obj_drc->str_bit_handler.num_total_bytes = |
187 | 1.89k | p_obj_drc->str_bit_handler.num_bytes_bs; |
188 | | |
189 | 1.89k | break; |
190 | 2.13k | } |
191 | 1.78k | case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: { |
192 | 1.78k | memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config, |
193 | 1.78k | p_obj_drc->pp_mem[2], |
194 | 1.78k | p_obj_drc->str_bit_handler.num_byts_cur_ic); |
195 | 1.78k | p_obj_drc->str_bit_handler.num_bytes_bs_drc_config = |
196 | 1.78k | p_obj_drc->str_bit_handler.num_byts_cur_ic; |
197 | 1.78k | break; |
198 | 2.13k | } |
199 | 1.12k | case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: { |
200 | 1.12k | memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info, |
201 | 1.12k | p_obj_drc->pp_mem[2], |
202 | 1.12k | p_obj_drc->str_bit_handler.num_byts_cur_il); |
203 | 1.12k | p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info = |
204 | 1.12k | p_obj_drc->str_bit_handler.num_byts_cur_il; |
205 | 1.12k | break; |
206 | 2.13k | } |
207 | 2.13k | case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: { |
208 | 2.13k | memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface, |
209 | 2.13k | p_obj_drc->pp_mem[2], |
210 | 2.13k | p_obj_drc->str_bit_handler.num_byts_cur_in); |
211 | 2.13k | p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface = |
212 | 2.13k | p_obj_drc->str_bit_handler.num_byts_cur_in; |
213 | 2.13k | break; |
214 | 2.13k | } |
215 | 0 | default: { return -1; } |
216 | 75.5k | }; |
217 | 73.3k | break; |
218 | 75.5k | } |
219 | 2.13k | case IA_API_CMD_GET_CONFIG_PARAM: { |
220 | 2.13k | switch (i_idx) { |
221 | 0 | case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { |
222 | 0 | *pus_value = p_obj_drc->str_config.sampling_rate; |
223 | 0 | break; |
224 | 0 | } |
225 | | |
226 | 2.13k | case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { |
227 | 2.13k | *pus_value = p_obj_drc->str_config.num_ch_out; |
228 | 2.13k | break; |
229 | 0 | } |
230 | 0 | case IA_DRC_DEC_CONFIG_PROC_OUT_PTR: { |
231 | 0 | *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output; |
232 | 0 | break; |
233 | 0 | } |
234 | 0 | case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: { |
235 | 0 | *pi_value = (WORD32)p_obj_drc->str_payload.pstr_loudness_info->loudness_info |
236 | 0 | ->loudness_measure->method_val; |
237 | 0 | if (*pi_value < -1) |
238 | 0 | *pi_value = *pi_value * -4; |
239 | 0 | else |
240 | 0 | *pi_value = -1; |
241 | 0 | break; |
242 | 0 | } |
243 | 2.13k | } |
244 | 2.13k | break; |
245 | 2.13k | } |
246 | 137k | case IA_API_CMD_SET_CONFIG_PARAM: { |
247 | 137k | switch (i_idx) { |
248 | 21.0k | case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { |
249 | 21.0k | if (*pus_value == 0 || *pus_value > 96000) { |
250 | 9 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ; |
251 | 9 | } |
252 | 21.0k | p_obj_drc->str_config.sampling_rate = *pus_value; |
253 | 21.0k | break; |
254 | 21.0k | } |
255 | 0 | case IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE: { |
256 | 0 | p_obj_drc->str_config.apply_crossfade = *pus_value; |
257 | 0 | break; |
258 | 21.0k | } |
259 | 0 | case IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED: { |
260 | 0 | p_obj_drc->str_config.is_config_changed = *pus_value; |
261 | 0 | break; |
262 | 21.0k | } |
263 | 21.0k | case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { |
264 | 21.0k | p_obj_drc->str_config.num_ch_in = *pus_value; |
265 | 21.0k | if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) { |
266 | 43 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS; |
267 | 43 | } |
268 | 21.0k | break; |
269 | 21.0k | } |
270 | | |
271 | 21.0k | case IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ: { |
272 | 21.0k | switch (*pus_value) { |
273 | 21.0k | case 16: |
274 | 21.0k | case 24: |
275 | 21.0k | case 32: |
276 | 21.0k | break; |
277 | 0 | default: |
278 | 0 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE; |
279 | 21.0k | } |
280 | | |
281 | 21.0k | p_obj_drc->str_config.pcm_size = *pus_value; |
282 | | |
283 | 21.0k | break; |
284 | 21.0k | } |
285 | | |
286 | 4.81k | case IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT: { |
287 | 4.81k | break; |
288 | 21.0k | } |
289 | 2.13k | case IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT: { |
290 | 2.13k | break; |
291 | 21.0k | } |
292 | 2.13k | case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: { |
293 | 2.13k | if (*pus_value < 1 || *pus_value > 4096) { |
294 | 0 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE; |
295 | 0 | } |
296 | | |
297 | 2.13k | p_obj_drc->str_config.frame_size = *pus_value; |
298 | | |
299 | 2.13k | break; |
300 | 2.13k | } |
301 | 1.89k | case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: { |
302 | 1.89k | break; |
303 | 2.13k | } |
304 | | |
305 | 21.0k | case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: { |
306 | 21.0k | p_obj_drc->str_config.effect_type = *pus_value; |
307 | 21.0k | break; |
308 | 2.13k | } |
309 | 21.0k | case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: { |
310 | 21.0k | p_obj_drc->str_config.target_loudness = *pus_value; |
311 | 21.0k | break; |
312 | 2.13k | } |
313 | 21.0k | case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: { |
314 | 21.0k | p_obj_drc->str_config.loud_norm_flag = *pus_value; |
315 | 21.0k | break; |
316 | 2.13k | } |
317 | 0 | case IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE: { |
318 | 0 | p_obj_drc->str_config.album_mode = *pus_value; |
319 | 0 | break; |
320 | 2.13k | } |
321 | 0 | case IA_DRC_DEC_CONFIG_DRC_BOOST: { |
322 | 0 | p_obj_drc->str_config.boost = *pf_value; |
323 | 0 | p_obj_drc->str_config.boost_set = 1; |
324 | 0 | break; |
325 | 2.13k | } |
326 | 0 | case IA_DRC_DEC_CONFIG_DRC_COMPRESS: { |
327 | 0 | p_obj_drc->str_config.compress = *pf_value; |
328 | 0 | p_obj_drc->str_config.compress_set = 1; |
329 | 0 | break; |
330 | 2.13k | } |
331 | 0 | #ifdef LOUDNESS_LEVELING_SUPPORT |
332 | 0 | case IA_DRC_DEC_CONFIG_DRC_LOUDNESS_LEVELING: { |
333 | 0 | p_obj_drc->str_config.loudness_leveling_flag = *pus_value; |
334 | 0 | break; |
335 | 2.13k | } |
336 | 0 | #endif |
337 | 0 | default: { return -1; } |
338 | 137k | } |
339 | 137k | break; |
340 | 137k | } |
341 | 137k | case IA_API_CMD_GET_MEMTABS_SIZE: { |
342 | 21.0k | *pui_value = |
343 | 21.0k | (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES); |
344 | 21.0k | break; |
345 | 137k | } |
346 | 21.0k | case IA_API_CMD_SET_MEMTABS_PTR: { |
347 | 21.0k | if (ps_value == NULL) return IA_DRC_DEC_API_FATAL_MEM_ALLOC; |
348 | 21.0k | memset(ps_value, 0, |
349 | 21.0k | (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES)); |
350 | 21.0k | p_obj_drc->p_mem_info = (ia_mem_info_struct *)(ps_value); |
351 | 21.0k | p_obj_drc->pp_mem = |
352 | 21.0k | (pVOID)((SIZE_T)p_obj_drc->p_mem_info + |
353 | 21.0k | (NUM_DRC_TABLES * sizeof(*(p_obj_drc->p_mem_info)))); |
354 | 21.0k | break; |
355 | 21.0k | } |
356 | 0 | case IA_API_CMD_GET_N_MEMTABS: { |
357 | 0 | *pui_value = NUM_DRC_TABLES; |
358 | 0 | break; |
359 | 21.0k | } |
360 | 0 | case IA_API_CMD_GET_N_TABLES: { |
361 | 0 | break; |
362 | 21.0k | } |
363 | | |
364 | 29.5k | case IA_API_CMD_EXECUTE: { |
365 | 29.5k | switch (i_idx) { |
366 | 29.5k | case IA_CMD_TYPE_DO_EXECUTE: { |
367 | 29.5k | if (!p_obj_drc->p_state->ui_init_done) { |
368 | 8.41k | error_code = IA_FATAL_ERROR; |
369 | 21.1k | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD) { |
370 | 21.1k | error_code = impd_process_time_domain(p_obj_drc); |
371 | 21.1k | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_QMF64) { |
372 | 0 | error_code = IA_FATAL_ERROR; |
373 | 0 | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) { |
374 | 0 | error_code = IA_FATAL_ERROR; |
375 | 0 | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD_QMF64) { |
376 | 0 | error_code = IA_FATAL_ERROR; |
377 | 0 | } |
378 | 29.5k | p_obj_drc->str_bit_handler.byte_index_bs = |
379 | 29.5k | p_obj_drc->str_bit_handler.num_total_bytes - |
380 | 29.5k | p_obj_drc->str_bit_handler.num_bytes_bs; |
381 | 29.5k | p_obj_drc->str_bit_handler.num_bytes_offset_bs = 0; |
382 | | |
383 | 29.5k | break; |
384 | 0 | } |
385 | 0 | case IA_CMD_TYPE_DONE_QUERY: { |
386 | 0 | *pui_value = p_obj_drc->p_state->ui_exe_done; |
387 | 0 | break; |
388 | 0 | } |
389 | 0 | default: { return -1; } |
390 | 29.5k | }; |
391 | 29.5k | break; |
392 | 29.5k | } |
393 | 0 | case IA_API_CMD_PUT_INPUT_QUERY: { |
394 | 0 | *pui_value = 1; |
395 | 0 | break; |
396 | 29.5k | } |
397 | 0 | case IA_API_CMD_GET_CURIDX_INPUT_BUF: { |
398 | 0 | UWORD32 ui_in_buf_size = p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size; |
399 | 0 | UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes; |
400 | 0 | *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size; |
401 | 0 | break; |
402 | 29.5k | } |
403 | 29.5k | case IA_API_CMD_SET_INPUT_BYTES: { |
404 | 29.5k | p_obj_drc->p_state->ui_in_bytes = *pui_value; |
405 | 29.5k | break; |
406 | 29.5k | } |
407 | | |
408 | 0 | case IA_API_CMD_GET_OUTPUT_BYTES: { |
409 | 0 | *pui_value = p_obj_drc->p_state->ui_out_bytes; |
410 | 0 | break; |
411 | 29.5k | } |
412 | 0 | case IA_API_CMD_INPUT_OVER: { |
413 | 0 | p_obj_drc->p_state->ui_exe_done = 1; |
414 | 0 | break; |
415 | 29.5k | } |
416 | 1.89k | case IA_API_CMD_SET_INPUT_BYTES_BS: { |
417 | 1.89k | p_obj_drc->str_bit_handler.num_byts_cur = *pus_value; |
418 | 1.89k | break; |
419 | 29.5k | } |
420 | 1.78k | case IA_API_CMD_SET_INPUT_BYTES_IC_BS: { |
421 | 1.78k | p_obj_drc->str_bit_handler.num_byts_cur_ic = *pus_value; |
422 | 1.78k | break; |
423 | 29.5k | } |
424 | 1.12k | case IA_API_CMD_SET_INPUT_BYTES_IL_BS: { |
425 | 1.12k | p_obj_drc->str_bit_handler.num_byts_cur_il = *pus_value; |
426 | 1.12k | break; |
427 | 29.5k | } |
428 | 0 | case IA_API_CMD_SET_INPUT_BYTES_IN_BS: { |
429 | 0 | p_obj_drc->str_bit_handler.num_byts_cur_in = *pus_value; |
430 | 0 | break; |
431 | 29.5k | } |
432 | 0 | default: { return -1; } |
433 | 345k | }; |
434 | 343k | return error_code; |
435 | 345k | } |
436 | | |
437 | | IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, |
438 | 210k | WORD32 i_idx, pVOID pv_value) { |
439 | 210k | pUWORD32 pui_value = pv_value; |
440 | | |
441 | 210k | switch (i_cmd) { |
442 | 42.1k | case IA_API_CMD_GET_MEM_INFO_SIZE: { |
443 | 42.1k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size; |
444 | 42.1k | break; |
445 | 0 | } |
446 | 42.1k | case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: { |
447 | 42.1k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment; |
448 | 42.1k | break; |
449 | 0 | } |
450 | 42.1k | case IA_API_CMD_GET_MEM_INFO_TYPE: { |
451 | 42.1k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type; |
452 | 42.1k | break; |
453 | 0 | } |
454 | 0 | case IA_API_CMD_GET_MEM_INFO_PLACEMENT: { |
455 | 0 | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0]; |
456 | 0 | *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1]; |
457 | 0 | break; |
458 | 0 | } |
459 | 0 | case IA_API_CMD_GET_MEM_INFO_PRIORITY: { |
460 | 0 | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority; |
461 | 0 | break; |
462 | 0 | } |
463 | 84.2k | case IA_API_CMD_SET_MEM_PTR: { |
464 | 84.2k | if (pv_value == 0) { |
465 | 0 | return (-1); |
466 | 0 | } |
467 | 84.2k | if (((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) { |
468 | 0 | return (-1); |
469 | 0 | } |
470 | 84.2k | p_obj_drc->pp_mem[i_idx] = pv_value; |
471 | 84.2k | memset(p_obj_drc->pp_mem[i_idx], 0, p_obj_drc->p_mem_info[i_idx].ui_size); |
472 | 84.2k | if (IA_MEMTYPE_PERSIST == i_idx) { |
473 | 21.0k | p_obj_drc->p_state = pv_value; |
474 | 21.0k | } |
475 | 84.2k | break; |
476 | 84.2k | } |
477 | 0 | case IA_API_CMD_SET_MEM_PLACEMENT: { |
478 | 0 | } |
479 | 210k | }; |
480 | 210k | return IA_NO_ERROR; |
481 | 210k | } |
482 | | |
483 | 21.0k | static WORD32 impd_calc_scratch_size() { |
484 | 21.0k | return IXHEAAC_GET_SIZE_ALIGNED( |
485 | 21.0k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * NUM_ELE_IN_CPLX_NUM * sizeof(FLOAT32), |
486 | 21.0k | BYTE_ALIGN_8); |
487 | 21.0k | } |
488 | | |
489 | 21.0k | static WORD32 impd_calc_pers_size() { |
490 | 21.0k | WORD32 size = 0; |
491 | | |
492 | 21.0k | WORD32 analysis_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
493 | 21.0k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
494 | 21.0k | BYTE_ALIGN_8); |
495 | 21.0k | WORD32 synth_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
496 | 21.0k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
497 | 21.0k | BYTE_ALIGN_8); |
498 | 21.0k | WORD32 peak_lim_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
499 | 21.0k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
500 | 21.0k | BYTE_ALIGN_8); |
501 | 21.0k | WORD32 subband_buf_size = |
502 | 21.0k | NUM_ELE_IN_CPLX_NUM * |
503 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8) + |
504 | 21.0k | NUM_ELE_IN_CPLX_NUM * MAX_CHANNEL_COUNT * |
505 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((MAX_SUBBAND_DELAY + MAX_DRC_FRAME_SIZE) * sizeof(FLOAT32), |
506 | 21.0k | BYTE_ALIGN_8); |
507 | | |
508 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8); |
509 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_bits_dec_struct), BYTE_ALIGN_8); |
510 | 21.0k | size += 2 * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_dec_struct), BYTE_ALIGN_8); |
511 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_loudness_info_set_struct), BYTE_ALIGN_8); |
512 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_struct), BYTE_ALIGN_8); |
513 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_interface_struct), BYTE_ALIGN_8); |
514 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_config), BYTE_ALIGN_8); |
515 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_pro_struct), BYTE_ALIGN_8); |
516 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_params_struct), BYTE_ALIGN_8); |
517 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_output_struct), BYTE_ALIGN_8); |
518 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_peak_limiter_struct), BYTE_ALIGN_8); |
519 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_qmf_filt_struct), BYTE_ALIGN_8); |
520 | 21.0k | size += analysis_buf_size; |
521 | 21.0k | size += synth_buf_size; |
522 | 21.0k | size += peak_lim_buf_size; |
523 | | |
524 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_BS_BUF_SIZE, BYTE_ALIGN_8); |
525 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_CONFG_BUF_SIZE, BYTE_ALIGN_8); /*DRC Config Bitstream*/ |
526 | 21.0k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_LOUD_INFO_BUF_SIZE, |
527 | 21.0k | BYTE_ALIGN_8); /*DRC loudness info Bitstream*/ |
528 | 21.0k | size += |
529 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED(MAX_INTERFACE_BUF_SIZE, BYTE_ALIGN_8); /*DRC interface Bitstream*/ |
530 | | |
531 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * SEL_DRC_COUNT * |
532 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_interp_buf_struct) * MAX_GAIN_ELE_COUNT), |
533 | 21.0k | BYTE_ALIGN_8); /*ia_interp_buf_struct*/ |
534 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * |
535 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_eq_set_struct)), BYTE_ALIGN_8); /*ia_eq_set_struct*/ |
536 | | |
537 | | /*non_interleaved_audio*/ |
538 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * |
539 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
540 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
541 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8); |
542 | | |
543 | | /*audio_in_out_buf ptr*/ |
544 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * |
545 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
546 | | /*audio_io_buffer_delayed*/ |
547 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * |
548 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
549 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
550 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8); |
551 | | |
552 | | /*subband band buffer ptr*/ |
553 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * NUM_ELE_IN_CPLX_NUM * |
554 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8); |
555 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * subband_buf_size; |
556 | | |
557 | 21.0k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
558 | 21.0k | IXHEAAC_GET_SIZE_ALIGNED((PARAM_DRC_MAX_BUF_SZ * sizeof(FLOAT32)), BYTE_ALIGN_8); |
559 | | |
560 | 21.0k | return size; |
561 | 21.0k | } |
562 | | |
563 | 21.0k | IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { |
564 | 21.0k | ia_mem_info_struct *p_mem_info; |
565 | 21.0k | { |
566 | 21.0k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX]; |
567 | 21.0k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
568 | 21.0k | p_mem_info->ui_size = impd_calc_pers_size(); |
569 | 21.0k | p_mem_info->ui_alignment = 8; |
570 | 21.0k | p_mem_info->ui_type = IA_MEMTYPE_PERSIST; |
571 | 21.0k | p_mem_info->ui_placement[0] = 0; |
572 | 21.0k | p_mem_info->ui_placement[1] = 0; |
573 | 21.0k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
574 | 21.0k | p_mem_info->ui_placed[0] = 0; |
575 | 21.0k | p_mem_info->ui_placed[1] = 0; |
576 | 21.0k | } |
577 | 21.0k | { |
578 | 21.0k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX]; |
579 | 21.0k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
580 | 21.0k | p_mem_info->ui_size = p_obj_drc->str_config.frame_size * |
581 | 21.0k | (p_obj_drc->str_config.pcm_size >> 3) * |
582 | 21.0k | p_obj_drc->str_config.num_ch_in; |
583 | 21.0k | p_mem_info->ui_alignment = 4; |
584 | 21.0k | p_mem_info->ui_type = IA_MEMTYPE_INPUT; |
585 | 21.0k | p_mem_info->ui_placement[0] = 0; |
586 | 21.0k | p_mem_info->ui_placement[1] = 0; |
587 | 21.0k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
588 | 21.0k | p_mem_info->ui_placed[0] = 0; |
589 | 21.0k | p_mem_info->ui_placed[1] = 0; |
590 | 21.0k | } |
591 | 21.0k | { |
592 | 21.0k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX]; |
593 | 21.0k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
594 | 21.0k | p_mem_info->ui_size = p_obj_drc->str_config.frame_size * |
595 | 21.0k | (p_obj_drc->str_config.pcm_size >> 3) * |
596 | 21.0k | p_obj_drc->str_config.num_ch_in; |
597 | 21.0k | p_mem_info->ui_alignment = 4; |
598 | 21.0k | p_mem_info->ui_type = IA_MEMTYPE_OUTPUT; |
599 | 21.0k | p_mem_info->ui_placement[0] = 0; |
600 | 21.0k | p_mem_info->ui_placement[1] = 0; |
601 | 21.0k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
602 | 21.0k | p_mem_info->ui_placed[0] = 0; |
603 | 21.0k | p_mem_info->ui_placed[1] = 0; |
604 | 21.0k | } |
605 | 21.0k | { |
606 | 21.0k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX]; |
607 | 21.0k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
608 | 21.0k | p_mem_info->ui_size = impd_calc_scratch_size(); |
609 | 21.0k | p_mem_info->ui_alignment = 8; |
610 | 21.0k | p_mem_info->ui_type = IA_MEMTYPE_SCRATCH; |
611 | 21.0k | p_mem_info->ui_placement[0] = 0; |
612 | 21.0k | p_mem_info->ui_placement[1] = 0; |
613 | 21.0k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
614 | 21.0k | p_mem_info->ui_placed[0] = 0; |
615 | 21.0k | p_mem_info->ui_placed[1] = 0; |
616 | 21.0k | } |
617 | 21.0k | return IA_NO_ERROR; |
618 | 21.0k | } |