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 { |