comparison ac3enc.c @ 6003:608c8e9ac412 libavcodec

cosmetics: rename ac3 bit allocation variables
author jbr
date Sun, 09 Dec 2007 03:23:04 +0000
parents 29635f7c3d9c
children 7d9dddd54817
comparison
equal deleted inserted replaced
6002:29635f7c3d9c 6003:608c8e9ac412
40 unsigned int bsid; 40 unsigned int bsid;
41 unsigned int frame_size_min; /* minimum frame size in case rounding is necessary */ 41 unsigned int frame_size_min; /* minimum frame size in case rounding is necessary */
42 unsigned int frame_size; /* current frame size in words */ 42 unsigned int frame_size; /* current frame size in words */
43 unsigned int bits_written; 43 unsigned int bits_written;
44 unsigned int samples_written; 44 unsigned int samples_written;
45 int halfratecod; 45 int sr_shift;
46 unsigned int frmsizecod; 46 unsigned int frmsizecod;
47 unsigned int fscod; /* frequency */ 47 unsigned int sr_code; /* frequency */
48 unsigned int acmod; 48 unsigned int acmod;
49 int lfe; 49 int lfe;
50 unsigned int bsmod; 50 unsigned int bsmod;
51 short last_samples[AC3_MAX_CHANNELS][256]; 51 short last_samples[AC3_MAX_CHANNELS][256];
52 unsigned int chbwcod[AC3_MAX_CHANNELS]; 52 unsigned int chbwcod[AC3_MAX_CHANNELS];
53 int nb_coefs[AC3_MAX_CHANNELS]; 53 int nb_coefs[AC3_MAX_CHANNELS];
54 54
55 /* bitrate allocation control */ 55 /* bitrate allocation control */
56 int sgaincod, sdecaycod, fdecaycod, dbkneecod, floorcod; 56 int slow_gain_code, slow_decay_code, fast_decay_code, db_per_bit_code, floor_code;
57 AC3BitAllocParameters bit_alloc; 57 AC3BitAllocParameters bit_alloc;
58 int csnroffst; 58 int coarse_snr_offset;
59 int fgaincod[AC3_MAX_CHANNELS]; 59 int fast_gain_code[AC3_MAX_CHANNELS];
60 int fsnroffst[AC3_MAX_CHANNELS]; 60 int fine_snr_offset[AC3_MAX_CHANNELS];
61 /* mantissa encoding */ 61 /* mantissa encoding */
62 int mant1_cnt, mant2_cnt, mant4_cnt; 62 int mant1_cnt, mant2_cnt, mant4_cnt;
63 } AC3EncodeContext; 63 } AC3EncodeContext;
64 64
65 static int16_t costab[64]; 65 static int16_t costab[64];
436 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], 436 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS],
437 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], 437 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
438 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50]) 438 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50])
439 { 439 {
440 int blk, ch; 440 int blk, ch;
441 int16_t bndpsd[NB_BLOCKS][AC3_MAX_CHANNELS][50]; 441 int16_t band_psd[NB_BLOCKS][AC3_MAX_CHANNELS][50];
442 442
443 for(blk=0; blk<NB_BLOCKS; blk++) { 443 for(blk=0; blk<NB_BLOCKS; blk++) {
444 for(ch=0;ch<s->nb_all_channels;ch++) { 444 for(ch=0;ch<s->nb_all_channels;ch++) {
445 if(exp_strategy[blk][ch] == EXP_REUSE) { 445 if(exp_strategy[blk][ch] == EXP_REUSE) {
446 memcpy(psd[blk][ch], psd[blk-1][ch], (N/2)*sizeof(int16_t)); 446 memcpy(psd[blk][ch], psd[blk-1][ch], (N/2)*sizeof(int16_t));
447 memcpy(mask[blk][ch], mask[blk-1][ch], 50*sizeof(int16_t)); 447 memcpy(mask[blk][ch], mask[blk-1][ch], 50*sizeof(int16_t));
448 } else { 448 } else {
449 ff_ac3_bit_alloc_calc_psd(encoded_exp[blk][ch], 0, 449 ff_ac3_bit_alloc_calc_psd(encoded_exp[blk][ch], 0,
450 s->nb_coefs[ch], 450 s->nb_coefs[ch],
451 psd[blk][ch], bndpsd[blk][ch]); 451 psd[blk][ch], band_psd[blk][ch]);
452 ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, bndpsd[blk][ch], 452 ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, band_psd[blk][ch],
453 0, s->nb_coefs[ch], 453 0, s->nb_coefs[ch],
454 ff_ac3_fast_gain_tab[s->fgaincod[ch]], 454 ff_ac3_fast_gain_tab[s->fast_gain_code[ch]],
455 ch == s->lfe_channel, 455 ch == s->lfe_channel,
456 DBA_NONE, 0, NULL, NULL, NULL, 456 DBA_NONE, 0, NULL, NULL, NULL,
457 mask[blk][ch]); 457 mask[blk][ch]);
458 } 458 }
459 } 459 }
462 462
463 static int bit_alloc(AC3EncodeContext *s, 463 static int bit_alloc(AC3EncodeContext *s,
464 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50], 464 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50],
465 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], 465 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
466 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], 466 uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
467 int frame_bits, int csnroffst, int fsnroffst) 467 int frame_bits, int coarse_snr_offset, int fine_snr_offset)
468 { 468 {
469 int i, ch; 469 int i, ch;
470 int snroffset; 470 int snr_offset;
471 471
472 snroffset = (((csnroffst - 15) << 4) + fsnroffst) << 2; 472 snr_offset = (((coarse_snr_offset - 15) << 4) + fine_snr_offset) << 2;
473 473
474 /* compute size */ 474 /* compute size */
475 for(i=0;i<NB_BLOCKS;i++) { 475 for(i=0;i<NB_BLOCKS;i++) {
476 s->mant1_cnt = 0; 476 s->mant1_cnt = 0;
477 s->mant2_cnt = 0; 477 s->mant2_cnt = 0;
478 s->mant4_cnt = 0; 478 s->mant4_cnt = 0;
479 for(ch=0;ch<s->nb_all_channels;ch++) { 479 for(ch=0;ch<s->nb_all_channels;ch++) {
480 ff_ac3_bit_alloc_calc_bap(mask[i][ch], psd[i][ch], 0, 480 ff_ac3_bit_alloc_calc_bap(mask[i][ch], psd[i][ch], 0,
481 s->nb_coefs[ch], snroffset, 481 s->nb_coefs[ch], snr_offset,
482 s->bit_alloc.floor, bap[i][ch]); 482 s->bit_alloc.floor, bap[i][ch]);
483 frame_bits += compute_mantissa_size(s, bap[i][ch], 483 frame_bits += compute_mantissa_size(s, bap[i][ch],
484 s->nb_coefs[ch]); 484 s->nb_coefs[ch]);
485 } 485 }
486 } 486 }
487 #if 0 487 #if 0
488 printf("csnr=%d fsnr=%d frame_bits=%d diff=%d\n", 488 printf("csnr=%d fsnr=%d frame_bits=%d diff=%d\n",
489 csnroffst, fsnroffst, frame_bits, 489 coarse_snr_offset, fine_snr_offset, frame_bits,
490 16 * s->frame_size - ((frame_bits + 7) & ~7)); 490 16 * s->frame_size - ((frame_bits + 7) & ~7));
491 #endif 491 #endif
492 return 16 * s->frame_size - frame_bits; 492 return 16 * s->frame_size - frame_bits;
493 } 493 }
494 494
499 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], 499 uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2],
500 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], 500 uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS],
501 int frame_bits) 501 int frame_bits)
502 { 502 {
503 int i, ch; 503 int i, ch;
504 int csnroffst, fsnroffst; 504 int coarse_snr_offset, fine_snr_offset;
505 uint8_t bap1[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; 505 uint8_t bap1[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
506 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; 506 int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
507 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50]; 507 int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50];
508 static int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 }; 508 static int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 };
509 509
510 /* init default parameters */ 510 /* init default parameters */
511 s->sdecaycod = 2; 511 s->slow_decay_code = 2;
512 s->fdecaycod = 1; 512 s->fast_decay_code = 1;
513 s->sgaincod = 1; 513 s->slow_gain_code = 1;
514 s->dbkneecod = 2; 514 s->db_per_bit_code = 2;
515 s->floorcod = 4; 515 s->floor_code = 4;
516 for(ch=0;ch<s->nb_all_channels;ch++) 516 for(ch=0;ch<s->nb_all_channels;ch++)
517 s->fgaincod[ch] = 4; 517 s->fast_gain_code[ch] = 4;
518 518
519 /* compute real values */ 519 /* compute real values */
520 s->bit_alloc.fscod = s->fscod; 520 s->bit_alloc.sr_code = s->sr_code;
521 s->bit_alloc.halfratecod = s->halfratecod; 521 s->bit_alloc.sr_shift = s->sr_shift;
522 s->bit_alloc.sdecay = ff_ac3_slow_decay_tab[s->sdecaycod] >> s->halfratecod; 522 s->bit_alloc.slow_decay = ff_ac3_slow_decay_tab[s->slow_decay_code] >> s->sr_shift;
523 s->bit_alloc.fdecay = ff_ac3_fast_decay_tab[s->fdecaycod] >> s->halfratecod; 523 s->bit_alloc.fast_decay = ff_ac3_fast_decay_tab[s->fast_decay_code] >> s->sr_shift;
524 s->bit_alloc.sgain = ff_ac3_slow_gain_tab[s->sgaincod]; 524 s->bit_alloc.slow_gain = ff_ac3_slow_gain_tab[s->slow_gain_code];
525 s->bit_alloc.dbknee = ff_ac3_db_per_bit_tab[s->dbkneecod]; 525 s->bit_alloc.db_per_bit = ff_ac3_db_per_bit_tab[s->db_per_bit_code];
526 s->bit_alloc.floor = ff_ac3_floor_tab[s->floorcod]; 526 s->bit_alloc.floor = ff_ac3_floor_tab[s->floor_code];
527 527
528 /* header size */ 528 /* header size */
529 frame_bits += 65; 529 frame_bits += 65;
530 // if (s->acmod == 2) 530 // if (s->acmod == 2)
531 // frame_bits += 2; 531 // frame_bits += 2;
566 bit_alloc_masking(s, encoded_exp, exp_strategy, psd, mask); 566 bit_alloc_masking(s, encoded_exp, exp_strategy, psd, mask);
567 567
568 /* now the big work begins : do the bit allocation. Modify the snr 568 /* now the big work begins : do the bit allocation. Modify the snr
569 offset until we can pack everything in the requested frame size */ 569 offset until we can pack everything in the requested frame size */
570 570
571 csnroffst = s->csnroffst; 571 coarse_snr_offset = s->coarse_snr_offset;
572 while (csnroffst >= 0 && 572 while (coarse_snr_offset >= 0 &&
573 bit_alloc(s, mask, psd, bap, frame_bits, csnroffst, 0) < 0) 573 bit_alloc(s, mask, psd, bap, frame_bits, coarse_snr_offset, 0) < 0)
574 csnroffst -= SNR_INC1; 574 coarse_snr_offset -= SNR_INC1;
575 if (csnroffst < 0) { 575 if (coarse_snr_offset < 0) {
576 av_log(NULL, AV_LOG_ERROR, "Bit allocation failed, try increasing the bitrate, -ab 384k for example!\n"); 576 av_log(NULL, AV_LOG_ERROR, "Bit allocation failed, try increasing the bitrate, -ab 384k for example!\n");
577 return -1; 577 return -1;
578 } 578 }
579 while ((csnroffst + SNR_INC1) <= 63 && 579 while ((coarse_snr_offset + SNR_INC1) <= 63 &&
580 bit_alloc(s, mask, psd, bap1, frame_bits, 580 bit_alloc(s, mask, psd, bap1, frame_bits,
581 csnroffst + SNR_INC1, 0) >= 0) { 581 coarse_snr_offset + SNR_INC1, 0) >= 0) {
582 csnroffst += SNR_INC1; 582 coarse_snr_offset += SNR_INC1;
583 memcpy(bap, bap1, sizeof(bap1)); 583 memcpy(bap, bap1, sizeof(bap1));
584 } 584 }
585 while ((csnroffst + 1) <= 63 && 585 while ((coarse_snr_offset + 1) <= 63 &&
586 bit_alloc(s, mask, psd, bap1, frame_bits, csnroffst + 1, 0) >= 0) { 586 bit_alloc(s, mask, psd, bap1, frame_bits, coarse_snr_offset + 1, 0) >= 0) {
587 csnroffst++; 587 coarse_snr_offset++;
588 memcpy(bap, bap1, sizeof(bap1)); 588 memcpy(bap, bap1, sizeof(bap1));
589 } 589 }
590 590
591 fsnroffst = 0; 591 fine_snr_offset = 0;
592 while ((fsnroffst + SNR_INC1) <= 15 && 592 while ((fine_snr_offset + SNR_INC1) <= 15 &&
593 bit_alloc(s, mask, psd, bap1, frame_bits, 593 bit_alloc(s, mask, psd, bap1, frame_bits,
594 csnroffst, fsnroffst + SNR_INC1) >= 0) { 594 coarse_snr_offset, fine_snr_offset + SNR_INC1) >= 0) {
595 fsnroffst += SNR_INC1; 595 fine_snr_offset += SNR_INC1;
596 memcpy(bap, bap1, sizeof(bap1)); 596 memcpy(bap, bap1, sizeof(bap1));
597 } 597 }
598 while ((fsnroffst + 1) <= 15 && 598 while ((fine_snr_offset + 1) <= 15 &&
599 bit_alloc(s, mask, psd, bap1, frame_bits, 599 bit_alloc(s, mask, psd, bap1, frame_bits,
600 csnroffst, fsnroffst + 1) >= 0) { 600 coarse_snr_offset, fine_snr_offset + 1) >= 0) {
601 fsnroffst++; 601 fine_snr_offset++;
602 memcpy(bap, bap1, sizeof(bap1)); 602 memcpy(bap, bap1, sizeof(bap1));
603 } 603 }
604 604
605 s->csnroffst = csnroffst; 605 s->coarse_snr_offset = coarse_snr_offset;
606 for(ch=0;ch<s->nb_all_channels;ch++) 606 for(ch=0;ch<s->nb_all_channels;ch++)
607 s->fsnroffst[ch] = fsnroffst; 607 s->fine_snr_offset[ch] = fine_snr_offset;
608 #if defined(DEBUG_BITALLOC) 608 #if defined(DEBUG_BITALLOC)
609 { 609 {
610 int j; 610 int j;
611 611
612 for(i=0;i<6;i++) { 612 for(i=0;i<6;i++) {
661 goto found; 661 goto found;
662 } 662 }
663 return -1; 663 return -1;
664 found: 664 found:
665 s->sample_rate = freq; 665 s->sample_rate = freq;
666 s->halfratecod = i; 666 s->sr_shift = i;
667 s->fscod = j; 667 s->sr_code = j;
668 s->bsid = 8 + s->halfratecod; 668 s->bsid = 8 + s->sr_shift;
669 s->bsmod = 0; /* complete main audio service */ 669 s->bsmod = 0; /* complete main audio service */
670 670
671 /* bitrate & frame size */ 671 /* bitrate & frame size */
672 bitrate /= 1000; 672 bitrate /= 1000;
673 for(i=0;i<19;i++) { 673 for(i=0;i<19;i++) {
674 if ((ff_ac3_bitrate_tab[i] >> s->halfratecod) == bitrate) 674 if ((ff_ac3_bitrate_tab[i] >> s->sr_shift) == bitrate)
675 break; 675 break;
676 } 676 }
677 if (i == 19) 677 if (i == 19)
678 return -1; 678 return -1;
679 s->bit_rate = bitrate; 679 s->bit_rate = bitrate;
680 s->frmsizecod = i << 1; 680 s->frmsizecod = i << 1;
681 s->frame_size_min = ff_ac3_frame_size_tab[s->frmsizecod][s->fscod]; 681 s->frame_size_min = ff_ac3_frame_size_tab[s->frmsizecod][s->sr_code];
682 s->bits_written = 0; 682 s->bits_written = 0;
683 s->samples_written = 0; 683 s->samples_written = 0;
684 s->frame_size = s->frame_size_min; 684 s->frame_size = s->frame_size_min;
685 685
686 /* bit allocation init */ 686 /* bit allocation init */
693 } 693 }
694 if (s->lfe) { 694 if (s->lfe) {
695 s->nb_coefs[s->lfe_channel] = 7; /* fixed */ 695 s->nb_coefs[s->lfe_channel] = 7; /* fixed */
696 } 696 }
697 /* initial snr offset */ 697 /* initial snr offset */
698 s->csnroffst = 40; 698 s->coarse_snr_offset = 40;
699 699
700 /* mdct init */ 700 /* mdct init */
701 fft_init(MDCT_NBITS - 2); 701 fft_init(MDCT_NBITS - 2);
702 for(i=0;i<N/4;i++) { 702 for(i=0;i<N/4;i++) {
703 alpha = 2 * M_PI * (i + 1.0 / 8.0) / (float)N; 703 alpha = 2 * M_PI * (i + 1.0 / 8.0) / (float)N;
716 { 716 {
717 init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE); 717 init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE);
718 718
719 put_bits(&s->pb, 16, 0x0b77); /* frame header */ 719 put_bits(&s->pb, 16, 0x0b77); /* frame header */
720 put_bits(&s->pb, 16, 0); /* crc1: will be filled later */ 720 put_bits(&s->pb, 16, 0); /* crc1: will be filled later */
721 put_bits(&s->pb, 2, s->fscod); 721 put_bits(&s->pb, 2, s->sr_code);
722 put_bits(&s->pb, 6, s->frmsizecod + (s->frame_size - s->frame_size_min)); 722 put_bits(&s->pb, 6, s->frmsizecod + (s->frame_size - s->frame_size_min));
723 put_bits(&s->pb, 5, s->bsid); 723 put_bits(&s->pb, 5, s->bsid);
724 put_bits(&s->pb, 3, s->bsmod); 724 put_bits(&s->pb, 3, s->bsmod);
725 put_bits(&s->pb, 3, s->acmod); 725 put_bits(&s->pb, 3, s->acmod);
726 if ((s->acmod & 0x01) && s->acmod != AC3_ACMOD_MONO) 726 if ((s->acmod & 0x01) && s->acmod != AC3_ACMOD_MONO)
898 898
899 /* bit allocation info */ 899 /* bit allocation info */
900 baie = (block_num == 0); 900 baie = (block_num == 0);
901 put_bits(&s->pb, 1, baie); 901 put_bits(&s->pb, 1, baie);
902 if (baie) { 902 if (baie) {
903 put_bits(&s->pb, 2, s->sdecaycod); 903 put_bits(&s->pb, 2, s->slow_decay_code);
904 put_bits(&s->pb, 2, s->fdecaycod); 904 put_bits(&s->pb, 2, s->fast_decay_code);
905 put_bits(&s->pb, 2, s->sgaincod); 905 put_bits(&s->pb, 2, s->slow_gain_code);
906 put_bits(&s->pb, 2, s->dbkneecod); 906 put_bits(&s->pb, 2, s->db_per_bit_code);
907 put_bits(&s->pb, 3, s->floorcod); 907 put_bits(&s->pb, 3, s->floor_code);
908 } 908 }
909 909
910 /* snr offset */ 910 /* snr offset */
911 put_bits(&s->pb, 1, baie); /* always present with bai */ 911 put_bits(&s->pb, 1, baie); /* always present with bai */
912 if (baie) { 912 if (baie) {
913 put_bits(&s->pb, 6, s->csnroffst); 913 put_bits(&s->pb, 6, s->coarse_snr_offset);
914 for(ch=0;ch<s->nb_all_channels;ch++) { 914 for(ch=0;ch<s->nb_all_channels;ch++) {
915 put_bits(&s->pb, 4, s->fsnroffst[ch]); 915 put_bits(&s->pb, 4, s->fine_snr_offset[ch]);
916 put_bits(&s->pb, 3, s->fgaincod[ch]); 916 put_bits(&s->pb, 3, s->fast_gain_code[ch]);
917 } 917 }
918 } 918 }
919 919
920 put_bits(&s->pb, 1, 0); /* no delta bit allocation */ 920 put_bits(&s->pb, 1, 0); /* no delta bit allocation */
921 put_bits(&s->pb, 1, 0); /* no data to skip */ 921 put_bits(&s->pb, 1, 0); /* no data to skip */