Mercurial > libavcodec.hg
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 */ |