[FFmpeg-devel] [PATCH] aacsbr: support hardcoding tables.

Reimar Döffinger Reimar.Doeffinger at gmx.de
Sat Aug 30 17:29:36 CEST 2014


For sbr_qmf_window_us there is even a question if it maybe
should be fully hardcoded all the time.
Since half of it is coded, it ends up in .data and not .bss.

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
---
 libavcodec/Makefile          |   4 +-
 libavcodec/aacsbr.c          |  10 +---
 libavcodec/aacsbr_tablegen.c |  39 +++++++++++++
 libavcodec/aacsbr_tablegen.h | 132 +++++++++++++++++++++++++++++++++++++++++++
 libavcodec/aacsbrdata.h      |  86 ----------------------------
 libavcodec/tableprint.h      |  10 ++++
 6 files changed, 186 insertions(+), 95 deletions(-)
 create mode 100644 libavcodec/aacsbr_tablegen.c
 create mode 100644 libavcodec/aacsbr_tablegen.h

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 8173449..0ed5478 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -871,6 +871,7 @@ TOOLS = fourcc2pixfmt
 
 HOSTPROGS = aac_tablegen                                                \
             aacps_tablegen                                              \
+            aacsbr_tablegen                                             \
             cbrt_tablegen                                               \
             cos_tablegen                                                \
             dsd_tablegen                                                \
@@ -898,7 +899,7 @@ else
 $(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
 endif
 
-GEN_HEADERS = cbrt_tables.h aacps_tables.h aac_tables.h dsd_tables.h dv_tables.h     \
+GEN_HEADERS = cbrt_tables.h aacps_tables.h aacsbr_tables.h aac_tables.h dsd_tables.h dv_tables.h     \
               sinewin_tables.h mpegaudio_tables.h motionpixels_tables.h \
               pcm_tables.h qdm2_tables.h
 GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS))
@@ -909,6 +910,7 @@ $(GEN_HEADERS): $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF)
 ifdef CONFIG_HARDCODED_TABLES
 $(SUBDIR)aacdec.o: $(SUBDIR)cbrt_tables.h
 $(SUBDIR)aacps.o: $(SUBDIR)aacps_tables.h
+$(SUBDIR)aacsbr.o: $(SUBDIR)aacsbr_tables.h
 $(SUBDIR)aactab.o: $(SUBDIR)aac_tables.h
 $(SUBDIR)dsddec.o: $(SUBDIR)dsd_tables.h
 $(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h
diff --git a/libavcodec/aacsbr.c b/libavcodec/aacsbr.c
index 290fb81..f550ead 100644
--- a/libavcodec/aacsbr.c
+++ b/libavcodec/aacsbr.c
@@ -30,6 +30,7 @@
 #include "sbr.h"
 #include "aacsbr.h"
 #include "aacsbrdata.h"
+#include "aacsbr_tablegen.h"
 #include "fft.h"
 #include "aacps.h"
 #include "sbrdsp.h"
@@ -95,7 +96,6 @@ static void aacsbr_func_ptr_init(AACSBRContext *c);
 
 av_cold void ff_aac_sbr_init(void)
 {
-    int n;
     static const struct {
         const void *sbr_codes, *sbr_bits;
         const unsigned int table_size, elem_size;
@@ -124,13 +124,7 @@ av_cold void ff_aac_sbr_init(void)
     SBR_INIT_VLC_STATIC(8, 592);
     SBR_INIT_VLC_STATIC(9, 512);
 
-    for (n = 1; n < 320; n++)
-        sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n];
-    sbr_qmf_window_us[384] = -sbr_qmf_window_us[384];
-    sbr_qmf_window_us[512] = -sbr_qmf_window_us[512];
-
-    for (n = 0; n < 320; n++)
-        sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n];
+    aacsbr_tableinit();
 
     ff_ps_init();
 }
diff --git a/libavcodec/aacsbr_tablegen.c b/libavcodec/aacsbr_tablegen.c
new file mode 100644
index 0000000..c3c0f0c
--- /dev/null
+++ b/libavcodec/aacsbr_tablegen.c
@@ -0,0 +1,39 @@
+/*
+ * Header file for hardcoded AAC SBR windows
+ *
+ * Copyright (c) 2014 Reimar Döffinger <Reimar.Doeffinger at 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
+#include "libavutil/common.h"
+#include "aacsbr_tablegen.h"
+#include "tableprint.h"
+
+int main(void)
+{
+    aacsbr_tableinit();
+
+    write_fileheader();
+
+    WRITE_ARRAY_ALIGNED("static const", 32, float, sbr_qmf_window_ds);
+    WRITE_ARRAY_ALIGNED("static const", 32, float, sbr_qmf_window_us);
+
+    return 0;
+}
diff --git a/libavcodec/aacsbr_tablegen.h b/libavcodec/aacsbr_tablegen.h
new file mode 100644
index 0000000..104daae
--- /dev/null
+++ b/libavcodec/aacsbr_tablegen.h
@@ -0,0 +1,132 @@
+/*
+ * Header file for hardcoded AAC SBR windows
+ *
+ * Copyright (c) 2014 Reimar Döffinger <Reimar.Doeffinger at 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
+ */
+
+#ifndef AVCODEC_AACSBR_TABLEGEN_H
+#define AVCODEC_AACSBR_TABLEGEN_H
+
+#include <stdint.h>
+#include <math.h>
+
+#if CONFIG_HARDCODED_TABLES
+#define aacsbr_tableinit()
+#include "libavcodec/aacsbr_tables.h"
+#else
+///< window coefficients for analysis/synthesis QMF banks
+static DECLARE_ALIGNED(32, float, sbr_qmf_window_ds)[320];
+static DECLARE_ALIGNED(32, float, sbr_qmf_window_us)[640] = {
+     0.0000000000, -0.0005525286, -0.0005617692, -0.0004947518,
+    -0.0004875227, -0.0004893791, -0.0005040714, -0.0005226564,
+    -0.0005466565, -0.0005677802, -0.0005870930, -0.0006132747,
+    -0.0006312493, -0.0006540333, -0.0006777690, -0.0006941614,
+    -0.0007157736, -0.0007255043, -0.0007440941, -0.0007490598,
+    -0.0007681371, -0.0007724848, -0.0007834332, -0.0007779869,
+    -0.0007803664, -0.0007801449, -0.0007757977, -0.0007630793,
+    -0.0007530001, -0.0007319357, -0.0007215391, -0.0006917937,
+    -0.0006650415, -0.0006341594, -0.0005946118, -0.0005564576,
+    -0.0005145572, -0.0004606325, -0.0004095121, -0.0003501175,
+    -0.0002896981, -0.0002098337, -0.0001446380, -0.0000617334,
+     0.0000134949,  0.0001094383,  0.0002043017,  0.0002949531,
+     0.0004026540,  0.0005107388,  0.0006239376,  0.0007458025,
+     0.0008608443,  0.0009885988,  0.0011250155,  0.0012577884,
+     0.0013902494,  0.0015443219,  0.0016868083,  0.0018348265,
+     0.0019841140,  0.0021461583,  0.0023017254,  0.0024625616,
+     0.0026201758,  0.0027870464,  0.0029469447,  0.0031125420,
+     0.0032739613,  0.0034418874,  0.0036008268,  0.0037603922,
+     0.0039207432,  0.0040819753,  0.0042264269,  0.0043730719,
+     0.0045209852,  0.0046606460,  0.0047932560,  0.0049137603,
+     0.0050393022,  0.0051407353,  0.0052461166,  0.0053471681,
+     0.0054196775,  0.0054876040,  0.0055475714,  0.0055938023,
+     0.0056220643,  0.0056455196,  0.0056389199,  0.0056266114,
+     0.0055917128,  0.0055404363,  0.0054753783,  0.0053838975,
+     0.0052715758,  0.0051382275,  0.0049839687,  0.0048109469,
+     0.0046039530,  0.0043801861,  0.0041251642,  0.0038456408,
+     0.0035401246,  0.0032091885,  0.0028446757,  0.0024508540,
+     0.0020274176,  0.0015784682,  0.0010902329,  0.0005832264,
+     0.0000276045, -0.0005464280, -0.0011568135, -0.0018039472,
+    -0.0024826723, -0.0031933778, -0.0039401124, -0.0047222596,
+    -0.0055337211, -0.0063792293, -0.0072615816, -0.0081798233,
+    -0.0091325329, -0.0101150215, -0.0111315548, -0.0121849995,
+     0.0132718220,  0.0143904666,  0.0155405553,  0.0167324712,
+     0.0179433381,  0.0191872431,  0.0204531793,  0.0217467550,
+     0.0230680169,  0.0244160992,  0.0257875847,  0.0271859429,
+     0.0286072173,  0.0300502657,  0.0315017608,  0.0329754081,
+     0.0344620948,  0.0359697560,  0.0374812850,  0.0390053679,
+     0.0405349170,  0.0420649094,  0.0436097542,  0.0451488405,
+     0.0466843027,  0.0482165720,  0.0497385755,  0.0512556155,
+     0.0527630746,  0.0542452768,  0.0557173648,  0.0571616450,
+     0.0585915683,  0.0599837480,  0.0613455171,  0.0626857808,
+     0.0639715898,  0.0652247106,  0.0664367512,  0.0676075985,
+     0.0687043828,  0.0697630244,  0.0707628710,  0.0717002673,
+     0.0725682583,  0.0733620255,  0.0741003642,  0.0747452558,
+     0.0753137336,  0.0758008358,  0.0761992479,  0.0764992170,
+     0.0767093490,  0.0768173975,  0.0768230011,  0.0767204924,
+     0.0765050718,  0.0761748321,  0.0757305756,  0.0751576255,
+     0.0744664394,  0.0736406005,  0.0726774642,  0.0715826364,
+     0.0703533073,  0.0689664013,  0.0674525021,  0.0657690668,
+     0.0639444805,  0.0619602779,  0.0598166570,  0.0575152691,
+     0.0550460034,  0.0524093821,  0.0495978676,  0.0466303305,
+     0.0434768782,  0.0401458278,  0.0366418116,  0.0329583930,
+     0.0290824006,  0.0250307561,  0.0207997072,  0.0163701258,
+     0.0117623832,  0.0069636862,  0.0019765601, -0.0032086896,
+    -0.0085711749, -0.0141288827, -0.0198834129, -0.0258227288,
+    -0.0319531274, -0.0382776572, -0.0447806821, -0.0514804176,
+    -0.0583705326, -0.0654409853, -0.0726943300, -0.0801372934,
+    -0.0877547536, -0.0955533352, -0.1035329531, -0.1116826931,
+    -0.1200077984, -0.1285002850, -0.1371551761, -0.1459766491,
+    -0.1549607071, -0.1640958855, -0.1733808172, -0.1828172548,
+    -0.1923966745, -0.2021250176, -0.2119735853, -0.2219652696,
+    -0.2320690870, -0.2423016884, -0.2526480309, -0.2631053299,
+    -0.2736634040, -0.2843214189, -0.2950716717, -0.3059098575,
+    -0.3168278913, -0.3278113727, -0.3388722693, -0.3499914122,
+     0.3611589903,  0.3723795546,  0.3836350013,  0.3949211761,
+     0.4062317676,  0.4175696896,  0.4289119920,  0.4402553754,
+     0.4515996535,  0.4629308085,  0.4742453214,  0.4855253091,
+     0.4967708254,  0.5079817500,  0.5191234970,  0.5302240895,
+     0.5412553448,  0.5522051258,  0.5630789140,  0.5738524131,
+     0.5845403235,  0.5951123086,  0.6055783538,  0.6159109932,
+     0.6261242695,  0.6361980107,  0.6461269695,  0.6559016302,
+     0.6655139880,  0.6749663190,  0.6842353293,  0.6933282376,
+     0.7022388719,  0.7109410426,  0.7194462634,  0.7277448900,
+     0.7358211758,  0.7436827863,  0.7513137456,  0.7587080760,
+     0.7658674865,  0.7727780881,  0.7794287519,  0.7858353120,
+     0.7919735841,  0.7978466413,  0.8034485751,  0.8087695004,
+     0.8138191270,  0.8185776004,  0.8230419890,  0.8272275347,
+     0.8311038457,  0.8346937361,  0.8379717337,  0.8409541392,
+     0.8436238281,  0.8459818469,  0.8480315777,  0.8497805198,
+     0.8511971524,  0.8523047035,  0.8531020949,  0.8535720573,
+     0.8537385600,
+};
+
+static void aacsbr_tableinit(void)
+{
+    int n;
+    for (n = 1; n < 320; n++)
+        sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n];
+    sbr_qmf_window_us[384] = -sbr_qmf_window_us[384];
+    sbr_qmf_window_us[512] = -sbr_qmf_window_us[512];
+
+    for (n = 0; n < 320; n++)
+        sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n];
+}
+#endif /* CONFIG_HARDCODED_TABLES */
+
+#endif /* AVCODEC_AACSBR_TABLEGEN_H */
diff --git a/libavcodec/aacsbrdata.h b/libavcodec/aacsbrdata.h
index 12575ee..c667e0b 100644
--- a/libavcodec/aacsbrdata.h
+++ b/libavcodec/aacsbrdata.h
@@ -266,92 +266,6 @@ static const int8_t sbr_offset[6][16] = {
     {-2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  9, 11, 13, 16, 20, 24}, // 64000 Hz <  fs_sbr
 };
 
-///< window coefficients for analysis/synthesis QMF banks
-static DECLARE_ALIGNED(32, float, sbr_qmf_window_ds)[320];
-static DECLARE_ALIGNED(32, float, sbr_qmf_window_us)[640] = {
-     0.0000000000, -0.0005525286, -0.0005617692, -0.0004947518,
-    -0.0004875227, -0.0004893791, -0.0005040714, -0.0005226564,
-    -0.0005466565, -0.0005677802, -0.0005870930, -0.0006132747,
-    -0.0006312493, -0.0006540333, -0.0006777690, -0.0006941614,
-    -0.0007157736, -0.0007255043, -0.0007440941, -0.0007490598,
-    -0.0007681371, -0.0007724848, -0.0007834332, -0.0007779869,
-    -0.0007803664, -0.0007801449, -0.0007757977, -0.0007630793,
-    -0.0007530001, -0.0007319357, -0.0007215391, -0.0006917937,
-    -0.0006650415, -0.0006341594, -0.0005946118, -0.0005564576,
-    -0.0005145572, -0.0004606325, -0.0004095121, -0.0003501175,
-    -0.0002896981, -0.0002098337, -0.0001446380, -0.0000617334,
-     0.0000134949,  0.0001094383,  0.0002043017,  0.0002949531,
-     0.0004026540,  0.0005107388,  0.0006239376,  0.0007458025,
-     0.0008608443,  0.0009885988,  0.0011250155,  0.0012577884,
-     0.0013902494,  0.0015443219,  0.0016868083,  0.0018348265,
-     0.0019841140,  0.0021461583,  0.0023017254,  0.0024625616,
-     0.0026201758,  0.0027870464,  0.0029469447,  0.0031125420,
-     0.0032739613,  0.0034418874,  0.0036008268,  0.0037603922,
-     0.0039207432,  0.0040819753,  0.0042264269,  0.0043730719,
-     0.0045209852,  0.0046606460,  0.0047932560,  0.0049137603,
-     0.0050393022,  0.0051407353,  0.0052461166,  0.0053471681,
-     0.0054196775,  0.0054876040,  0.0055475714,  0.0055938023,
-     0.0056220643,  0.0056455196,  0.0056389199,  0.0056266114,
-     0.0055917128,  0.0055404363,  0.0054753783,  0.0053838975,
-     0.0052715758,  0.0051382275,  0.0049839687,  0.0048109469,
-     0.0046039530,  0.0043801861,  0.0041251642,  0.0038456408,
-     0.0035401246,  0.0032091885,  0.0028446757,  0.0024508540,
-     0.0020274176,  0.0015784682,  0.0010902329,  0.0005832264,
-     0.0000276045, -0.0005464280, -0.0011568135, -0.0018039472,
-    -0.0024826723, -0.0031933778, -0.0039401124, -0.0047222596,
-    -0.0055337211, -0.0063792293, -0.0072615816, -0.0081798233,
-    -0.0091325329, -0.0101150215, -0.0111315548, -0.0121849995,
-     0.0132718220,  0.0143904666,  0.0155405553,  0.0167324712,
-     0.0179433381,  0.0191872431,  0.0204531793,  0.0217467550,
-     0.0230680169,  0.0244160992,  0.0257875847,  0.0271859429,
-     0.0286072173,  0.0300502657,  0.0315017608,  0.0329754081,
-     0.0344620948,  0.0359697560,  0.0374812850,  0.0390053679,
-     0.0405349170,  0.0420649094,  0.0436097542,  0.0451488405,
-     0.0466843027,  0.0482165720,  0.0497385755,  0.0512556155,
-     0.0527630746,  0.0542452768,  0.0557173648,  0.0571616450,
-     0.0585915683,  0.0599837480,  0.0613455171,  0.0626857808,
-     0.0639715898,  0.0652247106,  0.0664367512,  0.0676075985,
-     0.0687043828,  0.0697630244,  0.0707628710,  0.0717002673,
-     0.0725682583,  0.0733620255,  0.0741003642,  0.0747452558,
-     0.0753137336,  0.0758008358,  0.0761992479,  0.0764992170,
-     0.0767093490,  0.0768173975,  0.0768230011,  0.0767204924,
-     0.0765050718,  0.0761748321,  0.0757305756,  0.0751576255,
-     0.0744664394,  0.0736406005,  0.0726774642,  0.0715826364,
-     0.0703533073,  0.0689664013,  0.0674525021,  0.0657690668,
-     0.0639444805,  0.0619602779,  0.0598166570,  0.0575152691,
-     0.0550460034,  0.0524093821,  0.0495978676,  0.0466303305,
-     0.0434768782,  0.0401458278,  0.0366418116,  0.0329583930,
-     0.0290824006,  0.0250307561,  0.0207997072,  0.0163701258,
-     0.0117623832,  0.0069636862,  0.0019765601, -0.0032086896,
-    -0.0085711749, -0.0141288827, -0.0198834129, -0.0258227288,
-    -0.0319531274, -0.0382776572, -0.0447806821, -0.0514804176,
-    -0.0583705326, -0.0654409853, -0.0726943300, -0.0801372934,
-    -0.0877547536, -0.0955533352, -0.1035329531, -0.1116826931,
-    -0.1200077984, -0.1285002850, -0.1371551761, -0.1459766491,
-    -0.1549607071, -0.1640958855, -0.1733808172, -0.1828172548,
-    -0.1923966745, -0.2021250176, -0.2119735853, -0.2219652696,
-    -0.2320690870, -0.2423016884, -0.2526480309, -0.2631053299,
-    -0.2736634040, -0.2843214189, -0.2950716717, -0.3059098575,
-    -0.3168278913, -0.3278113727, -0.3388722693, -0.3499914122,
-     0.3611589903,  0.3723795546,  0.3836350013,  0.3949211761,
-     0.4062317676,  0.4175696896,  0.4289119920,  0.4402553754,
-     0.4515996535,  0.4629308085,  0.4742453214,  0.4855253091,
-     0.4967708254,  0.5079817500,  0.5191234970,  0.5302240895,
-     0.5412553448,  0.5522051258,  0.5630789140,  0.5738524131,
-     0.5845403235,  0.5951123086,  0.6055783538,  0.6159109932,
-     0.6261242695,  0.6361980107,  0.6461269695,  0.6559016302,
-     0.6655139880,  0.6749663190,  0.6842353293,  0.6933282376,
-     0.7022388719,  0.7109410426,  0.7194462634,  0.7277448900,
-     0.7358211758,  0.7436827863,  0.7513137456,  0.7587080760,
-     0.7658674865,  0.7727780881,  0.7794287519,  0.7858353120,
-     0.7919735841,  0.7978466413,  0.8034485751,  0.8087695004,
-     0.8138191270,  0.8185776004,  0.8230419890,  0.8272275347,
-     0.8311038457,  0.8346937361,  0.8379717337,  0.8409541392,
-     0.8436238281,  0.8459818469,  0.8480315777,  0.8497805198,
-     0.8511971524,  0.8523047035,  0.8531020949,  0.8535720573,
-     0.8537385600,
-};
-
 /* First eight entries repeated at end to simplify SIMD implementations. */
 const DECLARE_ALIGNED(16, float, ff_sbr_noise_table)[][2] = {
 {-0.99948153278296, -0.59483417516607}, { 0.97113454393991, -0.67528515225647},
diff --git a/libavcodec/tableprint.h b/libavcodec/tableprint.h
index 26d063e..5107912 100644
--- a/libavcodec/tableprint.h
+++ b/libavcodec/tableprint.h
@@ -81,6 +81,16 @@ void write_float_2d_array   (const void *, int, int);
 #define FMT "zu"
 #endif
 
+#define WRITE_ARRAY_ALIGNED(prefix, align, type, name)  \
+    do {                                                \
+        const size_t array_size = FF_ARRAY_ELEMS(name); \
+        printf(prefix" DECLARE_ALIGNED("#align", "      \
+               #type", "#name")[%"FMT"] = {\n",         \
+               array_size);                             \
+        write_##type##_array(name, array_size);         \
+        printf("};\n");                                 \
+    } while(0)
+
 #define WRITE_ARRAY(prefix, type, name)                 \
     do {                                                \
         const size_t array_size = FF_ARRAY_ELEMS(name); \
-- 
2.1.0



More information about the ffmpeg-devel mailing list