Statistics
| Branch: | Revision:

ffmpeg / libavcodec / ac3.c @ 4c57cde9

History | View | Annotate | Download (8.47 KB)

1 96ae7f11 Justin Ruggles
/*
2 14b70628 Justin Ruggles
 * Common code between the AC-3 encoder and decoder
3 406792e7 Diego Biurrun
 * Copyright (c) 2000 Fabrice Bellard
4 96ae7f11 Justin Ruggles
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
22
/**
23 ba87f080 Diego Biurrun
 * @file
24 14b70628 Justin Ruggles
 * Common code between the AC-3 encoder and decoder.
25 96ae7f11 Justin Ruggles
 */
26
27
#include "avcodec.h"
28
#include "ac3.h"
29 9106a698 Stefano Sabatini
#include "get_bits.h"
30 96ae7f11 Justin Ruggles
31 b05e4195 Justin Ruggles
/**
32
 * Starting frequency coefficient bin for each critical band.
33
 */
34 47ae6e79 Justin Ruggles
static const uint8_t band_start_tab[AC3_CRITICAL_BANDS+1] = {
35 b05e4195 Justin Ruggles
      0,  1,   2,   3,   4,   5,   6,   7,   8,   9,
36
     10,  11, 12,  13,  14,  15,  16,  17,  18,  19,
37
     20,  21, 22,  23,  24,  25,  26,  27,  28,  31,
38
     34,  37, 40,  43,  46,  49,  55,  61,  67,  73,
39
     79,  85, 97, 109, 121, 133, 157, 181, 205, 229, 253
40
};
41
42 24e3ad30 Justin Ruggles
#if CONFIG_HARDCODED_TABLES
43
44 b05e4195 Justin Ruggles
/**
45 49bd8e4b Måns Rullgård
 * Map each frequency coefficient bin to the critical band that contains it.
46 b05e4195 Justin Ruggles
 */
47
static const uint8_t bin_to_band_tab[253] = {
48
     0,
49
     1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
50
    13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
51
    25, 26, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30,
52
    31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34,
53
    35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36,
54
    37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38,
55
    39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40,
56
    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
57
    42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
58
    43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
59
    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
60
    45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
61
    45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
62
    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
63
    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
64
    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
65
    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
66
    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
67
    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
68
    49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
69
    49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49
70
};
71
72
#else /* CONFIG_HARDCODED_TABLES */
73 5ce21342 Justin Ruggles
static uint8_t bin_to_band_tab[253];
74 b05e4195 Justin Ruggles
#endif
75 7adb10be Aurelien Jacobs
76 96ae7f11 Justin Ruggles
static inline int calc_lowcomp1(int a, int b0, int b1, int c)
77
{
78
    if ((b0 + 256) == b1) {
79
        a = c;
80
    } else if (b0 > b1) {
81
        a = FFMAX(a - 64, 0);
82
    }
83
    return a;
84
}
85
86
static inline int calc_lowcomp(int a, int b0, int b1, int bin)
87
{
88
    if (bin < 7) {
89
        return calc_lowcomp1(a, b0, b1, 384);
90
    } else if (bin < 20) {
91
        return calc_lowcomp1(a, b0, b1, 320);
92
    } else {
93
        return FFMAX(a - 128, 0);
94
    }
95
}
96
97 575bf46f Justin Ruggles
void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
98 5ce21342 Justin Ruggles
                               int16_t *band_psd)
99 96ae7f11 Justin Ruggles
{
100 89e6317b Justin Ruggles
    int bin, band;
101 96ae7f11 Justin Ruggles
102
    /* exponent mapping to PSD */
103 612bdf18 Justin Ruggles
    for (bin = start; bin < end; bin++) {
104 96ae7f11 Justin Ruggles
        psd[bin]=(3072 - (exp[bin] << 7));
105
    }
106
107
    /* PSD integration */
108 89e6317b Justin Ruggles
    bin  = start;
109
    band = bin_to_band_tab[start];
110 96ae7f11 Justin Ruggles
    do {
111 89e6317b Justin Ruggles
        int v = psd[bin++];
112
        int band_end = FFMIN(band_start_tab[band+1], end);
113
        for (; bin < band_end; bin++) {
114 29b75f0b Reimar Döffinger
            int max = FFMAX(v, psd[bin]);
115 96ae7f11 Justin Ruggles
            /* logadd */
116 29b75f0b Reimar Döffinger
            int adr = FFMIN(max - ((v + psd[bin] + 1) >> 1), 255);
117
            v = max + ff_ac3_log_add_tab[adr];
118 96ae7f11 Justin Ruggles
        }
119 bf864383 Justin Ruggles
        band_psd[band++] = v;
120 89e6317b Justin Ruggles
    } while (end > band_start_tab[band]);
121 575bf46f Justin Ruggles
}
122
123 72a6244b Justin Ruggles
int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd,
124 20e04726 Justin Ruggles
                               int start, int end, int fast_gain, int is_lfe,
125
                               int dba_mode, int dba_nsegs, uint8_t *dba_offsets,
126
                               uint8_t *dba_lengths, uint8_t *dba_values,
127
                               int16_t *mask)
128 575bf46f Justin Ruggles
{
129 47ae6e79 Justin Ruggles
    int16_t excite[AC3_CRITICAL_BANDS]; /* excitation */
130 403b1543 Justin Ruggles
    int band;
131
    int band_start, band_end, begin, end1;
132 575bf46f Justin Ruggles
    int lowcomp, fastleak, slowleak;
133 96ae7f11 Justin Ruggles
134
    /* excitation function */
135 403b1543 Justin Ruggles
    band_start = bin_to_band_tab[start];
136
    band_end   = bin_to_band_tab[end-1] + 1;
137 96ae7f11 Justin Ruggles
138 403b1543 Justin Ruggles
    if (band_start == 0) {
139 96ae7f11 Justin Ruggles
        lowcomp = 0;
140 5ce21342 Justin Ruggles
        lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384);
141
        excite[0] = band_psd[0] - fast_gain - lowcomp;
142
        lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384);
143
        excite[1] = band_psd[1] - fast_gain - lowcomp;
144 96ae7f11 Justin Ruggles
        begin = 7;
145 403b1543 Justin Ruggles
        for (band = 2; band < 7; band++) {
146
            if (!(is_lfe && band == 6))
147
                lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384);
148
            fastleak = band_psd[band] - fast_gain;
149
            slowleak = band_psd[band] - s->slow_gain;
150
            excite[band] = fastleak - lowcomp;
151
            if (!(is_lfe && band == 6)) {
152
                if (band_psd[band] <= band_psd[band+1]) {
153
                    begin = band + 1;
154 96ae7f11 Justin Ruggles
                    break;
155
                }
156
            }
157
        }
158
159 403b1543 Justin Ruggles
        end1 = FFMIN(band_end, 22);
160
        for (band = begin; band < end1; band++) {
161
            if (!(is_lfe && band == 6))
162
                lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band);
163
            fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
164
            slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
165
            excite[band] = FFMAX(fastleak - lowcomp, slowleak);
166 96ae7f11 Justin Ruggles
        }
167
        begin = 22;
168
    } else {
169
        /* coupling channel */
170 403b1543 Justin Ruggles
        begin = band_start;
171 5ce21342 Justin Ruggles
        fastleak = (s->cpl_fast_leak << 8) + 768;
172
        slowleak = (s->cpl_slow_leak << 8) + 768;
173 96ae7f11 Justin Ruggles
    }
174
175 403b1543 Justin Ruggles
    for (band = begin; band < band_end; band++) {
176
        fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
177
        slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
178
        excite[band] = FFMAX(fastleak, slowleak);
179 96ae7f11 Justin Ruggles
    }
180
181
    /* compute masking curve */
182
183 403b1543 Justin Ruggles
    for (band = band_start; band < band_end; band++) {
184
        int tmp = s->db_per_bit - band_psd[band];
185 96ae7f11 Justin Ruggles
        if (tmp > 0) {
186 403b1543 Justin Ruggles
            excite[band] += tmp >> 2;
187 96ae7f11 Justin Ruggles
        }
188 403b1543 Justin Ruggles
        mask[band] = FFMAX(ff_ac3_hearing_threshold_tab[band >> s->sr_shift][s->sr_code], excite[band]);
189 96ae7f11 Justin Ruggles
    }
190
191
    /* delta bit allocation */
192
193 5ce21342 Justin Ruggles
    if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) {
194 403b1543 Justin Ruggles
        int i, seg, delta;
195 72a6244b Justin Ruggles
        if (dba_nsegs >= 8)
196
            return -1;
197 96ae7f11 Justin Ruggles
        band = 0;
198 72a6244b Justin Ruggles
        for (seg = 0; seg < dba_nsegs; seg++) {
199
            band += dba_offsets[seg];
200 47ae6e79 Justin Ruggles
            if (band >= AC3_CRITICAL_BANDS || dba_lengths[seg] > AC3_CRITICAL_BANDS-band)
201 72a6244b Justin Ruggles
                return -1;
202 5ce21342 Justin Ruggles
            if (dba_values[seg] >= 4) {
203
                delta = (dba_values[seg] - 3) << 7;
204 96ae7f11 Justin Ruggles
            } else {
205 5ce21342 Justin Ruggles
                delta = (dba_values[seg] - 4) << 7;
206 96ae7f11 Justin Ruggles
            }
207 403b1543 Justin Ruggles
            for (i = 0; i < dba_lengths[seg]; i++) {
208
                mask[band++] += delta;
209 96ae7f11 Justin Ruggles
            }
210
        }
211
    }
212 72a6244b Justin Ruggles
    return 0;
213 575bf46f Justin Ruggles
}
214 96ae7f11 Justin Ruggles
215 575bf46f Justin Ruggles
void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end,
216 687671f0 Justin Ruggles
                               int snr_offset, int floor,
217
                               const uint8_t *bap_tab, uint8_t *bap)
218 575bf46f Justin Ruggles
{
219 444ce49a Justin Ruggles
    int bin, band;
220 96ae7f11 Justin Ruggles
221 5ce21342 Justin Ruggles
    /* special case, if snr offset is -960, set all bap's to zero */
222 612bdf18 Justin Ruggles
    if (snr_offset == -960) {
223 ce571ceb Justin Ruggles
        memset(bap, 0, AC3_MAX_COEFS);
224 b5a05cc2 Justin Ruggles
        return;
225
    }
226
227 444ce49a Justin Ruggles
    bin  = start;
228
    band = bin_to_band_tab[start];
229 96ae7f11 Justin Ruggles
    do {
230 444ce49a Justin Ruggles
        int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor;
231 31f8c109 Justin Ruggles
        int band_end = FFMIN(band_start_tab[band+1], end);
232 444ce49a Justin Ruggles
        for (; bin < band_end; bin++) {
233
            int address = av_clip((psd[bin] - m) >> 5, 0, 63);
234
            bap[bin] = bap_tab[address];
235 96ae7f11 Justin Ruggles
        }
236 444ce49a Justin Ruggles
    } while (end > band_start_tab[band++]);
237 96ae7f11 Justin Ruggles
}
238
239 050aa8b9 Justin Ruggles
/**
240 49bd8e4b Måns Rullgård
 * Initialize some tables.
241 050aa8b9 Justin Ruggles
 * note: This function must remain thread safe because it is called by the
242
 *       AVParser init code.
243
 */
244 4c57cde9 Justin Ruggles
av_cold void ff_ac3_common_init(void)
245 96ae7f11 Justin Ruggles
{
246 b05e4195 Justin Ruggles
#if !CONFIG_HARDCODED_TABLES
247 24e3ad30 Justin Ruggles
    /* compute bin_to_band_tab from band_start_tab */
248 84cb4bc6 Justin Ruggles
    int bin = 0, band;
249 47ae6e79 Justin Ruggles
    for (band = 0; band < AC3_CRITICAL_BANDS; band++) {
250 24e3ad30 Justin Ruggles
        int band_end = band_start_tab[band+1];
251 84cb4bc6 Justin Ruggles
        while (bin < band_end)
252
            bin_to_band_tab[bin++] = band;
253 96ae7f11 Justin Ruggles
    }
254 b05e4195 Justin Ruggles
#endif /* !CONFIG_HARDCODED_TABLES */
255 96ae7f11 Justin Ruggles
}