X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fac3.c;h=1118b5230a53d02aa6a95096263403d26014d270;hb=404e51478ecad060249d5b9bee6ab39a8a9d8c1c;hp=41bc1345c940c90114688c65bcd42baf7f172809;hpb=20520421a120ee86362548e53b4225ebb69d3aee;p=ffmpeg diff --git a/libavcodec/ac3.c b/libavcodec/ac3.c index 41bc1345c94..1118b5230a5 100644 --- a/libavcodec/ac3.c +++ b/libavcodec/ac3.c @@ -2,38 +2,37 @@ * 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. */ +#include "libavutil/common.h" + #include "avcodec.h" #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 +40,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 +71,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) @@ -98,27 +98,27 @@ static inline int calc_lowcomp(int a, int b0, int b1, int bin) void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, int16_t *band_psd) { - int bin, j, k, end1, v; + int bin, band; /* exponent mapping to PSD */ - for(bin=start;bin> 1, 255); - v = FFMAX(v, psd[j]) + 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[k]=v; - k++; - } while (end > band_start_tab[k]); + band_psd[band++] = v; + } while (end > ff_ac3_band_start_tab[band]); } int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, @@ -127,163 +127,106 @@ 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 */ - int bin, k; - int bndstrt, bndend, begin, end1, tmp; + int16_t excite[AC3_CRITICAL_BANDS]; /* excitation */ + int band; + int band_start, band_end, begin, end1; int lowcomp, fastleak, slowleak; /* excitation function */ - bndstrt = bin_to_band_tab[start]; - bndend = 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 (bndstrt == 0) { + if (band_start == 0) { lowcomp = 0; lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384); excite[0] = band_psd[0] - fast_gain - lowcomp; lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384); excite[1] = band_psd[1] - fast_gain - lowcomp; begin = 7; - for (bin = 2; bin < 7; bin++) { - if (!(is_lfe && bin == 6)) - lowcomp = calc_lowcomp1(lowcomp, band_psd[bin], band_psd[bin+1], 384); - fastleak = band_psd[bin] - fast_gain; - slowleak = band_psd[bin] - s->slow_gain; - excite[bin] = fastleak - lowcomp; - if (!(is_lfe && bin == 6)) { - if (band_psd[bin] <= band_psd[bin+1]) { - begin = bin + 1; + for (band = 2; band < 7; band++) { + if (!(is_lfe && band == 6)) + lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384); + fastleak = band_psd[band] - fast_gain; + slowleak = band_psd[band] - s->slow_gain; + excite[band] = fastleak - lowcomp; + if (!(is_lfe && band == 6)) { + if (band_psd[band] <= band_psd[band+1]) { + begin = band + 1; break; } } } - end1=bndend; - if (end1 > 22) end1=22; - - for (bin = begin; bin < end1; bin++) { - if (!(is_lfe && bin == 6)) - lowcomp = calc_lowcomp(lowcomp, band_psd[bin], band_psd[bin+1], bin); - - fastleak = FFMAX(fastleak - s->fast_decay, band_psd[bin] - fast_gain); - slowleak = FFMAX(slowleak - s->slow_decay, band_psd[bin] - s->slow_gain); - excite[bin] = FFMAX(fastleak - lowcomp, slowleak); + end1 = FFMIN(band_end, 22); + for (band = begin; band < end1; band++) { + if (!(is_lfe && band == 6)) + lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band); + fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain); + slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain); + excite[band] = FFMAX(fastleak - lowcomp, slowleak); } begin = 22; } else { /* coupling channel */ - begin = bndstrt; - + begin = band_start; fastleak = (s->cpl_fast_leak << 8) + 768; slowleak = (s->cpl_slow_leak << 8) + 768; } - for (bin = begin; bin < bndend; bin++) { - fastleak = FFMAX(fastleak - s->fast_decay, band_psd[bin] - fast_gain); - slowleak = FFMAX(slowleak - s->slow_decay, band_psd[bin] - s->slow_gain); - excite[bin] = FFMAX(fastleak, slowleak); + for (band = begin; band < band_end; band++) { + fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain); + slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain); + excite[band] = FFMAX(fastleak, slowleak); } /* compute masking curve */ - for (bin = bndstrt; bin < bndend; bin++) { - tmp = s->db_per_bit - band_psd[bin]; + for (band = band_start; band < band_end; band++) { + int tmp = s->db_per_bit - band_psd[band]; if (tmp > 0) { - excite[bin] += tmp >> 2; + excite[band] += tmp >> 2; } - mask[bin] = FFMAX(ff_ac3_hearing_threshold_tab[bin >> s->sr_shift][s->sr_code], excite[bin]); + mask[band] = FFMAX(ff_ac3_hearing_threshold_tab[band >> s->sr_shift][s->sr_code], excite[band]); } /* delta bit allocation */ if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) { - int band, seg, delta; - if (dba_nsegs >= 8) + int i, seg, delta; + 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; } else { delta = (dba_values[seg] - 4) << 7; } - for (k = 0; k < dba_lengths[seg]; k++) { - mask[band] += delta; - band++; + for (i = 0; i < dba_lengths[seg]; i++) { + mask[band++] += delta; } } } 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 i, j, k, end1, v, address; - - /* special case, if snr offset is -960, set all bap's to zero */ - if(snr_offset == -960) { - memset(bap, 0, 256); - return; - } - - i = start; - j = bin_to_band_tab[start]; - do { - v = (FFMAX(mask[j] - snr_offset - floor, 0) & 0x1FE0) + floor; - end1 = FFMIN(band_start_tab[j] + ff_ac3_critical_band_size_tab[j], end); - for (k = i; k < end1; k++) { - address = av_clip((psd[i] - v) >> 5, 0, 63); - bap[i] = bap_tab[address]; - i++; - } - } while (end > band_start_tab[j++]); -} - -/* 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 - int i, j, k, l, v; - /* compute bndtab and masktab from bandsz */ - k = 0; - l = 0; - for(i=0;i<50;i++) { - band_start_tab[i] = l; - v = ff_ac3_critical_band_size_tab[i]; - for(j=0;j