[FFmpeg-cvslog] avcodec/ac3dec: Deduplicate mantissas and their init code

Andreas Rheinhardt git at videolan.org
Mon Jun 2 14:53:33 EEST 2025


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Sat May 24 18:39:26 2025 +0200| [20caa5cf2d912ebfc57c2b3335ad049d872abd7f] | committer: Andreas Rheinhardt

avcodec/ac3dec: Deduplicate mantissas and their init code

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

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

 libavcodec/ac3dec.c      | 92 ++++++++++++------------------------------------
 libavcodec/ac3dec_data.c | 60 ++++++++++++++++++++++++++++++-
 libavcodec/ac3dec_data.h |  8 +++++
 3 files changed, 90 insertions(+), 70 deletions(-)

diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index dbe7f0b57c..0e18403793 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -46,17 +46,6 @@
 #include "decode.h"
 #include "kbdwin.h"
 
-/**
- * table for ungrouping 3 values in 7 bits.
- * used for exponents and bap=2 mantissas
- */
-static uint8_t ungroup_3_in_7_bits_tab[128][3];
-
-/** tables for ungrouping mantissas */
-static int b1_mantissas[32][3];
-static int b2_mantissas[128][3];
-static int b4_mantissas[128][2];
-
 /**
  * Quantization table: levels for symmetric. bits for asymmetric.
  * reference: Table 7.18 Mapping of bap to Quantizer
@@ -109,67 +98,28 @@ static const uint8_t ac3_default_coeffs[8][5][2] = {
     { { 2, 7 }, { 5, 5 }, { 7, 2 }, { 6, 7 }, { 7, 6 }, },
 };
 
-/**
- * Symmetrical Dequantization
- * reference: Section 7.3.3 Expansion of Mantissas for Symmetrical Quantization
- *            Tables 7.19 to 7.23
- */
-static inline int
-symmetric_dequant(int code, int levels)
-{
-    return ((code - (levels >> 1)) * (1 << 24)) / levels;
-}
-
+#if (!USE_FIXED)
 /*
  * Initialize tables at runtime.
  */
-static av_cold void ac3_tables_init(void)
+static av_cold void ac3_float_tables_init(void)
 {
-    int i;
-
-    /* generate table for ungrouping 3 values in 7 bits
-       reference: Section 7.1.3 Exponent Decoding */
-    for (i = 0; i < 128; i++) {
-        ungroup_3_in_7_bits_tab[i][0] =  i / 25;
-        ungroup_3_in_7_bits_tab[i][1] = (i % 25) / 5;
-        ungroup_3_in_7_bits_tab[i][2] = (i % 25) % 5;
-    }
-
-    /* generate grouped mantissa tables
-       reference: Section 7.3.5 Ungrouping of Mantissas */
-    for (i = 0; i < 32; i++) {
-        /* bap=1 mantissas */
-        b1_mantissas[i][0] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][0], 3);
-        b1_mantissas[i][1] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][1], 3);
-        b1_mantissas[i][2] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][2], 3);
-    }
-    for (i = 0; i < 128; i++) {
-        /* bap=2 mantissas */
-        b2_mantissas[i][0] = symmetric_dequant(ungroup_3_in_7_bits_tab[i][0], 5);
-        b2_mantissas[i][1] = symmetric_dequant(ungroup_3_in_7_bits_tab[i][1], 5);
-        b2_mantissas[i][2] = symmetric_dequant(ungroup_3_in_7_bits_tab[i][2], 5);
-
-        /* bap=4 mantissas */
-        b4_mantissas[i][0] = symmetric_dequant(i / 11, 11);
-        b4_mantissas[i][1] = symmetric_dequant(i % 11, 11);
-    }
-
-#if (!USE_FIXED)
     /* generate dynamic range table
        reference: Section 7.7.1 Dynamic Range Control */
-    for (i = 0; i < 256; i++) {
+    for (int i = 0; i < 256; i++) {
         int v = (i >> 5) - ((i >> 7) << 3) - 5;
         dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0x1F) | 0x20);
     }
 
     /* generate compr dynamic range table
        reference: Section 7.7.2 Heavy Compression */
-    for (i = 0; i < 256; i++) {
+    for (int i = 0; i < 256; i++) {
         int v = (i >> 4) - ((i >> 7) << 4) - 4;
         ff_ac3_heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | 0x10);
     }
-#endif
+    ff_ac3_init_static();
 }
+#endif
 
 static void ac3_downmix(AVCodecContext *avctx)
 {
@@ -194,7 +144,6 @@ static void ac3_downmix(AVCodecContext *avctx)
  */
 static av_cold int ac3_decode_init(AVCodecContext *avctx)
 {
-    static AVOnce init_static_once = AV_ONCE_INIT;
     AC3DecodeContext *s = avctx->priv_data;
     const float scale = 1.0f;
     int i, ret;
@@ -235,7 +184,12 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
         s->dlyptr[i] = s->delay[i];
     }
 
-    ff_thread_once(&init_static_once, ac3_tables_init);
+#if USE_FIXED
+    ff_ac3_init_static();
+#else
+    static AVOnce init_static_once = AV_ONCE_INIT;
+    ff_thread_once(&init_static_once, ac3_float_tables_init);
+#endif
 
     return 0;
 }
@@ -467,9 +421,9 @@ static int decode_exponents(AC3DecodeContext *s,
             av_log(s->avctx, AV_LOG_ERROR, "expacc %d is out-of-range\n", expacc);
             return AVERROR_INVALIDDATA;
         }
-        dexp[i++] = ungroup_3_in_7_bits_tab[expacc][0];
-        dexp[i++] = ungroup_3_in_7_bits_tab[expacc][1];
-        dexp[i++] = ungroup_3_in_7_bits_tab[expacc][2];
+        dexp[i++] = ff_ac3_ungroup_3_in_7_bits_tab[expacc][0];
+        dexp[i++] = ff_ac3_ungroup_3_in_7_bits_tab[expacc][1];
+        dexp[i++] = ff_ac3_ungroup_3_in_7_bits_tab[expacc][2];
     }
 
     /* convert to absolute exps and expand groups */
@@ -564,9 +518,9 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma
                 mantissa = m->b1_mant[m->b1];
             } else {
                 int bits      = get_bits(gbc, 5);
-                mantissa      = b1_mantissas[bits][0];
-                m->b1_mant[1] = b1_mantissas[bits][1];
-                m->b1_mant[0] = b1_mantissas[bits][2];
+                mantissa      = ff_ac3_bap1_mantissas[bits][0];
+                m->b1_mant[1] = ff_ac3_bap1_mantissas[bits][1];
+                m->b1_mant[0] = ff_ac3_bap1_mantissas[bits][2];
                 m->b1         = 2;
             }
             break;
@@ -576,9 +530,9 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma
                 mantissa = m->b2_mant[m->b2];
             } else {
                 int bits      = get_bits(gbc, 7);
-                mantissa      = b2_mantissas[bits][0];
-                m->b2_mant[1] = b2_mantissas[bits][1];
-                m->b2_mant[0] = b2_mantissas[bits][2];
+                mantissa      = ff_ac3_bap2_mantissas[bits][0];
+                m->b2_mant[1] = ff_ac3_bap2_mantissas[bits][1];
+                m->b2_mant[0] = ff_ac3_bap2_mantissas[bits][2];
                 m->b2         = 2;
             }
             break;
@@ -591,8 +545,8 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma
                 mantissa = m->b4_mant;
             } else {
                 int bits   = get_bits(gbc, 7);
-                mantissa   = b4_mantissas[bits][0];
-                m->b4_mant = b4_mantissas[bits][1];
+                mantissa   = ff_ac3_bap4_mantissas[bits][0];
+                m->b4_mant = ff_ac3_bap4_mantissas[bits][1];
                 m->b4      = 1;
             }
             break;
diff --git a/libavcodec/ac3dec_data.c b/libavcodec/ac3dec_data.c
index 527b3353f2..7ef64f1f84 100644
--- a/libavcodec/ac3dec_data.c
+++ b/libavcodec/ac3dec_data.c
@@ -25,6 +25,7 @@
  */
 
 #include "ac3dec_data.h"
+#include "libavutil/thread.h"
 
 /**
  * Table used to ungroup 3 values stored in 5 bits.
@@ -43,9 +44,20 @@ const uint8_t ff_ac3_ungroup_3_in_5_bits_tab[32][3] = {
 };
 
 /**
- * Ungrouped mantissa tables; the extra entry is padding to avoid range checks
+ * table for ungrouping 3 values in 7 bits.
+ * used for exponents and bap=2 mantissas
+ */
+uint8_t ff_ac3_ungroup_3_in_7_bits_tab[128][3];
+
+/**
+ * Symmetrical Dequantization
+ * reference: Section 7.3.3 Expansion of Mantissas for Symmetrical Quantization
+ *            Tables 7.19 to 7.23
  */
 #define SYMMETRIC_DEQUANT(code, levels) (((code - (levels >> 1)) * (1 << 24)) / levels)
+/**
+ * Ungrouped mantissa tables; the extra entry is padding to avoid range checks
+ */
 /**
  * Table 7.21
  */
@@ -79,6 +91,52 @@ const int ff_ac3_bap5_mantissas[15 + 1] = {
     SYMMETRIC_DEQUANT(14, 15),
 };
 
+int ff_ac3_bap1_mantissas[32][3];
+int ff_ac3_bap2_mantissas[128][3];
+int ff_ac3_bap4_mantissas[128][2];
+
+static inline int
+symmetric_dequant(int code, int levels)
+{
+    return SYMMETRIC_DEQUANT(code, levels);
+}
+
+static av_cold void ac3_init_static(void)
+{
+    /* generate table for ungrouping 3 values in 7 bits
+       reference: Section 7.1.3 Exponent Decoding */
+    for (int i = 0; i < 128; ++i) {
+        ff_ac3_ungroup_3_in_7_bits_tab[i][0] =  i / 25;
+        ff_ac3_ungroup_3_in_7_bits_tab[i][1] = (i % 25) / 5;
+        ff_ac3_ungroup_3_in_7_bits_tab[i][2] = (i % 25) % 5;
+    }
+
+    /* generate grouped mantissa tables
+       reference: Section 7.3.5 Ungrouping of Mantissas */
+    for (int i = 0; i < 32; ++i) {
+        /* bap=1 mantissas */
+        ff_ac3_bap1_mantissas[i][0] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][0], 3);
+        ff_ac3_bap1_mantissas[i][1] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][1], 3);
+        ff_ac3_bap1_mantissas[i][2] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][2], 3);
+    }
+    for (int i = 0; i < 128; ++i) {
+        /* bap=2 mantissas */
+        ff_ac3_bap2_mantissas[i][0] = symmetric_dequant(ff_ac3_ungroup_3_in_7_bits_tab[i][0], 5);
+        ff_ac3_bap2_mantissas[i][1] = symmetric_dequant(ff_ac3_ungroup_3_in_7_bits_tab[i][1], 5);
+        ff_ac3_bap2_mantissas[i][2] = symmetric_dequant(ff_ac3_ungroup_3_in_7_bits_tab[i][2], 5);
+
+        /* bap=4 mantissas */
+        ff_ac3_bap4_mantissas[i][0] = symmetric_dequant(i / 11, 11);
+        ff_ac3_bap4_mantissas[i][1] = symmetric_dequant(i % 11, 11);
+    }
+}
+
+av_cold void ff_ac3_init_static(void)
+{
+    static AVOnce ac3_init_static_once = AV_ONCE_INIT;
+    ff_thread_once(&ac3_init_static_once, ac3_init_static);
+}
+
 const uint8_t ff_eac3_hebap_tab[64] = {
     0, 1, 2, 3, 4, 5, 6, 7, 8, 8,
     8, 8, 9, 9, 9, 10, 10, 10, 10, 11,
diff --git a/libavcodec/ac3dec_data.h b/libavcodec/ac3dec_data.h
index 4f3a23f6c7..1bbfa8b71e 100644
--- a/libavcodec/ac3dec_data.h
+++ b/libavcodec/ac3dec_data.h
@@ -29,13 +29,21 @@
 FF_VISIBILITY_PUSH_HIDDEN
 
 extern const uint8_t ff_ac3_ungroup_3_in_5_bits_tab[32][3];
+extern       uint8_t ff_ac3_ungroup_3_in_7_bits_tab[128][3];
 
 extern const int     ff_ac3_bap3_mantissas[ 7 + 1];
 extern const int     ff_ac3_bap5_mantissas[15 + 1];
 
+/** tables for ungrouping mantissas */
+extern int ff_ac3_bap1_mantissas[32][3];
+extern int ff_ac3_bap2_mantissas[128][3];
+extern int ff_ac3_bap4_mantissas[128][2];
+
 extern const uint8_t ff_eac3_hebap_tab[64];
 extern const uint8_t ff_eac3_default_spx_band_struct[17];
 
+void ff_ac3_init_static(void);
+
 FF_VISIBILITY_POP_HIDDEN
 
 #endif /* AVCODEC_AC3DEC_DATA_H */



More information about the ffmpeg-cvslog mailing list