Coverage Report

Created: 2025-07-12 07:02

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