Mercurial > libavcodec.hg
annotate ac3.c @ 12043:f9a0bd0888a4 libavcodec
mpegaudio: call ff_mpegaudiodec_init_mmx() only from float decoder
The mmx code is floating-point only, and this function does not know
from which decoder it is called. Without this change, the integer
decoder only "works" because the size of the context struct is smaller
in this case, and the mmx init function writes the function pointer
outside the allocated context.
author | mru |
---|---|
date | Thu, 01 Jul 2010 23:21:17 +0000 |
parents | fdafbcef52f5 |
children |
rev | line source |
---|---|
0 | 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 | 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 | 8 * modify it under the terms of the GNU Lesser General Public |
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 | 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 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Lesser General Public License for more details. | |
0 | 16 * |
429 | 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 | 20 */ |
1106 | 21 |
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 | 25 */ |
782 | 26 |
4642 | 27 #include "avcodec.h" |
28 #include "ac3.h" | |
9428 | 29 #include "get_bits.h" |
0 | 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 | 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 | 73 static uint8_t band_start_tab[51]; |
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 | 76 |
4641 | 77 static inline int calc_lowcomp1(int a, int b0, int b1, int c) |
0 | 78 { |
79 if ((b0 + 256) == b1) { | |
4641 | 80 a = c; |
2967 | 81 } else if (b0 > b1) { |
4641 | 82 a = FFMAX(a - 64, 0); |
0 | 83 } |
84 return a; | |
85 } | |
86 | |
87 static inline int calc_lowcomp(int a, int b0, int b1, int bin) | |
88 { | |
89 if (bin < 7) { | |
4641 | 90 return calc_lowcomp1(a, b0, b1, 384); |
0 | 91 } else if (bin < 20) { |
4641 | 92 return calc_lowcomp1(a, b0, b1, 320); |
0 | 93 } else { |
4641 | 94 return FFMAX(a - 128, 0); |
0 | 95 } |
96 } | |
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 | 99 int16_t *band_psd) |
0 | 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 | 102 |
103 /* exponent mapping to PSD */ | |
10284 | 104 for (bin = start; bin < end; bin++) { |
0 | 105 psd[bin]=(3072 - (exp[bin] << 7)); |
106 } | |
107 | |
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 | 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 | 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 | 119 } |
10283 | 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 | 125 int start, int end, int fast_gain, int is_lfe, |
126 int dba_mode, int dba_nsegs, uint8_t *dba_offsets, | |
127 uint8_t *dba_lengths, uint8_t *dba_values, | |
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 | 131 int band; |
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 | 134 |
135 /* excitation function */ | |
10286 | 136 band_start = bin_to_band_tab[start]; |
137 band_end = bin_to_band_tab[end-1] + 1; | |
2967 | 138 |
10286 | 139 if (band_start == 0) { |
782 | 140 lowcomp = 0; |
6003 | 141 lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384); |
142 excite[0] = band_psd[0] - fast_gain - lowcomp; | |
143 lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384); | |
144 excite[1] = band_psd[1] - fast_gain - lowcomp; | |
4640 | 145 begin = 7; |
10286 | 146 for (band = 2; band < 7; band++) { |
147 if (!(is_lfe && band == 6)) | |
148 lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384); | |
149 fastleak = band_psd[band] - fast_gain; | |
150 slowleak = band_psd[band] - s->slow_gain; | |
151 excite[band] = fastleak - lowcomp; | |
152 if (!(is_lfe && band == 6)) { | |
153 if (band_psd[band] <= band_psd[band+1]) { | |
154 begin = band + 1; | |
4640 | 155 break; |
782 | 156 } |
157 } | |
158 } | |
2967 | 159 |
10286 | 160 end1 = FFMIN(band_end, 22); |
161 for (band = begin; band < end1; band++) { | |
162 if (!(is_lfe && band == 6)) | |
163 lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band); | |
164 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain); | |
165 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain); | |
166 excite[band] = FFMAX(fastleak - lowcomp, slowleak); | |
782 | 167 } |
168 begin = 22; | |
169 } else { | |
170 /* coupling channel */ | |
10286 | 171 begin = band_start; |
6003 | 172 fastleak = (s->cpl_fast_leak << 8) + 768; |
173 slowleak = (s->cpl_slow_leak << 8) + 768; | |
0 | 174 } |
175 | |
10286 | 176 for (band = begin; band < band_end; band++) { |
177 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain); | |
178 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain); | |
179 excite[band] = FFMAX(fastleak, slowleak); | |
0 | 180 } |
181 | |
182 /* compute masking curve */ | |
183 | |
10286 | 184 for (band = band_start; band < band_end; band++) { |
185 int tmp = s->db_per_bit - band_psd[band]; | |
0 | 186 if (tmp > 0) { |
10286 | 187 excite[band] += tmp >> 2; |
0 | 188 } |
10286 | 189 mask[band] = FFMAX(ff_ac3_hearing_threshold_tab[band >> s->sr_shift][s->sr_code], excite[band]); |
0 | 190 } |
191 | |
782 | 192 /* delta bit allocation */ |
193 | |
6003 | 194 if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) { |
10286 | 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 | 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 | 203 if (dba_values[seg] >= 4) { |
204 delta = (dba_values[seg] - 3) << 7; | |
782 | 205 } else { |
6003 | 206 delta = (dba_values[seg] - 4) << 7; |
782 | 207 } |
10286 | 208 for (i = 0; i < dba_lengths[seg]; i++) { |
209 mask[band++] += delta; | |
782 | 210 } |
211 } | |
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 | 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 | 217 int snr_offset, int floor, |
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 | 221 |
6003 | 222 /* special case, if snr offset is -960, set all bap's to zero */ |
10284 | 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 | 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 | 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 | 238 } |
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 | 244 int snr_offset, int fast_gain, int is_lfe, |
245 int dba_mode, int dba_nsegs, | |
246 uint8_t *dba_offsets, uint8_t *dba_lengths, | |
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 | 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 | 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 | 255 ff_ac3_bit_alloc_calc_mask(s, band_psd, start, end, fast_gain, is_lfe, |
10284 | 256 dba_mode, dba_nsegs, dba_offsets, dba_lengths, |
257 dba_values, mask); | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
258 |
7017 | 259 ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snr_offset, s->floor, |
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 | 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 | 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 | 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 | 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 | 281 } |