00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00026
00027
00028 #include "avcodec.h"
00029 #include "bitstream.h"
00030 #include "crc.h"
00031 #include "ac3.h"
00032
00033 typedef struct AC3EncodeContext {
00034 PutBitContext pb;
00035 int nb_channels;
00036 int nb_all_channels;
00037 int lfe_channel;
00038 int bit_rate;
00039 unsigned int sample_rate;
00040 unsigned int bsid;
00041 unsigned int frame_size_min;
00042 unsigned int frame_size;
00043 unsigned int bits_written;
00044 unsigned int samples_written;
00045 int halfratecod;
00046 unsigned int frmsizecod;
00047 unsigned int fscod;
00048 unsigned int acmod;
00049 int lfe;
00050 unsigned int bsmod;
00051 short last_samples[AC3_MAX_CHANNELS][256];
00052 unsigned int chbwcod[AC3_MAX_CHANNELS];
00053 int nb_coefs[AC3_MAX_CHANNELS];
00054
00055
00056 int sgaincod, sdecaycod, fdecaycod, dbkneecod, floorcod;
00057 AC3BitAllocParameters bit_alloc;
00058 int csnroffst;
00059 int fgaincod[AC3_MAX_CHANNELS];
00060 int fsnroffst[AC3_MAX_CHANNELS];
00061
00062 int mant1_cnt, mant2_cnt, mant4_cnt;
00063 } AC3EncodeContext;
00064
00065 static int16_t costab[64];
00066 static int16_t sintab[64];
00067 static int16_t fft_rev[512];
00068 static int16_t xcos1[128];
00069 static int16_t xsin1[128];
00070
00071 #define MDCT_NBITS 9
00072 #define N (1 << MDCT_NBITS)
00073
00074
00075 #define EXP_DIFF_THRESHOLD 1000
00076
00077 static void fft_init(int ln);
00078
00079 static inline int16_t fix15(float a)
00080 {
00081 int v;
00082 v = (int)(a * (float)(1 << 15));
00083 if (v < -32767)
00084 v = -32767;
00085 else if (v > 32767)
00086 v = 32767;
00087 return v;
00088 }
00089
00090 typedef struct IComplex {
00091 short re,im;
00092 } IComplex;
00093
00094 static void fft_init(int ln)
00095 {
00096 int i, j, m, n;
00097 float alpha;
00098
00099 n = 1 << ln;
00100
00101 for(i=0;i<(n/2);i++) {
00102 alpha = 2 * M_PI * (float)i / (float)n;
00103 costab[i] = fix15(cos(alpha));
00104 sintab[i] = fix15(sin(alpha));
00105 }
00106
00107 for(i=0;i<n;i++) {
00108 m=0;
00109 for(j=0;j<ln;j++) {
00110 m |= ((i >> j) & 1) << (ln-j-1);
00111 }
00112 fft_rev[i]=m;
00113 }
00114 }
00115
00116
00117 #define BF(pre, pim, qre, qim, pre1, pim1, qre1, qim1) \
00118 {\
00119 int ax, ay, bx, by;\
00120 bx=pre1;\
00121 by=pim1;\
00122 ax=qre1;\
00123 ay=qim1;\
00124 pre = (bx + ax) >> 1;\
00125 pim = (by + ay) >> 1;\
00126 qre = (bx - ax) >> 1;\
00127 qim = (by - ay) >> 1;\
00128 }
00129
00130 #define MUL16(a,b) ((a) * (b))
00131
00132 #define CMUL(pre, pim, are, aim, bre, bim) \
00133 {\
00134 pre = (MUL16(are, bre) - MUL16(aim, bim)) >> 15;\
00135 pim = (MUL16(are, bim) + MUL16(bre, aim)) >> 15;\
00136 }
00137
00138
00139
00140 static void fft(IComplex *z, int ln)
00141 {
00142 int j, l, np, np2;
00143 int nblocks, nloops;
00144 register IComplex *p,*q;
00145 int tmp_re, tmp_im;
00146
00147 np = 1 << ln;
00148
00149
00150 for(j=0;j<np;j++) {
00151 int k;
00152 IComplex tmp;
00153 k = fft_rev[j];
00154 if (k < j) {
00155 tmp = z[k];
00156 z[k] = z[j];
00157 z[j] = tmp;
00158 }
00159 }
00160
00161
00162
00163 p=&z[0];
00164 j=(np >> 1);
00165 do {
00166 BF(p[0].re, p[0].im, p[1].re, p[1].im,
00167 p[0].re, p[0].im, p[1].re, p[1].im);
00168 p+=2;
00169 } while (--j != 0);
00170
00171
00172
00173 p=&z[0];
00174 j=np >> 2;
00175 do {
00176 BF(p[0].re, p[0].im, p[2].re, p[2].im,
00177 p[0].re, p[0].im, p[2].re, p[2].im);
00178 BF(p[1].re, p[1].im, p[3].re, p[3].im,
00179 p[1].re, p[1].im, p[3].im, -p[3].re);
00180 p+=4;
00181 } while (--j != 0);
00182
00183
00184
00185 nblocks = np >> 3;
00186 nloops = 1 << 2;
00187 np2 = np >> 1;
00188 do {
00189 p = z;
00190 q = z + nloops;
00191 for (j = 0; j < nblocks; ++j) {
00192
00193 BF(p->re, p->im, q->re, q->im,
00194 p->re, p->im, q->re, q->im);
00195
00196 p++;
00197 q++;
00198 for(l = nblocks; l < np2; l += nblocks) {
00199 CMUL(tmp_re, tmp_im, costab[l], -sintab[l], q->re, q->im);
00200 BF(p->re, p->im, q->re, q->im,
00201 p->re, p->im, tmp_re, tmp_im);
00202 p++;
00203 q++;
00204 }
00205 p += nloops;
00206 q += nloops;
00207 }
00208 nblocks = nblocks >> 1;
00209 nloops = nloops << 1;
00210 } while (nblocks != 0);
00211 }
00212
00213
00214 static void mdct512(int32_t *out, int16_t *in)
00215 {
00216 int i, re, im, re1, im1;
00217 int16_t rot[N];
00218 IComplex x[N/4];
00219
00220
00221 for(i=0;i<N/4;i++)
00222 rot[i] = -in[i + 3*N/4];
00223 for(i=N/4;i<N;i++)
00224 rot[i] = in[i - N/4];
00225
00226
00227 for(i=0;i<N/4;i++) {
00228 re = ((int)rot[2*i] - (int)rot[N-1-2*i]) >> 1;
00229 im = -((int)rot[N/2+2*i] - (int)rot[N/2-1-2*i]) >> 1;
00230 CMUL(x[i].re, x[i].im, re, im, -xcos1[i], xsin1[i]);
00231 }
00232
00233 fft(x, MDCT_NBITS - 2);
00234
00235
00236 for(i=0;i<N/4;i++) {
00237 re = x[i].re;
00238 im = x[i].im;
00239 CMUL(re1, im1, re, im, xsin1[i], xcos1[i]);
00240 out[2*i] = im1;
00241 out[N/2-1-2*i] = re1;
00242 }
00243 }
00244
00245
00246 static int calc_exp_diff(uint8_t *exp1, uint8_t *exp2, int n)
00247 {
00248 int sum, i;
00249 sum = 0;
00250 for(i=0;i<n;i++) {
00251 sum += abs(exp1[i] - exp2[i]);
00252 }
00253 return sum;
00254 }
00255
00256 static void compute_exp_strategy(uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS],
00257 uint8_t exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
00258 int ch, int is_lfe)
00259 {
00260 int i, j;
00261 int exp_diff;
00262
00263
00264
00265 exp_strategy[0][ch] = EXP_NEW;
00266 for(i=1;i<NB_BLOCKS;i++) {
00267 exp_diff = calc_exp_diff(exp[i][ch], exp[i-1][ch], N/2);
00268 #ifdef DEBUG
00269 av_log(NULL, AV_LOG_DEBUG, "exp_diff=%d\n", exp_diff);
00270 #endif
00271 if (exp_diff > EXP_DIFF_THRESHOLD)
00272 exp_strategy[i][ch] = EXP_NEW;
00273 else
00274 exp_strategy[i][ch] = EXP_REUSE;
00275 }
00276 if (is_lfe)
00277 return;
00278
00279
00280
00281 i = 0;
00282 while (i < NB_BLOCKS) {
00283 j = i + 1;
00284 while (j < NB_BLOCKS && exp_strategy[j][ch] == EXP_REUSE)
00285 j++;
00286 switch(j - i) {
00287 case 1:
00288 exp_strategy[i][ch] = EXP_D45;
00289 break;
00290 case 2:
00291 case 3:
00292 exp_strategy[i][ch] = EXP_D25;
00293 break;
00294 default:
00295 exp_strategy[i][ch] = EXP_D15;
00296 break;
00297 }
00298 i = j;
00299 }
00300 }
00301
00302
00303 static void exponent_min(uint8_t exp[N/2], uint8_t exp1[N/2], int n)
00304 {
00305 int i;
00306
00307 for(i=0;i<n;i++) {
00308 if (exp1[i] < exp[i])
00309 exp[i] = exp1[i];
00310 }
00311 }
00312
00313
00314
00315 static int encode_exp(uint8_t encoded_exp[N/2],
00316 uint8_t exp[N/2],
00317 int nb_exps,
00318 int exp_strategy)
00319 {
00320 int group_size, nb_groups, i, j, k, exp_min;
00321 uint8_t exp1[N/2];
00322
00323 switch(exp_strategy) {
00324 case EXP_D15:
00325 group_size = 1;
00326 break;
00327 case EXP_D25:
00328 group_size = 2;
00329 break;
00330 default:
00331 case EXP_D45:
00332 group_size = 4;
00333 break;
00334 }
00335 nb_groups = ((nb_exps + (group_size * 3) - 4) / (3 * group_size)) * 3;
00336
00337
00338 exp1[0] = exp[0];
00339 k = 1;
00340 for(i=1;i<=nb_groups;i++) {
00341 exp_min = exp[k];
00342 assert(exp_min >= 0 && exp_min <= 24);
00343 for(j=1;j<group_size;j++) {
00344 if (exp[k+j] < exp_min)
00345 exp_min = exp[k+j];
00346 }
00347 exp1[i] = exp_min;
00348 k += group_size;
00349 }
00350
00351
00352 if (exp1[0] > 15)
00353 exp1[0] = 15;
00354
00355
00356
00357 for (i=1;i<=nb_groups;i++)
00358 exp1[i] = FFMIN(exp1[i], exp1[i-1] + 2);
00359 for (i=nb_groups-1;i>=0;i--)
00360 exp1[i] = FFMIN(exp1[i], exp1[i+1] + 2);
00361
00362
00363 encoded_exp[0] = exp1[0];
00364 k = 1;
00365 for(i=1;i<=nb_groups;i++) {
00366 for(j=0;j<group_size;j++) {
00367 encoded_exp[k+j] = exp1[i];
00368 }
00369 k += group_size;
00370 }
00371
00372 #if defined(DEBUG)
00373 av_log(NULL, AV_LOG_DEBUG, "exponents: strategy=%d\n", exp_strategy);
00374 for(i=0;i<=nb_groups * group_size;i++) {
00375 av_log(NULL, AV_LOG_DEBUG, "%d ", encoded_exp[i]);
00376 }
00377 av_log(NULL, AV_LOG_DEBUG, "\n");
00378 #endif
00379
00380 return 4 + (nb_groups / 3) * 7;
00381 }
00382
00383
00384 static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs)
00385 {
00386 int bits, mant, i;
00387
00388 bits = 0;
00389 for(i=0;i<nb_coefs;i++) {
00390 mant = m[i];
00391 switch(mant) {
00392 case 0:
00393
00394 break;
00395 case 1:
00396
00397 if (s->mant1_cnt == 0)
00398 bits += 5;
00399 if (++s->mant1_cnt == 3)
00400 s->mant1_cnt = 0;
00401 break;
00402 case 2:
00403
00404 if (s->mant2_cnt == 0)
00405 bits += 7;
00406 if (++s->mant2_cnt == 3)
00407 s->mant2_cnt = 0;
00408 break;
00409 case 3:
00410 bits += 3;
00411 break;
00412 case 4:
00413
00414 if (s->mant4_cnt == 0)
00415 bits += 7;
00416 if (++s->mant4_cnt == 2)
00417 s->mant4_cnt = 0;
00418 break;
00419 case 14:
00420 bits += 14;
00421 break;
00422 case 15:
00423 bits += 16;
00424 break;
00425 default:
00426 bits += mant - 1;
00427 break;
00428 }
00429 }
00430 return bits;
00431 }
00432
00433
00434 static void bit_alloc_masking(AC3EncodeContext *s,
00435 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
00436 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS],
00437 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
00438 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50])
00439 {
00440 int blk, ch;
00441 int16_t bndpsd[NB_BLOCKS][AC3_MAX_CHANNELS][50];
00442
00443 for(blk=0; blk<NB_BLOCKS; blk++) {
00444 for(ch=0;ch<s->nb_all_channels;ch++) {
00445 if(exp_strategy[blk][ch] == EXP_REUSE) {
00446 memcpy(psd[blk][ch], psd[blk-1][ch], (N/2)*sizeof(int16_t));
00447 memcpy(mask[blk][ch], mask[blk-1][ch], 50*sizeof(int16_t));
00448 } else {
00449 ff_ac3_bit_alloc_calc_psd(encoded_exp[blk][ch], 0,
00450 s->nb_coefs[ch],
00451 psd[blk][ch], bndpsd[blk][ch]);
00452 ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, bndpsd[blk][ch],
00453 0, s->nb_coefs[ch],
00454 ff_fgaintab[s->fgaincod[ch]],
00455 ch == s->lfe_channel,
00456 DBA_NONE, 0, NULL, NULL, NULL,
00457 mask[blk][ch]);
00458 }
00459 }
00460 }
00461 }
00462
00463 static int bit_alloc(AC3EncodeContext *s,
00464 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50],
00465 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
00466 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
00467 int frame_bits, int csnroffst, int fsnroffst)
00468 {
00469 int i, ch;
00470 int snroffset;
00471
00472 snroffset = (((csnroffst - 15) << 4) + fsnroffst) << 2;
00473
00474
00475 for(i=0;i<NB_BLOCKS;i++) {
00476 s->mant1_cnt = 0;
00477 s->mant2_cnt = 0;
00478 s->mant4_cnt = 0;
00479 for(ch=0;ch<s->nb_all_channels;ch++) {
00480 ff_ac3_bit_alloc_calc_bap(mask[i][ch], psd[i][ch], 0,
00481 s->nb_coefs[ch], snroffset,
00482 s->bit_alloc.floor, bap[i][ch]);
00483 frame_bits += compute_mantissa_size(s, bap[i][ch],
00484 s->nb_coefs[ch]);
00485 }
00486 }
00487 #if 0
00488 printf("csnr=%d fsnr=%d frame_bits=%d diff=%d\n",
00489 csnroffst, fsnroffst, frame_bits,
00490 16 * s->frame_size - ((frame_bits + 7) & ~7));
00491 #endif
00492 return 16 * s->frame_size - frame_bits;
00493 }
00494
00495 #define SNR_INC1 4
00496
00497 static int compute_bit_allocation(AC3EncodeContext *s,
00498 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
00499 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
00500 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS],
00501 int frame_bits)
00502 {
00503 int i, ch;
00504 int csnroffst, fsnroffst;
00505 uint8_t bap1[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
00506 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
00507 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50];
00508 static int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 };
00509
00510
00511 s->sdecaycod = 2;
00512 s->fdecaycod = 1;
00513 s->sgaincod = 1;
00514 s->dbkneecod = 2;
00515 s->floorcod = 4;
00516 for(ch=0;ch<s->nb_all_channels;ch++)
00517 s->fgaincod[ch] = 4;
00518
00519
00520 s->bit_alloc.fscod = s->fscod;
00521 s->bit_alloc.halfratecod = s->halfratecod;
00522 s->bit_alloc.sdecay = ff_sdecaytab[s->sdecaycod] >> s->halfratecod;
00523 s->bit_alloc.fdecay = ff_fdecaytab[s->fdecaycod] >> s->halfratecod;
00524 s->bit_alloc.sgain = ff_sgaintab[s->sgaincod];
00525 s->bit_alloc.dbknee = ff_dbkneetab[s->dbkneecod];
00526 s->bit_alloc.floor = ff_floortab[s->floorcod];
00527
00528
00529 frame_bits += 65;
00530
00531
00532 frame_bits += frame_bits_inc[s->acmod];
00533
00534
00535 for(i=0;i<NB_BLOCKS;i++) {
00536 frame_bits += s->nb_channels * 2 + 2;
00537 if (s->acmod == AC3_ACMOD_STEREO) {
00538 frame_bits++;
00539 if(i==0) frame_bits += 4;
00540 }
00541 frame_bits += 2 * s->nb_channels;
00542 if (s->lfe)
00543 frame_bits++;
00544 for(ch=0;ch<s->nb_channels;ch++) {
00545 if (exp_strategy[i][ch] != EXP_REUSE)
00546 frame_bits += 6 + 2;
00547 }
00548 frame_bits++;
00549 frame_bits++;
00550 frame_bits += 2;
00551 }
00552 frame_bits++;
00553
00554
00555
00556
00557 frame_bits += 2*4 + 3 + 6 + s->nb_all_channels * (4 + 3);
00558
00559
00560 frame_bits += 2;
00561
00562
00563 frame_bits += 16;
00564
00565
00566 bit_alloc_masking(s, encoded_exp, exp_strategy, psd, mask);
00567
00568
00569
00570
00571 csnroffst = s->csnroffst;
00572 while (csnroffst >= 0 &&
00573 bit_alloc(s, mask, psd, bap, frame_bits, csnroffst, 0) < 0)
00574 csnroffst -= SNR_INC1;
00575 if (csnroffst < 0) {
00576 av_log(NULL, AV_LOG_ERROR, "Bit allocation failed, try increasing the bitrate, -ab 384 for example!\n");
00577 return -1;
00578 }
00579 while ((csnroffst + SNR_INC1) <= 63 &&
00580 bit_alloc(s, mask, psd, bap1, frame_bits,
00581 csnroffst + SNR_INC1, 0) >= 0) {
00582 csnroffst += SNR_INC1;
00583 memcpy(bap, bap1, sizeof(bap1));
00584 }
00585 while ((csnroffst + 1) <= 63 &&
00586 bit_alloc(s, mask, psd, bap1, frame_bits, csnroffst + 1, 0) >= 0) {
00587 csnroffst++;
00588 memcpy(bap, bap1, sizeof(bap1));
00589 }
00590
00591 fsnroffst = 0;
00592 while ((fsnroffst + SNR_INC1) <= 15 &&
00593 bit_alloc(s, mask, psd, bap1, frame_bits,
00594 csnroffst, fsnroffst + SNR_INC1) >= 0) {
00595 fsnroffst += SNR_INC1;
00596 memcpy(bap, bap1, sizeof(bap1));
00597 }
00598 while ((fsnroffst + 1) <= 15 &&
00599 bit_alloc(s, mask, psd, bap1, frame_bits,
00600 csnroffst, fsnroffst + 1) >= 0) {
00601 fsnroffst++;
00602 memcpy(bap, bap1, sizeof(bap1));
00603 }
00604
00605 s->csnroffst = csnroffst;
00606 for(ch=0;ch<s->nb_all_channels;ch++)
00607 s->fsnroffst[ch] = fsnroffst;
00608 #if defined(DEBUG_BITALLOC)
00609 {
00610 int j;
00611
00612 for(i=0;i<6;i++) {
00613 for(ch=0;ch<s->nb_all_channels;ch++) {
00614 printf("Block #%d Ch%d:\n", i, ch);
00615 printf("bap=");
00616 for(j=0;j<s->nb_coefs[ch];j++) {
00617 printf("%d ",bap[i][ch][j]);
00618 }
00619 printf("\n");
00620 }
00621 }
00622 }
00623 #endif
00624 return 0;
00625 }
00626
00627 static int AC3_encode_init(AVCodecContext *avctx)
00628 {
00629 int freq = avctx->sample_rate;
00630 int bitrate = avctx->bit_rate;
00631 int channels = avctx->channels;
00632 AC3EncodeContext *s = avctx->priv_data;
00633 int i, j, ch;
00634 float alpha;
00635 static const uint8_t acmod_defs[6] = {
00636 0x01,
00637 0x02,
00638 0x03,
00639 0x06,
00640 0x07,
00641 0x07,
00642 };
00643
00644 avctx->frame_size = AC3_FRAME_SIZE;
00645
00646 ac3_common_init();
00647
00648
00649 if (channels < 1 || channels > 6)
00650 return -1;
00651 s->acmod = acmod_defs[channels - 1];
00652 s->lfe = (channels == 6) ? 1 : 0;
00653 s->nb_all_channels = channels;
00654 s->nb_channels = channels > 5 ? 5 : channels;
00655 s->lfe_channel = s->lfe ? 5 : -1;
00656
00657
00658 for(i=0;i<3;i++) {
00659 for(j=0;j<3;j++)
00660 if ((ff_ac3_freqs[j] >> i) == freq)
00661 goto found;
00662 }
00663 return -1;
00664 found:
00665 s->sample_rate = freq;
00666 s->halfratecod = i;
00667 s->fscod = j;
00668 s->bsid = 8 + s->halfratecod;
00669 s->bsmod = 0;
00670
00671
00672 bitrate /= 1000;
00673 for(i=0;i<19;i++) {
00674 if ((ff_ac3_bitratetab[i] >> s->halfratecod) == bitrate)
00675 break;
00676 }
00677 if (i == 19)
00678 return -1;
00679 s->bit_rate = bitrate;
00680 s->frmsizecod = i << 1;
00681 s->frame_size_min = ff_ac3_frame_sizes[s->frmsizecod][s->fscod];
00682 s->bits_written = 0;
00683 s->samples_written = 0;
00684 s->frame_size = s->frame_size_min;
00685
00686
00687 for(ch=0;ch<s->nb_channels;ch++) {
00688
00689
00690
00691 s->chbwcod[ch] = 50;
00692 s->nb_coefs[ch] = ((s->chbwcod[ch] + 12) * 3) + 37;
00693 }
00694 if (s->lfe) {
00695 s->nb_coefs[s->lfe_channel] = 7;
00696 }
00697
00698 s->csnroffst = 40;
00699
00700
00701 fft_init(MDCT_NBITS - 2);
00702 for(i=0;i<N/4;i++) {
00703 alpha = 2 * M_PI * (i + 1.0 / 8.0) / (float)N;
00704 xcos1[i] = fix15(-cos(alpha));
00705 xsin1[i] = fix15(-sin(alpha));
00706 }
00707
00708 avctx->coded_frame= avcodec_alloc_frame();
00709 avctx->coded_frame->key_frame= 1;
00710
00711 return 0;
00712 }
00713
00714
00715 static void output_frame_header(AC3EncodeContext *s, unsigned char *frame)
00716 {
00717 init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE);
00718
00719 put_bits(&s->pb, 16, 0x0b77);
00720 put_bits(&s->pb, 16, 0);
00721 put_bits(&s->pb, 2, s->fscod);
00722 put_bits(&s->pb, 6, s->frmsizecod + (s->frame_size - s->frame_size_min));
00723 put_bits(&s->pb, 5, s->bsid);
00724 put_bits(&s->pb, 3, s->bsmod);
00725 put_bits(&s->pb, 3, s->acmod);
00726 if ((s->acmod & 0x01) && s->acmod != AC3_ACMOD_MONO)
00727 put_bits(&s->pb, 2, 1);
00728 if (s->acmod & 0x04)
00729 put_bits(&s->pb, 2, 1);
00730 if (s->acmod == AC3_ACMOD_STEREO)
00731 put_bits(&s->pb, 2, 0);
00732 put_bits(&s->pb, 1, s->lfe);
00733 put_bits(&s->pb, 5, 31);
00734 put_bits(&s->pb, 1, 0);
00735 put_bits(&s->pb, 1, 0);
00736 put_bits(&s->pb, 1, 0);
00737 put_bits(&s->pb, 1, 0);
00738 put_bits(&s->pb, 1, 1);
00739 put_bits(&s->pb, 1, 0);
00740 put_bits(&s->pb, 1, 0);
00741 put_bits(&s->pb, 1, 0);
00742 }
00743
00744
00745 static inline int sym_quant(int c, int e, int levels)
00746 {
00747 int v;
00748
00749 if (c >= 0) {
00750 v = (levels * (c << e)) >> 24;
00751 v = (v + 1) >> 1;
00752 v = (levels >> 1) + v;
00753 } else {
00754 v = (levels * ((-c) << e)) >> 24;
00755 v = (v + 1) >> 1;
00756 v = (levels >> 1) - v;
00757 }
00758 assert (v >= 0 && v < levels);
00759 return v;
00760 }
00761
00762
00763 static inline int asym_quant(int c, int e, int qbits)
00764 {
00765 int lshift, m, v;
00766
00767 lshift = e + qbits - 24;
00768 if (lshift >= 0)
00769 v = c << lshift;
00770 else
00771 v = c >> (-lshift);
00772
00773 v = (v + 1) >> 1;
00774 m = (1 << (qbits-1));
00775 if (v >= m)
00776 v = m - 1;
00777 assert(v >= -m);
00778 return v & ((1 << qbits)-1);
00779 }
00780
00781
00782
00783 static void output_audio_block(AC3EncodeContext *s,
00784 uint8_t exp_strategy[AC3_MAX_CHANNELS],
00785 uint8_t encoded_exp[AC3_MAX_CHANNELS][N/2],
00786 uint8_t bap[AC3_MAX_CHANNELS][N/2],
00787 int32_t mdct_coefs[AC3_MAX_CHANNELS][N/2],
00788 int8_t global_exp[AC3_MAX_CHANNELS],
00789 int block_num)
00790 {
00791 int ch, nb_groups, group_size, i, baie, rbnd;
00792 uint8_t *p;
00793 uint16_t qmant[AC3_MAX_CHANNELS][N/2];
00794 int exp0, exp1;
00795 int mant1_cnt, mant2_cnt, mant4_cnt;
00796 uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr;
00797 int delta0, delta1, delta2;
00798
00799 for(ch=0;ch<s->nb_channels;ch++)
00800 put_bits(&s->pb, 1, 0);
00801 for(ch=0;ch<s->nb_channels;ch++)
00802 put_bits(&s->pb, 1, 1);
00803 put_bits(&s->pb, 1, 0);
00804 if (block_num == 0) {
00805
00806
00807 put_bits(&s->pb, 1, 1);
00808 put_bits(&s->pb, 1, 0);
00809 } else {
00810 put_bits(&s->pb, 1, 0);
00811 }
00812
00813 if (s->acmod == AC3_ACMOD_STEREO)
00814 {
00815 if(block_num==0)
00816 {
00817
00818 put_bits(&s->pb, 1, 1);
00819
00820
00821 for (rbnd=0;rbnd<4;rbnd++)
00822 put_bits(&s->pb, 1, 0);
00823 }
00824 else
00825 {
00826
00827 put_bits(&s->pb, 1, 0);
00828 }
00829 }
00830
00831 #if defined(DEBUG)
00832 {
00833 static int count = 0;
00834 av_log(NULL, AV_LOG_DEBUG, "Block #%d (%d)\n", block_num, count++);
00835 }
00836 #endif
00837
00838 for(ch=0;ch<s->nb_channels;ch++) {
00839 put_bits(&s->pb, 2, exp_strategy[ch]);
00840 }
00841
00842 if (s->lfe) {
00843 put_bits(&s->pb, 1, exp_strategy[s->lfe_channel]);
00844 }
00845
00846 for(ch=0;ch<s->nb_channels;ch++) {
00847 if (exp_strategy[ch] != EXP_REUSE)
00848 put_bits(&s->pb, 6, s->chbwcod[ch]);
00849 }
00850
00851
00852 for (ch = 0; ch < s->nb_all_channels; ch++) {
00853 switch(exp_strategy[ch]) {
00854 case EXP_REUSE:
00855 continue;
00856 case EXP_D15:
00857 group_size = 1;
00858 break;
00859 case EXP_D25:
00860 group_size = 2;
00861 break;
00862 default:
00863 case EXP_D45:
00864 group_size = 4;
00865 break;
00866 }
00867 nb_groups = (s->nb_coefs[ch] + (group_size * 3) - 4) / (3 * group_size);
00868 p = encoded_exp[ch];
00869
00870
00871 exp1 = *p++;
00872 put_bits(&s->pb, 4, exp1);
00873
00874
00875 for(i=0;i<nb_groups;i++) {
00876
00877 exp0 = exp1;
00878 exp1 = p[0];
00879 p += group_size;
00880 delta0 = exp1 - exp0 + 2;
00881
00882 exp0 = exp1;
00883 exp1 = p[0];
00884 p += group_size;
00885 delta1 = exp1 - exp0 + 2;
00886
00887 exp0 = exp1;
00888 exp1 = p[0];
00889 p += group_size;
00890 delta2 = exp1 - exp0 + 2;
00891
00892 put_bits(&s->pb, 7, ((delta0 * 5 + delta1) * 5) + delta2);
00893 }
00894
00895 if (ch != s->lfe_channel)
00896 put_bits(&s->pb, 2, 0);
00897 }
00898
00899
00900 baie = (block_num == 0);
00901 put_bits(&s->pb, 1, baie);
00902 if (baie) {
00903 put_bits(&s->pb, 2, s->sdecaycod);
00904 put_bits(&s->pb, 2, s->fdecaycod);
00905 put_bits(&s->pb, 2, s->sgaincod);
00906 put_bits(&s->pb, 2, s->dbkneecod);
00907 put_bits(&s->pb, 3, s->floorcod);
00908 }
00909
00910
00911 put_bits(&s->pb, 1, baie);
00912 if (baie) {
00913 put_bits(&s->pb, 6, s->csnroffst);
00914 for(ch=0;ch<s->nb_all_channels;ch++) {
00915 put_bits(&s->pb, 4, s->fsnroffst[ch]);
00916 put_bits(&s->pb, 3, s->fgaincod[ch]);
00917 }
00918 }
00919
00920 put_bits(&s->pb, 1, 0);
00921 put_bits(&s->pb, 1, 0);
00922
00923
00924
00925
00926
00927
00928 mant1_cnt = mant2_cnt = mant4_cnt = 0;
00929 qmant1_ptr = qmant2_ptr = qmant4_ptr = NULL;
00930
00931 for (ch = 0; ch < s->nb_all_channels; ch++) {
00932 int b, c, e, v;
00933
00934 for(i=0;i<s->nb_coefs[ch];i++) {
00935 c = mdct_coefs[ch][i];
00936 e = encoded_exp[ch][i] - global_exp[ch];
00937 b = bap[ch][i];
00938 switch(b) {
00939 case 0:
00940 v = 0;
00941 break;
00942 case 1:
00943 v = sym_quant(c, e, 3);
00944 switch(mant1_cnt) {
00945 case 0:
00946 qmant1_ptr = &qmant[ch][i];
00947 v = 9 * v;
00948 mant1_cnt = 1;
00949 break;
00950 case 1:
00951 *qmant1_ptr += 3 * v;
00952 mant1_cnt = 2;
00953 v = 128;
00954 break;
00955 default:
00956 *qmant1_ptr += v;
00957 mant1_cnt = 0;
00958 v = 128;
00959 break;
00960 }
00961 break;
00962 case 2:
00963 v = sym_quant(c, e, 5);
00964 switch(mant2_cnt) {
00965 case 0:
00966 qmant2_ptr = &qmant[ch][i];
00967 v = 25 * v;
00968 mant2_cnt = 1;
00969 break;
00970 case 1:
00971 *qmant2_ptr += 5 * v;
00972 mant2_cnt = 2;
00973 v = 128;
00974 break;
00975 default:
00976 *qmant2_ptr += v;
00977 mant2_cnt = 0;
00978 v = 128;
00979 break;
00980 }
00981 break;
00982 case 3:
00983 v = sym_quant(c, e, 7);
00984 break;
00985 case 4:
00986 v = sym_quant(c, e, 11);
00987 switch(mant4_cnt) {
00988 case 0:
00989 qmant4_ptr = &qmant[ch][i];
00990 v = 11 * v;
00991 mant4_cnt = 1;
00992 break;
00993 default:
00994 *qmant4_ptr += v;
00995 mant4_cnt = 0;
00996 v = 128;
00997 break;
00998 }
00999 break;
01000 case 5:
01001 v = sym_quant(c, e, 15);
01002 break;
01003 case 14:
01004 v = asym_quant(c, e, 14);
01005 break;
01006 case 15:
01007 v = asym_quant(c, e, 16);
01008 break;
01009 default:
01010 v = asym_quant(c, e, b - 1);
01011 break;
01012 }
01013 qmant[ch][i] = v;
01014 }
01015 }
01016
01017
01018 for (ch = 0; ch < s->nb_all_channels; ch++) {
01019 int b, q;
01020
01021 for(i=0;i<s->nb_coefs[ch];i++) {
01022 q = qmant[ch][i];
01023 b = bap[ch][i];
01024 switch(b) {
01025 case 0:
01026 break;
01027 case 1:
01028 if (q != 128)
01029 put_bits(&s->pb, 5, q);
01030 break;
01031 case 2:
01032 if (q != 128)
01033 put_bits(&s->pb, 7, q);
01034 break;
01035 case 3:
01036 put_bits(&s->pb, 3, q);
01037 break;
01038 case 4:
01039 if (q != 128)
01040 put_bits(&s->pb, 7, q);
01041 break;
01042 case 14:
01043 put_bits(&s->pb, 14, q);
01044 break;
01045 case 15:
01046 put_bits(&s->pb, 16, q);
01047 break;
01048 default:
01049 put_bits(&s->pb, b - 1, q);
01050 break;
01051 }
01052 }
01053 }
01054 }
01055
01056 #define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16))
01057
01058 static unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly)
01059 {
01060 unsigned int c;
01061
01062 c = 0;
01063 while (a) {
01064 if (a & 1)
01065 c ^= b;
01066 a = a >> 1;
01067 b = b << 1;
01068 if (b & (1 << 16))
01069 b ^= poly;
01070 }
01071 return c;
01072 }
01073
01074 static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly)
01075 {
01076 unsigned int r;
01077 r = 1;
01078 while (n) {
01079 if (n & 1)
01080 r = mul_poly(r, a, poly);
01081 a = mul_poly(a, a, poly);
01082 n >>= 1;
01083 }
01084 return r;
01085 }
01086
01087
01088
01089 static int log2_tab(int16_t *tab, int n)
01090 {
01091 int i, v;
01092
01093 v = 0;
01094 for(i=0;i<n;i++) {
01095 v |= abs(tab[i]);
01096 }
01097 return av_log2(v);
01098 }
01099
01100 static void lshift_tab(int16_t *tab, int n, int lshift)
01101 {
01102 int i;
01103
01104 if (lshift > 0) {
01105 for(i=0;i<n;i++) {
01106 tab[i] <<= lshift;
01107 }
01108 } else if (lshift < 0) {
01109 lshift = -lshift;
01110 for(i=0;i<n;i++) {
01111 tab[i] >>= lshift;
01112 }
01113 }
01114 }
01115
01116
01117 static int output_frame_end(AC3EncodeContext *s)
01118 {
01119 int frame_size, frame_size_58, n, crc1, crc2, crc_inv;
01120 uint8_t *frame;
01121
01122 frame_size = s->frame_size;
01123
01124 flush_put_bits(&s->pb);
01125
01126 frame = s->pb.buf;
01127 n = 2 * s->frame_size - (pbBufPtr(&s->pb) - frame) - 2;
01128 assert(n >= 0);
01129 if(n>0)
01130 memset(pbBufPtr(&s->pb), 0, n);
01131
01132
01133
01134 frame_size_58 = (frame_size >> 1) + (frame_size >> 3);
01135 crc1 = bswap_16(av_crc(av_crc8005, 0, frame + 4, 2 * frame_size_58 - 4));
01136
01137 crc_inv = pow_poly((CRC16_POLY >> 1), (16 * frame_size_58) - 16, CRC16_POLY);
01138 crc1 = mul_poly(crc_inv, crc1, CRC16_POLY);
01139 AV_WB16(frame+2,crc1);
01140
01141 crc2 = bswap_16(av_crc(av_crc8005, 0, frame + 2 * frame_size_58, (frame_size - frame_size_58) * 2 - 2));
01142 AV_WB16(frame+2*frame_size-2,crc2);
01143
01144
01145 return frame_size * 2;
01146 }
01147
01148 static int AC3_encode_frame(AVCodecContext *avctx,
01149 unsigned char *frame, int buf_size, void *data)
01150 {
01151 AC3EncodeContext *s = avctx->priv_data;
01152 int16_t *samples = data;
01153 int i, j, k, v, ch;
01154 int16_t input_samples[N];
01155 int32_t mdct_coef[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
01156 uint8_t exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
01157 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS];
01158 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
01159 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
01160 int8_t exp_samples[NB_BLOCKS][AC3_MAX_CHANNELS];
01161 int frame_bits;
01162
01163 frame_bits = 0;
01164 for(ch=0;ch<s->nb_all_channels;ch++) {
01165
01166 for(i=0;i<NB_BLOCKS;i++) {
01167 int16_t *sptr;
01168 int sinc;
01169
01170
01171 memcpy(input_samples, s->last_samples[ch], N/2 * sizeof(int16_t));
01172 sinc = s->nb_all_channels;
01173 sptr = samples + (sinc * (N/2) * i) + ch;
01174 for(j=0;j<N/2;j++) {
01175 v = *sptr;
01176 input_samples[j + N/2] = v;
01177 s->last_samples[ch][j] = v;
01178 sptr += sinc;
01179 }
01180
01181
01182 for(j=0;j<N/2;j++) {
01183 input_samples[j] = MUL16(input_samples[j],
01184 ff_ac3_window[j]) >> 15;
01185 input_samples[N-j-1] = MUL16(input_samples[N-j-1],
01186 ff_ac3_window[j]) >> 15;
01187 }
01188
01189
01190
01191 v = 14 - log2_tab(input_samples, N);
01192 if (v < 0)
01193 v = 0;
01194 exp_samples[i][ch] = v - 9;
01195 lshift_tab(input_samples, N, v);
01196
01197
01198 mdct512(mdct_coef[i][ch], input_samples);
01199
01200
01201
01202 for(j=0;j<N/2;j++) {
01203 int e;
01204 v = abs(mdct_coef[i][ch][j]);
01205 if (v == 0)
01206 e = 24;
01207 else {
01208 e = 23 - av_log2(v) + exp_samples[i][ch];
01209 if (e >= 24) {
01210 e = 24;
01211 mdct_coef[i][ch][j] = 0;
01212 }
01213 }
01214 exp[i][ch][j] = e;
01215 }
01216 }
01217
01218 compute_exp_strategy(exp_strategy, exp, ch, ch == s->lfe_channel);
01219
01220
01221
01222
01223 i = 0;
01224 while (i < NB_BLOCKS) {
01225 j = i + 1;
01226 while (j < NB_BLOCKS && exp_strategy[j][ch] == EXP_REUSE) {
01227 exponent_min(exp[i][ch], exp[j][ch], s->nb_coefs[ch]);
01228 j++;
01229 }
01230 frame_bits += encode_exp(encoded_exp[i][ch],
01231 exp[i][ch], s->nb_coefs[ch],
01232 exp_strategy[i][ch]);
01233
01234 for(k=i+1;k<j;k++) {
01235 memcpy(encoded_exp[k][ch], encoded_exp[i][ch],
01236 s->nb_coefs[ch] * sizeof(uint8_t));
01237 }
01238 i = j;
01239 }
01240 }
01241
01242
01243 while(s->bits_written >= s->bit_rate*1000 && s->samples_written >= s->sample_rate) {
01244 s->bits_written -= s->bit_rate*1000;
01245 s->samples_written -= s->sample_rate;
01246 }
01247 s->frame_size = s->frame_size_min + (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate*1000);
01248 s->bits_written += s->frame_size * 16;
01249 s->samples_written += AC3_FRAME_SIZE;
01250
01251 compute_bit_allocation(s, bap, encoded_exp, exp_strategy, frame_bits);
01252
01253 output_frame_header(s, frame);
01254
01255 for(i=0;i<NB_BLOCKS;i++) {
01256 output_audio_block(s, exp_strategy[i], encoded_exp[i],
01257 bap[i], mdct_coef[i], exp_samples[i], i);
01258 }
01259 return output_frame_end(s);
01260 }
01261
01262 static int AC3_encode_close(AVCodecContext *avctx)
01263 {
01264 av_freep(&avctx->coded_frame);
01265 return 0;
01266 }
01267
01268 #if 0
01269
01270
01271
01272 #undef random
01273 #define FN (N/4)
01274
01275 void fft_test(void)
01276 {
01277 IComplex in[FN], in1[FN];
01278 int k, n, i;
01279 float sum_re, sum_im, a;
01280
01281
01282
01283 for(i=0;i<FN;i++) {
01284 in[i].re = random() % 65535 - 32767;
01285 in[i].im = random() % 65535 - 32767;
01286 in1[i] = in[i];
01287 }
01288 fft(in, 7);
01289
01290
01291 for(k=0;k<FN;k++) {
01292 sum_re = 0;
01293 sum_im = 0;
01294 for(n=0;n<FN;n++) {
01295 a = -2 * M_PI * (n * k) / FN;
01296 sum_re += in1[n].re * cos(a) - in1[n].im * sin(a);
01297 sum_im += in1[n].re * sin(a) + in1[n].im * cos(a);
01298 }
01299 printf("%3d: %6d,%6d %6.0f,%6.0f\n",
01300 k, in[k].re, in[k].im, sum_re / FN, sum_im / FN);
01301 }
01302 }
01303
01304 void mdct_test(void)
01305 {
01306 int16_t input[N];
01307 int32_t output[N/2];
01308 float input1[N];
01309 float output1[N/2];
01310 float s, a, err, e, emax;
01311 int i, k, n;
01312
01313 for(i=0;i<N;i++) {
01314 input[i] = (random() % 65535 - 32767) * 9 / 10;
01315 input1[i] = input[i];
01316 }
01317
01318 mdct512(output, input);
01319
01320
01321 for(k=0;k<N/2;k++) {
01322 s = 0;
01323 for(n=0;n<N;n++) {
01324 a = (2*M_PI*(2*n+1+N/2)*(2*k+1) / (4 * N));
01325 s += input1[n] * cos(a);
01326 }
01327 output1[k] = -2 * s / N;
01328 }
01329
01330 err = 0;
01331 emax = 0;
01332 for(i=0;i<N/2;i++) {
01333 printf("%3d: %7d %7.0f\n", i, output[i], output1[i]);
01334 e = output[i] - output1[i];
01335 if (e > emax)
01336 emax = e;
01337 err += e * e;
01338 }
01339 printf("err2=%f emax=%f\n", err / (N/2), emax);
01340 }
01341
01342 void test_ac3(void)
01343 {
01344 AC3EncodeContext ctx;
01345 unsigned char frame[AC3_MAX_CODED_FRAME_SIZE];
01346 short samples[AC3_FRAME_SIZE];
01347 int ret, i;
01348
01349 AC3_encode_init(&ctx, 44100, 64000, 1);
01350
01351 fft_test();
01352 mdct_test();
01353
01354 for(i=0;i<AC3_FRAME_SIZE;i++)
01355 samples[i] = (int)(sin(2*M_PI*i*1000.0/44100) * 10000);
01356 ret = AC3_encode_frame(&ctx, frame, samples);
01357 printf("ret=%d\n", ret);
01358 }
01359 #endif
01360
01361 AVCodec ac3_encoder = {
01362 "ac3",
01363 CODEC_TYPE_AUDIO,
01364 CODEC_ID_AC3,
01365 sizeof(AC3EncodeContext),
01366 AC3_encode_init,
01367 AC3_encode_frame,
01368 AC3_encode_close,
01369 NULL,
01370 };