/src/libxaac/decoder/drc_src/impd_drc_api.c
Line | Count | Source (jump to first uncovered line) |
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 | 60.4k | #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 | 598k | pVOID pv_value) { |
69 | 598k | ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj; |
70 | 598k | IA_ERRORCODE error_code = IA_NO_ERROR; |
71 | 598k | LOOPIDX i; |
72 | | |
73 | 598k | pUWORD32 pui_value = pv_value; |
74 | 598k | pUWORD32 pus_value = pv_value; |
75 | 598k | pWORD8 pb_value = pv_value; |
76 | 598k | SIZE_T *ps_value = pv_value; |
77 | 598k | pWORD32 pi_value = pv_value; |
78 | 598k | float *pf_value = pv_value; |
79 | | |
80 | 598k | switch (i_cmd) { |
81 | 40.3k | case IA_API_CMD_GET_MEM_INFO_SIZE: |
82 | 80.6k | case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: |
83 | 120k | case IA_API_CMD_GET_MEM_INFO_TYPE: |
84 | 120k | case IA_API_CMD_GET_MEM_INFO_PLACEMENT: |
85 | 120k | case IA_API_CMD_GET_MEM_INFO_PRIORITY: |
86 | 201k | case IA_API_CMD_SET_MEM_PTR: |
87 | 201k | case IA_API_CMD_SET_MEM_PLACEMENT: { |
88 | 201k | return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value); |
89 | 201k | } |
90 | 598k | }; |
91 | | |
92 | 396k | 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.5k | case IA_API_CMD_GET_API_SIZE: { |
113 | 24.5k | *pui_value = sizeof(ia_drc_api_struct); |
114 | | |
115 | 24.5k | break; |
116 | 0 | } |
117 | 75.9k | case IA_API_CMD_INIT: { |
118 | 75.9k | switch (i_idx) { |
119 | 20.1k | case IA_CMD_TYPE_INIT_SET_BUFF_PTR: { |
120 | 20.1k | p_obj_drc->p_state->persistent_ptr = |
121 | 20.1k | (UWORD8 *)p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] + |
122 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8); |
123 | 20.1k | error_code = impd_drc_set_struct_pointer(p_obj_drc); |
124 | 20.1k | if (error_code) return error_code; |
125 | | |
126 | 20.1k | break; |
127 | 20.1k | } |
128 | 24.5k | case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: { |
129 | 24.5k | error_code = impd_drc_set_default_config(p_obj_drc); |
130 | 24.5k | if (error_code) return error_code; |
131 | 24.5k | break; |
132 | 24.5k | } |
133 | 24.5k | case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: { |
134 | 20.1k | error_code = impd_drc_fill_mem_tables(p_obj_drc); |
135 | 20.1k | if (error_code) return error_code; |
136 | 20.1k | break; |
137 | 20.1k | } |
138 | 20.1k | case IA_CMD_TYPE_INIT_PROCESS: { |
139 | 2.35k | IA_ERRORCODE Error = 0; |
140 | | |
141 | 2.35k | if (p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) { |
142 | 0 | return (-1); |
143 | 0 | } |
144 | | |
145 | 2.35k | Error = impd_drc_init(p_obj_drc); |
146 | 2.35k | if (Error) return Error; |
147 | 806 | p_obj_drc->p_state->ui_init_done = 1; |
148 | 806 | return Error; |
149 | 0 | break; |
150 | 2.35k | } |
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.35k | } |
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.35k | } |
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.35k | } |
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.35k | } |
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.35k | } |
177 | 3.38k | case IA_CMD_TYPE_INIT_CPY_BSF_BUFF: { |
178 | 3.38k | memcpy(p_obj_drc->str_bit_handler.it_bit_buf + |
179 | 3.38k | p_obj_drc->str_bit_handler.num_bytes_offset_bs, |
180 | 3.38k | p_obj_drc->pp_mem[2], p_obj_drc->str_bit_handler.num_byts_cur); |
181 | 3.38k | p_obj_drc->str_bit_handler.num_bytes_bs = |
182 | 3.38k | p_obj_drc->str_bit_handler.num_bytes_bs + |
183 | 3.38k | p_obj_drc->str_bit_handler.num_byts_cur; |
184 | 3.38k | p_obj_drc->str_bit_handler.num_bytes_offset_bs = |
185 | 3.38k | p_obj_drc->str_bit_handler.num_bytes_bs; |
186 | 3.38k | p_obj_drc->str_bit_handler.num_total_bytes = |
187 | 3.38k | p_obj_drc->str_bit_handler.num_bytes_bs; |
188 | | |
189 | 3.38k | break; |
190 | 2.35k | } |
191 | 1.71k | case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: { |
192 | 1.71k | memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config, |
193 | 1.71k | p_obj_drc->pp_mem[2], |
194 | 1.71k | p_obj_drc->str_bit_handler.num_byts_cur_ic); |
195 | 1.71k | p_obj_drc->str_bit_handler.num_bytes_bs_drc_config = |
196 | 1.71k | p_obj_drc->str_bit_handler.num_byts_cur_ic; |
197 | 1.71k | break; |
198 | 2.35k | } |
199 | 1.31k | case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: { |
200 | 1.31k | memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info, |
201 | 1.31k | p_obj_drc->pp_mem[2], |
202 | 1.31k | p_obj_drc->str_bit_handler.num_byts_cur_il); |
203 | 1.31k | p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info = |
204 | 1.31k | p_obj_drc->str_bit_handler.num_byts_cur_il; |
205 | 1.31k | break; |
206 | 2.35k | } |
207 | 2.35k | case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: { |
208 | 2.35k | memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface, |
209 | 2.35k | p_obj_drc->pp_mem[2], |
210 | 2.35k | p_obj_drc->str_bit_handler.num_byts_cur_in); |
211 | 2.35k | p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface = |
212 | 2.35k | p_obj_drc->str_bit_handler.num_byts_cur_in; |
213 | 2.35k | break; |
214 | 2.35k | } |
215 | 0 | default: { return -1; } |
216 | 75.9k | }; |
217 | 73.6k | break; |
218 | 75.9k | } |
219 | 2.35k | case IA_API_CMD_GET_CONFIG_PARAM: { |
220 | 2.35k | 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.35k | case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { |
227 | 2.35k | *pus_value = p_obj_drc->str_config.num_ch_out; |
228 | 2.35k | 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.35k | } |
244 | 2.35k | break; |
245 | 2.35k | } |
246 | 135k | case IA_API_CMD_SET_CONFIG_PARAM: { |
247 | 135k | switch (i_idx) { |
248 | 20.1k | case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { |
249 | 20.1k | if (*pus_value < 8000 || *pus_value > 96000) { |
250 | 141 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ; |
251 | 141 | } |
252 | 20.0k | p_obj_drc->str_config.sampling_rate = *pus_value; |
253 | 20.0k | break; |
254 | 20.1k | } |
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 | 20.1k | } |
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 | 20.1k | } |
263 | 20.1k | case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { |
264 | 20.1k | p_obj_drc->str_config.num_ch_in = *pus_value; |
265 | 20.1k | if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) { |
266 | 69 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS; |
267 | 69 | } |
268 | 20.0k | break; |
269 | 20.1k | } |
270 | | |
271 | 20.1k | case IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ: { |
272 | 20.1k | switch (*pus_value) { |
273 | 20.1k | case 16: |
274 | 20.1k | case 24: |
275 | 20.1k | case 32: |
276 | 20.1k | break; |
277 | 0 | default: |
278 | 0 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE; |
279 | 20.1k | } |
280 | | |
281 | 20.1k | p_obj_drc->str_config.pcm_size = *pus_value; |
282 | | |
283 | 20.1k | break; |
284 | 20.1k | } |
285 | | |
286 | 6.42k | case IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT: { |
287 | 6.42k | break; |
288 | 20.1k | } |
289 | 2.35k | case IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT: { |
290 | 2.35k | break; |
291 | 20.1k | } |
292 | 2.35k | case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: { |
293 | 2.35k | if (*pus_value < 1 || *pus_value > 4096) { |
294 | 0 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE; |
295 | 0 | } |
296 | | |
297 | 2.35k | p_obj_drc->str_config.frame_size = *pus_value; |
298 | | |
299 | 2.35k | break; |
300 | 2.35k | } |
301 | 3.38k | case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: { |
302 | 3.38k | break; |
303 | 2.35k | } |
304 | | |
305 | 20.1k | case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: { |
306 | 20.1k | p_obj_drc->str_config.effect_type = *pus_value; |
307 | 20.1k | break; |
308 | 2.35k | } |
309 | 20.1k | case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: { |
310 | 20.1k | p_obj_drc->str_config.target_loudness = *pus_value; |
311 | 20.1k | break; |
312 | 2.35k | } |
313 | 20.1k | case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: { |
314 | 20.1k | p_obj_drc->str_config.loud_norm_flag = *pus_value; |
315 | 20.1k | break; |
316 | 2.35k | } |
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.35k | } |
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.35k | } |
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.35k | } |
331 | 0 | default: { return -1; } |
332 | 135k | } |
333 | 135k | break; |
334 | 135k | } |
335 | 135k | case IA_API_CMD_GET_MEMTABS_SIZE: { |
336 | 20.1k | *pui_value = |
337 | 20.1k | (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES); |
338 | 20.1k | break; |
339 | 135k | } |
340 | 20.1k | case IA_API_CMD_SET_MEMTABS_PTR: { |
341 | 20.1k | if (ps_value == NULL) return IA_DRC_DEC_API_FATAL_MEM_ALLOC; |
342 | 20.1k | memset(ps_value, 0, |
343 | 20.1k | (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES)); |
344 | 20.1k | p_obj_drc->p_mem_info = (ia_mem_info_struct *)(ps_value); |
345 | 20.1k | p_obj_drc->pp_mem = |
346 | 20.1k | (pVOID)((SIZE_T)p_obj_drc->p_mem_info + |
347 | 20.1k | (NUM_DRC_TABLES * sizeof(*(p_obj_drc->p_mem_info)))); |
348 | 20.1k | break; |
349 | 20.1k | } |
350 | 0 | case IA_API_CMD_GET_N_MEMTABS: { |
351 | 0 | *pui_value = NUM_DRC_TABLES; |
352 | 0 | break; |
353 | 20.1k | } |
354 | 0 | case IA_API_CMD_GET_N_TABLES: { |
355 | 0 | break; |
356 | 20.1k | } |
357 | | |
358 | 55.8k | case IA_API_CMD_EXECUTE: { |
359 | 55.8k | switch (i_idx) { |
360 | 55.8k | case IA_CMD_TYPE_DO_EXECUTE: { |
361 | 55.8k | if (!p_obj_drc->p_state->ui_init_done) { |
362 | 34.2k | error_code = IA_FATAL_ERROR; |
363 | 34.2k | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD) { |
364 | 21.5k | error_code = impd_process_time_domain(p_obj_drc); |
365 | 21.5k | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_QMF64) { |
366 | 0 | error_code = IA_FATAL_ERROR; |
367 | 0 | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) { |
368 | 0 | error_code = IA_FATAL_ERROR; |
369 | 0 | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD_QMF64) { |
370 | 0 | error_code = IA_FATAL_ERROR; |
371 | 0 | } |
372 | 55.8k | p_obj_drc->str_bit_handler.byte_index_bs = |
373 | 55.8k | p_obj_drc->str_bit_handler.num_total_bytes - |
374 | 55.8k | p_obj_drc->str_bit_handler.num_bytes_bs; |
375 | 55.8k | p_obj_drc->str_bit_handler.num_bytes_offset_bs = 0; |
376 | | |
377 | 55.8k | break; |
378 | 0 | } |
379 | 0 | case IA_CMD_TYPE_DONE_QUERY: { |
380 | 0 | *pui_value = p_obj_drc->p_state->ui_exe_done; |
381 | 0 | break; |
382 | 0 | } |
383 | 0 | default: { return -1; } |
384 | 55.8k | }; |
385 | 55.8k | break; |
386 | 55.8k | } |
387 | 0 | case IA_API_CMD_PUT_INPUT_QUERY: { |
388 | 0 | *pui_value = 1; |
389 | 0 | break; |
390 | 55.8k | } |
391 | 0 | case IA_API_CMD_GET_CURIDX_INPUT_BUF: { |
392 | 0 | UWORD32 ui_in_buf_size = p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size; |
393 | 0 | UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes; |
394 | 0 | *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size; |
395 | 0 | break; |
396 | 55.8k | } |
397 | 55.8k | case IA_API_CMD_SET_INPUT_BYTES: { |
398 | 55.8k | p_obj_drc->p_state->ui_in_bytes = *pui_value; |
399 | 55.8k | break; |
400 | 55.8k | } |
401 | | |
402 | 0 | case IA_API_CMD_GET_OUTPUT_BYTES: { |
403 | 0 | *pui_value = p_obj_drc->p_state->ui_out_bytes; |
404 | 0 | break; |
405 | 55.8k | } |
406 | 0 | case IA_API_CMD_INPUT_OVER: { |
407 | 0 | p_obj_drc->p_state->ui_exe_done = 1; |
408 | 0 | break; |
409 | 55.8k | } |
410 | 3.38k | case IA_API_CMD_SET_INPUT_BYTES_BS: { |
411 | 3.38k | p_obj_drc->str_bit_handler.num_byts_cur = *pus_value; |
412 | 3.38k | break; |
413 | 55.8k | } |
414 | 1.71k | case IA_API_CMD_SET_INPUT_BYTES_IC_BS: { |
415 | 1.71k | p_obj_drc->str_bit_handler.num_byts_cur_ic = *pus_value; |
416 | 1.71k | break; |
417 | 55.8k | } |
418 | 1.31k | case IA_API_CMD_SET_INPUT_BYTES_IL_BS: { |
419 | 1.31k | p_obj_drc->str_bit_handler.num_byts_cur_il = *pus_value; |
420 | 1.31k | break; |
421 | 55.8k | } |
422 | 0 | case IA_API_CMD_SET_INPUT_BYTES_IN_BS: { |
423 | 0 | p_obj_drc->str_bit_handler.num_byts_cur_in = *pus_value; |
424 | 0 | break; |
425 | 55.8k | } |
426 | 0 | default: { return -1; } |
427 | 396k | }; |
428 | 394k | return error_code; |
429 | 396k | } |
430 | | |
431 | | IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, |
432 | 201k | WORD32 i_idx, pVOID pv_value) { |
433 | 201k | pUWORD32 pui_value = pv_value; |
434 | | |
435 | 201k | switch (i_cmd) { |
436 | 40.3k | case IA_API_CMD_GET_MEM_INFO_SIZE: { |
437 | 40.3k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size; |
438 | 40.3k | break; |
439 | 0 | } |
440 | 40.3k | case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: { |
441 | 40.3k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment; |
442 | 40.3k | break; |
443 | 0 | } |
444 | 40.3k | case IA_API_CMD_GET_MEM_INFO_TYPE: { |
445 | 40.3k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type; |
446 | 40.3k | break; |
447 | 0 | } |
448 | 0 | case IA_API_CMD_GET_MEM_INFO_PLACEMENT: { |
449 | 0 | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0]; |
450 | 0 | *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1]; |
451 | 0 | break; |
452 | 0 | } |
453 | 0 | case IA_API_CMD_GET_MEM_INFO_PRIORITY: { |
454 | 0 | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority; |
455 | 0 | break; |
456 | 0 | } |
457 | 80.6k | case IA_API_CMD_SET_MEM_PTR: { |
458 | 80.6k | if (pv_value == 0) { |
459 | 0 | return (-1); |
460 | 0 | } |
461 | 80.6k | if (((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) { |
462 | 0 | return (-1); |
463 | 0 | } |
464 | 80.6k | p_obj_drc->pp_mem[i_idx] = pv_value; |
465 | 80.6k | memset(p_obj_drc->pp_mem[i_idx], 0, p_obj_drc->p_mem_info[i_idx].ui_size); |
466 | 80.6k | if (IA_MEMTYPE_PERSIST == i_idx) { |
467 | 20.1k | p_obj_drc->p_state = pv_value; |
468 | 20.1k | } |
469 | 80.6k | break; |
470 | 80.6k | } |
471 | 0 | case IA_API_CMD_SET_MEM_PLACEMENT: { |
472 | 0 | } |
473 | 201k | }; |
474 | 201k | return IA_NO_ERROR; |
475 | 201k | } |
476 | | |
477 | 20.1k | static WORD32 impd_calc_scratch_size() { |
478 | 20.1k | return IXHEAAC_GET_SIZE_ALIGNED( |
479 | 20.1k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * NUM_ELE_IN_CPLX_NUM * sizeof(FLOAT32), |
480 | 20.1k | BYTE_ALIGN_8); |
481 | 20.1k | } |
482 | | |
483 | 20.1k | static WORD32 impd_calc_pers_size() { |
484 | 20.1k | WORD32 size = 0; |
485 | | |
486 | 20.1k | WORD32 analysis_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
487 | 20.1k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
488 | 20.1k | BYTE_ALIGN_8); |
489 | 20.1k | WORD32 synth_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
490 | 20.1k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
491 | 20.1k | BYTE_ALIGN_8); |
492 | 20.1k | WORD32 peak_lim_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
493 | 20.1k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
494 | 20.1k | BYTE_ALIGN_8); |
495 | 20.1k | WORD32 subband_buf_size = |
496 | 20.1k | NUM_ELE_IN_CPLX_NUM * |
497 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8) + |
498 | 20.1k | NUM_ELE_IN_CPLX_NUM * MAX_CHANNEL_COUNT * |
499 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((MAX_SUBBAND_DELAY + MAX_DRC_FRAME_SIZE) * sizeof(FLOAT32), |
500 | 20.1k | BYTE_ALIGN_8); |
501 | | |
502 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8); |
503 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_bits_dec_struct), BYTE_ALIGN_8); |
504 | 20.1k | size += 2 * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_dec_struct), BYTE_ALIGN_8); |
505 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_loudness_info_set_struct), BYTE_ALIGN_8); |
506 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_struct), BYTE_ALIGN_8); |
507 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_interface_struct), BYTE_ALIGN_8); |
508 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_config), BYTE_ALIGN_8); |
509 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_pro_struct), BYTE_ALIGN_8); |
510 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_params_struct), BYTE_ALIGN_8); |
511 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_output_struct), BYTE_ALIGN_8); |
512 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_peak_limiter_struct), BYTE_ALIGN_8); |
513 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_qmf_filt_struct), BYTE_ALIGN_8); |
514 | 20.1k | size += analysis_buf_size; |
515 | 20.1k | size += synth_buf_size; |
516 | 20.1k | size += peak_lim_buf_size; |
517 | | |
518 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_BS_BUF_SIZE, BYTE_ALIGN_8); |
519 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_CONFG_BUF_SIZE, BYTE_ALIGN_8); /*DRC Config Bitstream*/ |
520 | 20.1k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_LOUD_INFO_BUF_SIZE, |
521 | 20.1k | BYTE_ALIGN_8); /*DRC loudness info Bitstream*/ |
522 | 20.1k | size += |
523 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED(MAX_INTERFACE_BUF_SIZE, BYTE_ALIGN_8); /*DRC interface Bitstream*/ |
524 | | |
525 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * SEL_DRC_COUNT * |
526 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_interp_buf_struct) * MAX_GAIN_ELE_COUNT), |
527 | 20.1k | BYTE_ALIGN_8); /*ia_interp_buf_struct*/ |
528 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * |
529 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_eq_set_struct)), BYTE_ALIGN_8); /*ia_eq_set_struct*/ |
530 | | |
531 | | /*non_interleaved_audio*/ |
532 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * |
533 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
534 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
535 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8); |
536 | | |
537 | | /*audio_in_out_buf ptr*/ |
538 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * |
539 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
540 | | /*audio_io_buffer_delayed*/ |
541 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * |
542 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
543 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
544 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8); |
545 | | |
546 | | /*subband band buffer ptr*/ |
547 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * NUM_ELE_IN_CPLX_NUM * |
548 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8); |
549 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * subband_buf_size; |
550 | | |
551 | 20.1k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
552 | 20.1k | IXHEAAC_GET_SIZE_ALIGNED((PARAM_DRC_MAX_BUF_SZ * sizeof(FLOAT32)), BYTE_ALIGN_8); |
553 | | |
554 | 20.1k | return size; |
555 | 20.1k | } |
556 | | |
557 | 20.1k | IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { |
558 | 20.1k | ia_mem_info_struct *p_mem_info; |
559 | 20.1k | { |
560 | 20.1k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX]; |
561 | 20.1k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
562 | 20.1k | p_mem_info->ui_size = impd_calc_pers_size(); |
563 | 20.1k | p_mem_info->ui_alignment = 8; |
564 | 20.1k | p_mem_info->ui_type = IA_MEMTYPE_PERSIST; |
565 | 20.1k | p_mem_info->ui_placement[0] = 0; |
566 | 20.1k | p_mem_info->ui_placement[1] = 0; |
567 | 20.1k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
568 | 20.1k | p_mem_info->ui_placed[0] = 0; |
569 | 20.1k | p_mem_info->ui_placed[1] = 0; |
570 | 20.1k | } |
571 | 20.1k | { |
572 | 20.1k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX]; |
573 | 20.1k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
574 | 20.1k | p_mem_info->ui_size = p_obj_drc->str_config.frame_size * |
575 | 20.1k | (p_obj_drc->str_config.pcm_size >> 3) * |
576 | 20.1k | p_obj_drc->str_config.num_ch_in; |
577 | 20.1k | p_mem_info->ui_alignment = 4; |
578 | 20.1k | p_mem_info->ui_type = IA_MEMTYPE_INPUT; |
579 | 20.1k | p_mem_info->ui_placement[0] = 0; |
580 | 20.1k | p_mem_info->ui_placement[1] = 0; |
581 | 20.1k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
582 | 20.1k | p_mem_info->ui_placed[0] = 0; |
583 | 20.1k | p_mem_info->ui_placed[1] = 0; |
584 | 20.1k | } |
585 | 20.1k | { |
586 | 20.1k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX]; |
587 | 20.1k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
588 | 20.1k | p_mem_info->ui_size = p_obj_drc->str_config.frame_size * |
589 | 20.1k | (p_obj_drc->str_config.pcm_size >> 3) * |
590 | 20.1k | p_obj_drc->str_config.num_ch_in; |
591 | 20.1k | p_mem_info->ui_alignment = 4; |
592 | 20.1k | p_mem_info->ui_type = IA_MEMTYPE_OUTPUT; |
593 | 20.1k | p_mem_info->ui_placement[0] = 0; |
594 | 20.1k | p_mem_info->ui_placement[1] = 0; |
595 | 20.1k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
596 | 20.1k | p_mem_info->ui_placed[0] = 0; |
597 | 20.1k | p_mem_info->ui_placed[1] = 0; |
598 | 20.1k | } |
599 | 20.1k | { |
600 | 20.1k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX]; |
601 | 20.1k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
602 | 20.1k | p_mem_info->ui_size = impd_calc_scratch_size(); |
603 | 20.1k | p_mem_info->ui_alignment = 8; |
604 | 20.1k | p_mem_info->ui_type = IA_MEMTYPE_SCRATCH; |
605 | 20.1k | p_mem_info->ui_placement[0] = 0; |
606 | 20.1k | p_mem_info->ui_placement[1] = 0; |
607 | 20.1k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
608 | 20.1k | p_mem_info->ui_placed[0] = 0; |
609 | 20.1k | p_mem_info->ui_placed[1] = 0; |
610 | 20.1k | } |
611 | 20.1k | return IA_NO_ERROR; |
612 | 20.1k | } |