[FFmpeg-cvslog] aacdec: template TNS application separately

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


ffmpeg | branch: master | Lynne <dev at lynne.ee> | Wed Mar 13 22:20:59 2024 +0100| [db5128ef70002c7d3e04398bfc7a9897659437f1] | committer: Lynne

aacdec: template TNS application separately

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

 libavcodec/aac/aacdec_dsp_template.c | 65 ++++++++++++++++++++++++++++++++
 libavcodec/aacdec.h                  |  6 ---
 libavcodec/aacdec_template.c         | 73 +++---------------------------------
 libavcodec/mips/aacdec_mips.c        |  2 +-
 4 files changed, 71 insertions(+), 75 deletions(-)

diff --git a/libavcodec/aac/aacdec_dsp_template.c b/libavcodec/aac/aacdec_dsp_template.c
index 102091d331..da7f5fac4f 100644
--- a/libavcodec/aac/aacdec_dsp_template.c
+++ b/libavcodec/aac/aacdec_dsp_template.c
@@ -31,6 +31,7 @@
 
 #include "libavcodec/aacdec.h"
 #include "libavcodec/aac_defines.h"
+#include "libavcodec/lpc_functions.h"
 
 #include "libavcodec/aactab.h"
 
@@ -174,8 +175,72 @@ static void AAC_RENAME(apply_intensity_stereo)(AACDecContext *ac,
     }
 }
 
+/**
+ * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3.
+ *
+ * @param   decode  1 if tool is used normally, 0 if tool is used in LTP.
+ * @param   coef    spectral coefficients
+ */
+static void AAC_RENAME(apply_tns)(void *_coef_param, TemporalNoiseShaping *tns,
+                                  IndividualChannelStream *ics, int decode)
+{
+    const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb);
+    int w, filt, m, i;
+    int bottom, top, order, start, end, size, inc;
+    INTFLOAT *coef_param = _coef_param;
+    INTFLOAT lpc[TNS_MAX_ORDER];
+    INTFLOAT tmp[TNS_MAX_ORDER+1];
+    UINTFLOAT *coef = coef_param;
+
+    if(!mmm)
+        return;
+
+    for (w = 0; w < ics->num_windows; w++) {
+        bottom = ics->num_swb;
+        for (filt = 0; filt < tns->n_filt[w]; filt++) {
+            top    = bottom;
+            bottom = FFMAX(0, top - tns->length[w][filt]);
+            order  = tns->order[w][filt];
+            if (order == 0)
+                continue;
+
+            // tns_decode_coef
+            compute_lpc_coefs(tns->AAC_RENAME(coef)[w][filt], order, lpc, 0, 0, 0);
+
+            start = ics->swb_offset[FFMIN(bottom, mmm)];
+            end   = ics->swb_offset[FFMIN(   top, mmm)];
+            if ((size = end - start) <= 0)
+                continue;
+            if (tns->direction[w][filt]) {
+                inc = -1;
+                start = end - 1;
+            } else {
+                inc = 1;
+            }
+            start += w * 128;
+
+            if (decode) {
+                // ar filter
+                for (m = 0; m < size; m++, start += inc)
+                    for (i = 1; i <= FFMIN(m, order); i++)
+                        coef[start] -= AAC_MUL26((INTFLOAT)coef[start - i * inc], lpc[i - 1]);
+            } else {
+                // ma filter
+                for (m = 0; m < size; m++, start += inc) {
+                    tmp[0] = coef[start];
+                    for (i = 1; i <= FFMIN(m, order); i++)
+                        coef[start] += AAC_MUL26(tmp[i], lpc[i - 1]);
+                    for (i = order; i > 0; i--)
+                        tmp[i] = tmp[i - 1];
+                }
+            }
+        }
+    }
+}
+
 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),
 };
diff --git a/libavcodec/aacdec.h b/libavcodec/aacdec.h
index 9078c2a4e6..3c8d14a53e 100644
--- a/libavcodec/aacdec.h
+++ b/libavcodec/aacdec.h
@@ -311,12 +311,6 @@ struct AACDecContext {
     /* aacdec functions pointers */
     void (*imdct_and_windowing)(struct AACDecContext *ac, SingleChannelElement *sce);
     void (*apply_ltp)(struct AACDecContext *ac, SingleChannelElement *sce);
-    union {
-        void (*apply_tns)(float coef[1024], TemporalNoiseShaping *tns,
-                          IndividualChannelStream *ics, int decode);
-        void (*apply_tns_fixed)(int coef[1024], TemporalNoiseShaping *tns,
-                                IndividualChannelStream *ics, int decode);
-    };
     union {
         void (*windowing_and_mdct_ltp)(struct AACDecContext *ac, float *out,
                                        float *in, IndividualChannelStream *ics);
diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
index da0bc47ac9..d0a5a6660f 100644
--- a/libavcodec/aacdec_template.c
+++ b/libavcodec/aacdec_template.c
@@ -2367,68 +2367,6 @@ static int decode_extension_payload(AACDecContext *ac, GetBitContext *gb, int cn
     return res;
 }
 
-/**
- * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3.
- *
- * @param   decode  1 if tool is used normally, 0 if tool is used in LTP.
- * @param   coef    spectral coefficients
- */
-static void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns,
-                      IndividualChannelStream *ics, int decode)
-{
-    const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb);
-    int w, filt, m, i;
-    int bottom, top, order, start, end, size, inc;
-    INTFLOAT lpc[TNS_MAX_ORDER];
-    INTFLOAT tmp[TNS_MAX_ORDER+1];
-    UINTFLOAT *coef = coef_param;
-
-    if(!mmm)
-        return;
-
-    for (w = 0; w < ics->num_windows; w++) {
-        bottom = ics->num_swb;
-        for (filt = 0; filt < tns->n_filt[w]; filt++) {
-            top    = bottom;
-            bottom = FFMAX(0, top - tns->length[w][filt]);
-            order  = tns->order[w][filt];
-            if (order == 0)
-                continue;
-
-            // tns_decode_coef
-            compute_lpc_coefs(tns->AAC_RENAME(coef)[w][filt], order, lpc, 0, 0, 0);
-
-            start = ics->swb_offset[FFMIN(bottom, mmm)];
-            end   = ics->swb_offset[FFMIN(   top, mmm)];
-            if ((size = end - start) <= 0)
-                continue;
-            if (tns->direction[w][filt]) {
-                inc = -1;
-                start = end - 1;
-            } else {
-                inc = 1;
-            }
-            start += w * 128;
-
-            if (decode) {
-                // ar filter
-                for (m = 0; m < size; m++, start += inc)
-                    for (i = 1; i <= FFMIN(m, order); i++)
-                        coef[start] -= AAC_MUL26((INTFLOAT)coef[start - i * inc], lpc[i - 1]);
-            } else {
-                // ma filter
-                for (m = 0; m < size; m++, start += inc) {
-                    tmp[0] = coef[start];
-                    for (i = 1; i <= FFMIN(m, order); i++)
-                        coef[start] += AAC_MUL26(tmp[i], lpc[i - 1]);
-                    for (i = order; i > 0; i--)
-                        tmp[i] = tmp[i - 1];
-                }
-            }
-        }
-    }
-}
-
 /**
  *  Apply windowing and MDCT to obtain the spectral
  *  coefficient from the predicted sample by LTP.
@@ -2479,7 +2417,7 @@ static void apply_ltp(AACDecContext *ac, SingleChannelElement *sce)
         ac->AAC_RENAME(windowing_and_mdct_ltp)(ac, predFreq, predTime, &sce->ics);
 
         if (sce->tns.present)
-            ac->AAC_RENAME(apply_tns)(predFreq, &sce->tns, &sce->ics, 0);
+            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])
@@ -2815,11 +2753,11 @@ static void spectral_to_sample(AACDecContext *ac, int samples)
                     }
                 }
                 if (che->ch[0].tns.present)
-                    ac->AAC_RENAME(apply_tns)(che->ch[0].AAC_RENAME(coeffs),
-                                              &che->ch[0].tns, &che->ch[0].ics, 1);
+                    ac->dsp.apply_tns(che->ch[0].AAC_RENAME(coeffs),
+                                      &che->ch[0].tns, &che->ch[0].ics, 1);
                 if (che->ch[1].tns.present)
-                    ac->AAC_RENAME(apply_tns)(che->ch[1].AAC_RENAME(coeffs),
-                                              &che->ch[1].tns, &che->ch[1].ics, 1);
+                    ac->dsp.apply_tns(che->ch[1].AAC_RENAME(coeffs),
+                                      &che->ch[1].tns, &che->ch[1].ics, 1);
                 if (type <= TYPE_CPE)
                     apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, AAC_RENAME(apply_dependent_coupling));
                 if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) {
@@ -3272,7 +3210,6 @@ static void aacdec_init(AACDecContext *c)
 {
     c->imdct_and_windowing                      = imdct_and_windowing;
     c->apply_ltp                                = apply_ltp;
-    c->AAC_RENAME(apply_tns)                    = apply_tns;
     c->AAC_RENAME(windowing_and_mdct_ltp)       = windowing_and_mdct_ltp;
     c->update_ltp                               = update_ltp;
 #if USE_FIXED
diff --git a/libavcodec/mips/aacdec_mips.c b/libavcodec/mips/aacdec_mips.c
index 2820f980a4..834794d9a2 100644
--- a/libavcodec/mips/aacdec_mips.c
+++ b/libavcodec/mips/aacdec_mips.c
@@ -275,7 +275,7 @@ static void apply_ltp_mips(AACDecContext *ac, SingleChannelElement *sce)
         ac->windowing_and_mdct_ltp(ac, predFreq, predTime, &sce->ics);
 
         if (sce->tns.present)
-            ac->apply_tns(predFreq, &sce->tns, &sce->ics, 0);
+            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])



More information about the ffmpeg-cvslog mailing list