summaryrefslogtreecommitdiff
path: root/libavutil/tx_priv.h
diff options
context:
space:
mode:
authorLynne <dev@lynne.ee>2019-07-27 18:54:20 +0100
committerLynne <dev@lynne.ee>2019-08-02 01:19:52 +0100
commit42e2319ba9b75c3ca55be7f18a0322ecb498ea97 (patch)
tree0ea27392acae99024413f7acf50e70d6f8034130 /libavutil/tx_priv.h
parentf60b1211b2aa7b6e8902d64072b678b4ccd87e54 (diff)
lavu/tx: add support for double precision FFT and MDCT
Simply moves and templates the actual transforms to support an additional data type. Unlike the float version, which is equal or better than libfftw3f, double precision output is bit identical with libfftw3.
Diffstat (limited to 'libavutil/tx_priv.h')
-rw-r--r--libavutil/tx_priv.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/libavutil/tx_priv.h b/libavutil/tx_priv.h
new file mode 100644
index 0000000000..94517b4b47
--- /dev/null
+++ b/libavutil/tx_priv.h
@@ -0,0 +1,105 @@
+/*
+ * 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 AVUTIL_TX_PRIV_H
+#define AVUTIL_TX_PRIV_H
+
+#include "tx.h"
+#include <stddef.h>
+#include "thread.h"
+#include "mem.h"
+#include "avassert.h"
+#include "attributes.h"
+
+#ifdef TX_FLOAT
+#define TX_NAME(x) x ## _float
+typedef float FFTSample;
+typedef AVComplexFloat FFTComplex;
+#elif defined(TX_DOUBLE)
+#define TX_NAME(x) x ## _double
+typedef double FFTSample;
+typedef AVComplexDouble FFTComplex;
+#else
+typedef void FFTComplex;
+#endif
+
+#if defined(TX_FLOAT) || defined(TX_DOUBLE)
+#define BF(x, y, a, b) do { \
+ x = (a) - (b); \
+ y = (a) + (b); \
+ } while (0)
+
+#define CMUL(dre, dim, are, aim, bre, bim) do { \
+ (dre) = (are) * (bre) - (aim) * (bim); \
+ (dim) = (are) * (bim) + (aim) * (bre); \
+ } while (0)
+#endif
+
+#define CMUL3(c, a, b) \
+ CMUL((c).re, (c).im, (a).re, (a).im, (b).re, (b).im)
+
+#define COSTABLE(size) \
+ DECLARE_ALIGNED(32, FFTSample, TX_NAME(ff_cos_##size))[size/2]
+
+/* Used by asm, reorder with care */
+struct AVTXContext {
+ int n; /* Nptwo part */
+ int m; /* Ptwo part */
+ int inv; /* Is inverted */
+ int type; /* Type */
+
+ FFTComplex *exptab; /* MDCT exptab */
+ FFTComplex *tmp; /* Temporary buffer needed for all compound transforms */
+ int *pfatab; /* Input/Output mapping for compound transforms */
+ int *revtab; /* Input mapping for power of two transforms */
+};
+
+/* Shared functions */
+int ff_tx_gen_compound_mapping(AVTXContext *s);
+int ff_tx_gen_ptwo_revtab(AVTXContext *s);
+
+/* Also used by SIMD init */
+static inline int split_radix_permutation(int i, int n, int inverse)
+{
+ int m;
+ if (n <= 2)
+ return i & 1;
+ m = n >> 1;
+ if (!(i & m))
+ return split_radix_permutation(i, m, inverse)*2;
+ m >>= 1;
+ if (inverse == !(i & m))
+ return split_radix_permutation(i, m, inverse)*4 + 1;
+ else
+ return split_radix_permutation(i, m, inverse)*4 - 1;
+}
+
+/* Templated functions */
+int ff_tx_init_mdct_fft_float(AVTXContext *s, av_tx_fn *tx,
+ enum AVTXType type, int inv, int len,
+ const void *scale, uint64_t flags);
+int ff_tx_init_mdct_fft_double(AVTXContext *s, av_tx_fn *tx,
+ enum AVTXType type, int inv, int len,
+ const void *scale, uint64_t flags);
+
+typedef struct CosTabsInitOnce {
+ void (*func)(void);
+ AVOnce control;
+} CosTabsInitOnce;
+
+#endif /* AVUTIL_TX_PRIV_H */