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