comparison aacsbr.c @ 11449:e62f45fd47d4 libavcodec

aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
author alexc
date Tue, 09 Mar 2010 21:46:46 +0000
parents 9fd8da0f1a50
children 95123a24a580
comparison
equal deleted inserted replaced
11448:9fd8da0f1a50 11449:e62f45fd47d4
616 616
617 static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr, 617 static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr,
618 GetBitContext *gb, SBRData *ch_data) 618 GetBitContext *gb, SBRData *ch_data)
619 { 619 {
620 int i; 620 int i;
621 unsigned bs_pointer; 621 unsigned bs_pointer = 0;
622 // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots 622 // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots
623 int abs_bord_trail = 16; 623 int abs_bord_trail = 16;
624 int num_rel_lead, num_rel_trail; 624 int num_rel_lead, num_rel_trail;
625 unsigned bs_num_env_old = ch_data->bs_num_env; 625 unsigned bs_num_env_old = ch_data->bs_num_env;
626 626
628 ch_data->bs_amp_res = sbr->bs_amp_res_header; 628 ch_data->bs_amp_res = sbr->bs_amp_res_header;
629 ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old]; 629 ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
630 630
631 switch (ch_data->bs_frame_class = get_bits(gb, 2)) { 631 switch (ch_data->bs_frame_class = get_bits(gb, 2)) {
632 case FIXFIX: 632 case FIXFIX:
633 ch_data->bs_num_env = 1 << get_bits(gb, 2); 633 ch_data->bs_num_env = 1 << get_bits(gb, 2);
634 num_rel_lead = ch_data->bs_num_env - 1; 634 num_rel_lead = ch_data->bs_num_env - 1;
635 if (ch_data->bs_num_env == 1) 635 if (ch_data->bs_num_env == 1)
636 ch_data->bs_amp_res = 0; 636 ch_data->bs_amp_res = 0;
637 637
638 if (ch_data->bs_num_env > 4) { 638 if (ch_data->bs_num_env > 4) {
639 av_log(ac->avccontext, AV_LOG_ERROR, 639 av_log(ac->avccontext, AV_LOG_ERROR,
648 abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) / 648 abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) /
649 ch_data->bs_num_env; 649 ch_data->bs_num_env;
650 for (i = 0; i < num_rel_lead; i++) 650 for (i = 0; i < num_rel_lead; i++)
651 ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail; 651 ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail;
652 652
653 bs_pointer = 0;
654
655 ch_data->bs_freq_res[1] = get_bits1(gb); 653 ch_data->bs_freq_res[1] = get_bits1(gb);
656 for (i = 1; i < ch_data->bs_num_env; i++) 654 for (i = 1; i < ch_data->bs_num_env; i++)
657 ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1]; 655 ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1];
658 break; 656 break;
659 case FIXVAR: 657 case FIXVAR:
660 abs_bord_trail += get_bits(gb, 2); 658 abs_bord_trail += get_bits(gb, 2);
661 num_rel_trail = get_bits(gb, 2); 659 num_rel_trail = get_bits(gb, 2);
662 num_rel_lead = 0; 660 ch_data->bs_num_env = num_rel_trail + 1;
663 ch_data->bs_num_env = num_rel_trail + 1; 661 ch_data->t_env[0] = 0;
664 ch_data->t_env[0] = 0;
665 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; 662 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
666 663
667 for (i = 0; i < num_rel_trail; i++) 664 for (i = 0; i < num_rel_trail; i++)
668 ch_data->t_env[ch_data->bs_num_env - 1 - i] = ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; 665 ch_data->t_env[ch_data->bs_num_env - 1 - i] =
666 ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
669 667
670 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); 668 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
671 669
672 for (i = 0; i < ch_data->bs_num_env; i++) 670 for (i = 0; i < ch_data->bs_num_env; i++)
673 ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb); 671 ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb);
674 break; 672 break;
675 case VARFIX: 673 case VARFIX:
676 ch_data->t_env[0] = get_bits(gb, 2); 674 ch_data->t_env[0] = get_bits(gb, 2);
677 num_rel_lead = get_bits(gb, 2); 675 num_rel_lead = get_bits(gb, 2);
678 ch_data->bs_num_env = num_rel_lead + 1; 676 ch_data->bs_num_env = num_rel_lead + 1;
679 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; 677 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
680 678
681 for (i = 0; i < num_rel_lead; i++) 679 for (i = 0; i < num_rel_lead; i++)
682 ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; 680 ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
683 681
684 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); 682 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
685 683
686 get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); 684 get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
687 break; 685 break;
688 case VARVAR: 686 case VARVAR:
689 ch_data->t_env[0] = get_bits(gb, 2); 687 ch_data->t_env[0] = get_bits(gb, 2);
690 abs_bord_trail += get_bits(gb, 2); 688 abs_bord_trail += get_bits(gb, 2);
691 num_rel_lead = get_bits(gb, 2); 689 num_rel_lead = get_bits(gb, 2);
692 num_rel_trail = get_bits(gb, 2); 690 num_rel_trail = get_bits(gb, 2);
693 ch_data->bs_num_env = num_rel_lead + num_rel_trail + 1; 691 ch_data->bs_num_env = num_rel_lead + num_rel_trail + 1;
694 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; 692 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
695 693
696 if (ch_data->bs_num_env > 5) { 694 if (ch_data->bs_num_env > 5) {
697 av_log(ac->avccontext, AV_LOG_ERROR, 695 av_log(ac->avccontext, AV_LOG_ERROR,
698 "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n", 696 "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n",
701 } 699 }
702 700
703 for (i = 0; i < num_rel_lead; i++) 701 for (i = 0; i < num_rel_lead; i++)
704 ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; 702 ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
705 for (i = 0; i < num_rel_trail; i++) 703 for (i = 0; i < num_rel_trail; i++)
706 ch_data->t_env[ch_data->bs_num_env - 1 - i] = ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; 704 ch_data->t_env[ch_data->bs_num_env - 1 - i] =
705 ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
707 706
708 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); 707 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
709 708
710 get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); 709 get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
711 break; 710 break;
718 return -1; 717 return -1;
719 } 718 }
720 719
721 ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1; 720 ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1;
722 721
723 ch_data->t_q[0] = ch_data->t_env[0]; 722 ch_data->t_q[0] = ch_data->t_env[0];
724 ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env]; 723 ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env];
725 if (ch_data->bs_num_noise > 1) { 724 if (ch_data->bs_num_noise > 1) {
726 unsigned int idx; 725 unsigned int idx;
727 if (ch_data->bs_frame_class == FIXFIX) { 726 if (ch_data->bs_frame_class == FIXFIX) {
728 idx = ch_data->bs_num_env >> 1; 727 idx = ch_data->bs_num_env >> 1;
749 return 0; 748 return 0;
750 } 749 }
751 750
752 static void copy_sbr_grid(SBRData *dst, const SBRData *src) { 751 static void copy_sbr_grid(SBRData *dst, const SBRData *src) {
753 //These variables are saved from the previous frame rather than copied 752 //These variables are saved from the previous frame rather than copied
754 dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env]; 753 dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env];
755 dst->t_env_num_env_old = dst->t_env[dst->bs_num_env]; 754 dst->t_env_num_env_old = dst->t_env[dst->bs_num_env];
756 dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env); 755 dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env);
757 756
758 //These variables are read from the bitstream and therefore copied 757 //These variables are read from the bitstream and therefore copied
759 memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res)); 758 memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res));
760 memcpy(dst->t_env, src->t_env, sizeof(dst->t_env)); 759 memcpy(dst->t_env, src->t_env, sizeof(dst->t_env));
761 memcpy(dst->t_q, src->t_q, sizeof(dst->t_q)); 760 memcpy(dst->t_q, src->t_q, sizeof(dst->t_q));
762 dst->bs_num_env = src->bs_num_env; 761 dst->bs_num_env = src->bs_num_env;
763 dst->bs_amp_res = src->bs_amp_res; 762 dst->bs_amp_res = src->bs_amp_res;
764 dst->bs_num_noise = src->bs_num_noise; 763 dst->bs_num_noise = src->bs_num_noise;
765 dst->bs_frame_class = src->bs_frame_class; 764 dst->bs_frame_class = src->bs_frame_class;
766 dst->e_a[1] = src->e_a[1]; 765 dst->e_a[1] = src->e_a[1];
767 } 766 }
768 767
769 /// Read how the envelope and noise floor data is delta coded 768 /// Read how the envelope and noise floor data is delta coded
770 static void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb, 769 static void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb,
771 SBRData *ch_data) 770 SBRData *ch_data)