Add support for hard-coded MDCT-related ff_sine_windows tables.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Sat, 9 Jan 2010 13:28:04 +0000 (13:28 +0000)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Sat, 9 Jan 2010 13:28:04 +0000 (13:28 +0000)
Originally committed as revision 21108 to svn://svn.ffmpeg.org/ffmpeg/trunk

14 files changed:
libavcodec/Makefile
libavcodec/aac.c
libavcodec/aacenc.c
libavcodec/atrac1.c
libavcodec/dsputil.h
libavcodec/mdct.c
libavcodec/mdct_tablegen.c [new file with mode: 0644]
libavcodec/mdct_tablegen.h [new file with mode: 0644]
libavcodec/nellymoserdec.c
libavcodec/tableprint.c
libavcodec/tableprint.h
libavcodec/twinvq.c
libavcodec/wma.c
libavcodec/wmaprodec.c

index 7ff5c45..a08c75f 100644 (file)
@@ -697,6 +697,7 @@ $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF)
        ./$< > $@
 
 ifdef CONFIG_HARDCODED_TABLES
+$(SUBDIR)mdct.o: $(SUBDIR)mdct_tables.h
 $(SUBDIR)mpegaudiodec.o: $(SUBDIR)mpegaudio_tables.h
 $(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h
 endif
index 19b3153..2bb05b8 100644 (file)
@@ -552,8 +552,8 @@ static av_cold int aac_decode_init(AVCodecContext *avccontext)
     // window initialization
     ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
     ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
-    ff_sine_window_init(ff_sine_1024, 1024);
-    ff_sine_window_init(ff_sine_128, 128);
+    ff_init_ff_sine_windows(10);
+    ff_init_ff_sine_windows( 7);
 
     return 0;
 }
index ce102b6..d32ae5e 100644 (file)
@@ -178,8 +178,8 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
     // window init
     ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
     ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
-    ff_sine_window_init(ff_sine_1024, 1024);
-    ff_sine_window_init(ff_sine_128, 128);
+    ff_init_ff_sine_windows(10);
+    ff_init_ff_sine_windows(7);
 
     s->samples            = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0]));
     s->cpe                = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]);
index 2009bba..6477cff 100644 (file)
@@ -339,7 +339,7 @@ static av_cold int atrac1_decode_init(AVCodecContext *avctx)
     ff_mdct_init(&q->mdct_ctx[1], 8, 1, -1.0/ (1 << 15));
     ff_mdct_init(&q->mdct_ctx[2], 9, 1, -1.0/ (1 << 15));
 
-    ff_sine_window_init(ff_sine_32, 32);
+    ff_init_ff_sine_windows(5);
 
     atrac_generate_tables();
 
index e483276..7b218ac 100644 (file)
@@ -741,15 +741,19 @@ typedef struct FFTContext {
 #if CONFIG_HARDCODED_TABLES
 #define COSTABLE_CONST const
 #define SINTABLE_CONST const
+#define SINETABLE_CONST const
 #else
 #define COSTABLE_CONST
 #define SINTABLE_CONST
+#define SINETABLE_CONST
 #endif
 
 #define COSTABLE(size) \
     COSTABLE_CONST DECLARE_ALIGNED_16(FFTSample, ff_cos_##size[size/2])
 #define SINTABLE(size) \
     SINTABLE_CONST DECLARE_ALIGNED_16(FFTSample, ff_sin_##size[size/2])
+#define SINETABLE(size) \
+    SINETABLE_CONST DECLARE_ALIGNED_16(float, ff_sine_##size[size])
 extern COSTABLE(16);
 extern COSTABLE(32);
 extern COSTABLE(64);
@@ -846,15 +850,19 @@ void ff_kbd_window_init(float *window, float alpha, int n);
  * @param   n       size of half window
  */
 void ff_sine_window_init(float *window, int n);
-extern float ff_sine_32  [  32];
-extern float ff_sine_64  [  64];
-extern float ff_sine_128 [ 128];
-extern float ff_sine_256 [ 256];
-extern float ff_sine_512 [ 512];
-extern float ff_sine_1024[1024];
-extern float ff_sine_2048[2048];
-extern float ff_sine_4096[4096];
-extern float * const ff_sine_windows[13];
+/**
+ * initialize the specified entry of ff_sine_windows
+ */
+void ff_init_ff_sine_windows(int index);
+extern SINETABLE(  32);
+extern SINETABLE(  64);
+extern SINETABLE( 128);
+extern SINETABLE( 256);
+extern SINETABLE( 512);
+extern SINETABLE(1024);
+extern SINETABLE(2048);
+extern SINETABLE(4096);
+extern SINETABLE_CONST float * const ff_sine_windows[13];
 
 int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale);
 void ff_imdct_calc_c(FFTContext *s, FFTSample *output, const FFTSample *input);
index a2b9e8b..8734bdc 100644 (file)
@@ -48,26 +48,7 @@ av_cold void ff_kbd_window_init(float *window, float alpha, int n)
        window[i] = sqrt(local_window[i] / sum);
 }
 
-DECLARE_ALIGNED(16, float, ff_sine_32  [  32]);
-DECLARE_ALIGNED(16, float, ff_sine_64  [  64]);
-DECLARE_ALIGNED(16, float, ff_sine_128 [ 128]);
-DECLARE_ALIGNED(16, float, ff_sine_256 [ 256]);
-DECLARE_ALIGNED(16, float, ff_sine_512 [ 512]);
-DECLARE_ALIGNED(16, float, ff_sine_1024[1024]);
-DECLARE_ALIGNED(16, float, ff_sine_2048[2048]);
-DECLARE_ALIGNED(16, float, ff_sine_4096[4096]);
-float * const ff_sine_windows[] = {
-    NULL, NULL, NULL, NULL, NULL, // unused
-    ff_sine_32 , ff_sine_64 ,
-    ff_sine_128, ff_sine_256, ff_sine_512, ff_sine_1024, ff_sine_2048, ff_sine_4096
-};
-
-// Generate a sine window.
-av_cold void ff_sine_window_init(float *window, int n) {
-    int i;
-    for(i = 0; i < n; i++)
-        window[i] = sinf((i + 0.5) * (M_PI / (2.0 * n)));
-}
+#include "mdct_tablegen.h"
 
 /**
  * init MDCT or IMDCT computation.
diff --git a/libavcodec/mdct_tablegen.c b/libavcodec/mdct_tablegen.c
new file mode 100644 (file)
index 0000000..f04502f
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Generate a header file for hardcoded MDCT tables
+ *
+ * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
+ *
+ * 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
+ */
+
+#include <stdlib.h>
+#define CONFIG_HARDCODED_TABLES 0
+#define av_cold
+#define SINETABLE_CONST
+#define SINETABLE(size) \
+    float ff_sine_##size[size]
+#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+#include "mdct_tablegen.h"
+#include "tableprint.h"
+
+void tableinit(void)
+{
+    int i;
+    for (i = 5; i <= 12; i++)
+        ff_init_ff_sine_windows(i);
+}
+
+#define SINE_TABLE_DEF(size) \
+    { \
+        "SINETABLE("#size")", \
+        write_float_array, \
+        ff_sine_##size, \
+        size \
+    },
+
+const struct tabledef tables[] = {
+    SINE_TABLE_DEF(  32)
+    SINE_TABLE_DEF(  64)
+    SINE_TABLE_DEF( 128)
+    SINE_TABLE_DEF( 256)
+    SINE_TABLE_DEF( 512)
+    SINE_TABLE_DEF(1024)
+    SINE_TABLE_DEF(2048)
+    SINE_TABLE_DEF(4096)
+    { NULL }
+};
diff --git a/libavcodec/mdct_tablegen.h b/libavcodec/mdct_tablegen.h
new file mode 100644 (file)
index 0000000..30a517c
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Header file for hardcoded MDCT tables
+ *
+ * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
+ *
+ * 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
+ */
+
+#include <assert.h>
+// do not use libavutil/mathematics.h since this is compiled both
+// for the host and the target and config.h is only valid for the target
+#include <math.h>
+
+#if !CONFIG_HARDCODED_TABLES
+SINETABLE(  32);
+SINETABLE(  64);
+SINETABLE( 128);
+SINETABLE( 256);
+SINETABLE( 512);
+SINETABLE(1024);
+SINETABLE(2048);
+SINETABLE(4096);
+#else
+#include "mdct_tables.h"
+#endif
+
+SINETABLE_CONST float * const ff_sine_windows[] = {
+    NULL, NULL, NULL, NULL, NULL, // unused
+    ff_sine_32 , ff_sine_64 ,
+    ff_sine_128, ff_sine_256, ff_sine_512, ff_sine_1024, ff_sine_2048, ff_sine_4096
+};
+
+// Generate a sine window.
+av_cold void ff_sine_window_init(float *window, int n) {
+    int i;
+    for(i = 0; i < n; i++)
+        window[i] = sinf((i + 0.5) * (M_PI / (2.0 * n)));
+}
+
+av_cold void ff_init_ff_sine_windows(int index) {
+    assert(index >= 0 && index < FF_ARRAY_ELEMS(ff_sine_windows));
+#if !CONFIG_HARDCODED_TABLES
+    ff_sine_window_init(ff_sine_windows[index], 1 << index);
+#endif
+}
index 8ed4298..9c36141 100644 (file)
@@ -144,7 +144,7 @@ static av_cold int decode_init(AVCodecContext * avctx) {
 
     /* Generate overlap window */
     if (!ff_sine_128[127])
-        ff_sine_window_init(ff_sine_128, 128);
+        ff_init_ff_sine_windows(7);
 
     avctx->sample_fmt = SAMPLE_FMT_S16;
     avctx->channel_layout = CH_LAYOUT_MONO;
index 4f94c6a..d715fd7 100644 (file)
@@ -39,6 +39,7 @@ void write_##name##_array(const void *arg, int len, int dummy)\
 
 WRITE_1D_FUNC(int8,   int8_t,   "%3"PRIi8, 15)
 WRITE_1D_FUNC(uint32, uint32_t, "0x%08"PRIx32, 7)
+WRITE_1D_FUNC(float,  float,    "%.18e", 3)
 
 #define WRITE_2D_FUNC(name, type)\
 void write_##name##_2d_array(const void *arg, int len, int len2)\
index e73a9e2..706e296 100644 (file)
@@ -32,6 +32,7 @@
  */
 void write_int8_array     (const void *, int, int);
 void write_uint32_array   (const void *, int, int);
+void write_float_array    (const void *, int, int);
 void write_int8_2d_array  (const void *, int, int);
 void write_uint32_2d_array(const void *, int, int);
 /** \} */ // end of printfuncs group
index 7131584..f107372 100644 (file)
@@ -893,9 +893,9 @@ static av_cold void init_mdct_win(TwinContext *tctx)
     }
 
 
-    ff_sine_window_init(ff_sine_windows[av_log2(size_m)    ], size_m  );
-    ff_sine_window_init(ff_sine_windows[av_log2(size_s/2)  ], size_s/2);
-    ff_sine_window_init(ff_sine_windows[av_log2(mtab->size)], mtab->size);
+    ff_init_ff_sine_windows(av_log2(size_m));
+    ff_init_ff_sine_windows(av_log2(size_s/2));
+    ff_init_ff_sine_windows(av_log2(mtab->size));
 }
 
 /**
index 9b2588f..3322d0e 100644 (file)
@@ -343,9 +343,7 @@ int ff_wma_init(AVCodecContext *avctx, int flags2)
 
     /* init MDCT windows : simple sinus window */
     for (i = 0; i < s->nb_block_sizes; i++) {
-        int n;
-        n = 1 << (s->frame_len_bits - i);
-        ff_sine_window_init(ff_sine_windows[s->frame_len_bits - i], n);
+        ff_init_ff_sine_windows(s->frame_len_bits - i);
         s->windows[i] = ff_sine_windows[s->frame_len_bits - i];
     }
 
index cbc97d9..dee47e0 100644 (file)
@@ -425,9 +425,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
 
     /** init MDCT windows: simple sinus window */
     for (i = 0; i < WMAPRO_BLOCK_SIZES; i++) {
-        const int n       = 1 << (WMAPRO_BLOCK_MAX_BITS - i);
         const int win_idx = WMAPRO_BLOCK_MAX_BITS - i;
-        ff_sine_window_init(ff_sine_windows[win_idx], n);
+        ff_init_ff_sine_windows(win_idx);
         s->windows[WMAPRO_BLOCK_SIZES - i - 1] = ff_sine_windows[win_idx];
     }