Mercurial > libavcodec.hg
comparison msmpeg4.c @ 309:32485ad4cc4e libavcodec
fixing msmpeg4v2 bugs (is bugfree now afaik)
| author | michaelni |
|---|---|
| date | Fri, 05 Apr 2002 16:51:12 +0000 |
| parents | 764aeec1320e |
| children | 49e73229a5e6 |
comparison
equal
deleted
inserted
replaced
| 308:072c4ff05e62 | 309:32485ad4cc4e |
|---|---|
| 366 | 366 |
| 367 | 367 |
| 368 /* strongly inspirated from MPEG4, but not exactly the same ! */ | 368 /* strongly inspirated from MPEG4, but not exactly the same ! */ |
| 369 void msmpeg4_dc_scale(MpegEncContext * s) | 369 void msmpeg4_dc_scale(MpegEncContext * s) |
| 370 { | 370 { |
| 371 if (s->qscale < 5){ | 371 if (s->qscale < 5 || s->msmpeg4_version==2){ |
| 372 s->y_dc_scale = 8; | 372 s->y_dc_scale = 8; |
| 373 s->c_dc_scale = 8; | 373 s->c_dc_scale = 8; |
| 374 // s->c_dc_scale = (s->qscale + 13)>>1; | |
| 375 }else if (s->qscale < 9){ | 374 }else if (s->qscale < 9){ |
| 376 s->y_dc_scale = 2 * s->qscale; | 375 s->y_dc_scale = 2 * s->qscale; |
| 377 s->c_dc_scale = (s->qscale + 13)>>1; | 376 s->c_dc_scale = (s->qscale + 13)>>1; |
| 378 }else{ | 377 }else{ |
| 379 s->y_dc_scale = s->qscale + 8; | 378 s->y_dc_scale = s->qscale + 8; |
| 380 s->c_dc_scale = (s->qscale + 13)>>1; | 379 s->c_dc_scale = (s->qscale + 13)>>1; |
| 381 } | 380 } |
| 382 // this differs for quant >24 from mpeg4 | |
| 383 | |
| 384 // if(s->qscale==13) s->c_dc_scale=14; | |
| 385 | |
| 386 // if(s->qscale>=6) | |
| 387 // printf("%d", s->qscale); | |
| 388 | |
| 389 /* s->c_dc_scale values (found by Michael Nidermayer) | |
| 390 qscale=2 -> 8 (yes iam sure about that) | |
| 391 qscale=3 -> 8 | |
| 392 qscale=4 -> 8 | |
| 393 qscale=5 -> 9 | |
| 394 qscale=6 -> 9 | |
| 395 qscale=7 -> 10 | |
| 396 qscale=8 -> 10 | |
| 397 qscale=9 -> 11 | |
| 398 qscale=10-> 11 | |
| 399 */ | |
| 400 } | 381 } |
| 401 | 382 |
| 402 /* dir = 0: left, dir = 1: top prediction */ | 383 /* dir = 0: left, dir = 1: top prediction */ |
| 403 static int msmpeg4_pred_dc(MpegEncContext * s, int n, | 384 static int msmpeg4_pred_dc(MpegEncContext * s, int n, |
| 404 INT16 **dc_val_ptr, int *dir_ptr) | 385 INT16 **dc_val_ptr, int *dir_ptr) |
| 636 | 617 |
| 637 if(!inited){ | 618 if(!inited){ |
| 638 int level, uni_code, uni_len; | 619 int level, uni_code, uni_len; |
| 639 inited=1; | 620 inited=1; |
| 640 | 621 |
| 641 for(level=-255; level<256; level++){ | 622 for(level=-256; level<256; level++){ |
| 642 int size, v, l; | 623 int size, v, l; |
| 643 /* find number of bits */ | 624 /* find number of bits */ |
| 644 size = 0; | 625 size = 0; |
| 645 v = abs(level); | 626 v = abs(level); |
| 646 while (v) { | 627 while (v) { |
| 827 | 808 |
| 828 #if 0 | 809 #if 0 |
| 829 if(s->msmpeg4_version==2) | 810 if(s->msmpeg4_version==2) |
| 830 { | 811 { |
| 831 int i; | 812 int i; |
| 832 printf("%s q:%d s:%X ", s->pict_type == I_TYPE ? "I" : "P" , s->qscale, | |
| 833 s->pict_type == I_TYPE ? code : s->use_skip_mb_code); | |
| 834 for(i=0; i<s->gb.size*8; i++) | 813 for(i=0; i<s->gb.size*8; i++) |
| 835 // printf("%d", get_bits1(&s->gb)); | 814 // printf("%d", get_bits1(&s->gb)); |
| 836 get_bits1(&s->gb); | 815 get_bits1(&s->gb); |
| 837 printf("END\n"); | 816 printf("END\n"); |
| 838 return -1; | 817 return -1; |
| 906 | 885 |
| 907 int msmpeg4v2_decode_mb(MpegEncContext *s, | 886 int msmpeg4v2_decode_mb(MpegEncContext *s, |
| 908 DCTELEM block[6][64]) | 887 DCTELEM block[6][64]) |
| 909 { | 888 { |
| 910 int cbp, code, i; | 889 int cbp, code, i; |
| 911 //printf("M"); | |
| 912 //fflush(stderr); fflush(stdout); | |
| 913 if (s->pict_type == P_TYPE) { | 890 if (s->pict_type == P_TYPE) { |
| 914 if (s->use_skip_mb_code) { | 891 if (s->use_skip_mb_code) { |
| 915 if (get_bits1(&s->gb)) { | 892 if (get_bits1(&s->gb)) { |
| 916 /* skip mb */ | 893 /* skip mb */ |
| 917 s->mb_intra = 0; | 894 s->mb_intra = 0; |
| 930 s->mb_intra = code >>2; | 907 s->mb_intra = code >>2; |
| 931 | 908 |
| 932 cbp = code & 0x3; | 909 cbp = code & 0x3; |
| 933 } else { | 910 } else { |
| 934 s->mb_intra = 1; | 911 s->mb_intra = 1; |
| 935 //printf("%X ", show_bits(&s->gb, 24)); | |
| 936 cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc); | 912 cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc); |
| 937 //printf("%X ", show_bits(&s->gb, 24)); | |
| 938 //printf("CBP: %X ",cbp); | |
| 939 } | 913 } |
| 940 | 914 |
| 941 if (!s->mb_intra) { | 915 if (!s->mb_intra) { |
| 942 int mx, my; | 916 int mx, my; |
| 943 | 917 |
| 951 s->mv_dir = MV_DIR_FORWARD; | 925 s->mv_dir = MV_DIR_FORWARD; |
| 952 s->mv_type = MV_TYPE_16X16; | 926 s->mv_type = MV_TYPE_16X16; |
| 953 s->mv[0][0][0] = mx; | 927 s->mv[0][0][0] = mx; |
| 954 s->mv[0][0][1] = my; | 928 s->mv[0][0][1] = my; |
| 955 } else { | 929 } else { |
| 956 //if(s->pict_type == P_TYPE) printf("intra cbp: %X", cbp); | |
| 957 s->ac_pred = get_bits1(&s->gb); | 930 s->ac_pred = get_bits1(&s->gb); |
| 958 //printf("AC: %d ",s->ac_pred); | |
| 959 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; | 931 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; |
| 960 //printf("cbp: %X ",cbp); | |
| 961 } | 932 } |
| 962 | 933 |
| 963 for (i = 0; i < 6; i++) { | 934 for (i = 0; i < 6; i++) { |
| 964 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) | 935 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) |
| 965 { | 936 { |
| 966 //fflush(stderr); fflush(stdout); | |
| 967 fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); | 937 fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
| 968 return -1; | 938 return -1; |
| 969 } | 939 } |
| 970 } | 940 } |
| 971 return 0; | 941 return 0; |
| 1214 if (n < 4) { | 1184 if (n < 4) { |
| 1215 level = get_vlc(&s->gb, &v2_dc_lum_vlc); | 1185 level = get_vlc(&s->gb, &v2_dc_lum_vlc); |
| 1216 } else { | 1186 } else { |
| 1217 level = get_vlc(&s->gb, &v2_dc_chroma_vlc); | 1187 level = get_vlc(&s->gb, &v2_dc_chroma_vlc); |
| 1218 } | 1188 } |
| 1219 if (level < 0) | 1189 if (level < 0) |
| 1220 return -1; | 1190 return -1; |
| 1221 | |
| 1222 level-=256; | 1191 level-=256; |
| 1223 }else{ //FIXME optimize use unified tables & index | 1192 }else{ //FIXME optimize use unified tables & index |
| 1224 if (n < 4) { | 1193 if (n < 4) { |
| 1225 level = get_vlc(&s->gb, &dc_lum_vlc[s->dc_table_index]); | 1194 level = get_vlc(&s->gb, &dc_lum_vlc[s->dc_table_index]); |
| 1226 } else { | 1195 } else { |
