changeset 12259:97db3c60fb9c libavcodec

aacdec: 4% faster main profile decoding.
author alexc
date Sat, 24 Jul 2010 02:41:47 +0000
parents 86d6c00756cc
children 65619c2230e7
files aacdec.c
diffstat 1 files changed, 7 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/aacdec.c	Sat Jul 24 02:10:59 2010 +0000
+++ b/aacdec.c	Sat Jul 24 02:41:47 2010 +0000
@@ -1231,7 +1231,8 @@
     return pun.f;
 }
 
-static av_always_inline void predict(AACContext *ac, PredictorState *ps, float *coef,
+static av_always_inline void predict(PredictorState *ps, float *coef,
+                                     float sf_scale, float inv_sf_scale,
                     int output_enable)
 {
     const float a     = 0.953125; // 61.0 / 64
@@ -1245,9 +1246,9 @@
 
     pv = flt16_round(k1 * ps->r0 + k2 * ps->r1);
     if (output_enable)
-        *coef += pv * ac->sf_scale;
+        *coef += pv * sf_scale;
 
-    e0 = *coef / ac->sf_scale;
+    e0 = *coef * inv_sf_scale;
     e1 = e0 - k1 * ps->r0;
 
     ps->cor1 = flt16_trunc(alpha * ps->cor1 + ps->r1 * e1);
@@ -1265,6 +1266,7 @@
 static void apply_prediction(AACContext *ac, SingleChannelElement *sce)
 {
     int sfb, k;
+    float sf_scale = ac->sf_scale, inv_sf_scale = 1 / ac->sf_scale;
 
     if (!sce->ics.predictor_initialized) {
         reset_all_predictors(sce->predictor_state);
@@ -1274,7 +1276,8 @@
     if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
         for (sfb = 0; sfb < ff_aac_pred_sfb_max[ac->m4ac.sampling_index]; sfb++) {
             for (k = sce->ics.swb_offset[sfb]; k < sce->ics.swb_offset[sfb + 1]; k++) {
-                predict(ac, &sce->predictor_state[k], &sce->coeffs[k],
+                predict(&sce->predictor_state[k], &sce->coeffs[k],
+                        sf_scale, inv_sf_scale,
                         sce->ics.predictor_present && sce->ics.prediction_used[sfb]);
             }
         }