Coverage Report

Created: 2025-11-24 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}