Mercurial > libavcodec.hg
changeset 11667:6818ea5a25a2 libavcodec
Rewrite ff_sbr_apply in a manner more friendly to PS.
This includes merging ff_sbr_dequant into ff_sbr_apply.
author | alexc |
---|---|
date | Fri, 30 Apr 2010 21:43:23 +0000 |
parents | 1c6d78234e67 |
children | db33423d99ac |
files | aac.c aacsbr.c aacsbr.h |
diffstat | 3 files changed, 25 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/aac.c Fri Apr 30 21:30:27 2010 +0000 +++ b/aac.c Fri Apr 30 21:43:23 2010 +0000 @@ -1892,15 +1892,12 @@ apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, apply_dependent_coupling); if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) { imdct_and_windowing(ac, &che->ch[0], imdct_bias); - if (ac->m4ac.sbr > 0) { - ff_sbr_dequant(ac, &che->sbr, type == TYPE_CPE ? TYPE_CPE : TYPE_SCE); - ff_sbr_apply(ac, &che->sbr, 0, che->ch[0].ret, che->ch[0].ret); - } - } if (type == TYPE_CPE) { imdct_and_windowing(ac, &che->ch[1], imdct_bias); - if (ac->m4ac.sbr > 0) - ff_sbr_apply(ac, &che->sbr, 1, che->ch[1].ret, che->ch[1].ret); + } + if (ac->m4ac.sbr > 0) { + ff_sbr_apply(ac, &che->sbr, type, che->ch[0].ret, che->ch[1].ret); + } } if (type <= TYPE_CCE) apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling);
--- a/aacsbr.c Fri Apr 30 21:30:27 2010 +0000 +++ b/aacsbr.c Fri Apr 30 21:43:23 2010 +0000 @@ -1709,20 +1709,19 @@ ch_data->f_indexsine = indexsine; } -void ff_sbr_dequant(AACContext *ac, SpectralBandReplication *sbr, int id_aac) +void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac, + float* L, float* R) { + int downsampled = ac->m4ac.ext_sample_rate < sbr->sample_rate; + int ch; + int nch = (id_aac == TYPE_CPE) ? 2 : 1; + if (sbr->start) { sbr_dequant(sbr, id_aac); } -} - -void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int ch, - const float* in, float* out) -{ - int downsampled = ac->m4ac.ext_sample_rate < sbr->sample_rate; - + for (ch = 0; ch < nch; ch++) { /* decode channel */ - sbr_qmf_analysis(&ac->dsp, &sbr->rdft, in, sbr->data[ch].analysis_filterbank_samples, + sbr_qmf_analysis(&ac->dsp, &sbr->rdft, ch ? R : L, sbr->data[ch].analysis_filterbank_samples, (float*)sbr->qmf_filter_scratch, sbr->data[ch].W, 1/(-1024 * ac->sf_scale)); sbr_lf_gen(ac, sbr, sbr->X_low, sbr->data[ch].W); @@ -1743,9 +1742,16 @@ /* synthesis */ sbr_x_gen(sbr, sbr->X, sbr->X_low, sbr->data[ch].Y, ch); - sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, out, sbr->X, sbr->qmf_filter_scratch, - sbr->data[ch].synthesis_filterbank_samples, - &sbr->data[ch].synthesis_filterbank_samples_offset, + } + sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X, sbr->qmf_filter_scratch, + sbr->data[0].synthesis_filterbank_samples, + &sbr->data[0].synthesis_filterbank_samples_offset, downsampled, ac->add_bias, -1024 * ac->sf_scale); + if (nch == 2) + sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, R, sbr->X, sbr->qmf_filter_scratch, + sbr->data[1].synthesis_filterbank_samples, + &sbr->data[1].synthesis_filterbank_samples_offset, + downsampled, + ac->add_bias, -1024 * ac->sf_scale); }
--- a/aacsbr.h Fri Apr 30 21:30:27 2010 +0000 +++ b/aacsbr.h Fri Apr 30 21:43:23 2010 +0000 @@ -42,10 +42,8 @@ /** Decode one SBR element. */ int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, int crc, int cnt, int id_aac); -/** Dequantized all channels in one SBR element. */ -void ff_sbr_dequant(AACContext *ac, SpectralBandReplication *sbr, int id_aac); -/** Apply dequantized SBR to a single AAC channel. */ -void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int ch, - const float* in, float* out); +/** Apply one SBR element to one AAC element. */ +void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac, + float* L, float *R); #endif /* AVCODEC_AACSBR_H */