X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fac3.c;h=99e5b50acbda8193e9f0dbc71a4ba0d9ea5f0884;hb=0a60780c7fe72e2f9cc41efc152b3807954b7820;hp=f0f14e360c2ef1770b898c2de1603c4ca2e7c818;hpb=09e03847b945ab31469ea428349aa4d589544019;p=ffmpeg diff --git a/libavcodec/ac3.c b/libavcodec/ac3.c index f0f14e360c2..99e5b50acbd 100644 --- a/libavcodec/ac3.c +++ b/libavcodec/ac3.c @@ -2,25 +2,25 @@ * Common code between the AC-3 encoder and decoder * Copyright (c) 2000 Fabrice Bellard * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav 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, + * Libav 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 + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file libavcodec/ac3.c + * @file * Common code between the AC-3 encoder and decoder. */ @@ -28,12 +28,10 @@ #include "ac3.h" #include "get_bits.h" -#if CONFIG_HARDCODED_TABLES - /** * Starting frequency coefficient bin for each critical band. */ -static const uint8_t band_start_tab[51] = { +const uint8_t ff_ac3_band_start_tab[AC3_CRITICAL_BANDS+1] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, @@ -41,10 +39,12 @@ static const uint8_t band_start_tab[51] = { 79, 85, 97, 109, 121, 133, 157, 181, 205, 229, 253 }; +#if CONFIG_HARDCODED_TABLES + /** - * Maps each frequency coefficient bin to the critical band that contains it. + * Map each frequency coefficient bin to the critical band that contains it. */ -static const uint8_t bin_to_band_tab[253] = { +const uint8_t ff_ac3_bin_to_band_tab[253] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, @@ -70,8 +70,7 @@ static const uint8_t bin_to_band_tab[253] = { }; #else /* CONFIG_HARDCODED_TABLES */ -static uint8_t band_start_tab[51]; -static uint8_t bin_to_band_tab[253]; +uint8_t ff_ac3_bin_to_band_tab[253]; #endif static inline int calc_lowcomp1(int a, int b0, int b1, int c) @@ -107,17 +106,18 @@ void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, /* PSD integration */ bin = start; - band = bin_to_band_tab[start]; + band = ff_ac3_bin_to_band_tab[start]; do { int v = psd[bin++]; - int band_end = FFMIN(band_start_tab[band+1], end); + int band_end = FFMIN(ff_ac3_band_start_tab[band+1], end); for (; bin < band_end; bin++) { + int max = FFMAX(v, psd[bin]); /* logadd */ - int adr = FFMIN(FFABS(v - psd[bin]) >> 1, 255); - v = FFMAX(v, psd[bin]) + ff_ac3_log_add_tab[adr]; + int adr = FFMIN(max - ((v + psd[bin] + 1) >> 1), 255); + v = max + ff_ac3_log_add_tab[adr]; } band_psd[band++] = v; - } while (end > band_start_tab[band]); + } while (end > ff_ac3_band_start_tab[band]); } int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, @@ -126,14 +126,14 @@ int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, uint8_t *dba_lengths, uint8_t *dba_values, int16_t *mask) { - int16_t excite[50]; /* excitation */ + int16_t excite[AC3_CRITICAL_BANDS]; /* excitation */ int band; int band_start, band_end, begin, end1; int lowcomp, fastleak, slowleak; /* excitation function */ - band_start = bin_to_band_tab[start]; - band_end = bin_to_band_tab[end-1] + 1; + band_start = ff_ac3_bin_to_band_tab[start]; + band_end = ff_ac3_bin_to_band_tab[end-1] + 1; if (band_start == 0) { lowcomp = 0; @@ -192,12 +192,12 @@ int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) { int i, seg, delta; - if (dba_nsegs >= 8) + if (dba_nsegs > 8) return -1; - band = 0; + band = band_start; for (seg = 0; seg < dba_nsegs; seg++) { band += dba_offsets[seg]; - if (band >= 50 || dba_lengths[seg] > 50-band) + if (band >= AC3_CRITICAL_BANDS || dba_lengths[seg] > AC3_CRITICAL_BANDS-band) return -1; if (dba_values[seg] >= 4) { delta = (dba_values[seg] - 3) << 7; @@ -212,69 +212,20 @@ int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, return 0; } -void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end, - int snr_offset, int floor, - const uint8_t *bap_tab, uint8_t *bap) -{ - int bin, band; - - /* special case, if snr offset is -960, set all bap's to zero */ - if (snr_offset == -960) { - memset(bap, 0, 256); - return; - } - - bin = start; - band = bin_to_band_tab[start]; - do { - int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor; - int band_end = FFMIN(bin + ff_ac3_critical_band_size_tab[band], end); - for (; bin < band_end; bin++) { - int address = av_clip((psd[bin] - m) >> 5, 0, 63); - bap[bin] = bap_tab[address]; - } - } while (end > band_start_tab[band++]); -} - -/* AC-3 bit allocation. The algorithm is the one described in the AC-3 - spec. */ -void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap, - int8_t *exp, int start, int end, - int snr_offset, int fast_gain, int is_lfe, - int dba_mode, int dba_nsegs, - uint8_t *dba_offsets, uint8_t *dba_lengths, - uint8_t *dba_values) -{ - int16_t psd[256]; /* scaled exponents */ - int16_t band_psd[50]; /* interpolated exponents */ - int16_t mask[50]; /* masking value */ - - ff_ac3_bit_alloc_calc_psd(exp, start, end, psd, band_psd); - - ff_ac3_bit_alloc_calc_mask(s, band_psd, start, end, fast_gain, is_lfe, - dba_mode, dba_nsegs, dba_offsets, dba_lengths, - dba_values, mask); - - ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snr_offset, s->floor, - ff_ac3_bap_tab, bap); -} - /** - * Initializes some tables. + * Initialize some tables. * note: This function must remain thread safe because it is called by the * AVParser init code. */ -av_cold void ac3_common_init(void) +av_cold void ff_ac3_common_init(void) { #if !CONFIG_HARDCODED_TABLES - /* compute bndtab and masktab from bandsz */ + /* compute ff_ac3_bin_to_band_tab from ff_ac3_band_start_tab */ int bin = 0, band; - for (band = 0; band < 50; band++) { - int band_end = bin + ff_ac3_critical_band_size_tab[band]; - band_start_tab[band] = bin; + for (band = 0; band < AC3_CRITICAL_BANDS; band++) { + int band_end = ff_ac3_band_start_tab[band+1]; while (bin < band_end) - bin_to_band_tab[bin++] = band; + ff_ac3_bin_to_band_tab[bin++] = band; } - band_start_tab[50] = bin; #endif /* !CONFIG_HARDCODED_TABLES */ }