comparison msmpeg4.c @ 21:20e680e7a490 libavcodec

get_bits() specialization, gives 4\speedup
author arpi_esp
date Sat, 04 Aug 2001 00:46:50 +0000
parents 1d3ac9654178
children 2f603eb2f23d
comparison
equal deleted inserted replaced
20:907b67420d84 21:20e680e7a490
599 } 599 }
600 600
601 static int decode012(GetBitContext *gb) 601 static int decode012(GetBitContext *gb)
602 { 602 {
603 int n; 603 int n;
604 n = get_bits(gb, 1); 604 n = get_bits1(gb);
605 if (n == 0) 605 if (n == 0)
606 return 0; 606 return 0;
607 else 607 else
608 return get_bits(gb, 1) + 1; 608 return get_bits1(gb) + 1;
609 } 609 }
610 610
611 int msmpeg4_decode_picture_header(MpegEncContext * s) 611 int msmpeg4_decode_picture_header(MpegEncContext * s)
612 { 612 {
613 int code; 613 int code;
627 return -1; 627 return -1;
628 s->slice_height = s->mb_height / (code - 0x16); 628 s->slice_height = s->mb_height / (code - 0x16);
629 s->rl_chroma_table_index = decode012(&s->gb); 629 s->rl_chroma_table_index = decode012(&s->gb);
630 s->rl_table_index = decode012(&s->gb); 630 s->rl_table_index = decode012(&s->gb);
631 631
632 s->dc_table_index = get_bits(&s->gb, 1); 632 s->dc_table_index = get_bits1(&s->gb);
633 s->no_rounding = 1; 633 s->no_rounding = 1;
634 } else { 634 } else {
635 s->use_skip_mb_code = get_bits(&s->gb, 1); 635 s->use_skip_mb_code = get_bits1(&s->gb);
636 636
637 s->rl_table_index = decode012(&s->gb); 637 s->rl_table_index = decode012(&s->gb);
638 s->rl_chroma_table_index = s->rl_table_index; 638 s->rl_chroma_table_index = s->rl_table_index;
639 639
640 s->dc_table_index = get_bits(&s->gb, 1); 640 s->dc_table_index = get_bits1(&s->gb);
641 641
642 s->mv_table_index = get_bits(&s->gb, 1); 642 s->mv_table_index = get_bits1(&s->gb);
643 s->no_rounding ^= 1; 643 s->no_rounding ^= 1;
644 } 644 }
645 #ifdef DEBUG 645 #ifdef DEBUG
646 printf("*****frame %d:\n", frame_count++); 646 printf("*****frame %d:\n", frame_count++);
647 #endif 647 #endif
683 } 683 }
684 684
685 if (s->pict_type == P_TYPE) { 685 if (s->pict_type == P_TYPE) {
686 set_stat(ST_INTER_MB); 686 set_stat(ST_INTER_MB);
687 if (s->use_skip_mb_code) { 687 if (s->use_skip_mb_code) {
688 if (get_bits(&s->gb, 1)) { 688 if (get_bits1(&s->gb)) {
689 /* skip mb */ 689 /* skip mb */
690 s->mb_intra = 0; 690 s->mb_intra = 0;
691 for(i=0;i<6;i++) 691 for(i=0;i<6;i++)
692 s->block_last_index[i] = -1; 692 s->block_last_index[i] = -1;
693 s->mv_dir = MV_DIR_FORWARD; 693 s->mv_dir = MV_DIR_FORWARD;
737 s->mv_type = MV_TYPE_16X16; 737 s->mv_type = MV_TYPE_16X16;
738 s->mv[0][0][0] = mx; 738 s->mv[0][0][0] = mx;
739 s->mv[0][0][1] = my; 739 s->mv[0][0][1] = my;
740 } else { 740 } else {
741 set_stat(ST_INTRA_MB); 741 set_stat(ST_INTRA_MB);
742 s->ac_pred = get_bits(&s->gb, 1); 742 s->ac_pred = get_bits1(&s->gb);
743 } 743 }
744 744
745 for (i = 0; i < 6; i++) { 745 for (i = 0; i < 6; i++) {
746 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) 746 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
747 return -1; 747 return -1;
799 code = get_vlc(&s->gb, &rl->vlc); 799 code = get_vlc(&s->gb, &rl->vlc);
800 if (code < 0) 800 if (code < 0)
801 return -1; 801 return -1;
802 if (code == rl->n) { 802 if (code == rl->n) {
803 /* escape */ 803 /* escape */
804 if (get_bits(&s->gb, 1) == 0) { 804 if (get_bits1(&s->gb) == 0) {
805 if (get_bits(&s->gb, 1) == 0) { 805 if (get_bits1(&s->gb) == 0) {
806 /* third escape */ 806 /* third escape */
807 last = get_bits(&s->gb, 1); 807 last = get_bits1(&s->gb);
808 run = get_bits(&s->gb, 6); 808 run = get_bits(&s->gb, 6);
809 level = get_bits(&s->gb, 8); 809 level = get_bits(&s->gb, 8);
810 level = (level << 24) >> 24; /* sign extend */ 810 level = (level << 24) >> 24; /* sign extend */
811 } else { 811 } else {
812 /* second escape */ 812 /* second escape */
815 return -1; 815 return -1;
816 run = rl->table_run[code]; 816 run = rl->table_run[code];
817 level = rl->table_level[code]; 817 level = rl->table_level[code];
818 last = code >= rl->last; 818 last = code >= rl->last;
819 run += rl->max_run[last][level] + run_diff; 819 run += rl->max_run[last][level] + run_diff;
820 if (get_bits(&s->gb, 1)) 820 if (get_bits1(&s->gb))
821 level = -level; 821 level = -level;
822 } 822 }
823 } else { 823 } else {
824 /* first escape */ 824 /* first escape */
825 code = get_vlc(&s->gb, &rl->vlc); 825 code = get_vlc(&s->gb, &rl->vlc);
827 return -1; 827 return -1;
828 run = rl->table_run[code]; 828 run = rl->table_run[code];
829 level = rl->table_level[code]; 829 level = rl->table_level[code];
830 last = code >= rl->last; 830 last = code >= rl->last;
831 level += rl->max_level[last][run]; 831 level += rl->max_level[last][run];
832 if (get_bits(&s->gb, 1)) 832 if (get_bits1(&s->gb))
833 level = -level; 833 level = -level;
834 } 834 }
835 } else { 835 } else {
836 run = rl->table_run[code]; 836 run = rl->table_run[code];
837 level = rl->table_level[code]; 837 level = rl->table_level[code];
838 last = code >= rl->last; 838 last = code >= rl->last;
839 if (get_bits(&s->gb, 1)) 839 if (get_bits1(&s->gb))
840 level = -level; 840 level = -level;
841 } 841 }
842 i += run; 842 i += run;
843 if (i >= 64) 843 if (i >= 64)
844 return -1; 844 return -1;
873 if (level < 0) 873 if (level < 0)
874 return -1; 874 return -1;
875 875
876 if (level == DC_MAX) { 876 if (level == DC_MAX) {
877 level = get_bits(&s->gb, 8); 877 level = get_bits(&s->gb, 8);
878 if (get_bits(&s->gb, 1)) 878 if (get_bits1(&s->gb))
879 level = -level; 879 level = -level;
880 } else if (level != 0) { 880 } else if (level != 0) {
881 if (get_bits(&s->gb, 1)) 881 if (get_bits1(&s->gb))
882 level = -level; 882 level = -level;
883 } 883 }
884 884
885 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); 885 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
886 level += pred; 886 level += pred;