annotate ac3.c @ 10311:943b63f364ca libavcodec

Make sure all the bits are written to output in fax data decoder. This fixes decoding TIFF images with fax compression and width being not multiple of eight (and issue 1429).
author kostya
date Tue, 29 Sep 2009 05:55:14 +0000
parents 01e6afd0aba6
children 40e411a184b2
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8629
diff changeset
23 * @file libavcodec/ac3.c
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 /**
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
45 * Maps each frequency coefficient bin to the critical band that contains it.
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++) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 /* logadd */
10282
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
116 int adr = FFMIN(FFABS(v - psd[bin]) >> 1, 255);
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
117 v = FFMAX(v, psd[bin]) + ff_ac3_log_add_tab[adr];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 }
10283
a4b3121d4299 Simplify by combining increment with array access.
jbr
parents: 10282
diff changeset
119 band_psd[band++] = v;
10282
934cd92921df cosmetics: Rename some variables to be more descriptive of their use. Do some
jbr
parents: 10281
diff changeset
120 } while (end > band_start_tab[band]);
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
121 }
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
122
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
123 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
124 int start, int end, int fast_gain, int is_lfe,
63aba08af550 cosmetics: alignment after last commit
jbr
parents: 8279
diff changeset
125 int dba_mode, int dba_nsegs, uint8_t *dba_offsets,
63aba08af550 cosmetics: alignment after last commit
jbr
parents: 8279
diff changeset
126 uint8_t *dba_lengths, uint8_t *dba_values,
63aba08af550 cosmetics: alignment after last commit
jbr
parents: 8279
diff changeset
127 int16_t *mask)
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
128 {
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
129 int16_t excite[50]; /* excitation */
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
130 int band;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
131 int band_start, band_end, begin, end1;
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
132 int lowcomp, fastleak, slowleak;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
133
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 /* excitation function */
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
135 band_start = bin_to_band_tab[start];
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
136 band_end = bin_to_band_tab[end-1] + 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2644
diff changeset
137
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
138 if (band_start == 0) {
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
139 lowcomp = 0;
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
140 lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384);
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
141 excite[0] = band_psd[0] - fast_gain - lowcomp;
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
142 lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384);
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
143 excite[1] = band_psd[1] - fast_gain - lowcomp;
4640
d539eb4db3d2 cosmetics. remove space before semi-colon.
jbr
parents: 4230
diff changeset
144 begin = 7;
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
145 for (band = 2; band < 7; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
146 if (!(is_lfe && band == 6))
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
147 lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
148 fastleak = band_psd[band] - fast_gain;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
149 slowleak = band_psd[band] - s->slow_gain;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
150 excite[band] = fastleak - lowcomp;
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
151 if (!(is_lfe && band == 6)) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
152 if (band_psd[band] <= band_psd[band+1]) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
153 begin = band + 1;
4640
d539eb4db3d2 cosmetics. remove space before semi-colon.
jbr
parents: 4230
diff changeset
154 break;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
155 }
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 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2644
diff changeset
158
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
159 end1 = FFMIN(band_end, 22);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
160 for (band = begin; band < end1; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
161 if (!(is_lfe && band == 6))
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
162 lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
163 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
164 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
165 excite[band] = FFMAX(fastleak - lowcomp, slowleak);
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
166 }
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
167 begin = 22;
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
168 } else {
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
169 /* coupling channel */
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
170 begin = band_start;
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
171 fastleak = (s->cpl_fast_leak << 8) + 768;
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
172 slowleak = (s->cpl_slow_leak << 8) + 768;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
173 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
174
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
175 for (band = begin; band < band_end; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
176 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
177 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
178 excite[band] = FFMAX(fastleak, slowleak);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
180
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 /* compute masking curve */
986e461dc072 Initial revision
glantau
parents:
diff changeset
182
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
183 for (band = band_start; band < band_end; band++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
184 int tmp = s->db_per_bit - band_psd[band];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 if (tmp > 0) {
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
186 excite[band] += tmp >> 2;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 }
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
188 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
189 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
190
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
191 /* delta bit allocation */
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
192
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
193 if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) {
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
194 int i, seg, delta;
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
195 if (dba_nsegs >= 8)
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
196 return -1;
4640
d539eb4db3d2 cosmetics. remove space before semi-colon.
jbr
parents: 4230
diff changeset
197 band = 0;
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
198 for (seg = 0; seg < dba_nsegs; seg++) {
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
199 band += dba_offsets[seg];
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
200 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
201 return -1;
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
202 if (dba_values[seg] >= 4) {
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
203 delta = (dba_values[seg] - 3) << 7;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
204 } else {
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
205 delta = (dba_values[seg] - 4) << 7;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
206 }
10286
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
207 for (i = 0; i < dba_lengths[seg]; i++) {
2bb4b0cda61e Cosmetics: Rename some variables
jbr
parents: 10285
diff changeset
208 mask[band++] += delta;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
209 }
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 }
8279
6c2dcc1410bb ac3: detect dba errors and prevent writing past end of array
jbr
parents: 7470
diff changeset
212 return 0;
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
213 }
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
214
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
215 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
216 int snr_offset, int floor,
60fd9ae9540e pass bap table to ff_ac3_bit_alloc_calc_bap()
jbr
parents: 6998
diff changeset
217 const uint8_t *bap_tab, uint8_t *bap)
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
218 {
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
219 int bin, band;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2644
diff changeset
220
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
221 /* 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
222 if (snr_offset == -960) {
4689
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
223 memset(bap, 0, 256);
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
224 return;
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
225 }
c7828f1ae244 fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents: 4684
diff changeset
226
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
227 bin = start;
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
228 band = bin_to_band_tab[start];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 do {
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
230 int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor;
10292
01e6afd0aba6 Remove unneeded table lookup.
jbr
parents: 10291
diff changeset
231 int band_end = FFMIN(bin + ff_ac3_critical_band_size_tab[band], end);
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
232 for (; bin < band_end; bin++) {
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
233 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
234 bap[bin] = bap_tab[address];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 }
10291
40736a5ed681 Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10290
diff changeset
236 } while (end > band_start_tab[band++]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
238
7470
1a93d3bbe3ee cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents: 7017
diff changeset
239 /* 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
240 spec. */
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
241 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
242 int8_t *exp, int start, int end,
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
243 int snr_offset, int fast_gain, int is_lfe,
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
244 int dba_mode, int dba_nsegs,
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
245 uint8_t *dba_offsets, uint8_t *dba_lengths,
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
246 uint8_t *dba_values)
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
247 {
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
248 int16_t psd[256]; /* scaled exponents */
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
249 int16_t band_psd[50]; /* interpolated exponents */
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
250 int16_t mask[50]; /* masking value */
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
251
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
252 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
253
6003
608c8e9ac412 cosmetics: rename ac3 bit allocation variables
jbr
parents: 6002
diff changeset
254 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
255 dba_mode, dba_nsegs, dba_offsets, dba_lengths,
38e05838efc0 Cosmetics: Do some basic pretty-printing.
jbr
parents: 10283
diff changeset
256 dba_values, mask);
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
257
7017
60fd9ae9540e pass bap table to ff_ac3_bit_alloc_calc_bap()
jbr
parents: 6998
diff changeset
258 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
259 ff_ac3_bap_tab, bap);
4684
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
260 }
6ec0afffc572 split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents: 4679
diff changeset
261
4645
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
262 /**
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
263 * Initializes some tables.
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
264 * 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
265 * AVParser init code.
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4642
diff changeset
266 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6003
diff changeset
267 av_cold void ac3_common_init(void)
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
268 {
10278
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
269 #if !CONFIG_HARDCODED_TABLES
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
270 /* compute bndtab and masktab from bandsz */
10288
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
271 int bin = 0, band;
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
272 for (band = 0; band < 50; band++) {
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
273 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
274 band_start_tab[band] = bin;
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
275 while (bin < band_end)
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
276 bin_to_band_tab[bin++] = band;
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
277 }
10288
518b07f1d61a Cosmetics: Rename some variables to be more descriptive of their use.
jbr
parents: 10287
diff changeset
278 band_start_tab[50] = bin;
10278
1a4af35efbda Hardcode AC-3 critical band tables when CONFIG_HARDCODED_TABLES is set.
jbr
parents: 9428
diff changeset
279 #endif /* !CONFIG_HARDCODED_TABLES */
782
dd7d5748d064 preparing integration of new AC3 decoder
bellard
parents: 429
diff changeset
280 }