summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/libopus/celt/kiss_fft.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/kiss_fft.h')
-rw-r--r--lib/rbcodec/codecs/libopus/celt/kiss_fft.h67
1 files changed, 62 insertions, 5 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/kiss_fft.h b/lib/rbcodec/codecs/libopus/celt/kiss_fft.h
index 390b54d948..bffa2bfad6 100644
--- a/lib/rbcodec/codecs/libopus/celt/kiss_fft.h
+++ b/lib/rbcodec/codecs/libopus/celt/kiss_fft.h
@@ -32,6 +32,7 @@
32#include <stdlib.h> 32#include <stdlib.h>
33#include <math.h> 33#include <math.h>
34#include "arch.h" 34#include "arch.h"
35#include "cpu_support.h"
35 36
36#ifdef __cplusplus 37#ifdef __cplusplus
37extern "C" { 38extern "C" {
@@ -77,6 +78,11 @@ typedef struct {
77 4*4*4*2 78 4*4*4*2
78 */ 79 */
79 80
81typedef struct arch_fft_state{
82 int is_supported;
83 void *priv;
84} arch_fft_state;
85
80typedef struct kiss_fft_state{ 86typedef struct kiss_fft_state{
81 int nfft; 87 int nfft;
82 opus_val16 scale; 88 opus_val16 scale;
@@ -87,8 +93,13 @@ typedef struct kiss_fft_state{
87 opus_int16 factors[2*MAXFACTORS]; 93 opus_int16 factors[2*MAXFACTORS];
88 const opus_int16 *bitrev; 94 const opus_int16 *bitrev;
89 const kiss_twiddle_cpx *twiddles; 95 const kiss_twiddle_cpx *twiddles;
96 arch_fft_state *arch_fft;
90} kiss_fft_state; 97} kiss_fft_state;
91 98
99#if defined(HAVE_ARM_NE10)
100#include "arm/fft_arm.h"
101#endif
102
92/*typedef struct kiss_fft_state* kiss_fft_cfg;*/ 103/*typedef struct kiss_fft_state* kiss_fft_cfg;*/
93 104
94/** 105/**
@@ -114,9 +125,9 @@ typedef struct kiss_fft_state{
114 * buffer size in *lenmem. 125 * buffer size in *lenmem.
115 * */ 126 * */
116 127
117kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base); 128kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base, int arch);
118 129
119kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem); 130kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch);
120 131
121/** 132/**
122 * opus_fft(cfg,in_out_buf) 133 * opus_fft(cfg,in_out_buf)
@@ -128,13 +139,59 @@ kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem);
128 * Note that each element is complex and can be accessed like 139 * Note that each element is complex and can be accessed like
129 f[k].r and f[k].i 140 f[k].r and f[k].i
130 * */ 141 * */
131void opus_fft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); 142void opus_fft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
132void opus_ifft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); 143void opus_ifft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
133 144
134void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); 145void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout);
135void opus_ifft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); 146void opus_ifft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout);
136 147
137void opus_fft_free(const kiss_fft_state *cfg); 148void opus_fft_free(const kiss_fft_state *cfg, int arch);
149
150
151void opus_fft_free_arch_c(kiss_fft_state *st);
152int opus_fft_alloc_arch_c(kiss_fft_state *st);
153
154#if !defined(OVERRIDE_OPUS_FFT)
155/* Is run-time CPU detection enabled on this platform? */
156#if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10))
157
158extern int (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])(
159 kiss_fft_state *st);
160
161#define opus_fft_alloc_arch(_st, arch) \
162 ((*OPUS_FFT_ALLOC_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st))
163
164extern void (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])(
165 kiss_fft_state *st);
166#define opus_fft_free_arch(_st, arch) \
167 ((*OPUS_FFT_FREE_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st))
168
169extern void (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg,
170 const kiss_fft_cpx *fin, kiss_fft_cpx *fout);
171#define opus_fft(_cfg, _fin, _fout, arch) \
172 ((*OPUS_FFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout))
173
174extern void (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg,
175 const kiss_fft_cpx *fin, kiss_fft_cpx *fout);
176#define opus_ifft(_cfg, _fin, _fout, arch) \
177 ((*OPUS_IFFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout))
178
179#else /* else for if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */
180
181#define opus_fft_alloc_arch(_st, arch) \
182 ((void)(arch), opus_fft_alloc_arch_c(_st))
183
184#define opus_fft_free_arch(_st, arch) \
185 ((void)(arch), opus_fft_free_arch_c(_st))
186
187#define opus_fft(_cfg, _fin, _fout, arch) \
188 ((void)(arch), opus_fft_c(_cfg, _fin, _fout))
189
190#define opus_ifft(_cfg, _fin, _fout, arch) \
191 ((void)(arch), opus_ifft_c(_cfg, _fin, _fout))
192
193#endif /* end if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */
194#endif /* end if !defined(OVERRIDE_OPUS_FFT) */
138 195
139#ifdef __cplusplus 196#ifdef __cplusplus
140} 197}