From 2881c83127c680defd1d596200897dd6b6db7977 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A5ns=20Rullg=C3=A5rd?= <mans@mansr.com>
Date: Sat, 20 Mar 2010 21:27:03 +0000
Subject: Call rdft by function pointer

Call the RDFT by a function pointer like other FFT related transforms.
This makes instruction set optimized versions possible.

Based on patch by Alex Converse.

Originally committed as revision 22609 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavcodec/fft.h  | 7 ++++++-
 libavcodec/rdft.c | 8 +++-----
 2 files changed, 9 insertions(+), 6 deletions(-)

(limited to 'libavcodec')

diff --git a/libavcodec/fft.h b/libavcodec/fft.h
index 636f76b824..0c13bb634a 100644
--- a/libavcodec/fft.h
+++ b/libavcodec/fft.h
@@ -196,6 +196,7 @@ struct RDFTContext {
     const FFTSample *tcos;
     SINTABLE_CONST FFTSample *tsin;
     FFTContext fft;
+    void (*rdft_calc)(struct RDFTContext *s, FFTSample *z);
 };
 
 /**
@@ -204,9 +205,13 @@ struct RDFTContext {
  * @param trans           the type of transform
  */
 int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans);
-void ff_rdft_calc(RDFTContext *s, FFTSample *data);
 void ff_rdft_end(RDFTContext *s);
 
+static av_always_inline void ff_rdft_calc(RDFTContext *s, FFTSample *data)
+{
+    s->rdft_calc(s, data);
+}
+
 /* Discrete Cosine Transform */
 
 struct DCTContext {
diff --git a/libavcodec/rdft.c b/libavcodec/rdft.c
index 8d0167798f..0bab696f82 100644
--- a/libavcodec/rdft.c
+++ b/libavcodec/rdft.c
@@ -50,6 +50,8 @@ SINTABLE_CONST FFTSample * const ff_sin_tabs[] = {
     ff_sin_2048, ff_sin_4096, ff_sin_8192, ff_sin_16384, ff_sin_32768, ff_sin_65536,
 };
 
+static void ff_rdft_calc_c(RDFTContext* s, FFTSample* data);
+
 av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
 {
     int n = 1 << nbits;
@@ -74,6 +76,7 @@ av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
         s->tsin[i] = sin(i*theta);
     }
 #endif
+    s->rdft_calc   = ff_rdft_calc_c;
     return 0;
 }
 
@@ -123,11 +126,6 @@ static void ff_rdft_calc_c(RDFTContext* s, FFTSample* data)
     }
 }
 
-void ff_rdft_calc(RDFTContext *s, FFTSample *data)
-{
-    ff_rdft_calc_c(s, data);
-}
-
 av_cold void ff_rdft_end(RDFTContext *s)
 {
     ff_fft_end(&s->fft);
-- 
cgit v1.2.3