[FFmpeg-cvslog] aacdec: template LTP application separately

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


ffmpeg | branch: master | Lynne <dev at lynne.ee> | Thu Mar 14 04:52:28 2024 +0100| [e9fc7661daac9c0df0747e11435570899652d686] | committer: Lynne

aacdec: template LTP application separately

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

 libavcodec/aac/aacdec_dsp_template.c | 76 ++++++++++++++++++++++++++++++++-
 libavcodec/aac/aacdec_fixed.c        |  8 ++++
 libavcodec/aac/aacdec_float.c        |  5 +++
 libavcodec/aacdec.h                  |  2 -
 libavcodec/aacdec_fixed.c            |  8 ++--
 libavcodec/aacdec_template.c         | 83 ++----------------------------------
 libavcodec/mips/aacdec_mips.c        |  2 +-
 7 files changed, 97 insertions(+), 87 deletions(-)

diff --git a/libavcodec/aac/aacdec_dsp_template.c b/libavcodec/aac/aacdec_dsp_template.c
index da7f5fac4f..5e18b30d99 100644
--- a/libavcodec/aac/aacdec_dsp_template.c
+++ b/libavcodec/aac/aacdec_dsp_template.c
@@ -30,7 +30,6 @@
  */
 
 #include "libavcodec/aacdec.h"
-#include "libavcodec/aac_defines.h"
 #include "libavcodec/lpc_functions.h"
 
 #include "libavcodec/aactab.h"
@@ -238,9 +237,84 @@ static void AAC_RENAME(apply_tns)(void *_coef_param, TemporalNoiseShaping *tns,
     }
 }
 
+/**
+ * Apply the long term prediction
+ */
+static void AAC_RENAME(apply_ltp)(AACDecContext *ac, SingleChannelElement *sce)
+{
+    const LongTermPrediction *ltp = &sce->ics.ltp;
+    const uint16_t *offsets = sce->ics.swb_offset;
+    int i, sfb;
+
+    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
+        INTFLOAT *predTime = sce->AAC_RENAME(output);
+        INTFLOAT *predFreq = ac->AAC_RENAME(buf_mdct);
+        int16_t num_samples = 2048;
+
+        if (ltp->lag < 1024)
+            num_samples = ltp->lag + 1024;
+        for (i = 0; i < num_samples; i++)
+            predTime[i] = AAC_MUL30(sce->AAC_RENAME(ltp_state)[i + 2048 - ltp->lag], ltp->AAC_RENAME(coef));
+        memset(&predTime[i], 0, (2048 - i) * sizeof(*predTime));
+
+        ac->AAC_RENAME(windowing_and_mdct_ltp)(ac, predFreq, predTime, &sce->ics);
+
+        if (sce->tns.present)
+            AAC_RENAME(apply_tns)(predFreq, &sce->tns, &sce->ics, 0);
+
+        for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++)
+            if (ltp->used[sfb])
+                for (i = offsets[sfb]; i < offsets[sfb + 1]; i++)
+                    sce->AAC_RENAME(coeffs)[i] += (UINTFLOAT)predFreq[i];
+    }
+}
+
+/**
+ * Update the LTP buffer for next frame
+ */
+static void AAC_RENAME(update_ltp)(AACDecContext *ac, SingleChannelElement *sce)
+{
+    IndividualChannelStream *ics = &sce->ics;
+    INTFLOAT *saved     = sce->AAC_RENAME(saved);
+    INTFLOAT *saved_ltp = sce->AAC_RENAME(coeffs);
+    const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
+    const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
+    int i;
+
+    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
+        memcpy(saved_ltp,       saved, 512 * sizeof(*saved_ltp));
+        memset(saved_ltp + 576, 0,     448 * sizeof(*saved_ltp));
+        ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->AAC_RENAME(buf_mdct) + 960,     &swindow[64],      64);
+
+        for (i = 0; i < 64; i++)
+            saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], swindow[63 - i]);
+    } else if (1 && ics->window_sequence[0] == LONG_START_SEQUENCE) {
+        memcpy(saved_ltp,       ac->AAC_RENAME(buf_mdct) + 512, 448 * sizeof(*saved_ltp));
+        memset(saved_ltp + 576, 0,                  448 * sizeof(*saved_ltp));
+        ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->AAC_RENAME(buf_mdct) + 960,     &swindow[64],      64);
+
+        for (i = 0; i < 64; i++)
+            saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], swindow[63 - i]);
+    } else if (1) { // LONG_STOP or ONLY_LONG
+        ac->fdsp->vector_fmul_reverse(saved_ltp, ac->AAC_RENAME(buf_mdct) + 512,     &lwindow[512],     512);
+
+        for (i = 0; i < 512; i++)
+            saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], lwindow[511 - i]);
+    }
+
+    memcpy(sce->AAC_RENAME(ltp_state),      sce->AAC_RENAME(ltp_state)+1024,
+           1024 * sizeof(*sce->AAC_RENAME(ltp_state)));
+    memcpy(sce->AAC_RENAME(ltp_state) + 1024, sce->AAC_RENAME(output),
+           1024 * sizeof(*sce->AAC_RENAME(ltp_state)));
+    memcpy(sce->AAC_RENAME(ltp_state) + 2048, saved_ltp,
+           1024 * sizeof(*sce->AAC_RENAME(ltp_state)));
+}
+
 const AACDecDSP AAC_RENAME(aac_dsp) = {
     .dequant_scalefactors = &AAC_RENAME(dequant_scalefactors),
     .apply_mid_side_stereo = &AAC_RENAME(apply_mid_side_stereo),
     .apply_intensity_stereo = &AAC_RENAME(apply_intensity_stereo),
     .apply_tns = &AAC_RENAME(apply_tns),
+    .apply_ltp = &AAC_RENAME(apply_ltp),
+    .update_ltp = &AAC_RENAME(update_ltp),
 };
diff --git a/libavcodec/aac/aacdec_fixed.c b/libavcodec/aac/aacdec_fixed.c
index 1b41a43a46..9b66f22d2f 100644
--- a/libavcodec/aac/aacdec_fixed.c
+++ b/libavcodec/aac/aacdec_fixed.c
@@ -31,4 +31,12 @@
 
 #define USE_FIXED 1
 
+#include "libavcodec/aac_defines.h"
+
+#include "libavcodec/aactab.h"
+#include "libavcodec/sinewin_fixed_tablegen.h"
+
+DECLARE_ALIGNED(32, extern int, AAC_RENAME2(aac_kbd_long_1024))[1024];
+DECLARE_ALIGNED(32, extern int, AAC_RENAME2(aac_kbd_short_128))[128];
+
 #include "aacdec_dsp_template.c"
diff --git a/libavcodec/aac/aacdec_float.c b/libavcodec/aac/aacdec_float.c
index a40c1c1f03..ba1b06cc21 100644
--- a/libavcodec/aac/aacdec_float.c
+++ b/libavcodec/aac/aacdec_float.c
@@ -31,4 +31,9 @@
 
 #define USE_FIXED 0
 
+#include "libavcodec/aac_defines.h"
+
+#include "libavcodec/aactab.h"
+#include "libavcodec/sinewin.h"
+
 #include "aacdec_dsp_template.c"
diff --git a/libavcodec/aacdec.h b/libavcodec/aacdec.h
index 3c8d14a53e..109c38d8e2 100644
--- a/libavcodec/aacdec.h
+++ b/libavcodec/aacdec.h
@@ -310,14 +310,12 @@ struct AACDecContext {
 
     /* aacdec functions pointers */
     void (*imdct_and_windowing)(struct AACDecContext *ac, SingleChannelElement *sce);
-    void (*apply_ltp)(struct AACDecContext *ac, SingleChannelElement *sce);
     union {
         void (*windowing_and_mdct_ltp)(struct AACDecContext *ac, float *out,
                                        float *in, IndividualChannelStream *ics);
         void (*windowing_and_mdct_ltp_fixed)(struct AACDecContext *ac, int *out,
                                              int *in, IndividualChannelStream *ics);
     };
-    void (*update_ltp)(struct AACDecContext *ac, SingleChannelElement *sce);
     void (*vector_pow43)(int *coefs, int len);
     void (*subband_scale)(int *dst, int *src, int scale, int offset, int len, void *log_context);
 };
diff --git a/libavcodec/aacdec_fixed.c b/libavcodec/aacdec_fixed.c
index 2c87cddd6e..7633f4adb0 100644
--- a/libavcodec/aacdec_fixed.c
+++ b/libavcodec/aacdec_fixed.c
@@ -81,10 +81,10 @@
 #include <math.h>
 #include <string.h>
 
-DECLARE_ALIGNED(32, static int, AAC_RENAME2(aac_kbd_long_1024))[1024];
-DECLARE_ALIGNED(32, static int, AAC_RENAME2(aac_kbd_short_128))[128];
-DECLARE_ALIGNED(32, static int, AAC_RENAME2(aac_kbd_long_960))[960];
-DECLARE_ALIGNED(32, static int, AAC_RENAME2(aac_kbd_short_120))[120];
+DECLARE_ALIGNED(32, int, AAC_RENAME2(aac_kbd_long_1024))[1024];
+DECLARE_ALIGNED(32, int, AAC_RENAME2(aac_kbd_short_128))[128];
+DECLARE_ALIGNED(32, int, AAC_RENAME2(aac_kbd_long_960))[960];
+DECLARE_ALIGNED(32, int, AAC_RENAME2(aac_kbd_short_120))[120];
 
 /* @name ltp_coef
  * Table of the LTP coefficients
diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
index d0a5a6660f..11b3d96a44 100644
--- a/libavcodec/aacdec_template.c
+++ b/libavcodec/aacdec_template.c
@@ -2394,79 +2394,6 @@ static void windowing_and_mdct_ltp(AACDecContext *ac, INTFLOAT *out,
     ac->mdct_ltp_fn(ac->mdct_ltp, out, in, sizeof(INTFLOAT));
 }
 
-/**
- * Apply the long term prediction
- */
-static void apply_ltp(AACDecContext *ac, SingleChannelElement *sce)
-{
-    const LongTermPrediction *ltp = &sce->ics.ltp;
-    const uint16_t *offsets = sce->ics.swb_offset;
-    int i, sfb;
-
-    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
-        INTFLOAT *predTime = sce->AAC_RENAME(output);
-        INTFLOAT *predFreq = ac->AAC_RENAME(buf_mdct);
-        int16_t num_samples = 2048;
-
-        if (ltp->lag < 1024)
-            num_samples = ltp->lag + 1024;
-        for (i = 0; i < num_samples; i++)
-            predTime[i] = AAC_MUL30(sce->AAC_RENAME(ltp_state)[i + 2048 - ltp->lag], ltp->AAC_RENAME(coef));
-        memset(&predTime[i], 0, (2048 - i) * sizeof(*predTime));
-
-        ac->AAC_RENAME(windowing_and_mdct_ltp)(ac, predFreq, predTime, &sce->ics);
-
-        if (sce->tns.present)
-            ac->dsp.apply_tns(predFreq, &sce->tns, &sce->ics, 0);
-
-        for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++)
-            if (ltp->used[sfb])
-                for (i = offsets[sfb]; i < offsets[sfb + 1]; i++)
-                    sce->AAC_RENAME(coeffs)[i] += (UINTFLOAT)predFreq[i];
-    }
-}
-
-/**
- * Update the LTP buffer for next frame
- */
-static void update_ltp(AACDecContext *ac, SingleChannelElement *sce)
-{
-    IndividualChannelStream *ics = &sce->ics;
-    INTFLOAT *saved     = sce->AAC_RENAME(saved);
-    INTFLOAT *saved_ltp = sce->AAC_RENAME(coeffs);
-    const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
-    const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
-    int i;
-
-    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
-        memcpy(saved_ltp,       saved, 512 * sizeof(*saved_ltp));
-        memset(saved_ltp + 576, 0,     448 * sizeof(*saved_ltp));
-        ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->AAC_RENAME(buf_mdct) + 960,     &swindow[64],      64);
-
-        for (i = 0; i < 64; i++)
-            saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], swindow[63 - i]);
-    } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
-        memcpy(saved_ltp,       ac->AAC_RENAME(buf_mdct) + 512, 448 * sizeof(*saved_ltp));
-        memset(saved_ltp + 576, 0,                  448 * sizeof(*saved_ltp));
-        ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->AAC_RENAME(buf_mdct) + 960,     &swindow[64],      64);
-
-        for (i = 0; i < 64; i++)
-            saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], swindow[63 - i]);
-    } else { // LONG_STOP or ONLY_LONG
-        ac->fdsp->vector_fmul_reverse(saved_ltp, ac->AAC_RENAME(buf_mdct) + 512,     &lwindow[512],     512);
-
-        for (i = 0; i < 512; i++)
-            saved_ltp[i + 512] = AAC_MUL31(ac->AAC_RENAME(buf_mdct)[1023 - i], lwindow[511 - i]);
-    }
-
-    memcpy(sce->AAC_RENAME(ltp_state),      sce->AAC_RENAME(ltp_state)+1024,
-           1024 * sizeof(*sce->AAC_RENAME(ltp_state)));
-    memcpy(sce->AAC_RENAME(ltp_state) + 1024, sce->AAC_RENAME(output),
-           1024 * sizeof(*sce->AAC_RENAME(ltp_state)));
-    memcpy(sce->AAC_RENAME(ltp_state) + 2048, saved_ltp,
-           1024 * sizeof(*sce->AAC_RENAME(ltp_state)));
-}
-
 /**
  * Conduct IMDCT and windowing.
  */
@@ -2747,9 +2674,9 @@ static void spectral_to_sample(AACDecContext *ac, int samples)
                 if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
                     if (che->ch[0].ics.predictor_present) {
                         if (che->ch[0].ics.ltp.present)
-                            ac->apply_ltp(ac, &che->ch[0]);
+                            ac->dsp.apply_ltp(ac, &che->ch[0]);
                         if (che->ch[1].ics.ltp.present && type == TYPE_CPE)
-                            ac->apply_ltp(ac, &che->ch[1]);
+                            ac->dsp.apply_ltp(ac, &che->ch[1]);
                     }
                 }
                 if (che->ch[0].tns.present)
@@ -2763,11 +2690,11 @@ static void spectral_to_sample(AACDecContext *ac, int samples)
                 if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) {
                     imdct_and_window(ac, &che->ch[0]);
                     if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP)
-                        ac->update_ltp(ac, &che->ch[0]);
+                        ac->dsp.update_ltp(ac, &che->ch[0]);
                     if (type == TYPE_CPE) {
                         imdct_and_window(ac, &che->ch[1]);
                         if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP)
-                            ac->update_ltp(ac, &che->ch[1]);
+                            ac->dsp.update_ltp(ac, &che->ch[1]);
                     }
                     if (ac->oc[1].m4ac.sbr > 0) {
                         AAC_RENAME(ff_aac_sbr_apply)(ac, che, type,
@@ -3209,9 +3136,7 @@ static int aac_decode_frame(AVCodecContext *avctx, AVFrame *frame,
 static void aacdec_init(AACDecContext *c)
 {
     c->imdct_and_windowing                      = imdct_and_windowing;
-    c->apply_ltp                                = apply_ltp;
     c->AAC_RENAME(windowing_and_mdct_ltp)       = windowing_and_mdct_ltp;
-    c->update_ltp                               = update_ltp;
 #if USE_FIXED
     c->vector_pow43                             = vector_pow43;
     c->subband_scale                            = subband_scale;
diff --git a/libavcodec/mips/aacdec_mips.c b/libavcodec/mips/aacdec_mips.c
index 834794d9a2..5b71bb97ab 100644
--- a/libavcodec/mips/aacdec_mips.c
+++ b/libavcodec/mips/aacdec_mips.c
@@ -436,7 +436,7 @@ void ff_aacdec_init_mips(AACDecContext *c)
 #if HAVE_INLINE_ASM
 #if HAVE_MIPSFPU
     c->imdct_and_windowing         = imdct_and_windowing_mips;
-    c->apply_ltp                   = apply_ltp_mips;
+    c->dsp.apply_ltp               = apply_ltp_mips;
     c->update_ltp                  = update_ltp_mips;
 #endif /* HAVE_MIPSFPU */
 #endif /* HAVE_INLINE_ASM */



More information about the ffmpeg-cvslog mailing list