[FFmpeg-cvslog] on2avc: convert to lavu/tx

Lynne git at videolan.org
Sun Nov 6 15:41:49 EET 2022


ffmpeg | branch: master | Lynne <dev at lynne.ee> | Mon Oct 31 13:10:30 2022 +0100| [6ba0aa1770ba29eb4126c6a706f6b0cd3809648f] | committer: Lynne

on2avc: convert to lavu/tx

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

 configure           |   1 -
 libavcodec/on2avc.c | 143 +++++++++++++++++++++++++++-------------------------
 2 files changed, 75 insertions(+), 69 deletions(-)

diff --git a/configure b/configure
index eea1ea3743..d49638b381 100755
--- a/configure
+++ b/configure
@@ -2917,7 +2917,6 @@ nellymoser_decoder_select="sinewin"
 nellymoser_encoder_select="audio_frame_queue sinewin"
 notchlc_decoder_select="lzf"
 nuv_decoder_select="idctdsp"
-on2avc_decoder_select="mdct"
 opus_decoder_deps="swresample"
 opus_encoder_select="audio_frame_queue"
 png_decoder_select="inflate_wrapper"
diff --git a/libavcodec/on2avc.c b/libavcodec/on2avc.c
index 411414ee26..74be1dcb60 100644
--- a/libavcodec/on2avc.c
+++ b/libavcodec/on2avc.c
@@ -24,12 +24,12 @@
 #include "libavutil/ffmath.h"
 #include "libavutil/float_dsp.h"
 #include "libavutil/mem_internal.h"
+#include "libavutil/tx.h"
 
 #include "avcodec.h"
 #include "bytestream.h"
 #include "codec_internal.h"
 #include "decode.h"
-#include "fft.h"
 #include "get_bits.h"
 
 #include "on2avcdata.h"
@@ -50,8 +50,10 @@ enum WindowTypes {
 typedef struct On2AVCContext {
     AVCodecContext *avctx;
     AVFloatDSPContext *fdsp;
-    FFTContext mdct, mdct_half, mdct_small;
-    FFTContext fft128, fft256, fft512, fft1024;
+    AVTXContext *mdct, *mdct_half, *mdct_small;
+    AVTXContext *fft128, *fft256, *fft512, *fft1024;
+    av_tx_fn mdct_fn, mdct_half_fn, mdct_small_fn;
+    av_tx_fn fft128_fn, fft256_fn, fft512_fn, fft1024_fn;
     void (*wtf)(struct On2AVCContext *ctx, float *out, float *in, int size);
 
     int is_av500;
@@ -465,67 +467,57 @@ static void combine_fft(float *s0, float *s1, float *s2, float *s3, float *dst,
 static void wtf_end_512(On2AVCContext *c, float *out, float *src,
                         float *tmp0, float *tmp1)
 {
-    memcpy(src,        tmp0,      384 * sizeof(*tmp0));
-    memcpy(tmp0 + 384, src + 384, 128 * sizeof(*tmp0));
-
-    zero_head_and_tail(src,       128, 16, 4);
-    zero_head_and_tail(src + 128, 128, 16, 4);
-    zero_head_and_tail(src + 256, 128, 13, 7);
-    zero_head_and_tail(src + 384, 128, 15, 5);
-
-    c->fft128.fft_permute(&c->fft128, (FFTComplex*)src);
-    c->fft128.fft_permute(&c->fft128, (FFTComplex*)(src + 128));
-    c->fft128.fft_permute(&c->fft128, (FFTComplex*)(src + 256));
-    c->fft128.fft_permute(&c->fft128, (FFTComplex*)(src + 384));
-    c->fft128.fft_calc(&c->fft128, (FFTComplex*)src);
-    c->fft128.fft_calc(&c->fft128, (FFTComplex*)(src + 128));
-    c->fft128.fft_calc(&c->fft128, (FFTComplex*)(src + 256));
-    c->fft128.fft_calc(&c->fft128, (FFTComplex*)(src + 384));
+    memcpy(tmp1,       tmp0,       384 * sizeof(*tmp0));
+    memcpy(tmp0 + 384, tmp1 + 384, 128 * sizeof(*tmp0));
+
+    zero_head_and_tail(tmp1,       128, 16, 4);
+    zero_head_and_tail(tmp1 + 128, 128, 16, 4);
+    zero_head_and_tail(tmp1 + 256, 128, 13, 7);
+    zero_head_and_tail(tmp1 + 384, 128, 15, 5);
+
+    c->fft128_fn(c->fft128, src +   0, tmp1 +   0, sizeof(float));
+    c->fft128_fn(c->fft128, src + 128, tmp1 + 128, sizeof(float));
+    c->fft128_fn(c->fft128, src + 256, tmp1 + 256, sizeof(float));
+    c->fft128_fn(c->fft128, src + 384, tmp1 + 384, sizeof(float));
+
     combine_fft(src, src + 128, src + 256, src + 384, tmp1,
                 ff_on2avc_ctab_1, ff_on2avc_ctab_2,
                 ff_on2avc_ctab_3, ff_on2avc_ctab_4, 512, 2);
-    c->fft512.fft_permute(&c->fft512, (FFTComplex*)tmp1);
-    c->fft512.fft_calc(&c->fft512, (FFTComplex*)tmp1);
 
-    pretwiddle(&tmp0[  0], tmp1, 512, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1);
-    pretwiddle(&tmp0[128], tmp1, 512, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2);
-    pretwiddle(&tmp0[256], tmp1, 512, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3);
-    pretwiddle(&tmp0[384], tmp1, 512, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4);
+    c->fft512_fn(c->fft512, src, tmp1, sizeof(float));
 
-    memcpy(src, tmp1, 512 * sizeof(float));
+    pretwiddle(&tmp0[  0], src, 512, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1);
+    pretwiddle(&tmp0[128], src, 512, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2);
+    pretwiddle(&tmp0[256], src, 512, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3);
+    pretwiddle(&tmp0[384], src, 512, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4);
 }
 
 static void wtf_end_1024(On2AVCContext *c, float *out, float *src,
                          float *tmp0, float *tmp1)
 {
-    memcpy(src,        tmp0,      768 * sizeof(*tmp0));
-    memcpy(tmp0 + 768, src + 768, 256 * sizeof(*tmp0));
-
-    zero_head_and_tail(src,       256, 16, 4);
-    zero_head_and_tail(src + 256, 256, 16, 4);
-    zero_head_and_tail(src + 512, 256, 13, 7);
-    zero_head_and_tail(src + 768, 256, 15, 5);
-
-    c->fft256.fft_permute(&c->fft256, (FFTComplex*)src);
-    c->fft256.fft_permute(&c->fft256, (FFTComplex*)(src + 256));
-    c->fft256.fft_permute(&c->fft256, (FFTComplex*)(src + 512));
-    c->fft256.fft_permute(&c->fft256, (FFTComplex*)(src + 768));
-    c->fft256.fft_calc(&c->fft256, (FFTComplex*)src);
-    c->fft256.fft_calc(&c->fft256, (FFTComplex*)(src + 256));
-    c->fft256.fft_calc(&c->fft256, (FFTComplex*)(src + 512));
-    c->fft256.fft_calc(&c->fft256, (FFTComplex*)(src + 768));
+    memcpy(tmp1,       tmp0,       768 * sizeof(*tmp0));
+    memcpy(tmp0 + 768, tmp1 + 768, 256 * sizeof(*tmp0));
+
+    zero_head_and_tail(tmp1,       256, 16, 4);
+    zero_head_and_tail(tmp1 + 256, 256, 16, 4);
+    zero_head_and_tail(tmp1 + 512, 256, 13, 7);
+    zero_head_and_tail(tmp1 + 768, 256, 15, 5);
+
+    c->fft256_fn(c->fft256, src +   0, tmp1 +   0, sizeof(float));
+    c->fft256_fn(c->fft256, src + 256, tmp1 + 256, sizeof(float));
+    c->fft256_fn(c->fft256, src + 512, tmp1 + 512, sizeof(float));
+    c->fft256_fn(c->fft256, src + 768, tmp1 + 768, sizeof(float));
+
     combine_fft(src, src + 256, src + 512, src + 768, tmp1,
                 ff_on2avc_ctab_1, ff_on2avc_ctab_2,
                 ff_on2avc_ctab_3, ff_on2avc_ctab_4, 1024, 1);
-    c->fft1024.fft_permute(&c->fft1024, (FFTComplex*)tmp1);
-    c->fft1024.fft_calc(&c->fft1024, (FFTComplex*)tmp1);
 
-    pretwiddle(&tmp0[  0], tmp1, 1024, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1);
-    pretwiddle(&tmp0[256], tmp1, 1024, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2);
-    pretwiddle(&tmp0[512], tmp1, 1024, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3);
-    pretwiddle(&tmp0[768], tmp1, 1024, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4);
+    c->fft1024_fn(c->fft1024, src, tmp1, sizeof(float));
 
-    memcpy(src, tmp1, 1024 * sizeof(float));
+    pretwiddle(&tmp0[  0], src, 1024, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1);
+    pretwiddle(&tmp0[256], src, 1024, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2);
+    pretwiddle(&tmp0[512], src, 1024, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3);
+    pretwiddle(&tmp0[768], src, 1024, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4);
 }
 
 static void wtf_40(On2AVCContext *c, float *out, float *src, int size)
@@ -701,20 +693,20 @@ static int on2avc_reconstruct_channel_ext(On2AVCContext *c, AVFrame *dst, int of
 
         switch (c->window_type) {
         case WINDOW_TYPE_EXT7:
-            c->mdct.imdct_half(&c->mdct, buf, in);
+            c->mdct_fn(c->mdct, buf, in, sizeof(float));
             break;
         case WINDOW_TYPE_EXT4:
             c->wtf(c, buf, in, 1024);
             break;
         case WINDOW_TYPE_EXT5:
             c->wtf(c, buf, in, 512);
-            c->mdct.imdct_half(&c->mdct_half, buf + 512, in + 512);
+            c->mdct_half_fn(c->mdct, buf + 512, in + 512, sizeof(float));
             for (i = 0; i < 256; i++) {
                 FFSWAP(float, buf[i + 512], buf[1023 - i]);
             }
             break;
         case WINDOW_TYPE_EXT6:
-            c->mdct.imdct_half(&c->mdct_half, buf, in);
+            c->mdct_half_fn(c->mdct_half, buf, in, sizeof(float));
             for (i = 0; i < 256; i++) {
                 FFSWAP(float, buf[i], buf[511 - i]);
             }
@@ -747,11 +739,11 @@ static int on2avc_reconstruct_channel(On2AVCContext *c, int channel,
     case WINDOW_TYPE_LONG_START:
     case WINDOW_TYPE_LONG_STOP:
     case WINDOW_TYPE_LONG:
-        c->mdct.imdct_half(&c->mdct, buf, in);
+        c->mdct_fn(c->mdct, buf, in, sizeof(float));
         break;
     case WINDOW_TYPE_8SHORT:
         for (i = 0; i < ON2AVC_SUBFRAME_SIZE; i += ON2AVC_SUBFRAME_SIZE / 8)
-            c->mdct_small.imdct_half(&c->mdct_small, buf + i, in + i);
+            c->mdct_small_fn(c->mdct_small, buf + i, in + i, sizeof(float));
         break;
     }
 
@@ -911,6 +903,7 @@ static av_cold int on2avc_decode_init(AVCodecContext *avctx)
     const uint8_t  *lens = ff_on2avc_cb_lens;
     const uint16_t *syms = ff_on2avc_cb_syms;
     int channels = avctx->ch_layout.nb_channels;
+    float scale;
     int i, ret;
 
     if (channels > 2U) {
@@ -951,13 +944,27 @@ static av_cold int on2avc_decode_init(AVCodecContext *avctx)
     c->wtf   = (avctx->sample_rate <= 40000) ? wtf_40
                                              : wtf_44;
 
-    ff_mdct_init(&c->mdct,       11, 1, 1.0 / (32768.0 * 1024.0));
-    ff_mdct_init(&c->mdct_half,  10, 1, 1.0 / (32768.0 * 512.0));
-    ff_mdct_init(&c->mdct_small,  8, 1, 1.0 / (32768.0 * 128.0));
-    ff_fft_init(&c->fft128,  6, 0);
-    ff_fft_init(&c->fft256,  7, 0);
-    ff_fft_init(&c->fft512,  8, 1);
-    ff_fft_init(&c->fft1024, 9, 1);
+    scale = 1.0 / (1024*32768);
+    if ((ret = av_tx_init(&c->mdct, &c->mdct_fn, AV_TX_FLOAT_MDCT, 1, 1024, &scale, 0)) < 0)
+        return ret;
+
+    scale = 1.0 / (512*32768);
+    if ((ret = av_tx_init(&c->mdct_half, &c->mdct_half_fn, AV_TX_FLOAT_MDCT, 1, 512, &scale, 0)) < 0)
+        return ret;
+
+    scale = 1.0 / (128*32768);
+    if ((ret = av_tx_init(&c->mdct_small, &c->mdct_small_fn, AV_TX_FLOAT_MDCT, 1, 128, &scale, 0)) < 0)
+        return ret;
+
+    if ((ret = av_tx_init(&c->fft1024, &c->fft1024_fn, AV_TX_FLOAT_FFT, 1, 1024, NULL, 0)) < 0)
+        return ret;
+    if ((ret = av_tx_init(&c->fft512, &c->fft512_fn, AV_TX_FLOAT_FFT, 1, 512, NULL, 0)) < 0)
+        return ret;
+    if ((ret = av_tx_init(&c->fft256, &c->fft256_fn, AV_TX_FLOAT_FFT, 0, 256, NULL, 0)) < 0)
+        return ret;
+    if ((ret = av_tx_init(&c->fft128, &c->fft128_fn, AV_TX_FLOAT_FFT, 0, 128, NULL, 0)) < 0)
+        return ret;
+
     c->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
     if (!c->fdsp)
         return AVERROR(ENOMEM);
@@ -988,13 +995,13 @@ static av_cold int on2avc_decode_close(AVCodecContext *avctx)
 {
     On2AVCContext *c = avctx->priv_data;
 
-    ff_mdct_end(&c->mdct);
-    ff_mdct_end(&c->mdct_half);
-    ff_mdct_end(&c->mdct_small);
-    ff_fft_end(&c->fft128);
-    ff_fft_end(&c->fft256);
-    ff_fft_end(&c->fft512);
-    ff_fft_end(&c->fft1024);
+    av_tx_uninit(&c->mdct);
+    av_tx_uninit(&c->mdct_half);
+    av_tx_uninit(&c->mdct_small);
+    av_tx_uninit(&c->fft128);
+    av_tx_uninit(&c->fft256);
+    av_tx_uninit(&c->fft512);
+    av_tx_uninit(&c->fft1024);
 
     av_freep(&c->fdsp);
 



More information about the ffmpeg-cvslog mailing list