From 8606b8f1e9a6570135e4e1e17bd5ae1e19224814 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Sat, 24 May 2025 18:39:26 +0200 Subject: [PATCH 2/5] avcodec/ac3dec: Deduplicate mantissas and their init code Signed-off-by: Andreas Rheinhardt --- 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 */ -- 2.45.2