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 {