// do not use libavutil/libm.h since this is compiled both
// for the host and the target and config.h is only valid for the target
#include <math.h>
-#include "libavcodec/aac_defines.h"
#include "libavutil/attributes.h"
#include "libavutil/common.h"
-#if !USE_FIXED
-SINETABLE120960(120);
-SINETABLE120960(960);
-#endif
#if !CONFIG_HARDCODED_TABLES
+#ifndef BUILD_TABLES
+#include "libavutil/thread.h"
+#endif
+
SINETABLE( 32);
SINETABLE( 64);
SINETABLE( 128);
SINETABLE(4096);
SINETABLE(8192);
#else
-#if USE_FIXED
-#include "libavcodec/sinewin_fixed_tables.h"
-#else
#include "libavcodec/sinewin_tables.h"
#endif
-#endif
-#if USE_FIXED
-#define SIN_FIX(a) (int)floor((a) * 0x80000000 + 0.5)
-#else
-#define SIN_FIX(a) a
-#endif
-
-SINETABLE_CONST INTFLOAT * const AAC_RENAME(ff_sine_windows)[] = {
+SINETABLE_CONST float *const ff_sine_windows[] = {
NULL, NULL, NULL, NULL, NULL, // unused
- AAC_RENAME(ff_sine_32) , AAC_RENAME(ff_sine_64), AAC_RENAME(ff_sine_128),
- AAC_RENAME(ff_sine_256), AAC_RENAME(ff_sine_512), AAC_RENAME(ff_sine_1024),
- AAC_RENAME(ff_sine_2048), AAC_RENAME(ff_sine_4096), AAC_RENAME(ff_sine_8192),
+ ff_sine_32, ff_sine_64, ff_sine_128,
+ ff_sine_256, ff_sine_512, ff_sine_1024,
+ ff_sine_2048, ff_sine_4096, ff_sine_8192,
};
// Generate a sine window.
-av_cold void AAC_RENAME(ff_sine_window_init)(INTFLOAT *window, int n) {
+av_cold void ff_sine_window_init(float *window, int n)
+{
int i;
for(i = 0; i < n; i++)
- window[i] = SIN_FIX(sinf((i + 0.5) * (M_PI / (2.0 * n))));
+ window[i] = sinf((i + 0.5) * (M_PI / (2.0 * n)));
+}
+
+#if !CONFIG_HARDCODED_TABLES && !defined(BUILD_TABLES)
+#define INIT_FF_SINE_WINDOW_INIT_FUNC(index) \
+static void init_ff_sine_window_ ## index(void) \
+{ \
+ ff_sine_window_init(ff_sine_windows[index], 1 << index);\
}
-av_cold void AAC_RENAME(ff_init_ff_sine_windows)(int index) {
- assert(index >= 0 && index < FF_ARRAY_ELEMS(AAC_RENAME(ff_sine_windows)));
+INIT_FF_SINE_WINDOW_INIT_FUNC(5)
+INIT_FF_SINE_WINDOW_INIT_FUNC(6)
+INIT_FF_SINE_WINDOW_INIT_FUNC(7)
+INIT_FF_SINE_WINDOW_INIT_FUNC(8)
+INIT_FF_SINE_WINDOW_INIT_FUNC(9)
+INIT_FF_SINE_WINDOW_INIT_FUNC(10)
+INIT_FF_SINE_WINDOW_INIT_FUNC(11)
+INIT_FF_SINE_WINDOW_INIT_FUNC(12)
+INIT_FF_SINE_WINDOW_INIT_FUNC(13)
+
+static void (*const sine_window_init_func_array[])(void) = {
+ init_ff_sine_window_5,
+ init_ff_sine_window_6,
+ init_ff_sine_window_7,
+ init_ff_sine_window_8,
+ init_ff_sine_window_9,
+ init_ff_sine_window_10,
+ init_ff_sine_window_11,
+ init_ff_sine_window_12,
+ init_ff_sine_window_13,
+};
+
+static AVOnce init_sine_window_once[9] = {
+ AV_ONCE_INIT, AV_ONCE_INIT, AV_ONCE_INIT, AV_ONCE_INIT, AV_ONCE_INIT,
+ AV_ONCE_INIT, AV_ONCE_INIT, AV_ONCE_INIT, AV_ONCE_INIT
+};
+#endif
+
+av_cold void ff_init_ff_sine_windows(int index)
+{
+ assert(index >= 5 && index < FF_ARRAY_ELEMS(ff_sine_windows));
#if !CONFIG_HARDCODED_TABLES
- AAC_RENAME(ff_sine_window_init)(AAC_RENAME(ff_sine_windows)[index], 1 << index);
+#ifdef BUILD_TABLES
+ ff_sine_window_init(ff_sine_windows[index], 1 << index);
+#else
+ ff_thread_once(&init_sine_window_once[index - 5], sine_window_init_func_array[index - 5]);
+#endif
#endif
}