Coverage Report

Created: 2026-10-17 07:12

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
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
}