comparison msmpeg4.c @ 200:6ab301aaa652 libavcodec

(commit by michael) dequantizers skip trailing zeros msmpeg4 non-intra decoder has its dequantizer "build in" now
author arpi_esp
date Sun, 13 Jan 2002 04:59:37 +0000
parents 92f726205082
children 91ed656e7339
comparison
equal deleted inserted replaced
199:0f1dba8fc617 200:6ab301aaa652
628 } 628 }
629 629
630 int msmpeg4_decode_picture_header(MpegEncContext * s) 630 int msmpeg4_decode_picture_header(MpegEncContext * s)
631 { 631 {
632 int code; 632 int code;
633 static int weirdAl=0;
633 634
634 s->pict_type = get_bits(&s->gb, 2) + 1; 635 s->pict_type = get_bits(&s->gb, 2) + 1;
635 if (s->pict_type != I_TYPE && 636 if (s->pict_type != I_TYPE &&
636 s->pict_type != P_TYPE) 637 s->pict_type != P_TYPE)
637 return -1; 638 return -1;
640 641
641 if (s->pict_type == I_TYPE) { 642 if (s->pict_type == I_TYPE) {
642 code = get_bits(&s->gb, 5); 643 code = get_bits(&s->gb, 5);
643 /* 0x17: one slice, 0x18: three slices */ 644 /* 0x17: one slice, 0x18: three slices */
644 /* XXX: implement it */ 645 /* XXX: implement it */
646 //printf("%d %d %d\n", code, s->slice_height, s->first_slice_line);
645 if (code < 0x17) 647 if (code < 0x17)
646 return -1; 648 return -1;
647 s->slice_height = s->mb_height / (code - 0x16); 649 s->slice_height = s->mb_height / (code - 0x16);
648 s->rl_chroma_table_index = decode012(&s->gb); 650 s->rl_chroma_table_index = decode012(&s->gb);
649 s->rl_table_index = decode012(&s->gb); 651 s->rl_table_index = decode012(&s->gb);
650 652
651 s->dc_table_index = get_bits1(&s->gb); 653 s->dc_table_index = get_bits1(&s->gb);
652 s->no_rounding = 1; 654 s->no_rounding = 1;
655 /* printf(" %d %d %d %d \n",
656 s->qscale,
657 s->rl_chroma_table_index,
658 s->rl_table_index,
659 s->dc_table_index);*/
653 } else { 660 } else {
654 s->use_skip_mb_code = get_bits1(&s->gb); 661 s->use_skip_mb_code = get_bits1(&s->gb);
655 662
656 s->rl_table_index = decode012(&s->gb); 663 s->rl_table_index = decode012(&s->gb);
657 s->rl_chroma_table_index = s->rl_table_index; 664 s->rl_chroma_table_index = s->rl_table_index;
658 665
659 s->dc_table_index = get_bits1(&s->gb); 666 s->dc_table_index = get_bits1(&s->gb);
660 667
661 s->mv_table_index = get_bits1(&s->gb); 668 s->mv_table_index = get_bits1(&s->gb);
662 s->no_rounding ^= 1; 669 /* printf(" %d %d %d %d %d \n",
670 s->use_skip_mb_code,
671 s->rl_table_index,
672 s->rl_chroma_table_index,
673 s->dc_table_index,
674 s->mv_table_index);*/
675 if(weirdAl)
676 s->no_rounding = 0;
677 else
678 s->no_rounding ^= 1;
663 } 679 }
664 #ifdef DEBUG 680 #ifdef DEBUG
665 printf("*****frame %d:\n", frame_count++); 681 printf("*****frame %d:\n", frame_count++);
666 #endif 682 #endif
667 return 0; 683 return 0;
783 { 799 {
784 int code, level, i, j, last, run, run_diff; 800 int code, level, i, j, last, run, run_diff;
785 int dc_pred_dir; 801 int dc_pred_dir;
786 RLTable *rl; 802 RLTable *rl;
787 const UINT8 *scan_table; 803 const UINT8 *scan_table;
804 int qmul, qadd;
788 805
789 if (s->mb_intra) { 806 if (s->mb_intra) {
807 qmul=1;
808 qadd=0;
809
790 /* DC coef */ 810 /* DC coef */
791 set_stat(ST_DC); 811 set_stat(ST_DC);
792 level = msmpeg4_decode_dc(s, n, &dc_pred_dir); 812 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
793 if (level < 0) 813 if (level < 0)
794 return -1; 814 return -1;
796 if (n < 4) { 816 if (n < 4) {
797 rl = &rl_table[s->rl_table_index]; 817 rl = &rl_table[s->rl_table_index];
798 } else { 818 } else {
799 rl = &rl_table[3 + s->rl_chroma_table_index]; 819 rl = &rl_table[3 + s->rl_chroma_table_index];
800 } 820 }
821
801 run_diff = 0; 822 run_diff = 0;
802 i = 1; 823 i = 1;
803 if (!coded) { 824 if (!coded) {
804 goto not_coded; 825 goto not_coded;
805 } 826 }
811 } else { 832 } else {
812 scan_table = zigzag_direct; 833 scan_table = zigzag_direct;
813 } 834 }
814 set_stat(ST_INTRA_AC); 835 set_stat(ST_INTRA_AC);
815 } else { 836 } else {
837 qmul = s->qscale << 1;
838 qadd = (s->qscale - 1) | 1;
816 i = 0; 839 i = 0;
817 rl = &rl_table[3 + s->rl_table_index]; 840 rl = &rl_table[3 + s->rl_table_index];
818 run_diff = 1; 841 run_diff = 1;
819 if (!coded) { 842 if (!coded) {
820 s->block_last_index[n] = i - 1; 843 s->block_last_index[n] = i - 1;
835 /* third escape */ 858 /* third escape */
836 last = get_bits1(&s->gb); 859 last = get_bits1(&s->gb);
837 run = get_bits(&s->gb, 6); 860 run = get_bits(&s->gb, 6);
838 level = get_bits(&s->gb, 8); 861 level = get_bits(&s->gb, 8);
839 level = (level << 24) >> 24; /* sign extend */ 862 level = (level << 24) >> 24; /* sign extend */
863 if(level>0) level= level * qmul + qadd;
864 else level= level * qmul - qadd;
840 } else { 865 } else {
841 /* second escape */ 866 /* second escape */
842 code = get_vlc(&s->gb, &rl->vlc); 867 code = get_vlc(&s->gb, &rl->vlc);
843 if (code < 0 || code >= rl->n) 868 if (code < 0 || code >= rl->n)
844 return -1; 869 return -1;
845 run = rl->table_run[code]; 870 run = rl->table_run[code];
846 level = rl->table_level[code]; 871 level = rl->table_level[code] * qmul + qadd;
847 last = code >= rl->last; 872 last = code >= rl->last;
848 run += rl->max_run[last][level] + run_diff; 873 run += rl->max_run[last][level] + run_diff;
849 if (get_bits1(&s->gb)) 874 if (get_bits1(&s->gb))
850 level = -level; 875 level = -level;
851 } 876 }
856 return -1; 881 return -1;
857 run = rl->table_run[code]; 882 run = rl->table_run[code];
858 level = rl->table_level[code]; 883 level = rl->table_level[code];
859 last = code >= rl->last; 884 last = code >= rl->last;
860 level += rl->max_level[last][run]; 885 level += rl->max_level[last][run];
886 level= level * qmul + qadd;
861 if (get_bits1(&s->gb)) 887 if (get_bits1(&s->gb))
862 level = -level; 888 level = -level;
863 } 889 }
864 } else { 890 } else {
865 run = rl->table_run[code]; 891 run = rl->table_run[code];
866 level = rl->table_level[code]; 892 level = rl->table_level[code] * qmul + qadd;
867 last = code >= rl->last; 893 last = code >= rl->last;
868 if (get_bits1(&s->gb)) 894 if (get_bits1(&s->gb))
869 level = -level; 895 level = -level;
870 } 896 }
871 i += run; 897 i += run;