annotate ac3.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents fdafbcef52f5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
7470
1a93d3bbe3ee cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents: 7017
diff changeset
2 * Common code between the AC-3 encoder and decoder
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8280
diff changeset
3 * Copyright (c) 2000 Fabrice Bellard
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3668
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3668
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3668
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3668
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3668
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
16 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3668
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 10879
diff changeset
23 * @file
7470
1a93d3bbe3ee cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents: 7017
diff changeset
24 * Common code between the AC-3 encoder and decoder.
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
25 */
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
26
4642
7e140e4cd8cb Create ac3.c which will be used for AC-3 common code.
jbr
parents: 4641
diff changeset
27 #include "avcodec.h"
7e140e4cd8cb Create ac3.c which will be used for AC-3 common code.
jbr
parents: 4641
diff changeset
28 #include "ac3.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 8718
diff changeset
29 #include "get_bits.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
30
10278
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
31 #if CONFIG_HARDCODED_TABLES
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
32
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
33 /**
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
34 * Starting frequency coefficient bin for each critical band.
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
35 */
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
36 static const uint8_t band_start_tab[51] = {
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
37 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
38 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
39 20, 21, 22, 23, 24, 25, 26, 27, 28, 31,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
40 34, 37, 40, 43, 46, 49, 55, 61, 67, 73,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
41 79, 85, 97, 109, 121, 133, 157, 181, 205, 229, 253
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
42 };
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
43
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
44 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
45 * Map each frequency coefficient bin to the critical band that contains it.
10278
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
46 */
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
47 static const uint8_t bin_to_band_tab[253] = {
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
48 0,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
49 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
50 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
51 25, 26, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
52 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
53 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
54 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
55 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
56 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
57 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
58 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
59 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
60 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
61 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
62 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
63 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
64 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
65 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
66 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
67 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
68 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
69 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
70 };
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
71
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
72 #else /* CONFIG_HARDCODED_TABLES */
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
73 static uint8_t band_start_tab[51];
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
74 static uint8_t bin_to_band_tab[253];
10278
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
75 #endif
4879
60603c9c89d1 move ac3 tables from a .h to a .c
aurel
parents: 4855
diff changeset
76
4641
5bc169ed9db6 simplify AC-3 bit allocation
jbr
parents: 4640
diff changeset
77 static inline int calc_lowcomp1(int a, int b0, int b1, int c)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 if ((b0 + 256) == b1) {
4641
5bc169ed9db6 simplify AC-3 bit allocation
jbr
parents: 4640
diff changeset
80 a = c;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2644
diff changeset
81 } else if (b0 > b1) {
4641
5bc169ed9db6 simplify AC-3 bit allocation
jbr
parents: 4640
diff changeset
82 a = FFMAX(a - 64, 0);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 return a;
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
86
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 static inline int calc_lowcomp(int a, int b0, int b1, int bin)
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 if (bin < 7) {
4641
5bc169ed9db6 simplify AC-3 bit allocation
jbr
parents: 4640
diff changeset
90 return calc_lowcomp1(a, b0, b1, 384);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 } else if (bin < 20) {
4641
5bc169ed9db6 simplify AC-3 bit allocation
jbr
parents: 4640
diff changeset
92 return calc_lowcomp1(a, b0, b1, 320);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 } else {
4641
5bc169ed9db6 simplify AC-3 bit allocation
jbr
parents: 4640
diff changeset
94 return FFMAX(a - 128, 0);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
97
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
98 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
99 int16_t *band_psd)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 {
10282
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
101 int bin, band;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
102
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 /* exponent mapping to PSD */
10284
38e05838efc0 Cosmetics: Do some basic pretty-printing.
jbr
parents: 10283
diff changeset
104 for (bin = start; bin < end; bin++) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 psd[bin]=(3072 - (exp[bin] << 7));
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
107
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 /* PSD integration */
10282
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
109 bin = start;
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
110 band = bin_to_band_tab[start];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 do {
10282
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
112 int v = psd[bin++];
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
113 int band_end = FFMIN(band_start_tab[band+1], end);
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
114 for (; bin < band_end; bin++) {
10879
7d46c481d045 Change code so it uses 2 adds instead of one FFABS.
reimar
parents: 10489
diff changeset
115 int max = FFMAX(v, psd[bin]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 /* logadd */
10879
7d46c481d045 Change code so it uses 2 adds instead of one FFABS.
reimar
parents: 10489
diff changeset
117 int adr = FFMIN(max - ((v + psd[bin] + 1) >> 1), 255);
7d46c481d045 Change code so it uses 2 adds instead of one FFABS.
reimar
parents: 10489
diff changeset
118 v = max + ff_ac3_log_add_tab[adr];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 }
10283
a4b3121d4299 Simplify by combining increment with array access.
jbr
parents: 10282
diff changeset
120 band_psd[band++] = v;
10282
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
121 } while (end > band_start_tab[band]);
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
122 }
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
123
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
124 int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd,
8280
63aba08af550 cosmetics: alignment after last commit
jbr
parents: 8279
diff changeset
125 int start, int end, int fast_gain, int is_lfe,
63aba08af550 cosmetics: alignment after last commit
jbr
parents: 8279
diff changeset
126 int dba_mode, int dba_nsegs, uint8_t *dba_offsets,
63aba08af550 cosmetics: alignment after last commit
jbr
parents: 8279
diff changeset
127 uint8_t *dba_lengths, uint8_t *dba_values,
63aba08af550 cosmetics: alignment after last commit
jbr
parents: 8279
diff changeset
128 int16_t *mask)
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
129 {
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
130 int16_t excite[50]; /* excitation */
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
131 int band;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
132 int band_start, band_end, begin, end1;
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
133 int lowcomp, fastleak, slowleak;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
134
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 /* excitation function */
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
136 band_start = bin_to_band_tab[start];
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
137 band_end = bin_to_band_tab[end-1] + 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2644
diff changeset
138
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
139 if (band_start == 0) {
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
140 lowcomp = 0;
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
141 lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384);
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
142 excite[0] = band_psd[0] - fast_gain - lowcomp;
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
143 lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384);
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
144 excite[1] = band_psd[1] - fast_gain - lowcomp;
4640
d539eb4db3d2 cosmetics. remove space before semi-colon.
jbr
parents: 4230
diff changeset
145 begin = 7;
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
146 for (band = 2; band < 7; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
147 if (!(is_lfe && band == 6))
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
148 lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
149 fastleak = band_psd[band] - fast_gain;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
150 slowleak = band_psd[band] - s->slow_gain;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
151 excite[band] = fastleak - lowcomp;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
152 if (!(is_lfe && band == 6)) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
153 if (band_psd[band] <= band_psd[band+1]) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
154 begin = band + 1;
4640
d539eb4db3d2 cosmetics. remove space before semi-colon.
jbr
parents: 4230
diff changeset
155 break;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
156 }
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
157 }
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
158 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2644
diff changeset
159
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
160 end1 = FFMIN(band_end, 22);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
161 for (band = begin; band < end1; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
162 if (!(is_lfe && band == 6))
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
163 lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
164 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
165 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
166 excite[band] = FFMAX(fastleak - lowcomp, slowleak);
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
167 }
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
168 begin = 22;
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
169 } else {
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
170 /* coupling channel */
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
171 begin = band_start;
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
172 fastleak = (s->cpl_fast_leak << 8) + 768;
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
173 slowleak = (s->cpl_slow_leak << 8) + 768;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
175
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
176 for (band = begin; band < band_end; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
177 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
178 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
179 excite[band] = FFMAX(fastleak, slowleak);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
181
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 /* compute masking curve */
986e461dc072 Initial revision
glantau
parents:
diff changeset
183
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
184 for (band = band_start; band < band_end; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
185 int tmp = s->db_per_bit - band_psd[band];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 if (tmp > 0) {
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
187 excite[band] += tmp >> 2;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 }
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
189 mask[band] = FFMAX(ff_ac3_hearing_threshold_tab[band >> s->sr_shift][s->sr_code], excite[band]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
191
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
192 /* delta bit allocation */
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
193
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
194 if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) {
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
195 int i, seg, delta;
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
196 if (dba_nsegs >= 8)
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
197 return -1;
4640
d539eb4db3d2 cosmetics. remove space before semi-colon.
jbr
parents: 4230
diff changeset
198 band = 0;
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
199 for (seg = 0; seg < dba_nsegs; seg++) {
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
200 band += dba_offsets[seg];
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
201 if (band >= 50 || dba_lengths[seg] > 50-band)
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
202 return -1;
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
203 if (dba_values[seg] >= 4) {
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
204 delta = (dba_values[seg] - 3) << 7;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
205 } else {
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
206 delta = (dba_values[seg] - 4) << 7;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
207 }
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
208 for (i = 0; i < dba_lengths[seg]; i++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
209 mask[band++] += delta;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
210 }
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
211 }
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
212 }
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
213 return 0;
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
214 }
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
215
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
216 void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end,
7017
60fd9ae9540e pass bap table to ff_ac3_bit_alloc_calc_bap()
jbr
parents: 6998
diff changeset
217 int snr_offset, int floor,
60fd9ae9540e pass bap table to ff_ac3_bit_alloc_calc_bap()
jbr
parents: 6998
diff changeset
218 const uint8_t *bap_tab, uint8_t *bap)
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
219 {
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
220 int bin, band;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2644
diff changeset
221
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
222 /* special case, if snr offset is -960, set all bap's to zero */
10284
38e05838efc0 Cosmetics: Do some basic pretty-printing.
jbr
parents: 10283
diff changeset
223 if (snr_offset == -960) {
4689
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
224 memset(bap, 0, 256);
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
225 return;
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
226 }
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
227
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
228 bin = start;
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
229 band = bin_to_band_tab[start];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 do {
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
231 int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor;
10489
8e07155cbe04 Simplify AC-3 critical band end calculation (correctly this time).
jbr
parents: 10488
diff changeset
232 int band_end = FFMIN(band_start_tab[band+1], end);
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
233 for (; bin < band_end; bin++) {
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
234 int address = av_clip((psd[bin] - m) >> 5, 0, 63);
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
235 bap[bin] = bap_tab[address];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 }
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
237 } while (end > band_start_tab[band++]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
238 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
239
7470
1a93d3bbe3ee cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents: 7017
diff changeset
240 /* AC-3 bit allocation. The algorithm is the one described in the AC-3
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
241 spec. */
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
242 void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap,
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
243 int8_t *exp, int start, int end,
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
244 int snr_offset, int fast_gain, int is_lfe,
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
245 int dba_mode, int dba_nsegs,
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
246 uint8_t *dba_offsets, uint8_t *dba_lengths,
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
247 uint8_t *dba_values)
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
248 {
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
249 int16_t psd[256]; /* scaled exponents */
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
250 int16_t band_psd[50]; /* interpolated exponents */
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
251 int16_t mask[50]; /* masking value */
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
252
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
253 ff_ac3_bit_alloc_calc_psd(exp, start, end, psd, band_psd);
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
254
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
255 ff_ac3_bit_alloc_calc_mask(s, band_psd, start, end, fast_gain, is_lfe,
10284
38e05838efc0 Cosmetics: Do some basic pretty-printing.
jbr
parents: 10283
diff changeset
256 dba_mode, dba_nsegs, dba_offsets, dba_lengths,
38e05838efc0 Cosmetics: Do some basic pretty-printing.
jbr
parents: 10283
diff changeset
257 dba_values, mask);
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
258
7017
60fd9ae9540e pass bap table to ff_ac3_bit_alloc_calc_bap()
jbr
parents: 6998
diff changeset
259 ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snr_offset, s->floor,
60fd9ae9540e pass bap table to ff_ac3_bit_alloc_calc_bap()
jbr
parents: 6998
diff changeset
260 ff_ac3_bap_tab, bap);
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
261 }
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
262
4645
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
263 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
264 * Initialize some tables.
4645
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
265 * note: This function must remain thread safe because it is called by the
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
266 * AVParser init code.
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
267 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6003
diff changeset
268 av_cold void ac3_common_init(void)
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
269 {
10278
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
270 #if !CONFIG_HARDCODED_TABLES
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
271 /* compute bndtab and masktab from bandsz */
10288
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
272 int bin = 0, band;
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
273 for (band = 0; band < 50; band++) {
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
274 int band_end = bin + ff_ac3_critical_band_size_tab[band];
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
275 band_start_tab[band] = bin;
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
276 while (bin < band_end)
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
277 bin_to_band_tab[bin++] = band;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
278 }
10288
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
279 band_start_tab[50] = bin;
10278
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
280 #endif /* !CONFIG_HARDCODED_TABLES */
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
281 }