diff options
Diffstat (limited to 'decoder/drc_src/impd_drc_process.c')
-rw-r--r-- | decoder/drc_src/impd_drc_process.c | 949 |
1 files changed, 489 insertions, 460 deletions
diff --git a/decoder/drc_src/impd_drc_process.c b/decoder/drc_src/impd_drc_process.c index 8370907..15115a2 100644 --- a/decoder/drc_src/impd_drc_process.c +++ b/decoder/drc_src/impd_drc_process.c @@ -31,527 +31,556 @@ #include "impd_drc_gain_dec.h" #include "impd_drc_process_audio.h" - -WORD32 impd_apply_gains_and_add(ia_drc_instructions_struct* pstr_drc_instruction_arr, - const WORD32 drc_instructions_index, - ia_drc_params_struct* ia_drc_params_struct, - ia_gain_buffer_struct* pstr_gain_buf, - shape_filter_block shape_filter_block[], - FLOAT32* deinterleaved_audio[], - - FLOAT32* channel_audio[], - WORD32 impd_apply_gains) -{ - WORD32 c, b, g, i; - WORD32 offset = 0, signalIndex = 0; - WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX]; - WORD32 signalIndexForChannel[MAX_CHANNEL_COUNT]; - FLOAT32* lpcm_gains; - FLOAT32 sum; - FLOAT32 drc_gain_last, gainThr; - WORD32 iEnd, iStart; - ia_drc_instructions_struct* str_drc_instruction_str = &(pstr_drc_instruction_arr[drc_instructions_index]); - - if (drc_instructions_index >= 0) +WORD32 impd_apply_gains_and_add( + ia_drc_instructions_struct* pstr_drc_instruction_arr, + const WORD32 drc_instructions_index, + ia_drc_params_struct* ia_drc_params_struct, + ia_gain_buffer_struct* pstr_gain_buf, + shape_filter_block shape_filter_block[], FLOAT32* deinterleaved_audio[], + + FLOAT32* channel_audio[], WORD32 impd_apply_gains) { + WORD32 c, b, g, i; + WORD32 offset = 0, signalIndex = 0; + WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX]; + WORD32 signalIndexForChannel[MAX_CHANNEL_COUNT]; + FLOAT32* lpcm_gains; + FLOAT32 sum; + FLOAT32 drc_gain_last, gainThr; + WORD32 iEnd, iStart; + ia_drc_instructions_struct* str_drc_instruction_str = + &(pstr_drc_instruction_arr[drc_instructions_index]); + + if (drc_instructions_index >= 0) { + str_drc_instruction_str = + &(pstr_drc_instruction_arr[drc_instructions_index]); { - str_drc_instruction_str = &(pstr_drc_instruction_arr[drc_instructions_index]); - { - if (str_drc_instruction_str->drc_set_id > 0) - { - if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) - { - offset = ia_drc_params_struct->drc_frame_size; - } - gainIndexForGroup[0] = 0; - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups-1; g++) - { - gainIndexForGroup[g+1] = gainIndexForGroup[g] + str_drc_instruction_str->band_count_of_ch_group[g]; - } - signalIndexForChannel[0] = 0; - for (c=0; c<str_drc_instruction_str->audio_num_chan-1; c++) - { - if (str_drc_instruction_str->channel_group_of_ch[c] >= 0) - { - signalIndexForChannel[c+1] = signalIndexForChannel[c] + str_drc_instruction_str->band_count_of_ch_group[str_drc_instruction_str->channel_group_of_ch[c]]; - } - else - { - signalIndexForChannel[c+1] = signalIndexForChannel[c] + 1; - } - } - - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups; g++) - { - for (b=0; b<str_drc_instruction_str->band_count_of_ch_group[g]; b++) - { - if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { - lpcm_gains = pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]+b].lpcm_gains + MAX_SIGNAL_DELAY - ia_drc_params_struct->gain_delay_samples - ia_drc_params_struct->audio_delay_samples + offset; - } else { - lpcm_gains = pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]+b].lpcm_gains + MAX_SIGNAL_DELAY + str_drc_instruction_str->parametric_drc_look_ahead_samples[g] - ia_drc_params_struct->audio_delay_samples; - } - iEnd = 0; - iStart = 0; - while (iEnd < ia_drc_params_struct->drc_frame_size) - { - if (shape_filter_block[g].shape_flter_block_flag) { - drc_gain_last = shape_filter_block[g].drc_gain_last; - gainThr = 0.0001f * drc_gain_last; - while ((iEnd<ia_drc_params_struct->drc_frame_size) && (fabs(lpcm_gains[iEnd] - drc_gain_last) <= gainThr)) iEnd++; - } - else - { - iEnd = ia_drc_params_struct->drc_frame_size; - } - - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) - - { - if (g == str_drc_instruction_str->channel_group_of_ch[c]) - { - signalIndex = signalIndexForChannel[c] + b; - - if(impd_apply_gains == 1) { - - impd_shape_filt_block_time_process(&shape_filter_block[g], - &lpcm_gains[0], - signalIndex, - &deinterleaved_audio[signalIndex][0], - iStart, - iEnd); - - } - else { - for (i=iStart; i<iEnd; i++){ - deinterleaved_audio[signalIndex][i] = lpcm_gains[i]; - } - } - - - - - } - - + if (str_drc_instruction_str->drc_set_id > 0) { + if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) { + offset = ia_drc_params_struct->drc_frame_size; + } + gainIndexForGroup[0] = 0; + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups - 1; g++) { + gainIndexForGroup[g + 1] = + gainIndexForGroup[g] + + str_drc_instruction_str->band_count_of_ch_group[g]; + } + signalIndexForChannel[0] = 0; + for (c = 0; c < str_drc_instruction_str->audio_num_chan - 1; c++) { + if (str_drc_instruction_str->channel_group_of_ch[c] >= 0) { + signalIndexForChannel[c + 1] = + signalIndexForChannel[c] + + str_drc_instruction_str->band_count_of_ch_group + [str_drc_instruction_str->channel_group_of_ch[c]]; + } else { + signalIndexForChannel[c + 1] = signalIndexForChannel[c] + 1; + } + } + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { + for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g]; + b++) { + if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { + lpcm_gains = + pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b] + .lpcm_gains + + MAX_SIGNAL_DELAY - ia_drc_params_struct->gain_delay_samples - + ia_drc_params_struct->audio_delay_samples + offset; + } else { + lpcm_gains = + pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b] + .lpcm_gains + + MAX_SIGNAL_DELAY + + str_drc_instruction_str + ->parametric_drc_look_ahead_samples[g] - + ia_drc_params_struct->audio_delay_samples; + } + iEnd = 0; + iStart = 0; + while (iEnd < ia_drc_params_struct->drc_frame_size) { + if (shape_filter_block[g].shape_flter_block_flag) { + drc_gain_last = shape_filter_block[g].drc_gain_last; + gainThr = 0.0001f * drc_gain_last; + while ((iEnd < ia_drc_params_struct->drc_frame_size) && + (fabs(lpcm_gains[iEnd] - drc_gain_last) <= gainThr)) + iEnd++; + } else { + iEnd = ia_drc_params_struct->drc_frame_size; + } + + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) + + { + if (g == str_drc_instruction_str->channel_group_of_ch[c]) { + signalIndex = signalIndexForChannel[c] + b; + + if (impd_apply_gains == 1) { + impd_shape_filt_block_time_process( + &shape_filter_block[g], &lpcm_gains[0], signalIndex, + &deinterleaved_audio[signalIndex][0], iStart, iEnd); + + } else { + for (i = iStart; i < iEnd; i++) { + deinterleaved_audio[signalIndex][i] = lpcm_gains[i]; } - if ((iEnd < ia_drc_params_struct->drc_frame_size) && (shape_filter_block[g].shape_flter_block_flag)) - { - impd_shape_filt_block_adapt(lpcm_gains[iEnd], &shape_filter_block[g]); - } - iStart = iEnd; - } - } + } } + } + if ((iEnd < ia_drc_params_struct->drc_frame_size) && + (shape_filter_block[g].shape_flter_block_flag)) { + impd_shape_filt_block_adapt(lpcm_gains[iEnd], + &shape_filter_block[g]); + } + iStart = iEnd; } + } } + } } + } -signalIndex=0; - -if (str_drc_instruction_str->drc_set_id > 0) - { - - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) + signalIndex = 0; - { - g = str_drc_instruction_str->channel_group_of_ch[c]; - if (g>=0) - { - for (i=0; i<ia_drc_params_struct->drc_frame_size; i++) - { - sum = 0.0f; - for (b=0; b<str_drc_instruction_str->band_count_of_ch_group[g]; b++) - { - sum += deinterleaved_audio[signalIndex+b][i]; - } + if (str_drc_instruction_str->drc_set_id > 0) { + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) - channel_audio[c][i] = sum; - - } - signalIndex += str_drc_instruction_str->band_count_of_ch_group[g]; - } - else - { - for (i=0; i<ia_drc_params_struct->drc_frame_size; i++) - { - channel_audio[c][i] = deinterleaved_audio[signalIndex][i]; - } - signalIndex++; - } - } - } - else { - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) - - { - for (i=0; i<ia_drc_params_struct->drc_frame_size; i++) - { - channel_audio[c][i] = deinterleaved_audio[c][i]; - } + g = str_drc_instruction_str->channel_group_of_ch[c]; + if (g >= 0) { + for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) { + sum = 0.0f; + for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g]; + b++) { + sum += deinterleaved_audio[signalIndex + b][i]; + } + + channel_audio[c][i] = sum; + } + signalIndex += str_drc_instruction_str->band_count_of_ch_group[g]; + } else { + for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) { + channel_audio[c][i] = deinterleaved_audio[signalIndex][i]; } + signalIndex++; + } } + } else { + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) + { + for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) { + channel_audio[c][i] = deinterleaved_audio[c][i]; + } + } + } - - - - - - - - - - - - - - return (0); + return (0); } - - - - - /* subband-domain DRC: in-place application of DRC gains to audio frame */ WORD32 - impd_apply_gains_subband(ia_drc_instructions_struct* pstr_drc_instruction_arr, - const WORD32 drc_instructions_index, - ia_drc_params_struct* ia_drc_params_struct, - ia_gain_buffer_struct* pstr_gain_buf, - ia_overlap_params_struct* pstr_overlap_params, - FLOAT32* deinterleaved_audio_delayed_re[], - FLOAT32* deinterleaved_audio_delayed_im[], - FLOAT32* deinterleaved_audio_re[], - FLOAT32* deinterleaved_audio_im[]) -{ - WORD32 c, b, g, m, s; - WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX]; - FLOAT32* lpcm_gains; - FLOAT32 gainSb, gainLr; - ia_drc_instructions_struct* str_drc_instruction_str; - WORD32 offset = 0, signalIndex = 0; - WORD32 drc_frame_sizeSb = 0; - WORD32 nDecoderSubbands = 0; - WORD32 L = 0; /* L: downsampling factor */ - WORD32 analysisDelay = 0; - switch (ia_drc_params_struct->sub_band_domain_mode) { - case SUBBAND_DOMAIN_MODE_QMF64: - nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF64; - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF64; - break; - case SUBBAND_DOMAIN_MODE_QMF71: - nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF71; - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; - analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF71; - break; - case SUBBAND_DOMAIN_MODE_STFT256: - nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_STFT256; - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; - analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_STFT256; - break; - default: - return -1; - break; - } - drc_frame_sizeSb = ia_drc_params_struct->drc_frame_size/L; - - if (drc_instructions_index >= 0) +impd_apply_gains_subband(ia_drc_instructions_struct* pstr_drc_instruction_arr, + const WORD32 drc_instructions_index, + ia_drc_params_struct* ia_drc_params_struct, + ia_gain_buffer_struct* pstr_gain_buf, + ia_overlap_params_struct* pstr_overlap_params, + FLOAT32* deinterleaved_audio_delayed_re[], + FLOAT32* deinterleaved_audio_delayed_im[], + FLOAT32* deinterleaved_audio_re[], + FLOAT32* deinterleaved_audio_im[]) { + WORD32 c, b, g, m, s; + WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX]; + FLOAT32* lpcm_gains; + FLOAT32 gainSb, gainLr; + ia_drc_instructions_struct* str_drc_instruction_str; + WORD32 offset = 0, signalIndex = 0; + WORD32 drc_frame_sizeSb = 0; + WORD32 nDecoderSubbands = 0; + WORD32 L = 0; /* L: downsampling factor */ + WORD32 analysisDelay = 0; + switch (ia_drc_params_struct->sub_band_domain_mode) { + case SUBBAND_DOMAIN_MODE_QMF64: + nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF64; + L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; + analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF64; + break; + case SUBBAND_DOMAIN_MODE_QMF71: + nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF71; + L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; + analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF71; + break; + case SUBBAND_DOMAIN_MODE_STFT256: + nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_STFT256; + L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; + analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_STFT256; + break; + default: + return -1; + break; + } + drc_frame_sizeSb = ia_drc_params_struct->drc_frame_size / L; + + if (drc_instructions_index >= 0) { + str_drc_instruction_str = + &(pstr_drc_instruction_arr[drc_instructions_index]); { - str_drc_instruction_str = &(pstr_drc_instruction_arr[drc_instructions_index]); - { - if (str_drc_instruction_str->drc_set_id > 0) - { - if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) - { - offset = ia_drc_params_struct->drc_frame_size; - } - gainIndexForGroup[0] = 0; - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups-1; g++) - { - gainIndexForGroup[g+1] = gainIndexForGroup[g] + str_drc_instruction_str->band_count_of_ch_group[g]; /* index of first gain sequence in channel group */ - } + if (str_drc_instruction_str->drc_set_id > 0) { + if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) { + offset = ia_drc_params_struct->drc_frame_size; + } + gainIndexForGroup[0] = 0; + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups - 1; g++) { + gainIndexForGroup[g + 1] = + gainIndexForGroup[g] + + str_drc_instruction_str + ->band_count_of_ch_group[g]; /* index of first gain sequence + in channel group */ + } + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) - - { - g = str_drc_instruction_str->channel_group_of_ch[c]; - if (g>=0) - { - for (m=0; m<drc_frame_sizeSb; m++) - { - if (str_drc_instruction_str->band_count_of_ch_group[g] > 1) - { /* multiband DRC */ - for (s=0; s<nDecoderSubbands; s++) - { - gainSb = 0.0f; - for (b=0; b<str_drc_instruction_str->band_count_of_ch_group[g]; b++) - { - if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { - lpcm_gains = pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]+b].lpcm_gains + MAX_SIGNAL_DELAY - ia_drc_params_struct->gain_delay_samples - ia_drc_params_struct->audio_delay_samples + offset; - } else { - lpcm_gains = pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]+b].lpcm_gains + MAX_SIGNAL_DELAY + str_drc_instruction_str->parametric_drc_look_ahead_samples[g] - ia_drc_params_struct->audio_delay_samples + analysisDelay; - } - /* get gain for this timeslot by downsampling */ - gainLr = lpcm_gains[(m*L+(L-1)/2)]; - gainSb += pstr_overlap_params->str_group_overlap_params[g].str_band_overlap_params[b].overlap_weight[s] * gainLr; - } - deinterleaved_audio_re[signalIndex][m*nDecoderSubbands+s] = gainSb * deinterleaved_audio_delayed_re[signalIndex][m*nDecoderSubbands+s]; - if (ia_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_STFT256) { /* For STFT filterbank, the real value of the nyquist band is stored at the imag value of the first band */ - if (s != 0) - deinterleaved_audio_im[signalIndex][m*nDecoderSubbands+s] = gainSb * deinterleaved_audio_delayed_im[signalIndex][m*nDecoderSubbands+s]; - if (s == (nDecoderSubbands-1)) - deinterleaved_audio_im[signalIndex][m*nDecoderSubbands+0] = gainSb * deinterleaved_audio_delayed_im[signalIndex][m*nDecoderSubbands+0]; - } else { - deinterleaved_audio_im[signalIndex][m*nDecoderSubbands+s] = gainSb * deinterleaved_audio_delayed_im[signalIndex][m*nDecoderSubbands+s]; - } - } - } - else - { /* single-band DRC */ - if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { - lpcm_gains = pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]].lpcm_gains + MAX_SIGNAL_DELAY - ia_drc_params_struct->gain_delay_samples - ia_drc_params_struct->audio_delay_samples + offset; - } else { - lpcm_gains = pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]].lpcm_gains + MAX_SIGNAL_DELAY + str_drc_instruction_str->parametric_drc_look_ahead_samples[g] - ia_drc_params_struct->audio_delay_samples + analysisDelay; - } - /* get gain for this timeslot by downsampling */ - gainSb = lpcm_gains[(m*L+(L-1)/2)]; - for (s=0; s<nDecoderSubbands; s++) - { - deinterleaved_audio_re[signalIndex][m*nDecoderSubbands+s] = gainSb * deinterleaved_audio_delayed_re[signalIndex][m*nDecoderSubbands+s]; - deinterleaved_audio_im[signalIndex][m*nDecoderSubbands+s] = gainSb * deinterleaved_audio_delayed_im[signalIndex][m*nDecoderSubbands+s]; - } - } - } + { + g = str_drc_instruction_str->channel_group_of_ch[c]; + if (g >= 0) { + for (m = 0; m < drc_frame_sizeSb; m++) { + if (str_drc_instruction_str->band_count_of_ch_group[g] > + 1) { /* multiband DRC */ + for (s = 0; s < nDecoderSubbands; s++) { + gainSb = 0.0f; + for (b = 0; + b < str_drc_instruction_str->band_count_of_ch_group[g]; + b++) { + if (str_drc_instruction_str + ->ch_group_parametric_drc_flag[g] == 0) { + lpcm_gains = + pstr_gain_buf + ->buf_interpolation[gainIndexForGroup[g] + b] + .lpcm_gains + + MAX_SIGNAL_DELAY - + ia_drc_params_struct->gain_delay_samples - + ia_drc_params_struct->audio_delay_samples + offset; + } else { + lpcm_gains = + pstr_gain_buf + ->buf_interpolation[gainIndexForGroup[g] + b] + .lpcm_gains + + MAX_SIGNAL_DELAY + + str_drc_instruction_str + ->parametric_drc_look_ahead_samples[g] - + ia_drc_params_struct->audio_delay_samples + + analysisDelay; } - signalIndex++; + /* get gain for this timeslot by downsampling */ + gainLr = lpcm_gains[(m * L + (L - 1) / 2)]; + gainSb += pstr_overlap_params->str_group_overlap_params[g] + .str_band_overlap_params[b] + .overlap_weight[s] * + gainLr; + } + deinterleaved_audio_re[signalIndex][m * nDecoderSubbands + + s] = + gainSb * + deinterleaved_audio_delayed_re[signalIndex] + [m * nDecoderSubbands + s]; + if (ia_drc_params_struct->sub_band_domain_mode == + SUBBAND_DOMAIN_MODE_STFT256) { /* For STFT filterbank, the + real value of the + nyquist band is stored + at the imag value of the + first band */ + if (s != 0) + deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + + s] = + gainSb * + deinterleaved_audio_delayed_im[signalIndex] + [m * nDecoderSubbands + + s]; + if (s == (nDecoderSubbands - 1)) + deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + + 0] = + gainSb * + deinterleaved_audio_delayed_im[signalIndex] + [m * nDecoderSubbands + + 0]; + } else { + deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + + s] = + gainSb * + deinterleaved_audio_delayed_im[signalIndex] + [m * nDecoderSubbands + + s]; + } } + } else { /* single-band DRC */ + if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == + 0) { + lpcm_gains = + pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]] + .lpcm_gains + + MAX_SIGNAL_DELAY - + ia_drc_params_struct->gain_delay_samples - + ia_drc_params_struct->audio_delay_samples + offset; + } else { + lpcm_gains = + pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]] + .lpcm_gains + + MAX_SIGNAL_DELAY + + str_drc_instruction_str + ->parametric_drc_look_ahead_samples[g] - + ia_drc_params_struct->audio_delay_samples + analysisDelay; + } + /* get gain for this timeslot by downsampling */ + gainSb = lpcm_gains[(m * L + (L - 1) / 2)]; + for (s = 0; s < nDecoderSubbands; s++) { + deinterleaved_audio_re[signalIndex][m * nDecoderSubbands + + s] = + gainSb * + deinterleaved_audio_delayed_re[signalIndex] + [m * nDecoderSubbands + s]; + deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + + s] = + gainSb * + deinterleaved_audio_delayed_im[signalIndex] + [m * nDecoderSubbands + s]; + } + } } + } + signalIndex++; } + } } - return (0); + } + return (0); } WORD32 impd_filter_banks_process(ia_drc_instructions_struct* pstr_drc_instruction_arr, - const WORD32 drc_instructions_index, - ia_drc_params_struct* ia_drc_params_struct, - FLOAT32* audio_io_buf[], - ia_audio_band_buffer_struct* audio_band_buffer, - ia_filter_banks_struct* ia_filter_banks_struct, - const WORD32 passThru) -{ - WORD32 c, g, e, i, num_bands; - //WORD32 err = 0; - FLOAT32* audio_in; - FLOAT32** audio_out; - ia_drc_filter_bank_struct* str_drc_filter_bank; - ia_drc_instructions_struct* str_drc_instruction_str; - WORD32 drc_frame_size = ia_drc_params_struct->drc_frame_size; - - if (drc_instructions_index >= 0) { - str_drc_instruction_str = &(pstr_drc_instruction_arr[drc_instructions_index]); - } else { - return -1; - } - - e=0; - - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) - - { - str_drc_filter_bank = NULL; - - audio_in = audio_io_buf[c]; - - audio_out = &(audio_band_buffer->non_interleaved_audio[e]); - if ((passThru == 0) && (drc_instructions_index >= 0)) - { - if (str_drc_instruction_str->drc_set_id < 0) - { - num_bands = 1; - } - else - { - g = str_drc_instruction_str->channel_group_of_ch[c]; - if (g== -1) - { - num_bands = 1; - //if (ia_filter_banks_struct->str_drc_filter_bank != NULL) - //{ - str_drc_filter_bank = &(ia_filter_banks_struct->str_drc_filter_bank[str_drc_instruction_str->num_drc_ch_groups]); - //} - } - else - { - num_bands = str_drc_instruction_str->band_count_of_ch_group[g]; - //if (ia_filter_banks_struct->str_drc_filter_bank != NULL) - //{ - str_drc_filter_bank = &(ia_filter_banks_struct->str_drc_filter_bank[g]); - //} - } - //if (ia_filter_banks_struct->str_drc_filter_bank != NULL) - //{ - //if (&str_drc_filter_bank->str_all_pass_cascade != NULL) - //{ - impd_all_pass_cascade_process(&str_drc_filter_bank->str_all_pass_cascade, c, drc_frame_size, audio_in); - //} - //} - } - } - else - { - num_bands = 1; + const WORD32 drc_instructions_index, + ia_drc_params_struct* ia_drc_params_struct, + FLOAT32* audio_io_buf[], + ia_audio_band_buffer_struct* audio_band_buffer, + ia_filter_banks_struct* ia_filter_banks_struct, + const WORD32 passThru) { + WORD32 c, g, e, i, num_bands; + // WORD32 err = 0; + FLOAT32* audio_in; + FLOAT32** audio_out; + ia_drc_filter_bank_struct* str_drc_filter_bank; + ia_drc_instructions_struct* str_drc_instruction_str; + WORD32 drc_frame_size = ia_drc_params_struct->drc_frame_size; + + if (drc_instructions_index >= 0) { + str_drc_instruction_str = + &(pstr_drc_instruction_arr[drc_instructions_index]); + } else { + return -1; + } + + e = 0; + + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) + + { + str_drc_filter_bank = NULL; + + audio_in = audio_io_buf[c]; + + audio_out = &(audio_band_buffer->non_interleaved_audio[e]); + if ((passThru == 0) && (drc_instructions_index >= 0)) { + if (str_drc_instruction_str->drc_set_id < 0) { + num_bands = 1; + } else { + g = str_drc_instruction_str->channel_group_of_ch[c]; + if (g == -1) { + num_bands = 1; + // if (ia_filter_banks_struct->str_drc_filter_bank != NULL) + //{ + str_drc_filter_bank = + &(ia_filter_banks_struct->str_drc_filter_bank + [str_drc_instruction_str->num_drc_ch_groups]); + //} + } else { + num_bands = str_drc_instruction_str->band_count_of_ch_group[g]; + // if (ia_filter_banks_struct->str_drc_filter_bank != NULL) + //{ + str_drc_filter_bank = + &(ia_filter_banks_struct->str_drc_filter_bank[g]); + //} } - switch (num_bands) { - case 1: - for (i=0; i<drc_frame_size; i++) - { - audio_out[0][i] = audio_in[i]; - } - e++; - break; - case 2: - impd_two_band_filter_process(&str_drc_filter_bank->str_two_band_bank, - c, - drc_frame_size, - audio_in, - audio_out); - e+=2; - break; - case 3: - impd_three_band_filter_process(&str_drc_filter_bank->str_three_band_bank, - c, - drc_frame_size, - audio_in, - audio_out); - e+=3; - break; - case 4: - impd_four_band_filter_process(&str_drc_filter_bank->str_four_band_bank, - c, - drc_frame_size, - audio_in, - audio_out); - e+=4; - break; - default: - return (PARAM_ERROR); - break; + // if (ia_filter_banks_struct->str_drc_filter_bank != NULL) + //{ + // if (&str_drc_filter_bank->str_all_pass_cascade != NULL) + //{ + impd_all_pass_cascade_process( + &str_drc_filter_bank->str_all_pass_cascade, c, drc_frame_size, + audio_in); + //} + //} + } + } else { + num_bands = 1; + } + switch (num_bands) { + case 1: + for (i = 0; i < drc_frame_size; i++) { + audio_out[0][i] = audio_in[i]; } + e++; + break; + case 2: + impd_two_band_filter_process(&str_drc_filter_bank->str_two_band_bank, c, + drc_frame_size, audio_in, audio_out); + e += 2; + break; + case 3: + impd_three_band_filter_process( + &str_drc_filter_bank->str_three_band_bank, c, drc_frame_size, + audio_in, audio_out); + e += 3; + break; + case 4: + impd_four_band_filter_process(&str_drc_filter_bank->str_four_band_bank, + c, drc_frame_size, audio_in, audio_out); + e += 4; + break; + default: + return (PARAM_ERROR); + break; } + } - return (0); + return (0); } - - WORD32 -impd_store_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], - ia_audio_in_out_buf* audio_io_buf_internal) -{ - WORD32 i,j; - - if (audio_io_buf_internal->audio_delay_samples) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - for (j=0; j<audio_io_buf_internal->frame_size; j++) { - audio_io_buf_internal->audio_io_buffer_delayed[i][audio_io_buf_internal->audio_delay_samples+j] = audio_in_out_buf[i][j]; - } - } - } else { - audio_io_buf_internal->audio_io_buffer_delayed = audio_in_out_buf; - audio_io_buf_internal->audio_in_out_buf = audio_in_out_buf; +impd_store_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], + ia_audio_in_out_buf* audio_io_buf_internal) { + WORD32 i, j; + + if (audio_io_buf_internal->audio_delay_samples) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + for (j = 0; j < audio_io_buf_internal->frame_size; j++) { + audio_io_buf_internal->audio_io_buffer_delayed + [i][audio_io_buf_internal->audio_delay_samples + j] = + audio_in_out_buf[i][j]; + } } + } else { + audio_io_buf_internal->audio_io_buffer_delayed = audio_in_out_buf; + audio_io_buf_internal->audio_in_out_buf = audio_in_out_buf; + } - return 0; + return 0; } WORD32 -impd_store_audio_io_buffer_freq(FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_audio_in_out_buf* audio_io_buf_internal) -{ - WORD32 i,j; - - if (audio_io_buf_internal->audio_delay_sub_band_samples) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - for (j=0; j<audio_io_buf_internal->audio_sub_band_frame_size*audio_io_buf_internal->audio_sub_band_count; j++) { - audio_io_buf_internal->audio_buffer_delayed_real[i][audio_io_buf_internal->audio_delay_sub_band_samples*audio_io_buf_internal->audio_sub_band_count+j] = audio_real_buff[i][j]; - audio_io_buf_internal->audio_buffer_delayed_imag[i][audio_io_buf_internal->audio_delay_sub_band_samples*audio_io_buf_internal->audio_sub_band_count+j] = audio_imag_buff[i][j]; - } - } - } else { - audio_io_buf_internal->audio_buffer_delayed_real = audio_real_buff; - audio_io_buf_internal->audio_buffer_delayed_imag = audio_imag_buff; - audio_io_buf_internal->audio_real_buff = audio_real_buff; - audio_io_buf_internal->audio_imag_buff = audio_imag_buff; +impd_store_audio_io_buffer_freq(FLOAT32* audio_real_buff[], + FLOAT32* audio_imag_buff[], + ia_audio_in_out_buf* audio_io_buf_internal) { + WORD32 i, j; + + if (audio_io_buf_internal->audio_delay_sub_band_samples) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + for (j = 0; j < audio_io_buf_internal->audio_sub_band_frame_size * + audio_io_buf_internal->audio_sub_band_count; + j++) { + audio_io_buf_internal->audio_buffer_delayed_real + [i][audio_io_buf_internal->audio_delay_sub_band_samples * + audio_io_buf_internal->audio_sub_band_count + + j] = audio_real_buff[i][j]; + audio_io_buf_internal->audio_buffer_delayed_imag + [i][audio_io_buf_internal->audio_delay_sub_band_samples * + audio_io_buf_internal->audio_sub_band_count + + j] = audio_imag_buff[i][j]; + } } - - return 0; + } else { + audio_io_buf_internal->audio_buffer_delayed_real = audio_real_buff; + audio_io_buf_internal->audio_buffer_delayed_imag = audio_imag_buff; + audio_io_buf_internal->audio_real_buff = audio_real_buff; + audio_io_buf_internal->audio_imag_buff = audio_imag_buff; + } + + return 0; } WORD32 -impd_retrieve_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], - ia_audio_in_out_buf* audio_io_buf_internal) -{ - WORD32 i,j; - - if (audio_io_buf_internal->audio_delay_samples) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - for (j=0; j<audio_io_buf_internal->frame_size; j++) { - audio_in_out_buf[i][j] = audio_io_buf_internal->audio_io_buffer_delayed[i][j]; - } - } +impd_retrieve_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], + ia_audio_in_out_buf* audio_io_buf_internal) { + WORD32 i, j; + + if (audio_io_buf_internal->audio_delay_samples) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + for (j = 0; j < audio_io_buf_internal->frame_size; j++) { + audio_in_out_buf[i][j] = + audio_io_buf_internal->audio_io_buffer_delayed[i][j]; + } } + } - return 0; + return 0; } WORD32 -impd_retrieve_audio_buffer_freq(FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_audio_in_out_buf* audio_io_buf_internal) -{ - WORD32 i,j; - - if (audio_io_buf_internal->audio_delay_sub_band_samples) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - for (j=0; j<audio_io_buf_internal->audio_sub_band_frame_size*audio_io_buf_internal->audio_sub_band_count; j++) { - audio_real_buff[i][j] = audio_io_buf_internal->audio_buffer_delayed_real[i][audio_io_buf_internal->audio_sub_band_count+j]; - audio_imag_buff[i][j] = audio_io_buf_internal->audio_buffer_delayed_imag[i][audio_io_buf_internal->audio_sub_band_count+j]; - } - } +impd_retrieve_audio_buffer_freq(FLOAT32* audio_real_buff[], + FLOAT32* audio_imag_buff[], + ia_audio_in_out_buf* audio_io_buf_internal) { + WORD32 i, j; + + if (audio_io_buf_internal->audio_delay_sub_band_samples) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + for (j = 0; j < audio_io_buf_internal->audio_sub_band_frame_size * + audio_io_buf_internal->audio_sub_band_count; + j++) { + audio_real_buff[i][j] = + audio_io_buf_internal->audio_buffer_delayed_real + [i][audio_io_buf_internal->audio_sub_band_count + j]; + audio_imag_buff[i][j] = + audio_io_buf_internal->audio_buffer_delayed_imag + [i][audio_io_buf_internal->audio_sub_band_count + j]; + } } + } - return 0; + return 0; } WORD32 -impd_advance_audio_io_buffer_time(ia_audio_in_out_buf* audio_io_buf_internal) -{ - WORD32 i; - if (audio_io_buf_internal->audio_delay_samples) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - memmove(audio_io_buf_internal->audio_io_buffer_delayed[i], &audio_io_buf_internal->audio_io_buffer_delayed[i][audio_io_buf_internal->frame_size],sizeof(FLOAT32) * audio_io_buf_internal->audio_delay_samples); - } +impd_advance_audio_io_buffer_time(ia_audio_in_out_buf* audio_io_buf_internal) { + WORD32 i; + if (audio_io_buf_internal->audio_delay_samples) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + memmove( + audio_io_buf_internal->audio_io_buffer_delayed[i], + &audio_io_buf_internal + ->audio_io_buffer_delayed[i][audio_io_buf_internal->frame_size], + sizeof(FLOAT32) * audio_io_buf_internal->audio_delay_samples); } + } - return 0; + return 0; } WORD32 -impd_advance_audio_buff_freq(ia_audio_in_out_buf* audio_io_buf_internal) -{ - WORD32 i; - if (audio_io_buf_internal->audio_delay_sub_band_samples) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - memmove(audio_io_buf_internal->audio_buffer_delayed_real[i], &audio_io_buf_internal->audio_buffer_delayed_real[i][audio_io_buf_internal->audio_sub_band_frame_size * audio_io_buf_internal->audio_sub_band_count],sizeof(FLOAT32) * audio_io_buf_internal->audio_delay_sub_band_samples * audio_io_buf_internal->audio_sub_band_count); - memmove(audio_io_buf_internal->audio_buffer_delayed_imag[i], &audio_io_buf_internal->audio_buffer_delayed_imag[i][audio_io_buf_internal->audio_sub_band_frame_size * audio_io_buf_internal->audio_sub_band_count],sizeof(FLOAT32) * audio_io_buf_internal->audio_delay_sub_band_samples * audio_io_buf_internal->audio_sub_band_count); - } +impd_advance_audio_buff_freq(ia_audio_in_out_buf* audio_io_buf_internal) { + WORD32 i; + if (audio_io_buf_internal->audio_delay_sub_band_samples) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + memmove(audio_io_buf_internal->audio_buffer_delayed_real[i], + &audio_io_buf_internal->audio_buffer_delayed_real + [i][audio_io_buf_internal->audio_sub_band_frame_size * + audio_io_buf_internal->audio_sub_band_count], + sizeof(FLOAT32) * + audio_io_buf_internal->audio_delay_sub_band_samples * + audio_io_buf_internal->audio_sub_band_count); + memmove(audio_io_buf_internal->audio_buffer_delayed_imag[i], + &audio_io_buf_internal->audio_buffer_delayed_imag + [i][audio_io_buf_internal->audio_sub_band_frame_size * + audio_io_buf_internal->audio_sub_band_count], + sizeof(FLOAT32) * + audio_io_buf_internal->audio_delay_sub_band_samples * + audio_io_buf_internal->audio_sub_band_count); } - return 0; + } + return 0; } - |