[FFmpeg-cvslog] avcodec/aac_tablegen: get rid of hardcoded tables entirely

Ganesh Ajjanagadde git at videolan.org
Sat Nov 28 15:44:21 CET 2015


ffmpeg | branch: master | Ganesh Ajjanagadde <gajjanagadde at gmail.com> | Fri Nov 27 17:01:49 2015 -0500| [79abf2d0ded860acf505de22c4f7a750e5e98446] | committer: Ganesh Ajjanagadde

avcodec/aac_tablegen: get rid of hardcoded tables entirely

Commit 96786a12f6df26990bbe7c0ca4592b3731724469 makes runtime
initialization cheap.

Tested with FATE, with/without --enable-hardcoded-tables.

Reviewed-by: Rostislav Pehlivanov <atomnuker at gmail.com>
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=79abf2d0ded860acf505de22c4f7a750e5e98446
---

 libavcodec/Makefile            |    7 +---
 libavcodec/aac.h               |    2 +
 libavcodec/aac_tablegen.c      |   39 -------------------
 libavcodec/aac_tablegen.h      |   82 ----------------------------------------
 libavcodec/aac_tablegen_decl.h |   38 -------------------
 libavcodec/aaccoder.c          |    1 -
 libavcodec/aaccoder_trellis.h  |    2 -
 libavcodec/aaccoder_twoloop.h  |    1 -
 libavcodec/aacenc_utils.h      |    2 +-
 libavcodec/aactab.c            |    4 +-
 libavcodec/aactab.h            |   50 +++++++++++++++++++++++-
 11 files changed, 57 insertions(+), 171 deletions(-)

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 68a573f..d85215d 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -920,7 +920,6 @@ SLIBOBJS-$(HAVE_GNU_WINDRES)           += avcodecres.o
 
 SKIPHEADERS                            += %_tablegen.h                  \
                                           %_tables.h                    \
-                                          aac_tablegen_decl.h           \
                                           fft-internal.h                \
                                           tableprint.h                  \
                                           tableprint_vlc.h              \
@@ -964,8 +963,7 @@ TESTOBJS = dctref.o
 
 TOOLS = fourcc2pixfmt
 
-HOSTPROGS = aac_tablegen                                                \
-            aacps_tablegen                                              \
+HOSTPROGS = aacps_tablegen                                              \
             aacps_fixed_tablegen                                        \
             aacsbr_tablegen                                             \
             aacsbr_fixed_tablegen                                       \
@@ -999,7 +997,7 @@ $(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
 endif
 
 GEN_HEADERS = cbrt_tables.h cbrt_fixed_tables.h aacps_tables.h aacps_fixed_tables.h aacsbr_tables.h \
-              aacsbr_fixed_tables.h aac_tables.h dsd_tables.h dv_tables.h     \
+              aacsbr_fixed_tables.h dsd_tables.h dv_tables.h     \
               sinewin_tables.h sinewin_fixed_tables.h mpegaudio_tables.h motionpixels_tables.h \
               pcm_tables.h qdm2_tables.h
 GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS))
@@ -1014,7 +1012,6 @@ $(SUBDIR)aacps_float.o: $(SUBDIR)aacps_tables.h
 $(SUBDIR)aacps_fixed.o: $(SUBDIR)aacps_fixed_tables.h
 $(SUBDIR)aacsbr.o: $(SUBDIR)aacsbr_tables.h
 $(SUBDIR)aacsbr_fixed.o: $(SUBDIR)aacsbr_fixed_tables.h
-$(SUBDIR)aactab.o: $(SUBDIR)aac_tables.h
 $(SUBDIR)aactab_fixed.o: $(SUBDIR)aac_fixed_tables.h
 $(SUBDIR)dsddec.o: $(SUBDIR)dsd_tables.h
 $(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h
diff --git a/libavcodec/aac.h b/libavcodec/aac.h
index 3333bfe..b1f4aa7 100644
--- a/libavcodec/aac.h
+++ b/libavcodec/aac.h
@@ -151,6 +151,8 @@ typedef struct PredictorState {
 #define SCALE_MAX_DIFF   60    ///< maximum scalefactor difference allowed by standard
 #define SCALE_DIFF_ZERO  60    ///< codebook index corresponding to zero scalefactor indices difference
 
+#define POW_SF2_ZERO    200    ///< ff_aac_pow2sf_tab index corresponding to pow(2, 0);
+
 #define NOISE_PRE       256    ///< preamble for NOISE_BT, put in bitstream with the first noise band
 #define NOISE_PRE_BITS    9    ///< length of preamble
 #define NOISE_OFFSET     90    ///< subtracted from global gain, used as offset for the preamble
diff --git a/libavcodec/aac_tablegen.c b/libavcodec/aac_tablegen.c
deleted file mode 100644
index 2d13211..0000000
--- a/libavcodec/aac_tablegen.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Generate a header file for hardcoded AAC tables
- *
- * Copyright (c) 2010 Alex Converse <alex.converse at gmail.com>
- *
- * 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
-#include "aac_tablegen.h"
-#include "tableprint.h"
-
-int main(void)
-{
-    ff_aac_tableinit();
-
-    write_fileheader();
-
-    WRITE_ARRAY("const", float, ff_aac_pow2sf_tab);
-
-    WRITE_ARRAY("const", float, ff_aac_pow34sf_tab);
-
-    return 0;
-}
diff --git a/libavcodec/aac_tablegen.h b/libavcodec/aac_tablegen.h
deleted file mode 100644
index e7d96d5..0000000
--- a/libavcodec/aac_tablegen.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Header file for hardcoded AAC tables
- *
- * Copyright (c) 2010 Alex Converse <alex.converse at gmail.com>
- *
- * 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 AVCODEC_AAC_TABLEGEN_H
-#define AVCODEC_AAC_TABLEGEN_H
-
-#include "aac_tablegen_decl.h"
-
-#if CONFIG_HARDCODED_TABLES
-#include "libavcodec/aac_tables.h"
-#else
-#include "libavutil/mathematics.h"
-float ff_aac_pow2sf_tab[428];
-float ff_aac_pow34sf_tab[428];
-
-av_cold void ff_aac_tableinit(void)
-{
-    int i;
-
-    /* 2^(i/16) for 0 <= i <= 15 */
-    static const float exp2_lut[] = {
-        1.00000000000000000000,
-        1.04427378242741384032,
-        1.09050773266525765921,
-        1.13878863475669165370,
-        1.18920711500272106672,
-        1.24185781207348404859,
-        1.29683955465100966593,
-        1.35425554693689272830,
-        1.41421356237309504880,
-        1.47682614593949931139,
-        1.54221082540794082361,
-        1.61049033194925430818,
-        1.68179283050742908606,
-        1.75625216037329948311,
-        1.83400808640934246349,
-        1.91520656139714729387,
-    };
-    float t1 = 8.8817841970012523233890533447265625e-16; // 2^(-50)
-    float t2 = 3.63797880709171295166015625e-12; // 2^(-38)
-    int t1_inc_cur, t2_inc_cur;
-    int t1_inc_prev = 0;
-    int t2_inc_prev = 8;
-
-    for (i = 0; i < 428; i++) {
-        t1_inc_cur = 4 * (i % 4);
-        t2_inc_cur = (8 + 3*i) % 16;
-        if (t1_inc_cur < t1_inc_prev)
-            t1 *= 2;
-        if (t2_inc_cur < t2_inc_prev)
-            t2 *= 2;
-        // A much more efficient and accurate way of doing:
-        // ff_aac_pow2sf_tab[i] = pow(2, (i - POW_SF2_ZERO) / 4.0);
-        // ff_aac_pow34sf_tab[i] = pow(ff_aac_pow2sf_tab[i], 3.0/4.0);
-        ff_aac_pow2sf_tab[i] = t1 * exp2_lut[t1_inc_cur];
-        ff_aac_pow34sf_tab[i] = t2 * exp2_lut[t2_inc_cur];
-        t1_inc_prev = t1_inc_cur;
-        t2_inc_prev = t2_inc_cur;
-    }
-}
-#endif /* CONFIG_HARDCODED_TABLES */
-
-#endif /* AVCODEC_AAC_TABLEGEN_H */
diff --git a/libavcodec/aac_tablegen_decl.h b/libavcodec/aac_tablegen_decl.h
deleted file mode 100644
index ef86f85..0000000
--- a/libavcodec/aac_tablegen_decl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Header file for hardcoded AAC tables
- *
- * Copyright (c) 2010 Alex Converse <alex.converse at gmail.com>
- *
- * 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 AVCODEC_AAC_TABLEGEN_DECL_H
-#define AVCODEC_AAC_TABLEGEN_DECL_H
-
-#define POW_SF2_ZERO    200    ///< ff_aac_pow2sf_tab index corresponding to pow(2, 0);
-
-#if CONFIG_HARDCODED_TABLES
-#define ff_aac_tableinit()
-extern const float ff_aac_pow2sf_tab[428];
-extern const float ff_aac_pow34sf_tab[428];
-#else
-void ff_aac_tableinit(void);
-extern       float ff_aac_pow2sf_tab[428];
-extern       float ff_aac_pow34sf_tab[428];
-#endif /* CONFIG_HARDCODED_TABLES */
-
-#endif /* AVCODEC_AAC_TABLEGEN_DECL_H */
diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c
index 2337784..2a66045 100644
--- a/libavcodec/aaccoder.c
+++ b/libavcodec/aaccoder.c
@@ -44,7 +44,6 @@
 #include "aacenctab.h"
 #include "aacenc_utils.h"
 #include "aacenc_quantization.h"
-#include "aac_tablegen_decl.h"
 
 #include "aacenc_is.h"
 #include "aacenc_tns.h"
diff --git a/libavcodec/aaccoder_trellis.h b/libavcodec/aaccoder_trellis.h
index 6187692..0230052 100644
--- a/libavcodec/aaccoder_trellis.h
+++ b/libavcodec/aaccoder_trellis.h
@@ -45,8 +45,6 @@
 #include "aacenc.h"
 #include "aactab.h"
 #include "aacenctab.h"
-#include "aac_tablegen_decl.h"
-
 
 /**
  * structure used in optimal codebook search
diff --git a/libavcodec/aaccoder_twoloop.h b/libavcodec/aaccoder_twoloop.h
index a47cd66..d4290b4 100644
--- a/libavcodec/aaccoder_twoloop.h
+++ b/libavcodec/aaccoder_twoloop.h
@@ -49,7 +49,6 @@
 #include "aacenc.h"
 #include "aactab.h"
 #include "aacenctab.h"
-#include "aac_tablegen_decl.h"
 
 /** Frequency in Hz for lower limit of noise substitution **/
 #define NOISE_LOW_LIMIT 4000
diff --git a/libavcodec/aacenc_utils.h b/libavcodec/aacenc_utils.h
index 12ff797..40e1746 100644
--- a/libavcodec/aacenc_utils.h
+++ b/libavcodec/aacenc_utils.h
@@ -29,8 +29,8 @@
 #define AVCODEC_AACENC_UTILS_H
 
 #include "aac.h"
-#include "aac_tablegen_decl.h"
 #include "aacenctab.h"
+#include "aactab.h"
 
 #define ROUND_STANDARD 0.4054f
 #define ROUND_TO_ZERO 0.1054f
diff --git a/libavcodec/aactab.c b/libavcodec/aactab.c
index dc9acc1..77d8732 100644
--- a/libavcodec/aactab.c
+++ b/libavcodec/aactab.c
@@ -29,10 +29,12 @@
 
 #include "libavutil/mem.h"
 #include "aac.h"
-#include "aac_tablegen.h"
 
 #include <stdint.h>
 
+float ff_aac_pow2sf_tab[428];
+float ff_aac_pow34sf_tab[428];
+
 DECLARE_ALIGNED(32, float,  ff_aac_kbd_long_1024)[1024];
 DECLARE_ALIGNED(32, float,  ff_aac_kbd_short_128)[128];
 DECLARE_ALIGNED(32, int,    ff_aac_kbd_long_1024_fixed)[1024];
diff --git a/libavcodec/aactab.h b/libavcodec/aactab.h
index 321c5d3..b48e7da 100644
--- a/libavcodec/aactab.h
+++ b/libavcodec/aactab.h
@@ -32,7 +32,6 @@
 
 #include "libavutil/mem.h"
 #include "aac.h"
-#include "aac_tablegen_decl.h"
 
 #include <stdint.h>
 
@@ -40,6 +39,55 @@
  * Tables in this file are shared by the AAC decoders and encoder
  */
 
+extern float ff_aac_pow2sf_tab[428];
+extern float ff_aac_pow34sf_tab[428];
+
+static inline void ff_aac_tableinit(void)
+{
+    int i;
+
+    /* 2^(i/16) for 0 <= i <= 15 */
+    static const float exp2_lut[] = {
+        1.00000000000000000000,
+        1.04427378242741384032,
+        1.09050773266525765921,
+        1.13878863475669165370,
+        1.18920711500272106672,
+        1.24185781207348404859,
+        1.29683955465100966593,
+        1.35425554693689272830,
+        1.41421356237309504880,
+        1.47682614593949931139,
+        1.54221082540794082361,
+        1.61049033194925430818,
+        1.68179283050742908606,
+        1.75625216037329948311,
+        1.83400808640934246349,
+        1.91520656139714729387,
+    };
+    float t1 = 8.8817841970012523233890533447265625e-16; // 2^(-50)
+    float t2 = 3.63797880709171295166015625e-12; // 2^(-38)
+    int t1_inc_cur, t2_inc_cur;
+    int t1_inc_prev = 0;
+    int t2_inc_prev = 8;
+
+    for (i = 0; i < 428; i++) {
+        t1_inc_cur = 4 * (i % 4);
+        t2_inc_cur = (8 + 3*i) % 16;
+        if (t1_inc_cur < t1_inc_prev)
+            t1 *= 2;
+        if (t2_inc_cur < t2_inc_prev)
+            t2 *= 2;
+        // A much more efficient and accurate way of doing:
+        // ff_aac_pow2sf_tab[i] = pow(2, (i - POW_SF2_ZERO) / 4.0);
+        // ff_aac_pow34sf_tab[i] = pow(ff_aac_pow2sf_tab[i], 3.0/4.0);
+        ff_aac_pow2sf_tab[i] = t1 * exp2_lut[t1_inc_cur];
+        ff_aac_pow34sf_tab[i] = t2 * exp2_lut[t2_inc_cur];
+        t1_inc_prev = t1_inc_cur;
+        t2_inc_prev = t2_inc_cur;
+    }
+}
+
 /* @name ltp_coef
  * Table of the LTP coefficients
  */



More information about the ffmpeg-cvslog mailing list