xref: /aosp_15_r20/external/libxaac/decoder/drc_src/impd_drc_gain_decoder.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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