/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 | 55.0k | #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 | 537k | pVOID pv_value) { |
69 | 537k | ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj; |
70 | 537k | IA_ERRORCODE error_code = IA_NO_ERROR; |
71 | 537k | LOOPIDX i; |
72 | | |
73 | 537k | pUWORD32 pui_value = pv_value; |
74 | 537k | pUWORD32 pus_value = pv_value; |
75 | 537k | pWORD8 pb_value = pv_value; |
76 | 537k | SIZE_T *ps_value = pv_value; |
77 | 537k | pWORD32 pi_value = pv_value; |
78 | | |
79 | 537k | switch (i_cmd) { |
80 | 36.7k | case IA_API_CMD_GET_MEM_INFO_SIZE: |
81 | 73.4k | case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: |
82 | 110k | case IA_API_CMD_GET_MEM_INFO_TYPE: |
83 | 110k | case IA_API_CMD_GET_MEM_INFO_PLACEMENT: |
84 | 110k | case IA_API_CMD_GET_MEM_INFO_PRIORITY: |
85 | 183k | case IA_API_CMD_SET_MEM_PTR: |
86 | 183k | case IA_API_CMD_SET_MEM_PLACEMENT: { |
87 | 183k | return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value); |
88 | 183k | } |
89 | 537k | }; |
90 | | |
91 | 354k | switch (i_cmd) { |
92 | 0 | case IA_API_CMD_GET_LIB_ID_STRINGS: { |
93 | 0 | switch (i_idx) { |
94 | 0 | case IA_CMD_TYPE_LIB_NAME: { |
95 | 0 | WORD8 lib_name[] = LIBNAME; |
96 | 0 | for (i = 0; i < IA_API_STR_LEN && lib_name[i - 1] != 0; i++) { |
97 | 0 | pb_value[i] = lib_name[i]; |
98 | 0 | } |
99 | 0 | break; |
100 | 0 | } |
101 | 0 | case IA_CMD_TYPE_LIB_VERSION: { |
102 | 0 | break; |
103 | 0 | } |
104 | | |
105 | 0 | case IA_CMD_TYPE_API_VERSION: { |
106 | 0 | } |
107 | 0 | default: { return -1; } |
108 | 0 | }; |
109 | 0 | break; |
110 | 0 | } |
111 | 21.1k | case IA_API_CMD_GET_API_SIZE: { |
112 | 21.1k | *pui_value = sizeof(ia_drc_api_struct); |
113 | | |
114 | 21.1k | break; |
115 | 0 | } |
116 | 67.3k | case IA_API_CMD_INIT: { |
117 | 67.3k | switch (i_idx) { |
118 | 18.3k | case IA_CMD_TYPE_INIT_SET_BUFF_PTR: { |
119 | 18.3k | p_obj_drc->p_state->persistent_ptr = |
120 | 18.3k | (UWORD8 *)p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] + |
121 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8); |
122 | 18.3k | error_code = impd_drc_set_struct_pointer(p_obj_drc); |
123 | 18.3k | if (error_code) return error_code; |
124 | | |
125 | 18.3k | break; |
126 | 18.3k | } |
127 | 21.1k | case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: { |
128 | 21.1k | error_code = impd_drc_set_default_config(p_obj_drc); |
129 | 21.1k | if (error_code) return error_code; |
130 | 21.1k | break; |
131 | 21.1k | } |
132 | 21.1k | case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: { |
133 | 18.3k | error_code = impd_drc_fill_mem_tables(p_obj_drc); |
134 | 18.3k | if (error_code) return error_code; |
135 | 18.3k | break; |
136 | 18.3k | } |
137 | 18.3k | case IA_CMD_TYPE_INIT_PROCESS: { |
138 | 1.99k | IA_ERRORCODE Error = 0; |
139 | | |
140 | 1.99k | if (p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) { |
141 | 0 | return (-1); |
142 | 0 | } |
143 | | |
144 | 1.99k | Error = impd_drc_init(p_obj_drc); |
145 | 1.99k | if (Error) return Error; |
146 | 744 | p_obj_drc->p_state->ui_init_done = 1; |
147 | 744 | return Error; |
148 | 0 | break; |
149 | 1.99k | } |
150 | 0 | case IA_CMD_TYPE_INIT_DONE_QUERY: { |
151 | 0 | if (p_obj_drc->p_state->ui_init_done == 1) { |
152 | 0 | *pui_value = 1; |
153 | 0 | } else { |
154 | 0 | *pui_value = 0; |
155 | 0 | } |
156 | 0 | break; |
157 | 1.99k | } |
158 | | |
159 | 0 | case IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY: { |
160 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over; |
161 | 0 | break; |
162 | 1.99k | } |
163 | 0 | case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY: { |
164 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over_ic; |
165 | 0 | break; |
166 | 1.99k | } |
167 | | |
168 | 0 | case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY: { |
169 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over_il; |
170 | 0 | break; |
171 | 1.99k | } |
172 | 0 | case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY: { |
173 | 0 | *pui_value = p_obj_drc->str_bit_handler.cpy_over_in; |
174 | 0 | break; |
175 | 1.99k | } |
176 | 2.76k | case IA_CMD_TYPE_INIT_CPY_BSF_BUFF: { |
177 | 2.76k | memcpy(p_obj_drc->str_bit_handler.it_bit_buf + |
178 | 2.76k | p_obj_drc->str_bit_handler.num_bytes_offset_bs, |
179 | 2.76k | p_obj_drc->pp_mem[2], p_obj_drc->str_bit_handler.num_byts_cur); |
180 | 2.76k | p_obj_drc->str_bit_handler.num_bytes_bs = |
181 | 2.76k | p_obj_drc->str_bit_handler.num_bytes_bs + |
182 | 2.76k | p_obj_drc->str_bit_handler.num_byts_cur; |
183 | 2.76k | p_obj_drc->str_bit_handler.num_bytes_offset_bs = |
184 | 2.76k | p_obj_drc->str_bit_handler.num_bytes_bs; |
185 | 2.76k | p_obj_drc->str_bit_handler.num_total_bytes = |
186 | 2.76k | p_obj_drc->str_bit_handler.num_bytes_bs; |
187 | | |
188 | 2.76k | break; |
189 | 1.99k | } |
190 | 1.55k | case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: { |
191 | 1.55k | memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config, |
192 | 1.55k | p_obj_drc->pp_mem[2], |
193 | 1.55k | p_obj_drc->str_bit_handler.num_byts_cur_ic); |
194 | 1.55k | p_obj_drc->str_bit_handler.num_bytes_bs_drc_config = |
195 | 1.55k | p_obj_drc->str_bit_handler.num_byts_cur_ic; |
196 | 1.55k | break; |
197 | 1.99k | } |
198 | 1.12k | case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: { |
199 | 1.12k | memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info, |
200 | 1.12k | p_obj_drc->pp_mem[2], |
201 | 1.12k | p_obj_drc->str_bit_handler.num_byts_cur_il); |
202 | 1.12k | p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info = |
203 | 1.12k | p_obj_drc->str_bit_handler.num_byts_cur_il; |
204 | 1.12k | break; |
205 | 1.99k | } |
206 | 1.99k | case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: { |
207 | 1.99k | memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface, |
208 | 1.99k | p_obj_drc->pp_mem[2], |
209 | 1.99k | p_obj_drc->str_bit_handler.num_byts_cur_in); |
210 | 1.99k | p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface = |
211 | 1.99k | p_obj_drc->str_bit_handler.num_byts_cur_in; |
212 | 1.99k | break; |
213 | 1.99k | } |
214 | 0 | default: { return -1; } |
215 | 67.3k | }; |
216 | 65.3k | break; |
217 | 67.3k | } |
218 | 1.99k | case IA_API_CMD_GET_CONFIG_PARAM: { |
219 | 1.99k | switch (i_idx) { |
220 | 0 | case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { |
221 | 0 | *pus_value = p_obj_drc->str_config.sampling_rate; |
222 | 0 | break; |
223 | 0 | } |
224 | | |
225 | 1.99k | case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { |
226 | 1.99k | *pus_value = p_obj_drc->str_config.num_ch_out; |
227 | 1.99k | break; |
228 | 0 | } |
229 | 0 | case IA_DRC_DEC_CONFIG_PROC_OUT_PTR: { |
230 | 0 | *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output; |
231 | 0 | break; |
232 | 0 | } |
233 | 0 | case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: { |
234 | 0 | *pi_value = (WORD32)p_obj_drc->str_payload.pstr_loudness_info->loudness_info |
235 | 0 | ->loudness_measure->method_val; |
236 | 0 | if (*pi_value < -1) |
237 | 0 | *pi_value = *pi_value * -4; |
238 | 0 | else |
239 | 0 | *pi_value = -1; |
240 | 0 | break; |
241 | 0 | } |
242 | 1.99k | } |
243 | 1.99k | break; |
244 | 1.99k | } |
245 | 122k | case IA_API_CMD_SET_CONFIG_PARAM: { |
246 | 122k | switch (i_idx) { |
247 | 18.3k | case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { |
248 | 18.3k | if (*pus_value == 0 || *pus_value > 96000) { |
249 | 6 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ; |
250 | 6 | } |
251 | 18.3k | p_obj_drc->str_config.sampling_rate = *pus_value; |
252 | 18.3k | break; |
253 | 18.3k | } |
254 | 0 | case IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE: { |
255 | 0 | p_obj_drc->str_config.apply_crossfade = *pus_value; |
256 | 0 | break; |
257 | 18.3k | } |
258 | 0 | case IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED: { |
259 | 0 | p_obj_drc->str_config.is_config_changed = *pus_value; |
260 | 0 | break; |
261 | 18.3k | } |
262 | 18.3k | case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { |
263 | 18.3k | p_obj_drc->str_config.num_ch_in = *pus_value; |
264 | 18.3k | if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) { |
265 | 38 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS; |
266 | 38 | } |
267 | 18.3k | break; |
268 | 18.3k | } |
269 | | |
270 | 18.3k | case IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ: { |
271 | 18.3k | switch (*pus_value) { |
272 | 18.3k | case 16: |
273 | 18.3k | case 24: |
274 | 18.3k | case 32: |
275 | 18.3k | break; |
276 | 0 | default: |
277 | 0 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE; |
278 | 18.3k | } |
279 | | |
280 | 18.3k | p_obj_drc->str_config.pcm_size = *pus_value; |
281 | | |
282 | 18.3k | break; |
283 | 18.3k | } |
284 | | |
285 | 5.44k | case IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT: { |
286 | 5.44k | break; |
287 | 18.3k | } |
288 | 1.99k | case IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT: { |
289 | 1.99k | break; |
290 | 18.3k | } |
291 | 1.99k | case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: { |
292 | 1.99k | if (*pus_value < 1 || *pus_value > 4096) { |
293 | 0 | return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE; |
294 | 0 | } |
295 | | |
296 | 1.99k | p_obj_drc->str_config.frame_size = *pus_value; |
297 | | |
298 | 1.99k | break; |
299 | 1.99k | } |
300 | 2.76k | case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: { |
301 | 2.76k | break; |
302 | 1.99k | } |
303 | | |
304 | 18.3k | case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: { |
305 | 18.3k | p_obj_drc->str_config.effect_type = *pus_value; |
306 | 18.3k | break; |
307 | 1.99k | } |
308 | 18.3k | case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: { |
309 | 18.3k | p_obj_drc->str_config.target_loudness = *pus_value; |
310 | 18.3k | break; |
311 | 1.99k | } |
312 | 18.3k | case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: { |
313 | 18.3k | p_obj_drc->str_config.loud_norm_flag = *pus_value; |
314 | 18.3k | break; |
315 | 1.99k | } |
316 | 0 | case IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE: { |
317 | 0 | p_obj_drc->str_config.album_mode = *pus_value; |
318 | 0 | break; |
319 | 1.99k | } |
320 | 0 | case IA_DRC_DEC_CONFIG_DRC_BOOST: { |
321 | 0 | p_obj_drc->str_config.boost = (*pus_value)/100.0f; |
322 | 0 | p_obj_drc->str_config.boost_set = 1; |
323 | 0 | break; |
324 | 1.99k | } |
325 | 0 | case IA_DRC_DEC_CONFIG_DRC_CUT: { |
326 | 0 | p_obj_drc->str_config.compress = (*pus_value)/100.0f; |
327 | 0 | p_obj_drc->str_config.compress_set = 1; |
328 | 0 | break; |
329 | 1.99k | } |
330 | 0 | #ifdef LOUDNESS_LEVELING_SUPPORT |
331 | 0 | case IA_DRC_DEC_CONFIG_DRC_LOUDNESS_LEVELING: { |
332 | 0 | p_obj_drc->str_config.loudness_leveling_flag = *pus_value; |
333 | 0 | break; |
334 | 1.99k | } |
335 | 0 | #endif |
336 | 0 | default: { return -1; } |
337 | 122k | } |
338 | 122k | break; |
339 | 122k | } |
340 | 122k | case IA_API_CMD_GET_MEMTABS_SIZE: { |
341 | 18.3k | *pui_value = |
342 | 18.3k | (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES); |
343 | 18.3k | break; |
344 | 122k | } |
345 | 18.3k | case IA_API_CMD_SET_MEMTABS_PTR: { |
346 | 18.3k | if (ps_value == NULL) return IA_DRC_DEC_API_FATAL_MEM_ALLOC; |
347 | 18.3k | memset(ps_value, 0, |
348 | 18.3k | (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES)); |
349 | 18.3k | p_obj_drc->p_mem_info = (ia_mem_info_struct *)(ps_value); |
350 | 18.3k | p_obj_drc->pp_mem = |
351 | 18.3k | (pVOID)((SIZE_T)p_obj_drc->p_mem_info + |
352 | 18.3k | (NUM_DRC_TABLES * sizeof(*(p_obj_drc->p_mem_info)))); |
353 | 18.3k | break; |
354 | 18.3k | } |
355 | 0 | case IA_API_CMD_GET_N_MEMTABS: { |
356 | 0 | *pui_value = NUM_DRC_TABLES; |
357 | 0 | break; |
358 | 18.3k | } |
359 | 0 | case IA_API_CMD_GET_N_TABLES: { |
360 | 0 | break; |
361 | 18.3k | } |
362 | | |
363 | 49.6k | case IA_API_CMD_EXECUTE: { |
364 | 49.6k | switch (i_idx) { |
365 | 49.6k | case IA_CMD_TYPE_DO_EXECUTE: { |
366 | 49.6k | if (!p_obj_drc->p_state->ui_init_done) { |
367 | 21.4k | error_code = IA_FATAL_ERROR; |
368 | 28.1k | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD) { |
369 | 28.1k | error_code = impd_process_time_domain(p_obj_drc); |
370 | 28.1k | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_QMF64) { |
371 | 0 | error_code = IA_FATAL_ERROR; |
372 | 0 | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) { |
373 | 0 | error_code = IA_FATAL_ERROR; |
374 | 0 | } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD_QMF64) { |
375 | 0 | error_code = IA_FATAL_ERROR; |
376 | 0 | } |
377 | 49.6k | p_obj_drc->str_bit_handler.byte_index_bs = |
378 | 49.6k | p_obj_drc->str_bit_handler.num_total_bytes - |
379 | 49.6k | p_obj_drc->str_bit_handler.num_bytes_bs; |
380 | 49.6k | p_obj_drc->str_bit_handler.num_bytes_offset_bs = 0; |
381 | | |
382 | 49.6k | break; |
383 | 0 | } |
384 | 0 | case IA_CMD_TYPE_DONE_QUERY: { |
385 | 0 | *pui_value = p_obj_drc->p_state->ui_exe_done; |
386 | 0 | break; |
387 | 0 | } |
388 | 0 | default: { return -1; } |
389 | 49.6k | }; |
390 | 49.6k | break; |
391 | 49.6k | } |
392 | 0 | case IA_API_CMD_PUT_INPUT_QUERY: { |
393 | 0 | *pui_value = 1; |
394 | 0 | break; |
395 | 49.6k | } |
396 | 0 | case IA_API_CMD_GET_CURIDX_INPUT_BUF: { |
397 | 0 | UWORD32 ui_in_buf_size = p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size; |
398 | 0 | UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes; |
399 | 0 | *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size; |
400 | 0 | break; |
401 | 49.6k | } |
402 | 49.6k | case IA_API_CMD_SET_INPUT_BYTES: { |
403 | 49.6k | p_obj_drc->p_state->ui_in_bytes = *pui_value; |
404 | 49.6k | break; |
405 | 49.6k | } |
406 | | |
407 | 0 | case IA_API_CMD_GET_OUTPUT_BYTES: { |
408 | 0 | *pui_value = p_obj_drc->p_state->ui_out_bytes; |
409 | 0 | break; |
410 | 49.6k | } |
411 | 0 | case IA_API_CMD_INPUT_OVER: { |
412 | 0 | p_obj_drc->p_state->ui_exe_done = 1; |
413 | 0 | break; |
414 | 49.6k | } |
415 | 2.76k | case IA_API_CMD_SET_INPUT_BYTES_BS: { |
416 | 2.76k | p_obj_drc->str_bit_handler.num_byts_cur = *pus_value; |
417 | 2.76k | break; |
418 | 49.6k | } |
419 | 1.55k | case IA_API_CMD_SET_INPUT_BYTES_IC_BS: { |
420 | 1.55k | p_obj_drc->str_bit_handler.num_byts_cur_ic = *pus_value; |
421 | 1.55k | break; |
422 | 49.6k | } |
423 | 1.12k | case IA_API_CMD_SET_INPUT_BYTES_IL_BS: { |
424 | 1.12k | p_obj_drc->str_bit_handler.num_byts_cur_il = *pus_value; |
425 | 1.12k | break; |
426 | 49.6k | } |
427 | 0 | case IA_API_CMD_SET_INPUT_BYTES_IN_BS: { |
428 | 0 | p_obj_drc->str_bit_handler.num_byts_cur_in = *pus_value; |
429 | 0 | break; |
430 | 49.6k | } |
431 | 0 | default: { return -1; } |
432 | 354k | }; |
433 | 352k | return error_code; |
434 | 354k | } |
435 | | |
436 | | IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, |
437 | 183k | WORD32 i_idx, pVOID pv_value) { |
438 | 183k | pUWORD32 pui_value = pv_value; |
439 | | |
440 | 183k | switch (i_cmd) { |
441 | 36.7k | case IA_API_CMD_GET_MEM_INFO_SIZE: { |
442 | 36.7k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size; |
443 | 36.7k | break; |
444 | 0 | } |
445 | 36.7k | case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: { |
446 | 36.7k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment; |
447 | 36.7k | break; |
448 | 0 | } |
449 | 36.7k | case IA_API_CMD_GET_MEM_INFO_TYPE: { |
450 | 36.7k | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type; |
451 | 36.7k | break; |
452 | 0 | } |
453 | 0 | case IA_API_CMD_GET_MEM_INFO_PLACEMENT: { |
454 | 0 | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0]; |
455 | 0 | *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1]; |
456 | 0 | break; |
457 | 0 | } |
458 | 0 | case IA_API_CMD_GET_MEM_INFO_PRIORITY: { |
459 | 0 | *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority; |
460 | 0 | break; |
461 | 0 | } |
462 | 73.4k | case IA_API_CMD_SET_MEM_PTR: { |
463 | 73.4k | if (pv_value == 0) { |
464 | 0 | return (-1); |
465 | 0 | } |
466 | 73.4k | if (((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) { |
467 | 0 | return (-1); |
468 | 0 | } |
469 | 73.4k | p_obj_drc->pp_mem[i_idx] = pv_value; |
470 | 73.4k | memset(p_obj_drc->pp_mem[i_idx], 0, p_obj_drc->p_mem_info[i_idx].ui_size); |
471 | 73.4k | if (IA_MEMTYPE_PERSIST == i_idx) { |
472 | 18.3k | p_obj_drc->p_state = pv_value; |
473 | 18.3k | } |
474 | 73.4k | break; |
475 | 73.4k | } |
476 | 0 | case IA_API_CMD_SET_MEM_PLACEMENT: { |
477 | 0 | } |
478 | 183k | }; |
479 | 183k | return IA_NO_ERROR; |
480 | 183k | } |
481 | | |
482 | 18.3k | static WORD32 impd_calc_scratch_size() { |
483 | 18.3k | return IXHEAAC_GET_SIZE_ALIGNED( |
484 | 18.3k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * NUM_ELE_IN_CPLX_NUM * sizeof(FLOAT32), |
485 | 18.3k | BYTE_ALIGN_8); |
486 | 18.3k | } |
487 | | |
488 | 18.3k | static WORD32 impd_calc_pers_size() { |
489 | 18.3k | WORD32 size = 0; |
490 | | |
491 | 18.3k | WORD32 analysis_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
492 | 18.3k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
493 | 18.3k | BYTE_ALIGN_8); |
494 | 18.3k | WORD32 synth_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
495 | 18.3k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
496 | 18.3k | BYTE_ALIGN_8); |
497 | 18.3k | WORD32 peak_lim_buf_size = IXHEAAC_GET_SIZE_ALIGNED( |
498 | 18.3k | AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM, |
499 | 18.3k | BYTE_ALIGN_8); |
500 | 18.3k | WORD32 subband_buf_size = |
501 | 18.3k | NUM_ELE_IN_CPLX_NUM * |
502 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8) + |
503 | 18.3k | NUM_ELE_IN_CPLX_NUM * MAX_CHANNEL_COUNT * |
504 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((MAX_SUBBAND_DELAY + MAX_DRC_FRAME_SIZE) * sizeof(FLOAT32), |
505 | 18.3k | BYTE_ALIGN_8); |
506 | | |
507 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8); |
508 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_bits_dec_struct), BYTE_ALIGN_8); |
509 | 18.3k | size += 2 * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_dec_struct), BYTE_ALIGN_8); |
510 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_loudness_info_set_struct), BYTE_ALIGN_8); |
511 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_struct), BYTE_ALIGN_8); |
512 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_interface_struct), BYTE_ALIGN_8); |
513 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_config), BYTE_ALIGN_8); |
514 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_pro_struct), BYTE_ALIGN_8); |
515 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_params_struct), BYTE_ALIGN_8); |
516 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_output_struct), BYTE_ALIGN_8); |
517 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_peak_limiter_struct), BYTE_ALIGN_8); |
518 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_qmf_filt_struct), BYTE_ALIGN_8); |
519 | 18.3k | size += analysis_buf_size; |
520 | 18.3k | size += synth_buf_size; |
521 | 18.3k | size += peak_lim_buf_size; |
522 | | |
523 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_BS_BUF_SIZE, BYTE_ALIGN_8); |
524 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_CONFG_BUF_SIZE, BYTE_ALIGN_8); /*DRC Config Bitstream*/ |
525 | 18.3k | size += IXHEAAC_GET_SIZE_ALIGNED(MAX_LOUD_INFO_BUF_SIZE, |
526 | 18.3k | BYTE_ALIGN_8); /*DRC loudness info Bitstream*/ |
527 | 18.3k | size += |
528 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED(MAX_INTERFACE_BUF_SIZE, BYTE_ALIGN_8); /*DRC interface Bitstream*/ |
529 | | |
530 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * SEL_DRC_COUNT * |
531 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_interp_buf_struct) * MAX_GAIN_ELE_COUNT), |
532 | 18.3k | BYTE_ALIGN_8); /*ia_interp_buf_struct*/ |
533 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * |
534 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_eq_set_struct)), BYTE_ALIGN_8); /*ia_eq_set_struct*/ |
535 | | |
536 | | /*non_interleaved_audio*/ |
537 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * |
538 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
539 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
540 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8); |
541 | | |
542 | | /*audio_in_out_buf ptr*/ |
543 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * |
544 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
545 | | /*audio_io_buffer_delayed*/ |
546 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * |
547 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8); |
548 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
549 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8); |
550 | | |
551 | | /*subband band buffer ptr*/ |
552 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * NUM_ELE_IN_CPLX_NUM * |
553 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8); |
554 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * subband_buf_size; |
555 | | |
556 | 18.3k | size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT * |
557 | 18.3k | IXHEAAC_GET_SIZE_ALIGNED((PARAM_DRC_MAX_BUF_SZ * sizeof(FLOAT32)), BYTE_ALIGN_8); |
558 | | |
559 | 18.3k | return size; |
560 | 18.3k | } |
561 | | |
562 | 18.3k | IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { |
563 | 18.3k | ia_mem_info_struct *p_mem_info; |
564 | 18.3k | { |
565 | 18.3k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX]; |
566 | 18.3k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
567 | 18.3k | p_mem_info->ui_size = impd_calc_pers_size(); |
568 | 18.3k | p_mem_info->ui_alignment = 8; |
569 | 18.3k | p_mem_info->ui_type = IA_MEMTYPE_PERSIST; |
570 | 18.3k | p_mem_info->ui_placement[0] = 0; |
571 | 18.3k | p_mem_info->ui_placement[1] = 0; |
572 | 18.3k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
573 | 18.3k | p_mem_info->ui_placed[0] = 0; |
574 | 18.3k | p_mem_info->ui_placed[1] = 0; |
575 | 18.3k | } |
576 | 18.3k | { |
577 | 18.3k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX]; |
578 | 18.3k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
579 | 18.3k | p_mem_info->ui_size = p_obj_drc->str_config.frame_size * |
580 | 18.3k | (p_obj_drc->str_config.pcm_size >> 3) * |
581 | 18.3k | p_obj_drc->str_config.num_ch_in; |
582 | 18.3k | p_mem_info->ui_alignment = 4; |
583 | 18.3k | p_mem_info->ui_type = IA_MEMTYPE_INPUT; |
584 | 18.3k | p_mem_info->ui_placement[0] = 0; |
585 | 18.3k | p_mem_info->ui_placement[1] = 0; |
586 | 18.3k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
587 | 18.3k | p_mem_info->ui_placed[0] = 0; |
588 | 18.3k | p_mem_info->ui_placed[1] = 0; |
589 | 18.3k | } |
590 | 18.3k | { |
591 | 18.3k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX]; |
592 | 18.3k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
593 | 18.3k | p_mem_info->ui_size = p_obj_drc->str_config.frame_size * |
594 | 18.3k | (p_obj_drc->str_config.pcm_size >> 3) * |
595 | 18.3k | p_obj_drc->str_config.num_ch_in; |
596 | 18.3k | p_mem_info->ui_alignment = 4; |
597 | 18.3k | p_mem_info->ui_type = IA_MEMTYPE_OUTPUT; |
598 | 18.3k | p_mem_info->ui_placement[0] = 0; |
599 | 18.3k | p_mem_info->ui_placement[1] = 0; |
600 | 18.3k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
601 | 18.3k | p_mem_info->ui_placed[0] = 0; |
602 | 18.3k | p_mem_info->ui_placed[1] = 0; |
603 | 18.3k | } |
604 | 18.3k | { |
605 | 18.3k | p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX]; |
606 | 18.3k | memset(p_mem_info, 0, sizeof(*p_mem_info)); |
607 | 18.3k | p_mem_info->ui_size = impd_calc_scratch_size(); |
608 | 18.3k | p_mem_info->ui_alignment = 8; |
609 | 18.3k | p_mem_info->ui_type = IA_MEMTYPE_SCRATCH; |
610 | 18.3k | p_mem_info->ui_placement[0] = 0; |
611 | 18.3k | p_mem_info->ui_placement[1] = 0; |
612 | 18.3k | p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; |
613 | 18.3k | p_mem_info->ui_placed[0] = 0; |
614 | 18.3k | p_mem_info->ui_placed[1] = 0; |
615 | 18.3k | } |
616 | 18.3k | return IA_NO_ERROR; |
617 | 18.3k | } |