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