comparison msmpeg4.c @ 246:214ac77c0948 libavcodec

* simplified indexing * ignoring error from msmpeg4_decode_block
author kabi
date Mon, 18 Feb 2002 09:34:54 +0000
parents 3c2bad70a196
children 75091bfc577b
comparison
equal deleted inserted replaced
245:a023f78e0cc2 246:214ac77c0948
408 408
409 /* dir = 0: left, dir = 1: top prediction */ 409 /* dir = 0: left, dir = 1: top prediction */
410 static int msmpeg4_pred_dc(MpegEncContext * s, int n, 410 static int msmpeg4_pred_dc(MpegEncContext * s, int n,
411 INT16 **dc_val_ptr, int *dir_ptr) 411 INT16 **dc_val_ptr, int *dir_ptr)
412 { 412 {
413 int a, b, c, x, y, wrap, pred, scale; 413 int a, b, c, xy, wrap, pred, scale;
414 INT16 *dc_val; 414 INT16 *dc_val;
415 415
416 /* find prediction */ 416 /* find prediction */
417 if (n < 4) { 417 if (n < 4) {
418 x = 2 * s->mb_x + 1 + (n & 1);
419 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
420 wrap = s->mb_width * 2 + 2; 418 wrap = s->mb_width * 2 + 2;
419 xy = 2 * s->mb_y + 1 + ((n & 2) >> 1);
420 xy *= wrap;
421 xy += 2 * s->mb_x + 1 + (n & 1);
421 dc_val = s->dc_val[0]; 422 dc_val = s->dc_val[0];
422 scale = s->y_dc_scale; 423 scale = s->y_dc_scale;
423 } else { 424 } else {
424 x = s->mb_x + 1;
425 y = s->mb_y + 1;
426 wrap = s->mb_width + 2; 425 wrap = s->mb_width + 2;
426 xy = s->mb_y + 1;
427 xy *= wrap;
428 xy += s->mb_x + 1;
427 dc_val = s->dc_val[n - 4 + 1]; 429 dc_val = s->dc_val[n - 4 + 1];
428 scale = s->c_dc_scale; 430 scale = s->c_dc_scale;
429 } 431 }
430 432
431 /* B C 433 /* B C
432 * A X 434 * A X
433 */ 435 */
434 a = dc_val[(x - 1) + (y) * wrap]; 436 a = dc_val[xy - 1];
435 b = dc_val[(x - 1) + (y - 1) * wrap]; 437 b = dc_val[xy - 1 - wrap];
436 c = dc_val[(x) + (y - 1) * wrap]; 438 c = dc_val[xy - wrap];
437 439
438 /* XXX: the following solution consumes divisions, but it does not 440 /* XXX: the following solution consumes divisions, but it does not
439 necessitate to modify mpegvideo.c. The problem comes from the 441 necessitate to modify mpegvideo.c. The problem comes from the
440 fact they decided to store the quantized DC (which would lead 442 fact they decided to store the quantized DC (which would lead
441 to problems if Q could vary !) */ 443 to problems if Q could vary !) */
482 pred = a; 484 pred = a;
483 *dir_ptr = 0; 485 *dir_ptr = 0;
484 } 486 }
485 487
486 /* update predictor */ 488 /* update predictor */
487 *dc_val_ptr = &dc_val[(x) + (y) * wrap]; 489 *dc_val_ptr = &dc_val[xy];
488 return pred; 490 return pred;
489 } 491 }
490 492
491 #define DC_MAX 119 493 #define DC_MAX 119
492 494
774 } 776 }
775 777
776 return 0; 778 return 0;
777 } 779 }
778 780
779 void memsetw(short *tab, int val, int n) 781 static inline void memsetw(short *tab, int val, int n)
780 { 782 {
781 int i; 783 int i;
782 for(i=0;i<n;i++) 784 for(i=0;i<n;i++)
783 tab[i] = val; 785 tab[i] = val;
784 } 786 }
785 787
786 int msmpeg4_decode_mb(MpegEncContext *s, 788 int msmpeg4_decode_mb(MpegEncContext *s,
787 DCTELEM block[6][64]) 789 DCTELEM block[6][64])
788 { 790 {
789 int cbp, code, i; 791 int cbp, code, i;
790 int pred, val;
791 UINT8 *coded_val; 792 UINT8 *coded_val;
792 793
793 /* special slice handling */ 794 /* special slice handling */
794 if (s->mb_x == 0) { 795 if (s->mb_x == 0) {
795 if (s->slice_height && (s->mb_y % s->slice_height) == 0) { 796 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
838 } 839 }
839 840
840 code = get_vlc(&s->gb, &mb_non_intra_vlc); 841 code = get_vlc(&s->gb, &mb_non_intra_vlc);
841 if (code < 0) 842 if (code < 0)
842 return -1; 843 return -1;
843 if (code & 0x40) 844 //s->mb_intra = (code & 0x40) ? 0 : 1;
844 s->mb_intra = 0; 845 s->mb_intra = (~code & 0x40) >> 6;
845 else
846 s->mb_intra = 1;
847 846
848 cbp = code & 0x3f; 847 cbp = code & 0x3f;
849 } else { 848 } else {
850 set_stat(ST_INTRA_MB); 849 set_stat(ST_INTRA_MB);
851 s->mb_intra = 1; 850 s->mb_intra = 1;
853 if (code < 0) 852 if (code < 0)
854 return -1; 853 return -1;
855 /* predict coded block pattern */ 854 /* predict coded block pattern */
856 cbp = 0; 855 cbp = 0;
857 for(i=0;i<6;i++) { 856 for(i=0;i<6;i++) {
858 val = ((code >> (5 - i)) & 1); 857 int val = ((code >> (5 - i)) & 1);
859 if (i < 4) { 858 if (i < 4) {
860 pred = coded_block_pred(s, i, &coded_val); 859 int pred = coded_block_pred(s, i, &coded_val);
861 val = val ^ pred; 860 val = val ^ pred;
862 *coded_val = val; 861 *coded_val = val;
863 } 862 }
864 cbp |= val << (5 - i); 863 cbp |= val << (5 - i);
865 } 864 }
880 s->ac_pred = get_bits1(&s->gb); 879 s->ac_pred = get_bits1(&s->gb);
881 } 880 }
882 881
883 for (i = 0; i < 6; i++) { 882 for (i = 0; i < 6; i++) {
884 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) 883 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
885 return -1; 884 {
885 fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
886 // return -1;
887 }
886 } 888 }
887 return 0; 889 return 0;
888 } 890 }
889 891
890 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, 892 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
951 /* third escape */ 953 /* third escape */
952 last = get_bits1(&s->gb); 954 last = get_bits1(&s->gb);
953 run = get_bits(&s->gb, 6); 955 run = get_bits(&s->gb, 6);
954 level = get_bits(&s->gb, 8); 956 level = get_bits(&s->gb, 8);
955 level = (level << 24) >> 24; /* sign extend */ 957 level = (level << 24) >> 24; /* sign extend */
956 if(level>0) level= level * qmul + qadd; 958 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
959 if (level>0) level= level * qmul + qadd;
957 else level= level * qmul - qadd; 960 else level= level * qmul - qadd;
958 } else { 961 } else {
959 /* second escape */ 962 /* second escape */
960 code = get_vlc(&s->gb, &rl->vlc); 963 code = get_vlc(&s->gb, &rl->vlc);
961 if (code < 0 || code >= rl->n) 964 if (code < 0 || code >= rl->n)