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