Signed-off-by: Reimar Döffinger <reimar.doeffin...@gmx.de> --- libavcodec/ac3.h | 4 +- libavcodec/ac3dec.c | 188 +++++++---------------------------------------- libavcodec/ac3dec_data.c | 138 ++++++++++++++++++++++++++++++++++ libavcodec/ac3dec_data.h | 15 ++++ 4 files changed, 182 insertions(+), 163 deletions(-)
diff --git a/libavcodec/ac3.h b/libavcodec/ac3.h index 871640b..0d01014 100644 --- a/libavcodec/ac3.h +++ b/libavcodec/ac3.h @@ -86,8 +86,8 @@ #define AC3_RENAME(x) x #define AC3_NORM(norm) (1.0f/(norm)) #define AC3_MUL(a,b) ((a) * (b)) -#define AC3_RANGE(x) (dynamic_range_tab[(x)]) -#define AC3_HEAVY_RANGE(x) (heavy_dynamic_range_tab[(x)]) +#define AC3_RANGE(x) (ff_ac3_dynamic_range_tab[(x)]) +#define AC3_HEAVY_RANGE(x) (ff_ac3_heavy_dynamic_range_tab[(x)]) #define AC3_DYNAMIC_RANGE(x) (powf(x, s->drc_scale)) #define AC3_SPX_BLEND(x) (x)* (1.0f/32) #define AC3_DYNAMIC_RANGE1 1.0f diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 969e37f..4dbb784 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -42,140 +42,6 @@ #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 b3_mantissas[8]; -static int b4_mantissas[128][2]; -static int b5_mantissas[16]; - -/** - * Quantization table: levels for symmetric. bits for asymmetric. - * reference: Table 7.18 Mapping of bap to Quantizer - */ -static const uint8_t quantization_tab[16] = { - 0, 3, 5, 7, 11, 15, - 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 -}; - -/** dynamic range table. converts codes to scale factors. */ -static float dynamic_range_tab[256]; -static float heavy_dynamic_range_tab[256]; - -/** Adjustments in dB gain */ -static const float gain_levels[9] = { - LEVEL_PLUS_3DB, - LEVEL_PLUS_1POINT5DB, - LEVEL_ONE, - LEVEL_MINUS_1POINT5DB, - LEVEL_MINUS_3DB, - LEVEL_MINUS_4POINT5DB, - LEVEL_MINUS_6DB, - LEVEL_ZERO, - LEVEL_MINUS_9DB -}; - -/** Adjustments in dB gain (LFE, +10 to -21 dB) */ -static const float gain_levels_lfe[32] = { - 3.162275, 2.818382, 2.511886, 2.238719, 1.995261, 1.778278, 1.584893, - 1.412536, 1.258924, 1.122018, 1.000000, 0.891251, 0.794328, 0.707946, - 0.630957, 0.562341, 0.501187, 0.446683, 0.398107, 0.354813, 0.316227, - 0.281838, 0.251188, 0.223872, 0.199526, 0.177828, 0.158489, 0.141253, - 0.125892, 0.112201, 0.100000, 0.089125 -}; - -/** - * Table for default stereo downmixing coefficients - * reference: Section 7.8.2 Downmixing Into Two Channels - */ -static const uint8_t ac3_default_coeffs[8][5][2] = { - { { 2, 7 }, { 7, 2 }, }, - { { 4, 4 }, }, - { { 2, 7 }, { 7, 2 }, }, - { { 2, 7 }, { 5, 5 }, { 7, 2 }, }, - { { 2, 7 }, { 7, 2 }, { 6, 6 }, }, - { { 2, 7 }, { 5, 5 }, { 7, 2 }, { 8, 8 }, }, - { { 2, 7 }, { 7, 2 }, { 6, 7 }, { 7, 6 }, }, - { { 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)) << 24) / levels; -} - -/* - * Initialize tables at runtime. - */ -static av_cold void ac3_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); - } - /* generate ungrouped mantissa tables - reference: Tables 7.21 and 7.23 */ - for (i = 0; i < 7; i++) { - /* bap=3 mantissas */ - b3_mantissas[i] = symmetric_dequant(i, 7); - } - for (i = 0; i < 15; i++) { - /* bap=5 mantissas */ - b5_mantissas[i] = symmetric_dequant(i, 15); - } - - /* generate dynamic range table - reference: Section 7.7.1 Dynamic Range Control */ - for (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++) { - int v = (i >> 4) - ((i >> 7) << 4) - 4; - heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | 0x10); - } - -} - -/** * AVCodec initialization */ static av_cold int ac3_decode_init(AVCodecContext *avctx) @@ -186,7 +52,7 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx) s->avctx = avctx; ff_ac3_common_init(); - ac3_tables_init(); + ff_ac3_tables_init(); ff_mdct_init(&s->imdct_256, 8, 1, 1.0); ff_mdct_init(&s->imdct_512, 9, 1, 1.0); AC3_RENAME(ff_kbd_window_init)(s->window, 5.0, 256); @@ -371,14 +237,14 @@ static int parse_frame_header(AC3DecodeContext *s) static void set_downmix_coeffs(AC3DecodeContext *s) { int i; - float cmix = gain_levels[s-> center_mix_level]; - float smix = gain_levels[s->surround_mix_level]; + float cmix = ff_ac3_gain_levels[s-> center_mix_level]; + float smix = ff_ac3_gain_levels[s->surround_mix_level]; float norm0, norm1; float downmix_coeffs[AC3_MAX_CHANNELS][2]; for (i = 0; i < s->fbw_channels; i++) { - downmix_coeffs[i][0] = gain_levels[ac3_default_coeffs[s->channel_mode][i][0]]; - downmix_coeffs[i][1] = gain_levels[ac3_default_coeffs[s->channel_mode][i][1]]; + downmix_coeffs[i][0] = ff_ac3_gain_levels[ff_ac3_default_coeffs[s->channel_mode][i][0]]; + downmix_coeffs[i][1] = ff_ac3_gain_levels[ff_ac3_default_coeffs[s->channel_mode][i][1]]; } if (s->channel_mode > 1 && s->channel_mode & 1) { downmix_coeffs[1][0] = downmix_coeffs[1][1] = cmix; @@ -431,9 +297,9 @@ static int decode_exponents(GetBitContext *gbc, int exp_strategy, int ngrps, group_size = exp_strategy + (exp_strategy == EXP_D45); for (grp = 0, i = 0; grp < ngrps; grp++) { expacc = get_bits(gbc, 7); - 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 */ @@ -526,9 +392,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_b1_mantissas[bits][0]; + m->b1_mant[1] = ff_ac3_b1_mantissas[bits][1]; + m->b1_mant[0] = ff_ac3_b1_mantissas[bits][2]; m->b1 = 2; } break; @@ -538,14 +404,14 @@ 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_b2_mantissas[bits][0]; + m->b2_mant[1] = ff_ac3_b2_mantissas[bits][1]; + m->b2_mant[0] = ff_ac3_b2_mantissas[bits][2]; m->b2 = 2; } break; case 3: - mantissa = b3_mantissas[get_bits(gbc, 3)]; + mantissa = ff_ac3_b3_mantissas[get_bits(gbc, 3)]; break; case 4: if (m->b4) { @@ -553,13 +419,13 @@ 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_b4_mantissas[bits][0]; + m->b4_mant = ff_ac3_b4_mantissas[bits][1]; m->b4 = 1; } break; case 5: - mantissa = b5_mantissas[get_bits(gbc, 4)]; + mantissa = ff_ac3_b5_mantissas[get_bits(gbc, 4)]; break; default: /* 6 to 15 */ /* Shift mantissa and sign-extend it. */ @@ -567,8 +433,8 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma av_log(s->avctx, AV_LOG_ERROR, "bap %d is invalid in plain AC-3\n", bap); bap = 15; } - mantissa = get_sbits(gbc, quantization_tab[bap]); - mantissa <<= 24 - quantization_tab[bap]; + mantissa = get_sbits(gbc, ff_ac3_quantization_tab[bap]); + mantissa <<= 24 - ff_ac3_quantization_tab[bap]; break; } coeffs[freq] = mantissa >> exps[freq]; @@ -1506,8 +1372,8 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, s->output_mode = AC3_CHMODE_STEREO; } - s->loro_center_mix_level = gain_levels[s-> center_mix_level]; - s->loro_surround_mix_level = gain_levels[s->surround_mix_level]; + s->loro_center_mix_level = ff_ac3_gain_levels[s-> center_mix_level]; + s->loro_surround_mix_level = ff_ac3_gain_levels[s->surround_mix_level]; s->ltrt_center_mix_level = LEVEL_MINUS_3DB; s->ltrt_surround_mix_level = LEVEL_MINUS_3DB; /* set downmixing coefficients if needed */ @@ -1611,12 +1477,12 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_UNKNOWN; break; } - downmix_info->center_mix_level = gain_levels[s-> center_mix_level]; - downmix_info->center_mix_level_ltrt = gain_levels[s-> center_mix_level_ltrt]; - downmix_info->surround_mix_level = gain_levels[s-> surround_mix_level]; - downmix_info->surround_mix_level_ltrt = gain_levels[s->surround_mix_level_ltrt]; + downmix_info->center_mix_level = ff_ac3_gain_levels[s-> center_mix_level]; + downmix_info->center_mix_level_ltrt = ff_ac3_gain_levels[s-> center_mix_level_ltrt]; + downmix_info->surround_mix_level = ff_ac3_gain_levels[s-> surround_mix_level]; + downmix_info->surround_mix_level_ltrt = ff_ac3_gain_levels[s->surround_mix_level_ltrt]; if (s->lfe_mix_level_exists) - downmix_info->lfe_mix_level = gain_levels_lfe[s->lfe_mix_level]; + downmix_info->lfe_mix_level = ff_ac3_gain_levels_lfe[s->lfe_mix_level]; else downmix_info->lfe_mix_level = 0.0; // -inf dB } else diff --git a/libavcodec/ac3dec_data.c b/libavcodec/ac3dec_data.c index d0a9b1e..1c9fbdd 100644 --- a/libavcodec/ac3dec_data.c +++ b/libavcodec/ac3dec_data.c @@ -24,6 +24,7 @@ * Tables taken directly from the AC-3 spec. */ +#include "config.h" #include "ac3dec_data.h" #include "ac3.h" @@ -58,3 +59,140 @@ const uint8_t ff_eac3_hebap_tab[64] = { */ const uint8_t ff_eac3_default_spx_band_struct[17] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; + +/** + * 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]; + +/** tables for ungrouping mantissas */ +int ff_ac3_b1_mantissas[32][3]; +int ff_ac3_b2_mantissas[128][3]; +int ff_ac3_b3_mantissas[8]; +int ff_ac3_b4_mantissas[128][2]; +int ff_ac3_b5_mantissas[16]; + +/** + * Quantization table: levels for symmetric. bits for asymmetric. + * reference: Table 7.18 Mapping of bap to Quantizer + */ +const uint8_t ff_ac3_quantization_tab[16] = { + 0, 3, 5, 7, 11, 15, + 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 +}; + +#if CONFIG_AC3_DECODER +/** dynamic range table. converts codes to scale factors. */ +float ff_ac3_dynamic_range_tab[256]; +float ff_ac3_heavy_dynamic_range_tab[256]; +#endif + +/** Adjustments in dB gain */ +const float ff_ac3_gain_levels[9] = { + LEVEL_PLUS_3DB, + LEVEL_PLUS_1POINT5DB, + LEVEL_ONE, + LEVEL_MINUS_1POINT5DB, + LEVEL_MINUS_3DB, + LEVEL_MINUS_4POINT5DB, + LEVEL_MINUS_6DB, + LEVEL_ZERO, + LEVEL_MINUS_9DB +}; + +/** Adjustments in dB gain (LFE, +10 to -21 dB) */ +const float ff_ac3_gain_levels_lfe[32] = { + 3.162275, 2.818382, 2.511886, 2.238719, 1.995261, 1.778278, 1.584893, + 1.412536, 1.258924, 1.122018, 1.000000, 0.891251, 0.794328, 0.707946, + 0.630957, 0.562341, 0.501187, 0.446683, 0.398107, 0.354813, 0.316227, + 0.281838, 0.251188, 0.223872, 0.199526, 0.177828, 0.158489, 0.141253, + 0.125892, 0.112201, 0.100000, 0.089125 +}; + +/** + * Table for default stereo downmixing coefficients + * reference: Section 7.8.2 Downmixing Into Two Channels + */ +const uint8_t ff_ac3_default_coeffs[8][5][2] = { + { { 2, 7 }, { 7, 2 }, }, + { { 4, 4 }, }, + { { 2, 7 }, { 7, 2 }, }, + { { 2, 7 }, { 5, 5 }, { 7, 2 }, }, + { { 2, 7 }, { 7, 2 }, { 6, 6 }, }, + { { 2, 7 }, { 5, 5 }, { 7, 2 }, { 8, 8 }, }, + { { 2, 7 }, { 7, 2 }, { 6, 7 }, { 7, 6 }, }, + { { 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)) << 24) / levels; +} + +/* + * Initialize tables at runtime. + */ +av_cold void ff_ac3_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++) { + 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 (i = 0; i < 32; i++) { + /* bap=1 mantissas */ + ff_ac3_b1_mantissas[i][0] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][0], 3); + ff_ac3_b1_mantissas[i][1] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][1], 3); + ff_ac3_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 */ + ff_ac3_b2_mantissas[i][0] = symmetric_dequant(ff_ac3_ungroup_3_in_7_bits_tab[i][0], 5); + ff_ac3_b2_mantissas[i][1] = symmetric_dequant(ff_ac3_ungroup_3_in_7_bits_tab[i][1], 5); + ff_ac3_b2_mantissas[i][2] = symmetric_dequant(ff_ac3_ungroup_3_in_7_bits_tab[i][2], 5); + + /* bap=4 mantissas */ + ff_ac3_b4_mantissas[i][0] = symmetric_dequant(i / 11, 11); + ff_ac3_b4_mantissas[i][1] = symmetric_dequant(i % 11, 11); + } + /* generate ungrouped mantissa tables + reference: Tables 7.21 and 7.23 */ + for (i = 0; i < 7; i++) { + /* bap=3 mantissas */ + ff_ac3_b3_mantissas[i] = symmetric_dequant(i, 7); + } + for (i = 0; i < 15; i++) { + /* bap=5 mantissas */ + ff_ac3_b5_mantissas[i] = symmetric_dequant(i, 15); + } + +#if CONFIG_AC3_DECODER + /* generate dynamic range table + reference: Section 7.7.1 Dynamic Range Control */ + for (i = 0; i < 256; i++) { + int v = (i >> 5) - ((i >> 7) << 3) - 5; + ff_ac3_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++) { + int v = (i >> 4) - ((i >> 7) << 4) - 4; + ff_ac3_heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | 0x10); + } +#endif +} diff --git a/libavcodec/ac3dec_data.h b/libavcodec/ac3dec_data.h index 975b52e..934ccf3 100644 --- a/libavcodec/ac3dec_data.h +++ b/libavcodec/ac3dec_data.h @@ -29,4 +29,19 @@ extern const uint8_t ff_ac3_ungroup_3_in_5_bits_tab[32][3]; extern const uint8_t ff_eac3_hebap_tab[64]; extern const uint8_t ff_eac3_default_spx_band_struct[17]; +extern uint8_t ff_ac3_ungroup_3_in_7_bits_tab[128][3]; +extern int ff_ac3_b1_mantissas[32][3]; +extern int ff_ac3_b2_mantissas[128][3]; +extern int ff_ac3_b3_mantissas[8]; +extern int ff_ac3_b4_mantissas[128][2]; +extern int ff_ac3_b5_mantissas[16]; +extern const uint8_t ff_ac3_quantization_tab[16]; +extern float ff_ac3_dynamic_range_tab[256]; +extern float ff_ac3_heavy_dynamic_range_tab[256]; +extern const float ff_ac3_gain_levels[9]; +extern const float ff_ac3_gain_levels_lfe[32]; +extern const uint8_t ff_ac3_default_coeffs[8][5][2]; + +void ff_ac3_tables_init(void); + #endif /* AVCODEC_AC3DEC_DATA_H */ -- 2.1.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel