[FFmpeg-cvslog] aacdec: move prediction to separate files

Lynne git at videolan.org
Tue Apr 23 09:58:56 EEST 2024


ffmpeg | branch: master | Lynne <dev at lynne.ee> | Sat Mar 16 05:16:50 2024 +0100| [49e7be1e370a52d5ad2bc52830a2448384b5a58c] | committer: Lynne

aacdec: move prediction to separate files

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=49e7be1e370a52d5ad2bc52830a2448384b5a58c
---

 libavcodec/aac/aacdec_dsp_template.c     |  48 ++++++++++
 libavcodec/aac/aacdec_fixed.c            |   1 +
 libavcodec/aac/aacdec_fixed_prediction.h | 151 +++++++++++++++++++++++++++++++
 libavcodec/aac/aacdec_float.c            |   1 +
 libavcodec/aac/aacdec_float_prediction.h | 100 ++++++++++++++++++++
 libavcodec/aacdec.c                      |  65 -------------
 libavcodec/aacdec.h                      |   2 +
 libavcodec/aacdec_fixed.c                | 116 ------------------------
 libavcodec/aacdec_template.c             |  52 +----------
 9 files changed, 306 insertions(+), 230 deletions(-)

diff --git a/libavcodec/aac/aacdec_dsp_template.c b/libavcodec/aac/aacdec_dsp_template.c
index adcafa10e7..338e512ed2 100644
--- a/libavcodec/aac/aacdec_dsp_template.c
+++ b/libavcodec/aac/aacdec_dsp_template.c
@@ -569,6 +569,52 @@ static void AAC_RENAME(clip_output)(AACDecContext *ac, ChannelElement *che,
 #endif
 }
 
+static inline void reset_all_predictors(PredictorState *ps)
+{
+    int i;
+    for (i = 0; i < MAX_PREDICTORS; i++)
+        reset_predict_state(&ps[i]);
+}
+
+static inline void reset_predictor_group(PredictorState *ps, int group_num)
+{
+    int i;
+    for (i = group_num - 1; i < MAX_PREDICTORS; i += 30)
+        reset_predict_state(&ps[i]);
+}
+
+/**
+ * Apply AAC-Main style frequency domain prediction.
+ */
+static void AAC_RENAME(apply_prediction)(AACDecContext *ac, SingleChannelElement *sce)
+{
+    int sfb, k;
+
+    if (!sce->ics.predictor_initialized) {
+        reset_all_predictors(sce->AAC_RENAME(predictor_state));
+        sce->ics.predictor_initialized = 1;
+    }
+
+    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
+        for (sfb = 0;
+             sfb < ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index];
+             sfb++) {
+            for (k = sce->ics.swb_offset[sfb];
+                 k < sce->ics.swb_offset[sfb + 1];
+                 k++) {
+                predict(&sce->AAC_RENAME(predictor_state)[k],
+                        &sce->AAC_RENAME(coeffs)[k],
+                        sce->ics.predictor_present &&
+                        sce->ics.prediction_used[sfb]);
+            }
+        }
+        if (sce->ics.predictor_reset_group)
+            reset_predictor_group(sce->AAC_RENAME(predictor_state),
+                                  sce->ics.predictor_reset_group);
+    } else
+        reset_all_predictors(sce->AAC_RENAME(predictor_state));
+}
+
 const AACDecDSP AAC_RENAME(aac_dsp) = {
     .init_tables = &AAC_RENAME(init_tables),
 
@@ -579,6 +625,8 @@ const AACDecDSP AAC_RENAME(aac_dsp) = {
     .apply_ltp = &AAC_RENAME(apply_ltp),
     .update_ltp = &AAC_RENAME(update_ltp),
 
+    .apply_prediction = AAC_RENAME(apply_prediction),
+
     .imdct_and_windowing = AAC_RENAME(imdct_and_windowing),
     .imdct_and_windowing_960 = AAC_RENAME(imdct_and_windowing_960),
     .imdct_and_windowing_ld = AAC_RENAME(imdct_and_windowing_ld),
diff --git a/libavcodec/aac/aacdec_fixed.c b/libavcodec/aac/aacdec_fixed.c
index dc3e8eaab6..41f25d8148 100644
--- a/libavcodec/aac/aacdec_fixed.c
+++ b/libavcodec/aac/aacdec_fixed.c
@@ -79,5 +79,6 @@ static const int cce_scale_fixed[8] = {
 #include "aacdec_fixed_dequant.h"
 
 #include "aacdec_fixed_coupling.h"
+#include "aacdec_fixed_prediction.h"
 #include "aacdec_dsp_template.c"
 #include "aacdec_proc_template.c"
diff --git a/libavcodec/aac/aacdec_fixed_prediction.h b/libavcodec/aac/aacdec_fixed_prediction.h
new file mode 100644
index 0000000000..6fb3354865
--- /dev/null
+++ b/libavcodec/aac/aacdec_fixed_prediction.h
@@ -0,0 +1,151 @@
+/*
+ * AAC decoder
+ * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
+ * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
+ * Copyright (c) 2008-2013 Alex Converse <alex.converse at gmail.com>
+ *
+ * AAC LATM decoder
+ * Copyright (c) 2008-2010 Paul Kendall <paul at kcbbs.gen.nz>
+ * Copyright (c) 2010      Janne Grunau <janne-libav at jannau.net>
+ *
+ * AAC decoder fixed-point implementation
+ * Copyright (c) 2013
+ *      MIPS Technologies, Inc., California.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AAC_AACDEC_FIXED_PREDICTION_H
+#define AVCODEC_AAC_AACDEC_FIXED_PREDICTION_H
+
+static av_always_inline SoftFloat flt16_round(SoftFloat pf)
+{
+    SoftFloat tmp;
+    int s;
+
+    tmp.exp = pf.exp;
+    s = pf.mant >> 31;
+    tmp.mant = (pf.mant ^ s) - s;
+    tmp.mant = (tmp.mant + 0x00200000U) & 0xFFC00000U;
+    tmp.mant = (tmp.mant ^ s) - s;
+
+    return tmp;
+}
+
+static av_always_inline SoftFloat flt16_even(SoftFloat pf)
+{
+    SoftFloat tmp;
+    int s;
+
+    tmp.exp = pf.exp;
+    s = pf.mant >> 31;
+    tmp.mant = (pf.mant ^ s) - s;
+    tmp.mant = (tmp.mant + 0x001FFFFFU + (tmp.mant & 0x00400000U >> 16)) & 0xFFC00000U;
+    tmp.mant = (tmp.mant ^ s) - s;
+
+    return tmp;
+}
+
+static av_always_inline SoftFloat flt16_trunc(SoftFloat pf)
+{
+    SoftFloat pun;
+    int s;
+
+    pun.exp = pf.exp;
+    s = pf.mant >> 31;
+    pun.mant = (pf.mant ^ s) - s;
+    pun.mant = pun.mant & 0xFFC00000U;
+    pun.mant = (pun.mant ^ s) - s;
+
+    return pun;
+}
+
+static av_always_inline void predict(PredictorState *ps, int *coef,
+                                     int output_enable)
+{
+    const SoftFloat a     = { 1023410176, 0 };  // 61.0 / 64
+    const SoftFloat alpha = {  973078528, 0 };  // 29.0 / 32
+    SoftFloat e0, e1;
+    SoftFloat pv;
+    SoftFloat k1, k2;
+    SoftFloat   r0 = ps->r0,     r1 = ps->r1;
+    SoftFloat cor0 = ps->cor0, cor1 = ps->cor1;
+    SoftFloat var0 = ps->var0, var1 = ps->var1;
+    SoftFloat tmp;
+
+    if (var0.exp > 1 || (var0.exp == 1 && var0.mant > 0x20000000)) {
+        k1 = av_mul_sf(cor0, flt16_even(av_div_sf(a, var0)));
+    }
+    else {
+        k1.mant = 0;
+        k1.exp = 0;
+    }
+
+    if (var1.exp > 1 || (var1.exp == 1 && var1.mant > 0x20000000)) {
+        k2 = av_mul_sf(cor1, flt16_even(av_div_sf(a, var1)));
+    }
+    else {
+        k2.mant = 0;
+        k2.exp = 0;
+    }
+
+    tmp = av_mul_sf(k1, r0);
+    pv = flt16_round(av_add_sf(tmp, av_mul_sf(k2, r1)));
+    if (output_enable) {
+        int shift = 28 - pv.exp;
+
+        if (shift < 31) {
+            if (shift > 0) {
+                *coef += (unsigned)((pv.mant + (1 << (shift - 1))) >> shift);
+            } else
+                *coef += (unsigned)pv.mant << -shift;
+        }
+    }
+
+    e0 = av_int2sf(*coef, 2);
+    e1 = av_sub_sf(e0, tmp);
+
+    ps->cor1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor1), av_mul_sf(r1, e1)));
+    tmp = av_add_sf(av_mul_sf(r1, r1), av_mul_sf(e1, e1));
+    tmp.exp--;
+    ps->var1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var1), tmp));
+    ps->cor0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor0), av_mul_sf(r0, e0)));
+    tmp = av_add_sf(av_mul_sf(r0, r0), av_mul_sf(e0, e0));
+    tmp.exp--;
+    ps->var0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var0), tmp));
+
+    ps->r1 = flt16_trunc(av_mul_sf(a, av_sub_sf(r0, av_mul_sf(k1, e0))));
+    ps->r0 = flt16_trunc(av_mul_sf(a, e0));
+}
+
+static av_always_inline void reset_predict_state(PredictorState *ps)
+{
+    ps->r0.mant   = 0;
+    ps->r0.exp   = 0;
+    ps->r1.mant   = 0;
+    ps->r1.exp   = 0;
+    ps->cor0.mant = 0;
+    ps->cor0.exp = 0;
+    ps->cor1.mant = 0;
+    ps->cor1.exp = 0;
+    ps->var0.mant = 0x20000000;
+    ps->var0.exp = 1;
+    ps->var1.mant = 0x20000000;
+    ps->var1.exp = 1;
+}
+
+#endif /* AVCODEC_AAC_AACDEC_FIXED_PREDICTION_H */
diff --git a/libavcodec/aac/aacdec_float.c b/libavcodec/aac/aacdec_float.c
index bbb4aec0a2..73aaa72f68 100644
--- a/libavcodec/aac/aacdec_float.c
+++ b/libavcodec/aac/aacdec_float.c
@@ -147,5 +147,6 @@ static inline float *VMUL4S(float *dst, const float *v, unsigned idx,
 #endif
 
 #include "aacdec_float_coupling.h"
+#include "aacdec_float_prediction.h"
 #include "aacdec_dsp_template.c"
 #include "aacdec_proc_template.c"
diff --git a/libavcodec/aac/aacdec_float_prediction.h b/libavcodec/aac/aacdec_float_prediction.h
new file mode 100644
index 0000000000..a4100fd36c
--- /dev/null
+++ b/libavcodec/aac/aacdec_float_prediction.h
@@ -0,0 +1,100 @@
+/*
+ * AAC decoder
+ * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
+ * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
+ * Copyright (c) 2008-2013 Alex Converse <alex.converse at gmail.com>
+ *
+ * AAC LATM decoder
+ * Copyright (c) 2008-2010 Paul Kendall <paul at kcbbs.gen.nz>
+ * Copyright (c) 2010      Janne Grunau <janne-libav at jannau.net>
+ *
+ * AAC decoder fixed-point implementation
+ * Copyright (c) 2013
+ *      MIPS Technologies, Inc., California.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AAC_AACDEC_FLOAT_PREDICTION_H
+#define AVCODEC_AAC_AACDEC_FLOAT_PREDICTION_H
+
+static av_always_inline float flt16_round(float pf)
+{
+    union av_intfloat32 tmp;
+    tmp.f = pf;
+    tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U;
+    return tmp.f;
+}
+
+static av_always_inline float flt16_even(float pf)
+{
+    union av_intfloat32 tmp;
+    tmp.f = pf;
+    tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U;
+    return tmp.f;
+}
+
+static av_always_inline float flt16_trunc(float pf)
+{
+    union av_intfloat32 pun;
+    pun.f = pf;
+    pun.i &= 0xFFFF0000U;
+    return pun.f;
+}
+
+static av_always_inline void predict(PredictorState *ps, float *coef,
+                                     int output_enable)
+{
+    const float a     = 0.953125; // 61.0 / 64
+    const float alpha = 0.90625;  // 29.0 / 32
+    float e0, e1;
+    float pv;
+    float k1, k2;
+    float   r0 = ps->r0,     r1 = ps->r1;
+    float cor0 = ps->cor0, cor1 = ps->cor1;
+    float var0 = ps->var0, var1 = ps->var1;
+
+    k1 = var0 > 1 ? cor0 * flt16_even(a / var0) : 0;
+    k2 = var1 > 1 ? cor1 * flt16_even(a / var1) : 0;
+
+    pv = flt16_round(k1 * r0 + k2 * r1);
+    if (output_enable)
+        *coef += pv;
+
+    e0 = *coef;
+    e1 = e0 - k1 * r0;
+
+    ps->cor1 = flt16_trunc(alpha * cor1 + r1 * e1);
+    ps->var1 = flt16_trunc(alpha * var1 + 0.5f * (r1 * r1 + e1 * e1));
+    ps->cor0 = flt16_trunc(alpha * cor0 + r0 * e0);
+    ps->var0 = flt16_trunc(alpha * var0 + 0.5f * (r0 * r0 + e0 * e0));
+
+    ps->r1 = flt16_trunc(a * (r0 - k1 * e0));
+    ps->r0 = flt16_trunc(a * e0);
+}
+
+static av_always_inline void reset_predict_state(PredictorState *ps)
+{
+    ps->r0   = 0.0f;
+    ps->r1   = 0.0f;
+    ps->cor0 = 0.0f;
+    ps->cor1 = 0.0f;
+    ps->var0 = 1.0f;
+    ps->var1 = 1.0f;
+}
+
+#endif /* AVCODEC_AAC_AACDEC_FLOAT_PREDICTION_H */
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index d269b93564..cc2b9bedfb 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -63,71 +63,6 @@
 #   include "mips/aacdec_mips.h"
 #endif
 
-static av_always_inline void reset_predict_state(PredictorState *ps)
-{
-    ps->r0   = 0.0f;
-    ps->r1   = 0.0f;
-    ps->cor0 = 0.0f;
-    ps->cor1 = 0.0f;
-    ps->var0 = 1.0f;
-    ps->var1 = 1.0f;
-}
-
-static av_always_inline float flt16_round(float pf)
-{
-    union av_intfloat32 tmp;
-    tmp.f = pf;
-    tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U;
-    return tmp.f;
-}
-
-static av_always_inline float flt16_even(float pf)
-{
-    union av_intfloat32 tmp;
-    tmp.f = pf;
-    tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U;
-    return tmp.f;
-}
-
-static av_always_inline float flt16_trunc(float pf)
-{
-    union av_intfloat32 pun;
-    pun.f = pf;
-    pun.i &= 0xFFFF0000U;
-    return pun.f;
-}
-
-static av_always_inline void predict(PredictorState *ps, float *coef,
-                                     int output_enable)
-{
-    const float a     = 0.953125; // 61.0 / 64
-    const float alpha = 0.90625;  // 29.0 / 32
-    float e0, e1;
-    float pv;
-    float k1, k2;
-    float   r0 = ps->r0,     r1 = ps->r1;
-    float cor0 = ps->cor0, cor1 = ps->cor1;
-    float var0 = ps->var0, var1 = ps->var1;
-
-    k1 = var0 > 1 ? cor0 * flt16_even(a / var0) : 0;
-    k2 = var1 > 1 ? cor1 * flt16_even(a / var1) : 0;
-
-    pv = flt16_round(k1 * r0 + k2 * r1);
-    if (output_enable)
-        *coef += pv;
-
-    e0 = *coef;
-    e1 = e0 - k1 * r0;
-
-    ps->cor1 = flt16_trunc(alpha * cor1 + r1 * e1);
-    ps->var1 = flt16_trunc(alpha * var1 + 0.5f * (r1 * r1 + e1 * e1));
-    ps->cor0 = flt16_trunc(alpha * cor0 + r0 * e0);
-    ps->var0 = flt16_trunc(alpha * var0 + 0.5f * (r0 * r0 + e0 * e0));
-
-    ps->r1 = flt16_trunc(a * (r0 - k1 * e0));
-    ps->r0 = flt16_trunc(a * e0);
-}
-
 #include "aacdec_template.c"
 
 #define LOAS_SYNC_WORD   0x2b7       ///< 11 bits LOAS sync word
diff --git a/libavcodec/aacdec.h b/libavcodec/aacdec.h
index b78368d69f..2a997823ee 100644
--- a/libavcodec/aacdec.h
+++ b/libavcodec/aacdec.h
@@ -230,6 +230,8 @@ typedef struct AACDecDSP {
     void (*apply_ltp)(AACDecContext *ac, SingleChannelElement *sce);
     void (*update_ltp)(AACDecContext *ac, SingleChannelElement *sce);
 
+    void (*apply_prediction)(AACDecContext *ac, SingleChannelElement *sce);
+
     void (*apply_dependent_coupling)(AACDecContext *ac,
                                      SingleChannelElement *target,
                                      ChannelElement *cce, int index);
diff --git a/libavcodec/aacdec_fixed.c b/libavcodec/aacdec_fixed.c
index 03b39854f8..880c18b0f8 100644
--- a/libavcodec/aacdec_fixed.c
+++ b/libavcodec/aacdec_fixed.c
@@ -127,124 +127,8 @@ static const int * const tns_tmp2_map_fixed[4] = {
 };
 // @}
 
-static av_always_inline void reset_predict_state(PredictorState *ps)
-{
-    ps->r0.mant   = 0;
-    ps->r0.exp   = 0;
-    ps->r1.mant   = 0;
-    ps->r1.exp   = 0;
-    ps->cor0.mant = 0;
-    ps->cor0.exp = 0;
-    ps->cor1.mant = 0;
-    ps->cor1.exp = 0;
-    ps->var0.mant = 0x20000000;
-    ps->var0.exp = 1;
-    ps->var1.mant = 0x20000000;
-    ps->var1.exp = 1;
-}
-
 static const int exp2tab[4] = { Q31(1.0000000000/2), Q31(1.1892071150/2), Q31(1.4142135624/2), Q31(1.6817928305/2) };  // 2^0, 2^0.25, 2^0.5, 2^0.75
 
-static av_always_inline SoftFloat flt16_round(SoftFloat pf)
-{
-    SoftFloat tmp;
-    int s;
-
-    tmp.exp = pf.exp;
-    s = pf.mant >> 31;
-    tmp.mant = (pf.mant ^ s) - s;
-    tmp.mant = (tmp.mant + 0x00200000U) & 0xFFC00000U;
-    tmp.mant = (tmp.mant ^ s) - s;
-
-    return tmp;
-}
-
-static av_always_inline SoftFloat flt16_even(SoftFloat pf)
-{
-    SoftFloat tmp;
-    int s;
-
-    tmp.exp = pf.exp;
-    s = pf.mant >> 31;
-    tmp.mant = (pf.mant ^ s) - s;
-    tmp.mant = (tmp.mant + 0x001FFFFFU + (tmp.mant & 0x00400000U >> 16)) & 0xFFC00000U;
-    tmp.mant = (tmp.mant ^ s) - s;
-
-    return tmp;
-}
-
-static av_always_inline SoftFloat flt16_trunc(SoftFloat pf)
-{
-    SoftFloat pun;
-    int s;
-
-    pun.exp = pf.exp;
-    s = pf.mant >> 31;
-    pun.mant = (pf.mant ^ s) - s;
-    pun.mant = pun.mant & 0xFFC00000U;
-    pun.mant = (pun.mant ^ s) - s;
-
-    return pun;
-}
-
-static av_always_inline void predict(PredictorState *ps, int *coef,
-                                     int output_enable)
-{
-    const SoftFloat a     = { 1023410176, 0 };  // 61.0 / 64
-    const SoftFloat alpha = {  973078528, 0 };  // 29.0 / 32
-    SoftFloat e0, e1;
-    SoftFloat pv;
-    SoftFloat k1, k2;
-    SoftFloat   r0 = ps->r0,     r1 = ps->r1;
-    SoftFloat cor0 = ps->cor0, cor1 = ps->cor1;
-    SoftFloat var0 = ps->var0, var1 = ps->var1;
-    SoftFloat tmp;
-
-    if (var0.exp > 1 || (var0.exp == 1 && var0.mant > 0x20000000)) {
-        k1 = av_mul_sf(cor0, flt16_even(av_div_sf(a, var0)));
-    }
-    else {
-        k1.mant = 0;
-        k1.exp = 0;
-    }
-
-    if (var1.exp > 1 || (var1.exp == 1 && var1.mant > 0x20000000)) {
-        k2 = av_mul_sf(cor1, flt16_even(av_div_sf(a, var1)));
-    }
-    else {
-        k2.mant = 0;
-        k2.exp = 0;
-    }
-
-    tmp = av_mul_sf(k1, r0);
-    pv = flt16_round(av_add_sf(tmp, av_mul_sf(k2, r1)));
-    if (output_enable) {
-        int shift = 28 - pv.exp;
-
-        if (shift < 31) {
-            if (shift > 0) {
-                *coef += (unsigned)((pv.mant + (1 << (shift - 1))) >> shift);
-            } else
-                *coef += (unsigned)pv.mant << -shift;
-        }
-    }
-
-    e0 = av_int2sf(*coef, 2);
-    e1 = av_sub_sf(e0, tmp);
-
-    ps->cor1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor1), av_mul_sf(r1, e1)));
-    tmp = av_add_sf(av_mul_sf(r1, r1), av_mul_sf(e1, e1));
-    tmp.exp--;
-    ps->var1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var1), tmp));
-    ps->cor0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor0), av_mul_sf(r0, e0)));
-    tmp = av_add_sf(av_mul_sf(r0, r0), av_mul_sf(e0, e0));
-    tmp.exp--;
-    ps->var0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var0), tmp));
-
-    ps->r1 = flt16_trunc(av_mul_sf(a, av_sub_sf(r0, av_mul_sf(k1, e0))));
-    ps->r0 = flt16_trunc(av_mul_sf(a, e0));
-}
-
 #include "aacdec_template.c"
 
 const FFCodec ff_aac_fixed_decoder = {
diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
index 13acd8803a..1bc36809eb 100644
--- a/libavcodec/aacdec_template.c
+++ b/libavcodec/aacdec_template.c
@@ -1072,13 +1072,6 @@ static int decode_audio_specific_config(AACDecContext *ac,
                                            sync_extension);
 }
 
-static void reset_all_predictors(PredictorState *ps)
-{
-    int i;
-    for (i = 0; i < MAX_PREDICTORS; i++)
-        reset_predict_state(&ps[i]);
-}
-
 static int sample_rate_idx (int rate)
 {
          if (92017 <= rate) return 0;
@@ -1095,13 +1088,6 @@ static int sample_rate_idx (int rate)
     else                    return 11;
 }
 
-static void reset_predictor_group(PredictorState *ps, int group_num)
-{
-    int i;
-    for (i = group_num - 1; i < MAX_PREDICTORS; i += 30)
-        reset_predict_state(&ps[i]);
-}
-
 static void aacdec_init(AACDecContext *ac);
 
 static av_cold void aac_static_table_init(void)
@@ -1573,38 +1559,6 @@ static void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb,
     }
 }
 
-/**
- * Apply AAC-Main style frequency domain prediction.
- */
-static void apply_prediction(AACDecContext *ac, SingleChannelElement *sce)
-{
-    int sfb, k;
-
-    if (!sce->ics.predictor_initialized) {
-        reset_all_predictors(sce->AAC_RENAME(predictor_state));
-        sce->ics.predictor_initialized = 1;
-    }
-
-    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
-        for (sfb = 0;
-             sfb < ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index];
-             sfb++) {
-            for (k = sce->ics.swb_offset[sfb];
-                 k < sce->ics.swb_offset[sfb + 1];
-                 k++) {
-                predict(&sce->AAC_RENAME(predictor_state)[k],
-                        &sce->AAC_RENAME(coeffs)[k],
-                        sce->ics.predictor_present &&
-                        sce->ics.prediction_used[sfb]);
-            }
-        }
-        if (sce->ics.predictor_reset_group)
-            reset_predictor_group(sce->AAC_RENAME(predictor_state),
-                                  sce->ics.predictor_reset_group);
-    } else
-        reset_all_predictors(sce->AAC_RENAME(predictor_state));
-}
-
 static void decode_gain_control(SingleChannelElement * sce, GetBitContext * gb)
 {
     // wd_num, wd_test, aloc_size
@@ -1722,7 +1676,7 @@ int AAC_RENAME(ff_aac_decode_ics)(AACDecContext *ac, SingleChannelElement *sce,
         goto fail;
 
     if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN && !common_window)
-        apply_prediction(ac, sce);
+        ac->dsp.apply_prediction(ac, sce);
 
     return 0;
 fail:
@@ -1767,8 +1721,8 @@ static int decode_cpe(AACDecContext *ac, GetBitContext *gb, ChannelElement *cpe)
         if (ms_present)
             ac->dsp.apply_mid_side_stereo(ac, cpe);
         if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN) {
-            apply_prediction(ac, &cpe->ch[0]);
-            apply_prediction(ac, &cpe->ch[1]);
+            ac->dsp.apply_prediction(ac, &cpe->ch[0]);
+            ac->dsp.apply_prediction(ac, &cpe->ch[1]);
         }
     }
 



More information about the ffmpeg-cvslog mailing list