Mercurial > libavcodec.hg
annotate ac3.c @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
author | cehoyos |
---|---|
date | Fri, 20 Feb 2009 16:20:01 +0000 |
parents | e9d9d946f213 |
children | 0dce4fe6e6f3 |
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 /** | |
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 | 25 */ |
782 | 26 |
4642 | 27 #include "avcodec.h" |
28 #include "ac3.h" | |
4648 | 29 #include "bitstream.h" |
0 | 30 |
6003 | 31 static uint8_t band_start_tab[51]; |
32 static uint8_t bin_to_band_tab[253]; | |
4879 | 33 |
4641 | 34 static inline int calc_lowcomp1(int a, int b0, int b1, int c) |
0 | 35 { |
36 if ((b0 + 256) == b1) { | |
4641 | 37 a = c; |
2967 | 38 } else if (b0 > b1) { |
4641 | 39 a = FFMAX(a - 64, 0); |
0 | 40 } |
41 return a; | |
42 } | |
43 | |
44 static inline int calc_lowcomp(int a, int b0, int b1, int bin) | |
45 { | |
46 if (bin < 7) { | |
4641 | 47 return calc_lowcomp1(a, b0, b1, 384); |
0 | 48 } else if (bin < 20) { |
4641 | 49 return calc_lowcomp1(a, b0, b1, 320); |
0 | 50 } else { |
4641 | 51 return FFMAX(a - 128, 0); |
0 | 52 } |
53 } | |
54 | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
55 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, |
6003 | 56 int16_t *band_psd) |
0 | 57 { |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
58 int bin, i, j, k, end1, v; |
0 | 59 |
60 /* exponent mapping to PSD */ | |
61 for(bin=start;bin<end;bin++) { | |
62 psd[bin]=(3072 - (exp[bin] << 7)); | |
63 } | |
64 | |
65 /* PSD integration */ | |
66 j=start; | |
6003 | 67 k=bin_to_band_tab[start]; |
0 | 68 do { |
69 v=psd[j]; | |
70 j++; | |
6003 | 71 end1 = FFMIN(band_start_tab[k+1], end); |
0 | 72 for(i=j;i<end1;i++) { |
73 /* logadd */ | |
4641 | 74 int adr = FFMIN(FFABS(v - psd[j]) >> 1, 255); |
6002 | 75 v = FFMAX(v, psd[j]) + ff_ac3_log_add_tab[adr]; |
0 | 76 j++; |
77 } | |
6003 | 78 band_psd[k]=v; |
0 | 79 k++; |
6003 | 80 } while (end > band_start_tab[k]); |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
81 } |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
82 |
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7470
diff
changeset
|
83 int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, |
8280 | 84 int start, int end, int fast_gain, int is_lfe, |
85 int dba_mode, int dba_nsegs, uint8_t *dba_offsets, | |
86 uint8_t *dba_lengths, uint8_t *dba_values, | |
87 int16_t *mask) | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
88 { |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
89 int16_t excite[50]; /* excitation */ |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
90 int bin, k; |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
91 int bndstrt, bndend, begin, end1, tmp; |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
92 int lowcomp, fastleak, slowleak; |
0 | 93 |
94 /* excitation function */ | |
6003 | 95 bndstrt = bin_to_band_tab[start]; |
96 bndend = bin_to_band_tab[end-1] + 1; | |
2967 | 97 |
782 | 98 if (bndstrt == 0) { |
99 lowcomp = 0; | |
6003 | 100 lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384); |
101 excite[0] = band_psd[0] - fast_gain - lowcomp; | |
102 lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384); | |
103 excite[1] = band_psd[1] - fast_gain - lowcomp; | |
4640 | 104 begin = 7; |
782 | 105 for (bin = 2; bin < 7; bin++) { |
106 if (!(is_lfe && bin == 6)) | |
6003 | 107 lowcomp = calc_lowcomp1(lowcomp, band_psd[bin], band_psd[bin+1], 384); |
108 fastleak = band_psd[bin] - fast_gain; | |
109 slowleak = band_psd[bin] - s->slow_gain; | |
4640 | 110 excite[bin] = fastleak - lowcomp; |
782 | 111 if (!(is_lfe && bin == 6)) { |
6003 | 112 if (band_psd[bin] <= band_psd[bin+1]) { |
4640 | 113 begin = bin + 1; |
114 break; | |
782 | 115 } |
116 } | |
117 } | |
2967 | 118 |
782 | 119 end1=bndend; |
120 if (end1 > 22) end1=22; | |
2967 | 121 |
782 | 122 for (bin = begin; bin < end1; bin++) { |
123 if (!(is_lfe && bin == 6)) | |
6003 | 124 lowcomp = calc_lowcomp(lowcomp, band_psd[bin], band_psd[bin+1], bin); |
2967 | 125 |
6003 | 126 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[bin] - fast_gain); |
127 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[bin] - s->slow_gain); | |
4641 | 128 excite[bin] = FFMAX(fastleak - lowcomp, slowleak); |
782 | 129 } |
130 begin = 22; | |
131 } else { | |
132 /* coupling channel */ | |
133 begin = bndstrt; | |
2967 | 134 |
6003 | 135 fastleak = (s->cpl_fast_leak << 8) + 768; |
136 slowleak = (s->cpl_slow_leak << 8) + 768; | |
0 | 137 } |
138 | |
782 | 139 for (bin = begin; bin < bndend; bin++) { |
6003 | 140 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[bin] - fast_gain); |
141 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[bin] - s->slow_gain); | |
4641 | 142 excite[bin] = FFMAX(fastleak, slowleak); |
0 | 143 } |
144 | |
145 /* compute masking curve */ | |
146 | |
147 for (bin = bndstrt; bin < bndend; bin++) { | |
6003 | 148 tmp = s->db_per_bit - band_psd[bin]; |
0 | 149 if (tmp > 0) { |
4641 | 150 excite[bin] += tmp >> 2; |
0 | 151 } |
6003 | 152 mask[bin] = FFMAX(ff_ac3_hearing_threshold_tab[bin >> s->sr_shift][s->sr_code], excite[bin]); |
0 | 153 } |
154 | |
782 | 155 /* delta bit allocation */ |
156 | |
6003 | 157 if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) { |
782 | 158 int band, seg, delta; |
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7470
diff
changeset
|
159 if (dba_nsegs >= 8) |
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7470
diff
changeset
|
160 return -1; |
4640 | 161 band = 0; |
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7470
diff
changeset
|
162 for (seg = 0; seg < dba_nsegs; seg++) { |
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7470
diff
changeset
|
163 band += dba_offsets[seg]; |
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7470
diff
changeset
|
164 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
|
165 return -1; |
6003 | 166 if (dba_values[seg] >= 4) { |
167 delta = (dba_values[seg] - 3) << 7; | |
782 | 168 } else { |
6003 | 169 delta = (dba_values[seg] - 4) << 7; |
782 | 170 } |
6003 | 171 for (k = 0; k < dba_lengths[seg]; k++) { |
4640 | 172 mask[band] += delta; |
173 band++; | |
782 | 174 } |
175 } | |
176 } | |
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7470
diff
changeset
|
177 return 0; |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
178 } |
782 | 179 |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
180 void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end, |
7017 | 181 int snr_offset, int floor, |
182 const uint8_t *bap_tab, uint8_t *bap) | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
183 { |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
184 int i, j, k, end1, v, address; |
2967 | 185 |
6003 | 186 /* special case, if snr offset is -960, set all bap's to zero */ |
187 if(snr_offset == -960) { | |
4689
c7828f1ae244
fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents:
4684
diff
changeset
|
188 memset(bap, 0, 256); |
c7828f1ae244
fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents:
4684
diff
changeset
|
189 return; |
c7828f1ae244
fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents:
4684
diff
changeset
|
190 } |
c7828f1ae244
fix handling of special case for lowest snroffset. regressions are unaffected.
jbr
parents:
4684
diff
changeset
|
191 |
4640 | 192 i = start; |
6003 | 193 j = bin_to_band_tab[start]; |
0 | 194 do { |
6003 | 195 v = (FFMAX(mask[j] - snr_offset - floor, 0) & 0x1FE0) + floor; |
196 end1 = FFMIN(band_start_tab[j] + ff_ac3_critical_band_size_tab[j], end); | |
0 | 197 for (k = i; k < end1; k++) { |
4641 | 198 address = av_clip((psd[i] - v) >> 5, 0, 63); |
7017 | 199 bap[i] = bap_tab[address]; |
0 | 200 i++; |
201 } | |
6003 | 202 } while (end > band_start_tab[j++]); |
0 | 203 } |
204 | |
7470
1a93d3bbe3ee
cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents:
7017
diff
changeset
|
205 /* 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
|
206 spec. */ |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
207 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
|
208 int8_t *exp, int start, int end, |
6003 | 209 int snr_offset, int fast_gain, int is_lfe, |
210 int dba_mode, int dba_nsegs, | |
211 uint8_t *dba_offsets, uint8_t *dba_lengths, | |
212 uint8_t *dba_values) | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
213 { |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
214 int16_t psd[256]; /* scaled exponents */ |
6003 | 215 int16_t band_psd[50]; /* interpolated exponents */ |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
216 int16_t mask[50]; /* masking value */ |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
217 |
6003 | 218 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
|
219 |
6003 | 220 ff_ac3_bit_alloc_calc_mask(s, band_psd, start, end, fast_gain, is_lfe, |
221 dba_mode, dba_nsegs, dba_offsets, dba_lengths, dba_values, | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
222 mask); |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
223 |
7017 | 224 ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snr_offset, s->floor, |
225 ff_ac3_bap_tab, bap); | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
226 } |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
227 |
4645
056127e5df89
remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents:
4642
diff
changeset
|
228 /** |
056127e5df89
remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents:
4642
diff
changeset
|
229 * Initializes some tables. |
056127e5df89
remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents:
4642
diff
changeset
|
230 * 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
|
231 * AVParser init code. |
056127e5df89
remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents:
4642
diff
changeset
|
232 */ |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6003
diff
changeset
|
233 av_cold void ac3_common_init(void) |
782 | 234 { |
235 int i, j, k, l, v; | |
236 /* compute bndtab and masktab from bandsz */ | |
237 k = 0; | |
238 l = 0; | |
239 for(i=0;i<50;i++) { | |
6003 | 240 band_start_tab[i] = l; |
6002 | 241 v = ff_ac3_critical_band_size_tab[i]; |
6003 | 242 for(j=0;j<v;j++) bin_to_band_tab[k++]=i; |
782 | 243 l += v; |
244 } | |
6003 | 245 band_start_tab[50] = l; |
782 | 246 } |