Mercurial > libavcodec.hg
annotate ac3enc.c @ 6920:d02af7474bff libavcodec
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
fixes CID84 RUN2
CID85 RUN2
CID86 RUN2
CID87 RUN2
CID88 RUN2
CID89 RUN2
CID90 RUN2
CID91 RUN2
CID92 RUN2
CID93 RUN2
CID94 RUN2
CID95 RUN2
CID96 RUN2
CID97 RUN2
CID98 RUN2
CID99 RUN2
CID100 RUN2
CID101 RUN2
CID102 RUN2
CID103 RUN2
CID104 RUN2
CID105 RUN2
CID106 RUN2
author | michael |
---|---|
date | Wed, 28 May 2008 11:59:41 +0000 |
parents | f7cbb7733146 |
children | 60fd9ae9540e |
rev | line source |
---|---|
0 | 1 /* |
2 * The simplest AC3 encoder | |
429 | 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 /** | |
23 * @file ac3enc.c | |
24 * The simplest AC3 encoder. | |
25 */ | |
64 | 26 //#define DEBUG |
27 //#define DEBUG_BITALLOC | |
6763 | 28 #include "libavutil/crc.h" |
64 | 29 #include "avcodec.h" |
2398
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2367
diff
changeset
|
30 #include "bitstream.h" |
782 | 31 #include "ac3.h" |
32 | |
33 typedef struct AC3EncodeContext { | |
34 PutBitContext pb; | |
35 int nb_channels; | |
36 int nb_all_channels; | |
37 int lfe_channel; | |
38 int bit_rate; | |
1057 | 39 unsigned int sample_rate; |
6005 | 40 unsigned int bitstream_id; |
1057 | 41 unsigned int frame_size_min; /* minimum frame size in case rounding is necessary */ |
42 unsigned int frame_size; /* current frame size in words */ | |
3246 | 43 unsigned int bits_written; |
44 unsigned int samples_written; | |
6003 | 45 int sr_shift; |
6005 | 46 unsigned int frame_size_code; |
6003 | 47 unsigned int sr_code; /* frequency */ |
6005 | 48 unsigned int channel_mode; |
782 | 49 int lfe; |
6005 | 50 unsigned int bitstream_mode; |
782 | 51 short last_samples[AC3_MAX_CHANNELS][256]; |
1057 | 52 unsigned int chbwcod[AC3_MAX_CHANNELS]; |
782 | 53 int nb_coefs[AC3_MAX_CHANNELS]; |
2967 | 54 |
782 | 55 /* bitrate allocation control */ |
6003 | 56 int slow_gain_code, slow_decay_code, fast_decay_code, db_per_bit_code, floor_code; |
782 | 57 AC3BitAllocParameters bit_alloc; |
6003 | 58 int coarse_snr_offset; |
59 int fast_gain_code[AC3_MAX_CHANNELS]; | |
60 int fine_snr_offset[AC3_MAX_CHANNELS]; | |
782 | 61 /* mantissa encoding */ |
62 int mant1_cnt, mant2_cnt, mant4_cnt; | |
63 } AC3EncodeContext; | |
64 | |
4643
1e175640dad3
Remove common code from AC-3 encoder and utilize ac3.c.
jbr
parents:
4641
diff
changeset
|
65 static int16_t costab[64]; |
1e175640dad3
Remove common code from AC-3 encoder and utilize ac3.c.
jbr
parents:
4641
diff
changeset
|
66 static int16_t sintab[64]; |
1e175640dad3
Remove common code from AC-3 encoder and utilize ac3.c.
jbr
parents:
4641
diff
changeset
|
67 static int16_t xcos1[128]; |
1e175640dad3
Remove common code from AC-3 encoder and utilize ac3.c.
jbr
parents:
4641
diff
changeset
|
68 static int16_t xsin1[128]; |
0 | 69 |
70 #define MDCT_NBITS 9 | |
71 #define N (1 << MDCT_NBITS) | |
72 | |
73 /* new exponents are sent if their Norm 1 exceed this number */ | |
74 #define EXP_DIFF_THRESHOLD 1000 | |
75 | |
1064 | 76 static inline int16_t fix15(float a) |
0 | 77 { |
78 int v; | |
79 v = (int)(a * (float)(1 << 15)); | |
80 if (v < -32767) | |
81 v = -32767; | |
2967 | 82 else if (v > 32767) |
0 | 83 v = 32767; |
84 return v; | |
85 } | |
86 | |
87 typedef struct IComplex { | |
88 short re,im; | |
89 } IComplex; | |
90 | |
91 static void fft_init(int ln) | |
92 { | |
6166 | 93 int i, n; |
0 | 94 float alpha; |
95 | |
96 n = 1 << ln; | |
97 | |
98 for(i=0;i<(n/2);i++) { | |
99 alpha = 2 * M_PI * (float)i / (float)n; | |
100 costab[i] = fix15(cos(alpha)); | |
101 sintab[i] = fix15(sin(alpha)); | |
102 } | |
103 } | |
104 | |
105 /* butter fly op */ | |
106 #define BF(pre, pim, qre, qim, pre1, pim1, qre1, qim1) \ | |
107 {\ | |
108 int ax, ay, bx, by;\ | |
109 bx=pre1;\ | |
110 by=pim1;\ | |
111 ax=qre1;\ | |
112 ay=qim1;\ | |
113 pre = (bx + ax) >> 1;\ | |
114 pim = (by + ay) >> 1;\ | |
115 qre = (bx - ax) >> 1;\ | |
116 qim = (by - ay) >> 1;\ | |
117 } | |
118 | |
119 #define MUL16(a,b) ((a) * (b)) | |
120 | |
121 #define CMUL(pre, pim, are, aim, bre, bim) \ | |
122 {\ | |
123 pre = (MUL16(are, bre) - MUL16(aim, bim)) >> 15;\ | |
124 pim = (MUL16(are, bim) + MUL16(bre, aim)) >> 15;\ | |
125 } | |
126 | |
127 | |
128 /* do a 2^n point complex fft on 2^ln points. */ | |
129 static void fft(IComplex *z, int ln) | |
130 { | |
2979 | 131 int j, l, np, np2; |
132 int nblocks, nloops; | |
0 | 133 register IComplex *p,*q; |
134 int tmp_re, tmp_im; | |
135 | |
136 np = 1 << ln; | |
137 | |
138 /* reverse */ | |
139 for(j=0;j<np;j++) { | |
6141
932523fb0562
Get rid of fft_rev table, use ff_reverse and a shift.
reimar
parents:
6140
diff
changeset
|
140 int k = ff_reverse[j] >> (8 - ln); |
6140 | 141 if (k < j) |
142 FFSWAP(IComplex, z[k], z[j]); | |
0 | 143 } |
144 | |
145 /* pass 0 */ | |
146 | |
147 p=&z[0]; | |
148 j=(np >> 1); | |
149 do { | |
2967 | 150 BF(p[0].re, p[0].im, p[1].re, p[1].im, |
0 | 151 p[0].re, p[0].im, p[1].re, p[1].im); |
152 p+=2; | |
153 } while (--j != 0); | |
154 | |
155 /* pass 1 */ | |
156 | |
157 p=&z[0]; | |
158 j=np >> 2; | |
159 do { | |
2967 | 160 BF(p[0].re, p[0].im, p[2].re, p[2].im, |
0 | 161 p[0].re, p[0].im, p[2].re, p[2].im); |
2967 | 162 BF(p[1].re, p[1].im, p[3].re, p[3].im, |
0 | 163 p[1].re, p[1].im, p[3].im, -p[3].re); |
164 p+=4; | |
165 } while (--j != 0); | |
166 | |
167 /* pass 2 .. ln-1 */ | |
168 | |
169 nblocks = np >> 3; | |
170 nloops = 1 << 2; | |
171 np2 = np >> 1; | |
172 do { | |
173 p = z; | |
174 q = z + nloops; | |
175 for (j = 0; j < nblocks; ++j) { | |
176 | |
177 BF(p->re, p->im, q->re, q->im, | |
178 p->re, p->im, q->re, q->im); | |
2967 | 179 |
0 | 180 p++; |
181 q++; | |
182 for(l = nblocks; l < np2; l += nblocks) { | |
183 CMUL(tmp_re, tmp_im, costab[l], -sintab[l], q->re, q->im); | |
184 BF(p->re, p->im, q->re, q->im, | |
185 p->re, p->im, tmp_re, tmp_im); | |
186 p++; | |
187 q++; | |
188 } | |
189 p += nloops; | |
190 q += nloops; | |
191 } | |
192 nblocks = nblocks >> 1; | |
193 nloops = nloops << 1; | |
194 } while (nblocks != 0); | |
195 } | |
196 | |
197 /* do a 512 point mdct */ | |
1064 | 198 static void mdct512(int32_t *out, int16_t *in) |
0 | 199 { |
200 int i, re, im, re1, im1; | |
2967 | 201 int16_t rot[N]; |
0 | 202 IComplex x[N/4]; |
203 | |
204 /* shift to simplify computations */ | |
205 for(i=0;i<N/4;i++) | |
206 rot[i] = -in[i + 3*N/4]; | |
207 for(i=N/4;i<N;i++) | |
208 rot[i] = in[i - N/4]; | |
2967 | 209 |
0 | 210 /* pre rotation */ |
211 for(i=0;i<N/4;i++) { | |
212 re = ((int)rot[2*i] - (int)rot[N-1-2*i]) >> 1; | |
213 im = -((int)rot[N/2+2*i] - (int)rot[N/2-1-2*i]) >> 1; | |
214 CMUL(x[i].re, x[i].im, re, im, -xcos1[i], xsin1[i]); | |
215 } | |
216 | |
217 fft(x, MDCT_NBITS - 2); | |
2967 | 218 |
0 | 219 /* post rotation */ |
220 for(i=0;i<N/4;i++) { | |
221 re = x[i].re; | |
222 im = x[i].im; | |
223 CMUL(re1, im1, re, im, xsin1[i], xcos1[i]); | |
224 out[2*i] = im1; | |
225 out[N/2-1-2*i] = re1; | |
226 } | |
227 } | |
228 | |
229 /* XXX: use another norm ? */ | |
1064 | 230 static int calc_exp_diff(uint8_t *exp1, uint8_t *exp2, int n) |
0 | 231 { |
232 int sum, i; | |
233 sum = 0; | |
234 for(i=0;i<n;i++) { | |
235 sum += abs(exp1[i] - exp2[i]); | |
236 } | |
237 return sum; | |
238 } | |
239 | |
1064 | 240 static void compute_exp_strategy(uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], |
241 uint8_t exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], | |
314 | 242 int ch, int is_lfe) |
0 | 243 { |
244 int i, j; | |
245 int exp_diff; | |
2967 | 246 |
0 | 247 /* estimate if the exponent variation & decide if they should be |
248 reused in the next frame */ | |
249 exp_strategy[0][ch] = EXP_NEW; | |
250 for(i=1;i<NB_BLOCKS;i++) { | |
251 exp_diff = calc_exp_diff(exp[i][ch], exp[i-1][ch], N/2); | |
2967 | 252 #ifdef DEBUG |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
253 av_log(NULL, AV_LOG_DEBUG, "exp_diff=%d\n", exp_diff); |
0 | 254 #endif |
255 if (exp_diff > EXP_DIFF_THRESHOLD) | |
256 exp_strategy[i][ch] = EXP_NEW; | |
257 else | |
258 exp_strategy[i][ch] = EXP_REUSE; | |
259 } | |
314 | 260 if (is_lfe) |
2979 | 261 return; |
314 | 262 |
0 | 263 /* now select the encoding strategy type : if exponents are often |
264 recoded, we use a coarse encoding */ | |
265 i = 0; | |
266 while (i < NB_BLOCKS) { | |
267 j = i + 1; | |
268 while (j < NB_BLOCKS && exp_strategy[j][ch] == EXP_REUSE) | |
269 j++; | |
270 switch(j - i) { | |
271 case 1: | |
272 exp_strategy[i][ch] = EXP_D45; | |
273 break; | |
274 case 2: | |
275 case 3: | |
276 exp_strategy[i][ch] = EXP_D25; | |
277 break; | |
278 default: | |
279 exp_strategy[i][ch] = EXP_D15; | |
280 break; | |
281 } | |
2979 | 282 i = j; |
0 | 283 } |
284 } | |
285 | |
286 /* set exp[i] to min(exp[i], exp1[i]) */ | |
1064 | 287 static void exponent_min(uint8_t exp[N/2], uint8_t exp1[N/2], int n) |
0 | 288 { |
289 int i; | |
290 | |
291 for(i=0;i<n;i++) { | |
292 if (exp1[i] < exp[i]) | |
293 exp[i] = exp1[i]; | |
294 } | |
295 } | |
2967 | 296 |
0 | 297 /* update the exponents so that they are the ones the decoder will |
298 decode. Return the number of bits used to code the exponents */ | |
2967 | 299 static int encode_exp(uint8_t encoded_exp[N/2], |
300 uint8_t exp[N/2], | |
0 | 301 int nb_exps, |
302 int exp_strategy) | |
303 { | |
2157
4478e603a8e3
simpler delta decreasing algorithm patch by (Jeff Muizelaar <jrmuizel at student dot cs dot uwaterloo dot ca>)
michael
parents:
1819
diff
changeset
|
304 int group_size, nb_groups, i, j, k, exp_min; |
1064 | 305 uint8_t exp1[N/2]; |
0 | 306 |
307 switch(exp_strategy) { | |
308 case EXP_D15: | |
309 group_size = 1; | |
310 break; | |
311 case EXP_D25: | |
312 group_size = 2; | |
313 break; | |
314 default: | |
315 case EXP_D45: | |
316 group_size = 4; | |
317 break; | |
318 } | |
319 nb_groups = ((nb_exps + (group_size * 3) - 4) / (3 * group_size)) * 3; | |
320 | |
321 /* for each group, compute the minimum exponent */ | |
322 exp1[0] = exp[0]; /* DC exponent is handled separately */ | |
323 k = 1; | |
324 for(i=1;i<=nb_groups;i++) { | |
325 exp_min = exp[k]; | |
326 assert(exp_min >= 0 && exp_min <= 24); | |
327 for(j=1;j<group_size;j++) { | |
328 if (exp[k+j] < exp_min) | |
329 exp_min = exp[k+j]; | |
330 } | |
331 exp1[i] = exp_min; | |
332 k += group_size; | |
333 } | |
334 | |
335 /* constraint for DC exponent */ | |
336 if (exp1[0] > 15) | |
337 exp1[0] = 15; | |
338 | |
2157
4478e603a8e3
simpler delta decreasing algorithm patch by (Jeff Muizelaar <jrmuizel at student dot cs dot uwaterloo dot ca>)
michael
parents:
1819
diff
changeset
|
339 /* Decrease the delta between each groups to within 2 |
4478e603a8e3
simpler delta decreasing algorithm patch by (Jeff Muizelaar <jrmuizel at student dot cs dot uwaterloo dot ca>)
michael
parents:
1819
diff
changeset
|
340 * so that they can be differentially encoded */ |
4478e603a8e3
simpler delta decreasing algorithm patch by (Jeff Muizelaar <jrmuizel at student dot cs dot uwaterloo dot ca>)
michael
parents:
1819
diff
changeset
|
341 for (i=1;i<=nb_groups;i++) |
2979 | 342 exp1[i] = FFMIN(exp1[i], exp1[i-1] + 2); |
2157
4478e603a8e3
simpler delta decreasing algorithm patch by (Jeff Muizelaar <jrmuizel at student dot cs dot uwaterloo dot ca>)
michael
parents:
1819
diff
changeset
|
343 for (i=nb_groups-1;i>=0;i--) |
2979 | 344 exp1[i] = FFMIN(exp1[i], exp1[i+1] + 2); |
2157
4478e603a8e3
simpler delta decreasing algorithm patch by (Jeff Muizelaar <jrmuizel at student dot cs dot uwaterloo dot ca>)
michael
parents:
1819
diff
changeset
|
345 |
0 | 346 /* now we have the exponent values the decoder will see */ |
347 encoded_exp[0] = exp1[0]; | |
348 k = 1; | |
349 for(i=1;i<=nb_groups;i++) { | |
350 for(j=0;j<group_size;j++) { | |
351 encoded_exp[k+j] = exp1[i]; | |
352 } | |
353 k += group_size; | |
354 } | |
2967 | 355 |
0 | 356 #if defined(DEBUG) |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
357 av_log(NULL, AV_LOG_DEBUG, "exponents: strategy=%d\n", exp_strategy); |
0 | 358 for(i=0;i<=nb_groups * group_size;i++) { |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
359 av_log(NULL, AV_LOG_DEBUG, "%d ", encoded_exp[i]); |
0 | 360 } |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
361 av_log(NULL, AV_LOG_DEBUG, "\n"); |
0 | 362 #endif |
363 | |
364 return 4 + (nb_groups / 3) * 7; | |
365 } | |
366 | |
367 /* return the size in bits taken by the mantissa */ | |
1064 | 368 static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs) |
0 | 369 { |
370 int bits, mant, i; | |
371 | |
372 bits = 0; | |
373 for(i=0;i<nb_coefs;i++) { | |
374 mant = m[i]; | |
375 switch(mant) { | |
376 case 0: | |
377 /* nothing */ | |
378 break; | |
379 case 1: | |
380 /* 3 mantissa in 5 bits */ | |
2967 | 381 if (s->mant1_cnt == 0) |
0 | 382 bits += 5; |
383 if (++s->mant1_cnt == 3) | |
384 s->mant1_cnt = 0; | |
385 break; | |
386 case 2: | |
387 /* 3 mantissa in 7 bits */ | |
2967 | 388 if (s->mant2_cnt == 0) |
0 | 389 bits += 7; |
390 if (++s->mant2_cnt == 3) | |
391 s->mant2_cnt = 0; | |
392 break; | |
393 case 3: | |
394 bits += 3; | |
395 break; | |
396 case 4: | |
397 /* 2 mantissa in 7 bits */ | |
398 if (s->mant4_cnt == 0) | |
399 bits += 7; | |
2967 | 400 if (++s->mant4_cnt == 2) |
0 | 401 s->mant4_cnt = 0; |
402 break; | |
403 case 14: | |
404 bits += 14; | |
405 break; | |
406 case 15: | |
407 bits += 16; | |
408 break; | |
409 default: | |
410 bits += mant - 1; | |
411 break; | |
412 } | |
413 } | |
414 return bits; | |
415 } | |
416 | |
417 | |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
418 static void bit_alloc_masking(AC3EncodeContext *s, |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
419 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
420 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
421 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
422 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50]) |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
423 { |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
424 int blk, ch; |
6003 | 425 int16_t band_psd[NB_BLOCKS][AC3_MAX_CHANNELS][50]; |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
426 |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
427 for(blk=0; blk<NB_BLOCKS; blk++) { |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
428 for(ch=0;ch<s->nb_all_channels;ch++) { |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
429 if(exp_strategy[blk][ch] == EXP_REUSE) { |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
430 memcpy(psd[blk][ch], psd[blk-1][ch], (N/2)*sizeof(int16_t)); |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
431 memcpy(mask[blk][ch], mask[blk-1][ch], 50*sizeof(int16_t)); |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
432 } else { |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
433 ff_ac3_bit_alloc_calc_psd(encoded_exp[blk][ch], 0, |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
434 s->nb_coefs[ch], |
6003 | 435 psd[blk][ch], band_psd[blk][ch]); |
436 ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, band_psd[blk][ch], | |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
437 0, s->nb_coefs[ch], |
6003 | 438 ff_ac3_fast_gain_tab[s->fast_gain_code[ch]], |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
439 ch == s->lfe_channel, |
5331 | 440 DBA_NONE, 0, NULL, NULL, NULL, |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
441 mask[blk][ch]); |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
442 } |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
443 } |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
444 } |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
445 } |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
446 |
0 | 447 static int bit_alloc(AC3EncodeContext *s, |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
448 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50], |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
449 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], |
1064 | 450 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], |
6003 | 451 int frame_bits, int coarse_snr_offset, int fine_snr_offset) |
0 | 452 { |
453 int i, ch; | |
6003 | 454 int snr_offset; |
4705 | 455 |
6003 | 456 snr_offset = (((coarse_snr_offset - 15) << 4) + fine_snr_offset) << 2; |
0 | 457 |
458 /* compute size */ | |
459 for(i=0;i<NB_BLOCKS;i++) { | |
460 s->mant1_cnt = 0; | |
461 s->mant2_cnt = 0; | |
462 s->mant4_cnt = 0; | |
314 | 463 for(ch=0;ch<s->nb_all_channels;ch++) { |
4706 | 464 ff_ac3_bit_alloc_calc_bap(mask[i][ch], psd[i][ch], 0, |
6003 | 465 s->nb_coefs[ch], snr_offset, |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
466 s->bit_alloc.floor, bap[i][ch]); |
2967 | 467 frame_bits += compute_mantissa_size(s, bap[i][ch], |
0 | 468 s->nb_coefs[ch]); |
469 } | |
470 } | |
471 #if 0 | |
2967 | 472 printf("csnr=%d fsnr=%d frame_bits=%d diff=%d\n", |
6003 | 473 coarse_snr_offset, fine_snr_offset, frame_bits, |
0 | 474 16 * s->frame_size - ((frame_bits + 7) & ~7)); |
475 #endif | |
476 return 16 * s->frame_size - frame_bits; | |
477 } | |
478 | |
479 #define SNR_INC1 4 | |
480 | |
481 static int compute_bit_allocation(AC3EncodeContext *s, | |
1064 | 482 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], |
483 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], | |
484 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], | |
0 | 485 int frame_bits) |
486 { | |
487 int i, ch; | |
6003 | 488 int coarse_snr_offset, fine_snr_offset; |
1064 | 489 uint8_t bap1[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
490 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
491 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50]; |
314 | 492 static int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 }; |
0 | 493 |
494 /* init default parameters */ | |
6003 | 495 s->slow_decay_code = 2; |
496 s->fast_decay_code = 1; | |
497 s->slow_gain_code = 1; | |
498 s->db_per_bit_code = 2; | |
499 s->floor_code = 4; | |
2967 | 500 for(ch=0;ch<s->nb_all_channels;ch++) |
6003 | 501 s->fast_gain_code[ch] = 4; |
2967 | 502 |
0 | 503 /* compute real values */ |
6003 | 504 s->bit_alloc.sr_code = s->sr_code; |
505 s->bit_alloc.sr_shift = s->sr_shift; | |
506 s->bit_alloc.slow_decay = ff_ac3_slow_decay_tab[s->slow_decay_code] >> s->sr_shift; | |
507 s->bit_alloc.fast_decay = ff_ac3_fast_decay_tab[s->fast_decay_code] >> s->sr_shift; | |
508 s->bit_alloc.slow_gain = ff_ac3_slow_gain_tab[s->slow_gain_code]; | |
509 s->bit_alloc.db_per_bit = ff_ac3_db_per_bit_tab[s->db_per_bit_code]; | |
510 s->bit_alloc.floor = ff_ac3_floor_tab[s->floor_code]; | |
2967 | 511 |
0 | 512 /* header size */ |
513 frame_bits += 65; | |
6005 | 514 // if (s->channel_mode == 2) |
314 | 515 // frame_bits += 2; |
6005 | 516 frame_bits += frame_bits_inc[s->channel_mode]; |
0 | 517 |
518 /* audio blocks */ | |
519 for(i=0;i<NB_BLOCKS;i++) { | |
314 | 520 frame_bits += s->nb_channels * 2 + 2; /* blksw * c, dithflag * c, dynrnge, cplstre */ |
6005 | 521 if (s->channel_mode == AC3_CHMODE_STEREO) { |
314 | 522 frame_bits++; /* rematstr */ |
2644
6ff5dc0dbaf0
While adding stereo rematrixing, I came across something that needs to
michael
parents:
2398
diff
changeset
|
523 if(i==0) frame_bits += 4; |
6ff5dc0dbaf0
While adding stereo rematrixing, I came across something that needs to
michael
parents:
2398
diff
changeset
|
524 } |
314 | 525 frame_bits += 2 * s->nb_channels; /* chexpstr[2] * c */ |
2979 | 526 if (s->lfe) |
527 frame_bits++; /* lfeexpstr */ | |
0 | 528 for(ch=0;ch<s->nb_channels;ch++) { |
529 if (exp_strategy[i][ch] != EXP_REUSE) | |
314 | 530 frame_bits += 6 + 2; /* chbwcod[6], gainrng[2] */ |
0 | 531 } |
532 frame_bits++; /* baie */ | |
533 frame_bits++; /* snr */ | |
534 frame_bits += 2; /* delta / skip */ | |
535 } | |
536 frame_bits++; /* cplinu for block 0 */ | |
537 /* bit alloc info */ | |
314 | 538 /* sdcycod[2], fdcycod[2], sgaincod[2], dbpbcod[2], floorcod[3] */ |
539 /* csnroffset[6] */ | |
540 /* (fsnoffset[4] + fgaincod[4]) * c */ | |
541 frame_bits += 2*4 + 3 + 6 + s->nb_all_channels * (4 + 3); | |
0 | 542 |
1819
34cdcb221665
auxdatae, crcrs fix by (Jean-Francois Panisset <panisset at comcast dot net>)
michael
parents:
1602
diff
changeset
|
543 /* auxdatae, crcrsv */ |
34cdcb221665
auxdatae, crcrs fix by (Jean-Francois Panisset <panisset at comcast dot net>)
michael
parents:
1602
diff
changeset
|
544 frame_bits += 2; |
34cdcb221665
auxdatae, crcrs fix by (Jean-Francois Panisset <panisset at comcast dot net>)
michael
parents:
1602
diff
changeset
|
545 |
0 | 546 /* CRC */ |
547 frame_bits += 16; | |
548 | |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
549 /* calculate psd and masking curve before doing bit allocation */ |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
550 bit_alloc_masking(s, encoded_exp, exp_strategy, psd, mask); |
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
551 |
0 | 552 /* now the big work begins : do the bit allocation. Modify the snr |
553 offset until we can pack everything in the requested frame size */ | |
554 | |
6003 | 555 coarse_snr_offset = s->coarse_snr_offset; |
556 while (coarse_snr_offset >= 0 && | |
557 bit_alloc(s, mask, psd, bap, frame_bits, coarse_snr_offset, 0) < 0) | |
558 coarse_snr_offset -= SNR_INC1; | |
559 if (coarse_snr_offset < 0) { | |
6081 | 560 av_log(NULL, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n"); |
2979 | 561 return -1; |
0 | 562 } |
6003 | 563 while ((coarse_snr_offset + SNR_INC1) <= 63 && |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
564 bit_alloc(s, mask, psd, bap1, frame_bits, |
6003 | 565 coarse_snr_offset + SNR_INC1, 0) >= 0) { |
566 coarse_snr_offset += SNR_INC1; | |
0 | 567 memcpy(bap, bap1, sizeof(bap1)); |
568 } | |
6003 | 569 while ((coarse_snr_offset + 1) <= 63 && |
570 bit_alloc(s, mask, psd, bap1, frame_bits, coarse_snr_offset + 1, 0) >= 0) { | |
571 coarse_snr_offset++; | |
0 | 572 memcpy(bap, bap1, sizeof(bap1)); |
573 } | |
574 | |
6003 | 575 fine_snr_offset = 0; |
576 while ((fine_snr_offset + SNR_INC1) <= 15 && | |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
577 bit_alloc(s, mask, psd, bap1, frame_bits, |
6003 | 578 coarse_snr_offset, fine_snr_offset + SNR_INC1) >= 0) { |
579 fine_snr_offset += SNR_INC1; | |
0 | 580 memcpy(bap, bap1, sizeof(bap1)); |
581 } | |
6003 | 582 while ((fine_snr_offset + 1) <= 15 && |
4704
0cb02a723a62
utilize multi-stage AC-3 bit allocation. speeds up encoding by 25-30%
jbr
parents:
4686
diff
changeset
|
583 bit_alloc(s, mask, psd, bap1, frame_bits, |
6003 | 584 coarse_snr_offset, fine_snr_offset + 1) >= 0) { |
585 fine_snr_offset++; | |
0 | 586 memcpy(bap, bap1, sizeof(bap1)); |
587 } | |
2967 | 588 |
6003 | 589 s->coarse_snr_offset = coarse_snr_offset; |
314 | 590 for(ch=0;ch<s->nb_all_channels;ch++) |
6003 | 591 s->fine_snr_offset[ch] = fine_snr_offset; |
0 | 592 #if defined(DEBUG_BITALLOC) |
593 { | |
594 int j; | |
595 | |
596 for(i=0;i<6;i++) { | |
314 | 597 for(ch=0;ch<s->nb_all_channels;ch++) { |
0 | 598 printf("Block #%d Ch%d:\n", i, ch); |
599 printf("bap="); | |
600 for(j=0;j<s->nb_coefs[ch];j++) { | |
601 printf("%d ",bap[i][ch][j]); | |
602 } | |
603 printf("\n"); | |
604 } | |
605 } | |
606 } | |
607 #endif | |
608 return 0; | |
609 } | |
610 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6516
diff
changeset
|
611 static av_cold int AC3_encode_init(AVCodecContext *avctx) |
0 | 612 { |
613 int freq = avctx->sample_rate; | |
614 int bitrate = avctx->bit_rate; | |
615 int channels = avctx->channels; | |
616 AC3EncodeContext *s = avctx->priv_data; | |
782 | 617 int i, j, ch; |
0 | 618 float alpha; |
6083
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
619 int bw_code; |
6005 | 620 static const uint8_t channel_mode_defs[6] = { |
2979 | 621 0x01, /* C */ |
622 0x02, /* L R */ | |
623 0x03, /* L C R */ | |
624 0x06, /* L R SL SR */ | |
625 0x07, /* L C R SL SR */ | |
626 0x07, /* L C R SL SR (+LFE) */ | |
314 | 627 }; |
0 | 628 |
629 avctx->frame_size = AC3_FRAME_SIZE; | |
2967 | 630 |
4645
056127e5df89
remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents:
4643
diff
changeset
|
631 ac3_common_init(); |
056127e5df89
remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents:
4643
diff
changeset
|
632 |
0 | 633 /* number of channels */ |
314 | 634 if (channels < 1 || channels > 6) |
2979 | 635 return -1; |
6005 | 636 s->channel_mode = channel_mode_defs[channels - 1]; |
314 | 637 s->lfe = (channels == 6) ? 1 : 0; |
638 s->nb_all_channels = channels; | |
639 s->nb_channels = channels > 5 ? 5 : channels; | |
640 s->lfe_channel = s->lfe ? 5 : -1; | |
0 | 641 |
642 /* frequency */ | |
643 for(i=0;i<3;i++) { | |
2967 | 644 for(j=0;j<3;j++) |
6002 | 645 if ((ff_ac3_sample_rate_tab[j] >> i) == freq) |
0 | 646 goto found; |
647 } | |
648 return -1; | |
2967 | 649 found: |
0 | 650 s->sample_rate = freq; |
6003 | 651 s->sr_shift = i; |
652 s->sr_code = j; | |
6005 | 653 s->bitstream_id = 8 + s->sr_shift; |
654 s->bitstream_mode = 0; /* complete main audio service */ | |
0 | 655 |
656 /* bitrate & frame size */ | |
657 for(i=0;i<19;i++) { | |
6082 | 658 if ((ff_ac3_bitrate_tab[i] >> s->sr_shift)*1000 == bitrate) |
0 | 659 break; |
660 } | |
661 if (i == 19) | |
662 return -1; | |
663 s->bit_rate = bitrate; | |
6005 | 664 s->frame_size_code = i << 1; |
665 s->frame_size_min = ff_ac3_frame_size_tab[s->frame_size_code][s->sr_code]; | |
3246 | 666 s->bits_written = 0; |
667 s->samples_written = 0; | |
0 | 668 s->frame_size = s->frame_size_min; |
2967 | 669 |
0 | 670 /* bit allocation init */ |
6083
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
671 if(avctx->cutoff) { |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
672 /* calculate bandwidth based on user-specified cutoff frequency */ |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
673 int cutoff = av_clip(avctx->cutoff, 1, s->sample_rate >> 1); |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
674 int fbw_coeffs = cutoff * 512 / s->sample_rate; |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
675 bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60); |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
676 } else { |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
677 /* use default bandwidth setting */ |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
678 /* XXX: should compute the bandwidth according to the frame |
6516 | 679 size, so that we avoid annoying high frequency artifacts */ |
6083
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
680 bw_code = 50; |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
681 } |
0 | 682 for(ch=0;ch<s->nb_channels;ch++) { |
683 /* bandwidth for each channel */ | |
6083
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
684 s->chbwcod[ch] = bw_code; |
77d27412c35d
use cutoff frequency to adjust bandwidth in ac3 encoder
jbr
parents:
6082
diff
changeset
|
685 s->nb_coefs[ch] = bw_code * 3 + 73; |
0 | 686 } |
314 | 687 if (s->lfe) { |
2979 | 688 s->nb_coefs[s->lfe_channel] = 7; /* fixed */ |
314 | 689 } |
0 | 690 /* initial snr offset */ |
6003 | 691 s->coarse_snr_offset = 40; |
0 | 692 |
693 /* mdct init */ | |
694 fft_init(MDCT_NBITS - 2); | |
695 for(i=0;i<N/4;i++) { | |
696 alpha = 2 * M_PI * (i + 1.0 / 8.0) / (float)N; | |
697 xcos1[i] = fix15(-cos(alpha)); | |
698 xsin1[i] = fix15(-sin(alpha)); | |
699 } | |
700 | |
925 | 701 avctx->coded_frame= avcodec_alloc_frame(); |
702 avctx->coded_frame->key_frame= 1; | |
0 | 703 |
704 return 0; | |
705 } | |
706 | |
707 /* output the AC3 frame header */ | |
708 static void output_frame_header(AC3EncodeContext *s, unsigned char *frame) | |
709 { | |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1408
diff
changeset
|
710 init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE); |
0 | 711 |
712 put_bits(&s->pb, 16, 0x0b77); /* frame header */ | |
713 put_bits(&s->pb, 16, 0); /* crc1: will be filled later */ | |
6003 | 714 put_bits(&s->pb, 2, s->sr_code); |
6005 | 715 put_bits(&s->pb, 6, s->frame_size_code + (s->frame_size - s->frame_size_min)); |
716 put_bits(&s->pb, 5, s->bitstream_id); | |
717 put_bits(&s->pb, 3, s->bitstream_mode); | |
718 put_bits(&s->pb, 3, s->channel_mode); | |
719 if ((s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO) | |
2979 | 720 put_bits(&s->pb, 2, 1); /* XXX -4.5 dB */ |
6005 | 721 if (s->channel_mode & 0x04) |
2979 | 722 put_bits(&s->pb, 2, 1); /* XXX -6 dB */ |
6005 | 723 if (s->channel_mode == AC3_CHMODE_STEREO) |
0 | 724 put_bits(&s->pb, 2, 0); /* surround not indicated */ |
314 | 725 put_bits(&s->pb, 1, s->lfe); /* LFE */ |
0 | 726 put_bits(&s->pb, 5, 31); /* dialog norm: -31 db */ |
727 put_bits(&s->pb, 1, 0); /* no compression control word */ | |
728 put_bits(&s->pb, 1, 0); /* no lang code */ | |
729 put_bits(&s->pb, 1, 0); /* no audio production info */ | |
730 put_bits(&s->pb, 1, 0); /* no copyright */ | |
731 put_bits(&s->pb, 1, 1); /* original bitstream */ | |
732 put_bits(&s->pb, 1, 0); /* no time code 1 */ | |
733 put_bits(&s->pb, 1, 0); /* no time code 2 */ | |
6080 | 734 put_bits(&s->pb, 1, 0); /* no additional bit stream info */ |
0 | 735 } |
736 | |
737 /* symetric quantization on 'levels' levels */ | |
738 static inline int sym_quant(int c, int e, int levels) | |
739 { | |
740 int v; | |
741 | |
742 if (c >= 0) { | |
87 | 743 v = (levels * (c << e)) >> 24; |
744 v = (v + 1) >> 1; | |
0 | 745 v = (levels >> 1) + v; |
746 } else { | |
87 | 747 v = (levels * ((-c) << e)) >> 24; |
748 v = (v + 1) >> 1; | |
0 | 749 v = (levels >> 1) - v; |
750 } | |
751 assert (v >= 0 && v < levels); | |
752 return v; | |
753 } | |
754 | |
755 /* asymetric quantization on 2^qbits levels */ | |
756 static inline int asym_quant(int c, int e, int qbits) | |
757 { | |
758 int lshift, m, v; | |
759 | |
760 lshift = e + qbits - 24; | |
761 if (lshift >= 0) | |
762 v = c << lshift; | |
763 else | |
764 v = c >> (-lshift); | |
765 /* rounding */ | |
766 v = (v + 1) >> 1; | |
767 m = (1 << (qbits-1)); | |
768 if (v >= m) | |
769 v = m - 1; | |
770 assert(v >= -m); | |
771 return v & ((1 << qbits)-1); | |
772 } | |
773 | |
774 /* Output one audio block. There are NB_BLOCKS audio blocks in one AC3 | |
775 frame */ | |
776 static void output_audio_block(AC3EncodeContext *s, | |
1064 | 777 uint8_t exp_strategy[AC3_MAX_CHANNELS], |
778 uint8_t encoded_exp[AC3_MAX_CHANNELS][N/2], | |
779 uint8_t bap[AC3_MAX_CHANNELS][N/2], | |
780 int32_t mdct_coefs[AC3_MAX_CHANNELS][N/2], | |
781 int8_t global_exp[AC3_MAX_CHANNELS], | |
0 | 782 int block_num) |
783 { | |
1408
4d67eb341a0c
AC3 encoding patch ba (Ross Martin <ffmpeg at ross dot interwrx dot com>)
michaelni
parents:
1106
diff
changeset
|
784 int ch, nb_groups, group_size, i, baie, rbnd; |
1064 | 785 uint8_t *p; |
786 uint16_t qmant[AC3_MAX_CHANNELS][N/2]; | |
0 | 787 int exp0, exp1; |
788 int mant1_cnt, mant2_cnt, mant4_cnt; | |
1064 | 789 uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; |
0 | 790 int delta0, delta1, delta2; |
791 | |
2967 | 792 for(ch=0;ch<s->nb_channels;ch++) |
0 | 793 put_bits(&s->pb, 1, 0); /* 512 point MDCT */ |
2967 | 794 for(ch=0;ch<s->nb_channels;ch++) |
0 | 795 put_bits(&s->pb, 1, 1); /* no dither */ |
796 put_bits(&s->pb, 1, 0); /* no dynamic range */ | |
797 if (block_num == 0) { | |
798 /* for block 0, even if no coupling, we must say it. This is a | |
799 waste of bit :-) */ | |
800 put_bits(&s->pb, 1, 1); /* coupling strategy present */ | |
801 put_bits(&s->pb, 1, 0); /* no coupling strategy */ | |
802 } else { | |
803 put_bits(&s->pb, 1, 0); /* no new coupling strategy */ | |
804 } | |
805 | |
6005 | 806 if (s->channel_mode == AC3_CHMODE_STEREO) |
1408
4d67eb341a0c
AC3 encoding patch ba (Ross Martin <ffmpeg at ross dot interwrx dot com>)
michaelni
parents:
1106
diff
changeset
|
807 { |
2979 | 808 if(block_num==0) |
809 { | |
810 /* first block must define rematrixing (rematstr) */ | |
811 put_bits(&s->pb, 1, 1); | |
2967 | 812 |
2979 | 813 /* dummy rematrixing rematflg(1:4)=0 */ |
814 for (rbnd=0;rbnd<4;rbnd++) | |
815 put_bits(&s->pb, 1, 0); | |
816 } | |
817 else | |
818 { | |
819 /* no matrixing (but should be used in the future) */ | |
820 put_bits(&s->pb, 1, 0); | |
821 } | |
1408
4d67eb341a0c
AC3 encoding patch ba (Ross Martin <ffmpeg at ross dot interwrx dot com>)
michaelni
parents:
1106
diff
changeset
|
822 } |
0 | 823 |
2967 | 824 #if defined(DEBUG) |
0 | 825 { |
1408
4d67eb341a0c
AC3 encoding patch ba (Ross Martin <ffmpeg at ross dot interwrx dot com>)
michaelni
parents:
1106
diff
changeset
|
826 static int count = 0; |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
827 av_log(NULL, AV_LOG_DEBUG, "Block #%d (%d)\n", block_num, count++); |
0 | 828 } |
829 #endif | |
830 /* exponent strategy */ | |
831 for(ch=0;ch<s->nb_channels;ch++) { | |
832 put_bits(&s->pb, 2, exp_strategy[ch]); | |
833 } | |
2967 | 834 |
314 | 835 if (s->lfe) { |
2979 | 836 put_bits(&s->pb, 1, exp_strategy[s->lfe_channel]); |
314 | 837 } |
838 | |
0 | 839 for(ch=0;ch<s->nb_channels;ch++) { |
840 if (exp_strategy[ch] != EXP_REUSE) | |
841 put_bits(&s->pb, 6, s->chbwcod[ch]); | |
842 } | |
2967 | 843 |
0 | 844 /* exponents */ |
314 | 845 for (ch = 0; ch < s->nb_all_channels; ch++) { |
0 | 846 switch(exp_strategy[ch]) { |
847 case EXP_REUSE: | |
848 continue; | |
849 case EXP_D15: | |
850 group_size = 1; | |
851 break; | |
852 case EXP_D25: | |
853 group_size = 2; | |
854 break; | |
855 default: | |
856 case EXP_D45: | |
857 group_size = 4; | |
858 break; | |
859 } | |
2979 | 860 nb_groups = (s->nb_coefs[ch] + (group_size * 3) - 4) / (3 * group_size); |
0 | 861 p = encoded_exp[ch]; |
862 | |
863 /* first exponent */ | |
864 exp1 = *p++; | |
865 put_bits(&s->pb, 4, exp1); | |
866 | |
867 /* next ones are delta encoded */ | |
868 for(i=0;i<nb_groups;i++) { | |
869 /* merge three delta in one code */ | |
870 exp0 = exp1; | |
871 exp1 = p[0]; | |
872 p += group_size; | |
873 delta0 = exp1 - exp0 + 2; | |
874 | |
875 exp0 = exp1; | |
876 exp1 = p[0]; | |
877 p += group_size; | |
878 delta1 = exp1 - exp0 + 2; | |
879 | |
880 exp0 = exp1; | |
881 exp1 = p[0]; | |
882 p += group_size; | |
883 delta2 = exp1 - exp0 + 2; | |
884 | |
885 put_bits(&s->pb, 7, ((delta0 * 5 + delta1) * 5) + delta2); | |
886 } | |
887 | |
2979 | 888 if (ch != s->lfe_channel) |
889 put_bits(&s->pb, 2, 0); /* no gain range info */ | |
0 | 890 } |
891 | |
892 /* bit allocation info */ | |
893 baie = (block_num == 0); | |
894 put_bits(&s->pb, 1, baie); | |
895 if (baie) { | |
6003 | 896 put_bits(&s->pb, 2, s->slow_decay_code); |
897 put_bits(&s->pb, 2, s->fast_decay_code); | |
898 put_bits(&s->pb, 2, s->slow_gain_code); | |
899 put_bits(&s->pb, 2, s->db_per_bit_code); | |
900 put_bits(&s->pb, 3, s->floor_code); | |
0 | 901 } |
902 | |
903 /* snr offset */ | |
904 put_bits(&s->pb, 1, baie); /* always present with bai */ | |
905 if (baie) { | |
6003 | 906 put_bits(&s->pb, 6, s->coarse_snr_offset); |
314 | 907 for(ch=0;ch<s->nb_all_channels;ch++) { |
6003 | 908 put_bits(&s->pb, 4, s->fine_snr_offset[ch]); |
909 put_bits(&s->pb, 3, s->fast_gain_code[ch]); | |
0 | 910 } |
911 } | |
2967 | 912 |
0 | 913 put_bits(&s->pb, 1, 0); /* no delta bit allocation */ |
914 put_bits(&s->pb, 1, 0); /* no data to skip */ | |
915 | |
916 /* mantissa encoding : we use two passes to handle the grouping. A | |
917 one pass method may be faster, but it would necessitate to | |
918 modify the output stream. */ | |
919 | |
920 /* first pass: quantize */ | |
921 mant1_cnt = mant2_cnt = mant4_cnt = 0; | |
922 qmant1_ptr = qmant2_ptr = qmant4_ptr = NULL; | |
923 | |
314 | 924 for (ch = 0; ch < s->nb_all_channels; ch++) { |
0 | 925 int b, c, e, v; |
926 | |
927 for(i=0;i<s->nb_coefs[ch];i++) { | |
928 c = mdct_coefs[ch][i]; | |
929 e = encoded_exp[ch][i] - global_exp[ch]; | |
930 b = bap[ch][i]; | |
931 switch(b) { | |
932 case 0: | |
933 v = 0; | |
934 break; | |
935 case 1: | |
936 v = sym_quant(c, e, 3); | |
937 switch(mant1_cnt) { | |
938 case 0: | |
939 qmant1_ptr = &qmant[ch][i]; | |
940 v = 9 * v; | |
941 mant1_cnt = 1; | |
942 break; | |
943 case 1: | |
944 *qmant1_ptr += 3 * v; | |
945 mant1_cnt = 2; | |
946 v = 128; | |
947 break; | |
948 default: | |
949 *qmant1_ptr += v; | |
950 mant1_cnt = 0; | |
951 v = 128; | |
952 break; | |
953 } | |
954 break; | |
955 case 2: | |
956 v = sym_quant(c, e, 5); | |
957 switch(mant2_cnt) { | |
958 case 0: | |
959 qmant2_ptr = &qmant[ch][i]; | |
960 v = 25 * v; | |
961 mant2_cnt = 1; | |
962 break; | |
963 case 1: | |
964 *qmant2_ptr += 5 * v; | |
965 mant2_cnt = 2; | |
966 v = 128; | |
967 break; | |
968 default: | |
969 *qmant2_ptr += v; | |
970 mant2_cnt = 0; | |
971 v = 128; | |
972 break; | |
973 } | |
974 break; | |
975 case 3: | |
976 v = sym_quant(c, e, 7); | |
977 break; | |
978 case 4: | |
979 v = sym_quant(c, e, 11); | |
980 switch(mant4_cnt) { | |
981 case 0: | |
982 qmant4_ptr = &qmant[ch][i]; | |
983 v = 11 * v; | |
984 mant4_cnt = 1; | |
985 break; | |
986 default: | |
987 *qmant4_ptr += v; | |
988 mant4_cnt = 0; | |
989 v = 128; | |
990 break; | |
991 } | |
992 break; | |
993 case 5: | |
994 v = sym_quant(c, e, 15); | |
995 break; | |
996 case 14: | |
997 v = asym_quant(c, e, 14); | |
998 break; | |
999 case 15: | |
1000 v = asym_quant(c, e, 16); | |
1001 break; | |
1002 default: | |
1003 v = asym_quant(c, e, b - 1); | |
1004 break; | |
1005 } | |
1006 qmant[ch][i] = v; | |
1007 } | |
1008 } | |
1009 | |
1010 /* second pass : output the values */ | |
314 | 1011 for (ch = 0; ch < s->nb_all_channels; ch++) { |
0 | 1012 int b, q; |
2967 | 1013 |
0 | 1014 for(i=0;i<s->nb_coefs[ch];i++) { |
1015 q = qmant[ch][i]; | |
1016 b = bap[ch][i]; | |
1017 switch(b) { | |
1018 case 0: | |
1019 break; | |
1020 case 1: | |
2967 | 1021 if (q != 128) |
0 | 1022 put_bits(&s->pb, 5, q); |
1023 break; | |
1024 case 2: | |
2967 | 1025 if (q != 128) |
0 | 1026 put_bits(&s->pb, 7, q); |
1027 break; | |
1028 case 3: | |
1029 put_bits(&s->pb, 3, q); | |
1030 break; | |
1031 case 4: | |
1032 if (q != 128) | |
1033 put_bits(&s->pb, 7, q); | |
1034 break; | |
1035 case 14: | |
1036 put_bits(&s->pb, 14, q); | |
1037 break; | |
1038 case 15: | |
1039 put_bits(&s->pb, 16, q); | |
1040 break; | |
1041 default: | |
1042 put_bits(&s->pb, b - 1, q); | |
1043 break; | |
1044 } | |
1045 } | |
1046 } | |
1047 } | |
1048 | |
1049 #define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) | |
1050 | |
1051 static unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly) | |
1052 { | |
1053 unsigned int c; | |
1054 | |
1055 c = 0; | |
1056 while (a) { | |
1057 if (a & 1) | |
1058 c ^= b; | |
1059 a = a >> 1; | |
1060 b = b << 1; | |
1061 if (b & (1 << 16)) | |
1062 b ^= poly; | |
1063 } | |
1064 return c; | |
1065 } | |
1066 | |
1067 static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly) | |
1068 { | |
1069 unsigned int r; | |
1070 r = 1; | |
1071 while (n) { | |
1072 if (n & 1) | |
1073 r = mul_poly(r, a, poly); | |
1074 a = mul_poly(a, a, poly); | |
1075 n >>= 1; | |
1076 } | |
1077 return r; | |
1078 } | |
1079 | |
1080 | |
1081 /* compute log2(max(abs(tab[]))) */ | |
1064 | 1082 static int log2_tab(int16_t *tab, int n) |
0 | 1083 { |
1084 int i, v; | |
1085 | |
1086 v = 0; | |
1087 for(i=0;i<n;i++) { | |
1088 v |= abs(tab[i]); | |
1089 } | |
65 | 1090 return av_log2(v); |
0 | 1091 } |
1092 | |
1064 | 1093 static void lshift_tab(int16_t *tab, int n, int lshift) |
0 | 1094 { |
1095 int i; | |
1096 | |
1097 if (lshift > 0) { | |
1098 for(i=0;i<n;i++) { | |
1099 tab[i] <<= lshift; | |
1100 } | |
1101 } else if (lshift < 0) { | |
1102 lshift = -lshift; | |
1103 for(i=0;i<n;i++) { | |
1104 tab[i] >>= lshift; | |
1105 } | |
1106 } | |
1107 } | |
1108 | |
1109 /* fill the end of the frame and compute the two crcs */ | |
1110 static int output_frame_end(AC3EncodeContext *s) | |
1111 { | |
1112 int frame_size, frame_size_58, n, crc1, crc2, crc_inv; | |
1064 | 1113 uint8_t *frame; |
0 | 1114 |
1115 frame_size = s->frame_size; /* frame size in words */ | |
1116 /* align to 8 bits */ | |
1117 flush_put_bits(&s->pb); | |
1118 /* add zero bytes to reach the frame size */ | |
1119 frame = s->pb.buf; | |
234
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
87
diff
changeset
|
1120 n = 2 * s->frame_size - (pbBufPtr(&s->pb) - frame) - 2; |
0 | 1121 assert(n >= 0); |
1408
4d67eb341a0c
AC3 encoding patch ba (Ross Martin <ffmpeg at ross dot interwrx dot com>)
michaelni
parents:
1106
diff
changeset
|
1122 if(n>0) |
4d67eb341a0c
AC3 encoding patch ba (Ross Martin <ffmpeg at ross dot interwrx dot com>)
michaelni
parents:
1106
diff
changeset
|
1123 memset(pbBufPtr(&s->pb), 0, n); |
2967 | 1124 |
0 | 1125 /* Now we must compute both crcs : this is not so easy for crc1 |
1126 because it is at the beginning of the data... */ | |
1127 frame_size_58 = (frame_size >> 1) + (frame_size >> 3); | |
6108 | 1128 crc1 = bswap_16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, |
1129 frame + 4, 2 * frame_size_58 - 4)); | |
0 | 1130 /* XXX: could precompute crc_inv */ |
1131 crc_inv = pow_poly((CRC16_POLY >> 1), (16 * frame_size_58) - 16, CRC16_POLY); | |
1132 crc1 = mul_poly(crc_inv, crc1, CRC16_POLY); | |
5089 | 1133 AV_WB16(frame+2,crc1); |
2967 | 1134 |
6108 | 1135 crc2 = bswap_16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, |
1136 frame + 2 * frame_size_58, | |
1137 (frame_size - frame_size_58) * 2 - 2)); | |
5089 | 1138 AV_WB16(frame+2*frame_size-2,crc2); |
0 | 1139 |
1140 // printf("n=%d frame_size=%d\n", n, frame_size); | |
1141 return frame_size * 2; | |
1142 } | |
1143 | |
782 | 1144 static int AC3_encode_frame(AVCodecContext *avctx, |
1145 unsigned char *frame, int buf_size, void *data) | |
0 | 1146 { |
1147 AC3EncodeContext *s = avctx->priv_data; | |
2367
c353719836af
fix some type mismatches patch by (Jeff Muizelaar <muizelaar rogers com>)
michael
parents:
2157
diff
changeset
|
1148 int16_t *samples = data; |
0 | 1149 int i, j, k, v, ch; |
1064 | 1150 int16_t input_samples[N]; |
1151 int32_t mdct_coef[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; | |
1152 uint8_t exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; | |
1153 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS]; | |
1154 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; | |
1155 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; | |
1156 int8_t exp_samples[NB_BLOCKS][AC3_MAX_CHANNELS]; | |
0 | 1157 int frame_bits; |
1158 | |
1159 frame_bits = 0; | |
314 | 1160 for(ch=0;ch<s->nb_all_channels;ch++) { |
0 | 1161 /* fixed mdct to the six sub blocks & exponent computation */ |
1162 for(i=0;i<NB_BLOCKS;i++) { | |
1064 | 1163 int16_t *sptr; |
0 | 1164 int sinc; |
1165 | |
1166 /* compute input samples */ | |
1064 | 1167 memcpy(input_samples, s->last_samples[ch], N/2 * sizeof(int16_t)); |
314 | 1168 sinc = s->nb_all_channels; |
0 | 1169 sptr = samples + (sinc * (N/2) * i) + ch; |
1170 for(j=0;j<N/2;j++) { | |
1171 v = *sptr; | |
1172 input_samples[j + N/2] = v; | |
2967 | 1173 s->last_samples[ch][j] = v; |
0 | 1174 sptr += sinc; |
1175 } | |
1176 | |
1177 /* apply the MDCT window */ | |
1178 for(j=0;j<N/2;j++) { | |
2967 | 1179 input_samples[j] = MUL16(input_samples[j], |
4643
1e175640dad3
Remove common code from AC-3 encoder and utilize ac3.c.
jbr
parents:
4641
diff
changeset
|
1180 ff_ac3_window[j]) >> 15; |
2967 | 1181 input_samples[N-j-1] = MUL16(input_samples[N-j-1], |
4643
1e175640dad3
Remove common code from AC-3 encoder and utilize ac3.c.
jbr
parents:
4641
diff
changeset
|
1182 ff_ac3_window[j]) >> 15; |
0 | 1183 } |
2967 | 1184 |
0 | 1185 /* Normalize the samples to use the maximum available |
1186 precision */ | |
1187 v = 14 - log2_tab(input_samples, N); | |
1188 if (v < 0) | |
1189 v = 0; | |
4686
3a891d2379ce
AC-3 encoded volume is too high. Revert revision 7160:
jbr
parents:
4645
diff
changeset
|
1190 exp_samples[i][ch] = v - 9; |
0 | 1191 lshift_tab(input_samples, N, v); |
1192 | |
1193 /* do the MDCT */ | |
1194 mdct512(mdct_coef[i][ch], input_samples); | |
2967 | 1195 |
0 | 1196 /* compute "exponents". We take into account the |
1197 normalization there */ | |
1198 for(j=0;j<N/2;j++) { | |
1199 int e; | |
1200 v = abs(mdct_coef[i][ch][j]); | |
1201 if (v == 0) | |
1202 e = 24; | |
1203 else { | |
65 | 1204 e = 23 - av_log2(v) + exp_samples[i][ch]; |
0 | 1205 if (e >= 24) { |
1206 e = 24; | |
1207 mdct_coef[i][ch][j] = 0; | |
1208 } | |
1209 } | |
1210 exp[i][ch][j] = e; | |
1211 } | |
1212 } | |
2967 | 1213 |
314 | 1214 compute_exp_strategy(exp_strategy, exp, ch, ch == s->lfe_channel); |
0 | 1215 |
1216 /* compute the exponents as the decoder will see them. The | |
1217 EXP_REUSE case must be handled carefully : we select the | |
1218 min of the exponents */ | |
1219 i = 0; | |
1220 while (i < NB_BLOCKS) { | |
1221 j = i + 1; | |
1222 while (j < NB_BLOCKS && exp_strategy[j][ch] == EXP_REUSE) { | |
1223 exponent_min(exp[i][ch], exp[j][ch], s->nb_coefs[ch]); | |
1224 j++; | |
1225 } | |
1226 frame_bits += encode_exp(encoded_exp[i][ch], | |
2967 | 1227 exp[i][ch], s->nb_coefs[ch], |
0 | 1228 exp_strategy[i][ch]); |
1229 /* copy encoded exponents for reuse case */ | |
1230 for(k=i+1;k<j;k++) { | |
2967 | 1231 memcpy(encoded_exp[k][ch], encoded_exp[i][ch], |
1064 | 1232 s->nb_coefs[ch] * sizeof(uint8_t)); |
0 | 1233 } |
1234 i = j; | |
1235 } | |
1236 } | |
1237 | |
3246 | 1238 /* adjust for fractional frame sizes */ |
6082 | 1239 while(s->bits_written >= s->bit_rate && s->samples_written >= s->sample_rate) { |
1240 s->bits_written -= s->bit_rate; | |
3246 | 1241 s->samples_written -= s->sample_rate; |
1242 } | |
6082 | 1243 s->frame_size = s->frame_size_min + (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate); |
3246 | 1244 s->bits_written += s->frame_size * 16; |
1245 s->samples_written += AC3_FRAME_SIZE; | |
1246 | |
0 | 1247 compute_bit_allocation(s, bap, encoded_exp, exp_strategy, frame_bits); |
1248 /* everything is known... let's output the frame */ | |
1249 output_frame_header(s, frame); | |
2967 | 1250 |
0 | 1251 for(i=0;i<NB_BLOCKS;i++) { |
2967 | 1252 output_audio_block(s, exp_strategy[i], encoded_exp[i], |
0 | 1253 bap[i], mdct_coef[i], exp_samples[i], i); |
1254 } | |
1255 return output_frame_end(s); | |
1256 } | |
1257 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6516
diff
changeset
|
1258 static av_cold int AC3_encode_close(AVCodecContext *avctx) |
925 | 1259 { |
1260 av_freep(&avctx->coded_frame); | |
1014
48349e11c9b2
C99 initializers and kill warnings patch by (mru at users dot sourceforge dot net (Mns Rullgrd))
michaelni
parents:
925
diff
changeset
|
1261 return 0; |
925 | 1262 } |
1263 | |
0 | 1264 #if 0 |
1265 /*************************************************************************/ | |
1266 /* TEST */ | |
1267 | |
5380
389366aa3458
Fix the self tests which are contained in some codecs and are using random().
takis
parents:
5331
diff
changeset
|
1268 #undef random |
0 | 1269 #define FN (N/4) |
1270 | |
1271 void fft_test(void) | |
1272 { | |
1273 IComplex in[FN], in1[FN]; | |
1274 int k, n, i; | |
1275 float sum_re, sum_im, a; | |
1276 | |
1277 /* FFT test */ | |
1278 | |
1279 for(i=0;i<FN;i++) { | |
1280 in[i].re = random() % 65535 - 32767; | |
1281 in[i].im = random() % 65535 - 32767; | |
1282 in1[i] = in[i]; | |
1283 } | |
1284 fft(in, 7); | |
1285 | |
1286 /* do it by hand */ | |
1287 for(k=0;k<FN;k++) { | |
1288 sum_re = 0; | |
1289 sum_im = 0; | |
1290 for(n=0;n<FN;n++) { | |
1291 a = -2 * M_PI * (n * k) / FN; | |
1292 sum_re += in1[n].re * cos(a) - in1[n].im * sin(a); | |
1293 sum_im += in1[n].re * sin(a) + in1[n].im * cos(a); | |
1294 } | |
2967 | 1295 printf("%3d: %6d,%6d %6.0f,%6.0f\n", |
1296 k, in[k].re, in[k].im, sum_re / FN, sum_im / FN); | |
0 | 1297 } |
1298 } | |
1299 | |
1300 void mdct_test(void) | |
1301 { | |
1064 | 1302 int16_t input[N]; |
1303 int32_t output[N/2]; | |
0 | 1304 float input1[N]; |
1305 float output1[N/2]; | |
1306 float s, a, err, e, emax; | |
1307 int i, k, n; | |
1308 | |
1309 for(i=0;i<N;i++) { | |
1310 input[i] = (random() % 65535 - 32767) * 9 / 10; | |
1311 input1[i] = input[i]; | |
1312 } | |
1313 | |
1314 mdct512(output, input); | |
2967 | 1315 |
0 | 1316 /* do it by hand */ |
1317 for(k=0;k<N/2;k++) { | |
1318 s = 0; | |
1319 for(n=0;n<N;n++) { | |
1320 a = (2*M_PI*(2*n+1+N/2)*(2*k+1) / (4 * N)); | |
1321 s += input1[n] * cos(a); | |
1322 } | |
1323 output1[k] = -2 * s / N; | |
1324 } | |
2967 | 1325 |
0 | 1326 err = 0; |
1327 emax = 0; | |
1328 for(i=0;i<N/2;i++) { | |
1329 printf("%3d: %7d %7.0f\n", i, output[i], output1[i]); | |
1330 e = output[i] - output1[i]; | |
1331 if (e > emax) | |
1332 emax = e; | |
1333 err += e * e; | |
1334 } | |
1335 printf("err2=%f emax=%f\n", err / (N/2), emax); | |
1336 } | |
1337 | |
1338 void test_ac3(void) | |
1339 { | |
1340 AC3EncodeContext ctx; | |
1341 unsigned char frame[AC3_MAX_CODED_FRAME_SIZE]; | |
1342 short samples[AC3_FRAME_SIZE]; | |
1343 int ret, i; | |
2967 | 1344 |
0 | 1345 AC3_encode_init(&ctx, 44100, 64000, 1); |
1346 | |
1347 fft_test(); | |
1348 mdct_test(); | |
1349 | |
1350 for(i=0;i<AC3_FRAME_SIZE;i++) | |
1351 samples[i] = (int)(sin(2*M_PI*i*1000.0/44100) * 10000); | |
1352 ret = AC3_encode_frame(&ctx, frame, samples); | |
1353 printf("ret=%d\n", ret); | |
1354 } | |
1355 #endif | |
1356 | |
1357 AVCodec ac3_encoder = { | |
1358 "ac3", | |
1359 CODEC_TYPE_AUDIO, | |
1360 CODEC_ID_AC3, | |
1361 sizeof(AC3EncodeContext), | |
1362 AC3_encode_init, | |
1363 AC3_encode_frame, | |
925 | 1364 AC3_encode_close, |
0 | 1365 NULL, |
6712 | 1366 .long_name = "ATSC A/52 / AC-3", |
0 | 1367 }; |