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