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 <stdlib.h>
21 #include <stdio.h>
22 #include <math.h>
23 #include <string.h>
24
25 #include "impd_type_def.h"
26 #include "impd_error_standards.h"
27 #include "impd_drc_extr_delta_coded_info.h"
28 #include "ixheaac_constants.h"
29 #include "impd_drc_common.h"
30 #include "impd_drc_struct.h"
31 #include "impd_parametric_drc_dec.h"
32 #include "impd_drc_gain_dec.h"
33 #include "impd_drc_filter_bank.h"
34 #include "impd_drc_multi_band.h"
35 #include "impd_drc_interface.h"
36 #include "impd_drc_gain_dec.h"
37 #include "impd_drc_eq.h"
38 #include "impd_drc_process_audio.h"
39 #include "impd_drc_gain_decoder.h"
40 #include "impd_drc_dec.h"
41
impd_init_drc_decode(WORD32 frame_size,WORD32 sample_rate,WORD32 gain_delay_samples,WORD32 delay_mode,WORD32 sub_band_domain_mode,ia_drc_gain_dec_struct * p_drc_gain_dec_structs)42 IA_ERRORCODE impd_init_drc_decode(
43 WORD32 frame_size, WORD32 sample_rate, WORD32 gain_delay_samples,
44 WORD32 delay_mode, WORD32 sub_band_domain_mode,
45 ia_drc_gain_dec_struct* p_drc_gain_dec_structs) {
46 IA_ERRORCODE err_code = IA_NO_ERROR;
47
48 err_code = impd_init_drc_params(
49 frame_size, sample_rate, gain_delay_samples, delay_mode,
50 sub_band_domain_mode, &p_drc_gain_dec_structs->ia_drc_params_struct);
51
52 if (err_code != IA_NO_ERROR) return (err_code);
53
54 err_code = impd_init_parametric_drc(
55 p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size, sample_rate,
56 sub_band_domain_mode, &p_drc_gain_dec_structs->parametricdrc_params);
57
58 if (err_code != IA_NO_ERROR) return (err_code);
59
60 return err_code;
61 }
62
impd_init_drc_decode_post_config(WORD32 audio_num_chan,WORD32 * drc_set_id_processed,WORD32 * downmix_id_processed,WORD32 num_sets_processed,WORD32 eq_set_id_processed,ia_drc_gain_dec_struct * p_drc_gain_dec_structs,ia_drc_config * pstr_drc_config,ia_drc_loudness_info_set_struct * pstr_loudness_info,pVOID * mem_ptr)63 IA_ERRORCODE impd_init_drc_decode_post_config(
64 WORD32 audio_num_chan, WORD32* drc_set_id_processed,
65 WORD32* downmix_id_processed, WORD32 num_sets_processed,
66 WORD32 eq_set_id_processed,
67
68 ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
69 ia_drc_config* pstr_drc_config,
70 ia_drc_loudness_info_set_struct* pstr_loudness_info, pVOID* mem_ptr) {
71 IA_ERRORCODE err_code = 0;
72 WORD32 i, j, k, maxMultibandAudioSignalCount = 0;
73 ia_drc_params_struct* p_drc_params_struct =
74 &p_drc_gain_dec_structs->ia_drc_params_struct;
75 ia_audio_in_out_buf* p_audio_in_out_buf =
76 &p_drc_gain_dec_structs->audio_in_out_buf;
77
78 for (i = 0; i < num_sets_processed; i++) {
79 err_code = impd_init_selected_drc_set(
80 pstr_drc_config, p_drc_params_struct,
81 &p_drc_gain_dec_structs->parametricdrc_params, audio_num_chan,
82 drc_set_id_processed[i], downmix_id_processed[i],
83 &p_drc_gain_dec_structs->ia_filter_banks_struct,
84 &p_drc_gain_dec_structs->str_overlap_params,
85 p_drc_gain_dec_structs->shape_filter_block);
86 if (err_code) return (err_code);
87 }
88
89 p_drc_gain_dec_structs->audio_num_chan = audio_num_chan;
90 p_drc_gain_dec_structs->ia_drc_params_struct.audio_delay_samples =
91 p_drc_gain_dec_structs->ia_drc_params_struct.parametric_drc_delay;
92 if (pstr_drc_config->str_drc_config_ext.parametric_drc_present) {
93 err_code = impd_init_parametric_drc_after_config(
94 pstr_drc_config, pstr_loudness_info,
95 &p_drc_gain_dec_structs->parametricdrc_params, mem_ptr);
96 if (err_code) return (err_code);
97 }
98
99 p_audio_in_out_buf->audio_num_chan = audio_num_chan;
100 p_audio_in_out_buf->audio_delay_samples =
101 p_drc_params_struct->audio_delay_samples;
102 p_audio_in_out_buf->frame_size = p_drc_params_struct->drc_frame_size;
103
104 if (p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_QMF64) {
105 p_audio_in_out_buf->audio_delay_sub_band_samples =
106 p_drc_params_struct->audio_delay_samples /
107 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
108 p_audio_in_out_buf->audio_sub_band_frame_size =
109 p_drc_params_struct->drc_frame_size /
110 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
111 p_audio_in_out_buf->audio_sub_band_count = AUDIO_CODEC_SUBBAND_COUNT_QMF64;
112 } else if (p_drc_params_struct->sub_band_domain_mode ==
113 SUBBAND_DOMAIN_MODE_QMF71) {
114 p_audio_in_out_buf->audio_delay_sub_band_samples =
115 p_drc_params_struct->audio_delay_samples /
116 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71;
117 p_audio_in_out_buf->audio_sub_band_frame_size =
118 p_drc_params_struct->drc_frame_size /
119 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71;
120 p_audio_in_out_buf->audio_sub_band_count = AUDIO_CODEC_SUBBAND_COUNT_QMF71;
121 } else if (p_drc_params_struct->sub_band_domain_mode ==
122 SUBBAND_DOMAIN_MODE_STFT256) {
123 p_audio_in_out_buf->audio_delay_sub_band_samples =
124 p_drc_params_struct->audio_delay_samples /
125 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256;
126 p_audio_in_out_buf->audio_sub_band_frame_size =
127 p_drc_params_struct->drc_frame_size /
128 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256;
129 p_audio_in_out_buf->audio_sub_band_count =
130 AUDIO_CODEC_SUBBAND_COUNT_STFT256;
131 } else {
132 p_audio_in_out_buf->audio_delay_sub_band_samples = 0;
133 p_audio_in_out_buf->audio_sub_band_frame_size = 0;
134 p_audio_in_out_buf->audio_sub_band_count = 0;
135 }
136
137 for (k = 0; k < SEL_DRC_COUNT; k++) {
138 if (p_drc_params_struct->sel_drc_array[k].drc_instructions_index >= 0) {
139 ia_drc_instructions_struct* drc_instruction_str =
140 &(pstr_drc_config->str_drc_instruction_str
141 [p_drc_params_struct->sel_drc_array[k].drc_instructions_index]);
142 if (drc_instruction_str->gain_element_count > 0) {
143 p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
144 .buf_interpolation = (ia_interp_buf_struct*)*mem_ptr;
145 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
146 IXHEAAC_GET_SIZE_ALIGNED(drc_instruction_str->gain_element_count *
147 sizeof(ia_interp_buf_struct),
148 BYTE_ALIGN_8));
149 p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
150 .buf_interpolation_count = drc_instruction_str->gain_element_count;
151 for (i = 0;
152 i < p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
153 .buf_interpolation_count;
154 i++) {
155 p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
156 .buf_interpolation[i]
157 .str_node.time = 0;
158 p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
159 .buf_interpolation[i]
160 .prev_node.time = -1;
161 p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
162 .buf_interpolation[i]
163 .str_node.loc_db_gain = 0.0f;
164 p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
165 .buf_interpolation[i]
166 .str_node.slope = 0.0f;
167
168 for (j = 0; j < 2 * AUDIO_CODEC_FRAME_SIZE_MAX + MAX_SIGNAL_DELAY;
169 j++) {
170 p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k]
171 .buf_interpolation[i]
172 .lpcm_gains[j] = 1.f;
173 }
174 }
175 }
176 }
177 }
178
179 if (eq_set_id_processed > 0) {
180 for (i = 0; i < pstr_drc_config->str_drc_config_ext.eq_instructions_count;
181 i++) {
182 if (pstr_drc_config->str_drc_config_ext.str_eq_instructions[i]
183 .eq_set_id == eq_set_id_processed)
184 break;
185 }
186 if (i == pstr_drc_config->str_drc_config_ext.eq_instructions_count) {
187 return -1;
188 }
189
190 p_drc_gain_dec_structs->eq_set = (ia_eq_set_struct*)*mem_ptr;
191 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
192 IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_eq_set_struct), BYTE_ALIGN_8));
193
194 if (err_code) return (err_code);
195
196 err_code = impd_derive_eq_set(
197 &pstr_drc_config->str_drc_config_ext.str_eq_coeff,
198 &(pstr_drc_config->str_drc_config_ext.str_eq_instructions[i]),
199 (FLOAT32)p_drc_gain_dec_structs->ia_drc_params_struct.sample_rate,
200 p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size,
201 p_drc_gain_dec_structs->ia_drc_params_struct.sub_band_domain_mode,
202 p_drc_gain_dec_structs->eq_set);
203 if (err_code) return (err_code);
204
205 impd_get_eq_set_delay(
206 p_drc_gain_dec_structs->eq_set,
207 &p_drc_gain_dec_structs->ia_drc_params_struct.eq_delay);
208 }
209
210 for (i = 0; i < p_drc_params_struct->drc_set_counter; i++) {
211 ia_drc_instructions_struct* drc_instruction_str;
212 drc_instruction_str =
213 &(pstr_drc_config->str_drc_instruction_str
214 [p_drc_params_struct->sel_drc_array[i].drc_instructions_index]);
215 maxMultibandAudioSignalCount =
216 max(maxMultibandAudioSignalCount,
217 drc_instruction_str->multiband_audio_sig_count);
218 }
219
220 p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio = *mem_ptr;
221 *mem_ptr =
222 (pVOID)((SIZE_T)*mem_ptr +
223 IXHEAAC_GET_SIZE_ALIGNED(
224 (maxMultibandAudioSignalCount *
225 sizeof(p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio[0])),
226 BYTE_ALIGN_8));
227
228 for (i = 0; i < maxMultibandAudioSignalCount; i++) {
229 p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio[i] =
230 *mem_ptr;
231 *mem_ptr =
232 (pVOID)((SIZE_T)*mem_ptr +
233 IXHEAAC_GET_SIZE_ALIGNED(
234 (p_drc_params_struct->drc_frame_size *
235 sizeof(
236 p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio[i][0])),
237 BYTE_ALIGN_8));
238 }
239 p_drc_gain_dec_structs->audio_band_buffer.multiband_audio_sig_count =
240 maxMultibandAudioSignalCount;
241 p_drc_gain_dec_structs->audio_band_buffer.frame_size =
242 p_drc_params_struct->drc_frame_size;
243 ;
244
245 if (p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF &&
246 p_audio_in_out_buf->audio_delay_samples) {
247 p_audio_in_out_buf->audio_io_buffer_delayed = *mem_ptr;
248 *mem_ptr =
249 (pVOID)((SIZE_T)*mem_ptr +
250 IXHEAAC_GET_SIZE_ALIGNED((p_audio_in_out_buf->audio_num_chan *
251 sizeof(p_audio_in_out_buf->audio_io_buffer_delayed[0])),
252 BYTE_ALIGN_8));
253 p_audio_in_out_buf->audio_in_out_buf = *mem_ptr;
254 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
255 IXHEAAC_GET_SIZE_ALIGNED((p_audio_in_out_buf->audio_num_chan *
256 sizeof(p_audio_in_out_buf->audio_in_out_buf[0])),
257 BYTE_ALIGN_8));
258
259 for (i = 0; i < p_audio_in_out_buf->audio_num_chan; i++) {
260 p_audio_in_out_buf->audio_io_buffer_delayed[i] = *mem_ptr;
261 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
262 IXHEAAC_GET_SIZE_ALIGNED(
263 ((p_audio_in_out_buf->frame_size +
264 p_audio_in_out_buf->audio_delay_samples) *
265 sizeof(p_audio_in_out_buf->audio_io_buffer_delayed[i][0])),
266 BYTE_ALIGN_8));
267 p_audio_in_out_buf->audio_in_out_buf[i] =
268 &p_audio_in_out_buf->audio_io_buffer_delayed
269 [i][p_audio_in_out_buf->audio_delay_samples];
270 }
271 }
272 if (p_drc_params_struct->sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF &&
273 p_audio_in_out_buf->audio_delay_sub_band_samples) {
274 p_audio_in_out_buf->audio_buffer_delayed_real = *mem_ptr;
275 *mem_ptr =
276 (pVOID)((SIZE_T)*mem_ptr + IXHEAAC_GET_SIZE_ALIGNED(
277 (p_audio_in_out_buf->audio_num_chan *
278 sizeof(p_audio_in_out_buf->audio_buffer_delayed_real[0])),
279 BYTE_ALIGN_8));
280 p_audio_in_out_buf->audio_buffer_delayed_imag = *mem_ptr;
281 *mem_ptr =
282 (pVOID)((SIZE_T)*mem_ptr + IXHEAAC_GET_SIZE_ALIGNED(
283 (p_audio_in_out_buf->audio_num_chan *
284 sizeof(p_audio_in_out_buf->audio_buffer_delayed_imag[0])),
285 BYTE_ALIGN_8));
286 p_audio_in_out_buf->audio_real_buff = *mem_ptr;
287 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
288 IXHEAAC_GET_SIZE_ALIGNED((p_audio_in_out_buf->audio_num_chan *
289 sizeof(p_audio_in_out_buf->audio_real_buff[0])),
290 BYTE_ALIGN_8));
291 p_audio_in_out_buf->audio_imag_buff = *mem_ptr;
292 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
293 IXHEAAC_GET_SIZE_ALIGNED((p_audio_in_out_buf->audio_num_chan *
294 sizeof(p_audio_in_out_buf->audio_imag_buff[0])),
295 BYTE_ALIGN_8));
296
297 for (i = 0; i < p_audio_in_out_buf->audio_num_chan; i++) {
298 p_audio_in_out_buf->audio_buffer_delayed_real[i] = *mem_ptr;
299 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
300 IXHEAAC_GET_SIZE_ALIGNED(
301 ((p_audio_in_out_buf->audio_sub_band_frame_size +
302 p_audio_in_out_buf->audio_delay_sub_band_samples) *
303 sizeof(p_audio_in_out_buf->audio_buffer_delayed_real[i][0])),
304 BYTE_ALIGN_8));
305 p_audio_in_out_buf->audio_buffer_delayed_imag[i] = *mem_ptr;
306 *mem_ptr = (pVOID)((SIZE_T)*mem_ptr +
307 IXHEAAC_GET_SIZE_ALIGNED(
308 ((p_audio_in_out_buf->audio_sub_band_frame_size +
309 p_audio_in_out_buf->audio_delay_sub_band_samples) *
310 sizeof(p_audio_in_out_buf->audio_buffer_delayed_imag[i][0])),
311 BYTE_ALIGN_8));
312
313 p_audio_in_out_buf->audio_real_buff[i] =
314 &p_audio_in_out_buf->audio_buffer_delayed_real
315 [i][p_audio_in_out_buf->audio_delay_sub_band_samples *
316 p_audio_in_out_buf->audio_sub_band_count];
317 p_audio_in_out_buf->audio_imag_buff[i] =
318 &p_audio_in_out_buf->audio_buffer_delayed_imag
319 [i][p_audio_in_out_buf->audio_delay_sub_band_samples *
320 p_audio_in_out_buf->audio_sub_band_count];
321 }
322 }
323
324 return err_code;
325 }
326
impd_drc_process_time_domain(ia_drc_gain_dec_struct * p_drc_gain_dec_structs,ia_drc_config * pstr_drc_config,ia_drc_gain_struct * pstr_drc_gain,FLOAT32 * audio_in_out_buf[],FLOAT32 loudness_normalization_gain_db,FLOAT32 boost,FLOAT32 compress,WORD32 drc_characteristic_target)327 IA_ERRORCODE impd_drc_process_time_domain(
328 ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
329 ia_drc_config* pstr_drc_config, ia_drc_gain_struct* pstr_drc_gain,
330 FLOAT32* audio_in_out_buf[], FLOAT32 loudness_normalization_gain_db,
331 FLOAT32 boost, FLOAT32 compress, WORD32 drc_characteristic_target) {
332 WORD32 sel_drc_index;
333 IA_ERRORCODE err_code = 0;
334 WORD32 passThru;
335 ia_drc_instructions_struct* str_drc_instruction_str =
336 pstr_drc_config->str_drc_instruction_str;
337
338 if (p_drc_gain_dec_structs->eq_set) {
339 WORD32 ch;
340 FLOAT32* audio_channel;
341 for (ch = 0; ch < p_drc_gain_dec_structs->eq_set->audio_num_chan; ch++) {
342 audio_channel = audio_in_out_buf[ch];
343
344 err_code = impd_process_eq_set_time_domain(
345 p_drc_gain_dec_structs->eq_set, ch, audio_channel, audio_channel,
346 p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size);
347 if (err_code) return (err_code);
348 }
349 }
350
351 impd_store_audio_io_buffer_time(audio_in_out_buf,
352 &p_drc_gain_dec_structs->audio_in_out_buf);
353
354 if (pstr_drc_config->apply_drc) {
355 for (sel_drc_index = 0;
356 sel_drc_index <
357 p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter;
358 sel_drc_index++) {
359 err_code = impd_get_drc_gain(
360 p_drc_gain_dec_structs, pstr_drc_config, pstr_drc_gain, compress,
361 boost, drc_characteristic_target, loudness_normalization_gain_db,
362 sel_drc_index, &p_drc_gain_dec_structs->drc_gain_buffers);
363 if (err_code != IA_NO_ERROR) return (err_code);
364 }
365
366 if (p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter == 0) {
367 impd_retrieve_audio_io_buffer_time(
368 audio_in_out_buf, &p_drc_gain_dec_structs->audio_in_out_buf);
369
370 } else {
371 for (sel_drc_index = 0;
372 sel_drc_index <
373 p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter;
374 sel_drc_index++) {
375 if (p_drc_gain_dec_structs->ia_drc_params_struct
376 .multiband_sel_drc_idx == sel_drc_index) {
377 passThru = 0;
378 } else {
379 passThru = 1;
380 }
381 err_code = impd_filter_banks_process(
382 str_drc_instruction_str,
383 p_drc_gain_dec_structs->ia_drc_params_struct
384 .sel_drc_array[sel_drc_index]
385 .drc_instructions_index,
386 &p_drc_gain_dec_structs->ia_drc_params_struct,
387 p_drc_gain_dec_structs->audio_in_out_buf.audio_io_buffer_delayed,
388 &p_drc_gain_dec_structs->audio_band_buffer,
389 &p_drc_gain_dec_structs->ia_filter_banks_struct, passThru);
390 if (err_code != IA_NO_ERROR) return (err_code);
391
392 impd_apply_gains_and_add(
393 str_drc_instruction_str,
394 p_drc_gain_dec_structs->ia_drc_params_struct
395 .sel_drc_array[sel_drc_index]
396 .drc_instructions_index,
397 &p_drc_gain_dec_structs->ia_drc_params_struct,
398 &(p_drc_gain_dec_structs->drc_gain_buffers
399 .pstr_gain_buf[sel_drc_index]),
400 p_drc_gain_dec_structs->shape_filter_block,
401 p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio,
402 audio_in_out_buf, 1);
403 }
404 }
405 }
406
407 impd_advance_audio_io_buffer_time(&p_drc_gain_dec_structs->audio_in_out_buf);
408
409 return err_code;
410 }
411
impd_get_parametric_drc_delay(ia_drc_gain_dec_struct * p_drc_gain_dec_structs,ia_drc_config * pstr_drc_config,WORD32 * parametric_drc_delay,WORD32 * parametric_drc_delay_max)412 VOID impd_get_parametric_drc_delay(
413 ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
414 ia_drc_config* pstr_drc_config, WORD32* parametric_drc_delay,
415 WORD32* parametric_drc_delay_max) {
416 *parametric_drc_delay =
417 p_drc_gain_dec_structs->ia_drc_params_struct.parametric_drc_delay;
418
419 if (pstr_drc_config->str_drc_config_ext.parametric_drc_present &&
420 pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc
421 .parametric_drc_delay_max_present) {
422 *parametric_drc_delay_max =
423 pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc
424 .parametric_drc_delay_max;
425 } else if (pstr_drc_config->str_drc_config_ext.parametric_drc_present == 0) {
426 *parametric_drc_delay_max = 0;
427 } else {
428 *parametric_drc_delay_max = -1;
429 }
430
431 return;
432 }
433
impd_get_eq_delay(ia_drc_gain_dec_struct * p_drc_gain_dec_structs,ia_drc_config * pstr_drc_config,WORD32 * eq_delay,WORD32 * eq_delay_max)434 VOID impd_get_eq_delay(ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
435 ia_drc_config* pstr_drc_config, WORD32* eq_delay,
436 WORD32* eq_delay_max) {
437 *eq_delay = p_drc_gain_dec_structs->ia_drc_params_struct.eq_delay;
438
439 if (pstr_drc_config->str_drc_config_ext.eq_flag &&
440 pstr_drc_config->str_drc_config_ext.str_eq_coeff.eq_delay_max_present) {
441 *eq_delay_max =
442 pstr_drc_config->str_drc_config_ext.str_eq_coeff.eq_delay_max;
443 } else if (pstr_drc_config->str_drc_config_ext.eq_flag == 0) {
444 *eq_delay_max = 0;
445 } else {
446 *eq_delay_max = -1;
447 }
448
449 return;
450 }
451