comparison msmpeg4.c @ 501:2241bce35bb9 libavcodec

fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
author michaelni
date Sat, 22 Jun 2002 15:52:25 +0000
parents 8b7a54d58549
children 55b4e2248a45
comparison
equal deleted inserted replaced
500:460bc2ba363e 501:2241bce35bb9
19 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at> 19 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
20 */ 20 */
21 #include "avcodec.h" 21 #include "avcodec.h"
22 #include "dsputil.h" 22 #include "dsputil.h"
23 #include "mpegvideo.h" 23 #include "mpegvideo.h"
24 24 //#define PRINT_MB
25 25
26 /* 26 /*
27 * You can also call this codec : MPEG4 with a twist ! 27 * You can also call this codec : MPEG4 with a twist !
28 * 28 *
29 * TODO: 29 * TODO:
672 c = (c + (scale >> 1)) / scale; 672 c = (c + (scale >> 1)) / scale;
673 } 673 }
674 #endif 674 #endif
675 /* XXX: WARNING: they did not choose the same test as MPEG4. This 675 /* XXX: WARNING: they did not choose the same test as MPEG4. This
676 is very important ! */ 676 is very important ! */
677 677 if(s->msmpeg4_version>3){
678 if (abs(a - b) <= abs(b - c)) { 678 if (abs(a - b) < abs(b - c)) {
679 pred = c; 679 pred = c;
680 *dir_ptr = 1; 680 *dir_ptr = 1;
681 } else { 681 } else {
682 pred = a; 682 pred = a;
683 *dir_ptr = 0; 683 *dir_ptr = 0;
684 }
685 }else{
686 if (abs(a - b) <= abs(b - c)) {
687 pred = c;
688 *dir_ptr = 1;
689 } else {
690 pred = a;
691 *dir_ptr = 0;
692 }
684 } 693 }
685 694
686 /* update predictor */ 695 /* update predictor */
687 *dc_val_ptr = &dc_val[0]; 696 *dc_val_ptr = &dc_val[0];
688 return pred; 697 return pred;
701 710
702 /* update predictor */ 711 /* update predictor */
703 *dc_val= level; 712 *dc_val= level;
704 }else{ 713 }else{
705 UINT16 *dc_val; 714 UINT16 *dc_val;
706 if(s->msmpeg4_version<=3) 715 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
707 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
708 else
709 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
710 716
711 /* update predictor */ 717 /* update predictor */
712 if (n < 4) { 718 if (n < 4) {
713 *dc_val = level * s->y_dc_scale; 719 *dc_val = level * s->y_dc_scale;
714 } else { 720 } else {
1372 DCTELEM block[6][64]) 1378 DCTELEM block[6][64])
1373 { 1379 {
1374 int cbp, code, i; 1380 int cbp, code, i;
1375 UINT8 *coded_val; 1381 UINT8 *coded_val;
1376 1382
1383 #ifdef PRINT_MB
1384 if(s->mb_x==0){
1385 printf("\n");
1386 if(s->mb_y==0) printf("\n");
1387 }
1388 #endif
1377 /* special slice handling */ 1389 /* special slice handling */
1378 if (s->mb_x == 0) { 1390 if (s->mb_x == 0) {
1379 if (s->slice_height && (s->mb_y % s->slice_height) == 0) { 1391 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
1380 int wrap; 1392 int wrap;
1381 /* reset DC pred (set previous line to 1024) */ 1393 /* reset DC pred (set previous line to 1024) */
1417 s->mv_dir = MV_DIR_FORWARD; 1429 s->mv_dir = MV_DIR_FORWARD;
1418 s->mv_type = MV_TYPE_16X16; 1430 s->mv_type = MV_TYPE_16X16;
1419 s->mv[0][0][0] = 0; 1431 s->mv[0][0][0] = 0;
1420 s->mv[0][0][1] = 0; 1432 s->mv[0][0][1] = 0;
1421 s->mb_skiped = 1; 1433 s->mb_skiped = 1;
1434 #ifdef PRINT_MB
1435 printf("S ");
1436 #endif
1422 return 0; 1437 return 0;
1423 } 1438 }
1424 } 1439 }
1425 1440
1426 code = get_vlc(&s->gb, &mb_non_intra_vlc); 1441 code = get_vlc(&s->gb, &mb_non_intra_vlc);
1462 return -1; 1477 return -1;
1463 s->mv_dir = MV_DIR_FORWARD; 1478 s->mv_dir = MV_DIR_FORWARD;
1464 s->mv_type = MV_TYPE_16X16; 1479 s->mv_type = MV_TYPE_16X16;
1465 s->mv[0][0][0] = mx; 1480 s->mv[0][0][0] = mx;
1466 s->mv[0][0][1] = my; 1481 s->mv[0][0][1] = my;
1482 #ifdef PRINT_MB
1483 printf("P ");
1484 #endif
1467 } else { 1485 } else {
1468 //printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24)); 1486 //printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24));
1469 set_stat(ST_INTRA_MB); 1487 set_stat(ST_INTRA_MB);
1470 s->ac_pred = get_bits1(&s->gb); 1488 s->ac_pred = get_bits1(&s->gb);
1489 #ifdef PRINT_MB
1490 printf("%c", s->ac_pred ? 'A' : 'I');
1491 #endif
1471 if(s->per_mb_rl_table && cbp){ 1492 if(s->per_mb_rl_table && cbp){
1472 s->rl_table_index = decode012(&s->gb); 1493 s->rl_table_index = decode012(&s->gb);
1473 s->rl_chroma_table_index = s->rl_table_index; 1494 s->rl_chroma_table_index = s->rl_table_index;
1474 } 1495 }
1475 } 1496 }
1479 { 1500 {
1480 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); 1501 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1481 return -1; 1502 return -1;
1482 } 1503 }
1483 } 1504 }
1484 1505
1485 return 0; 1506 return 0;
1486 } 1507 }
1487 1508
1488 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, 1509 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1489 int n, int coded) 1510 int n, int coded)
1499 qadd=0; 1520 qadd=0;
1500 1521
1501 /* DC coef */ 1522 /* DC coef */
1502 set_stat(ST_DC); 1523 set_stat(ST_DC);
1503 level = msmpeg4_decode_dc(s, n, &dc_pred_dir); 1524 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
1525 #ifdef PRINT_MB
1526 {
1527 static int c;
1528 if(n==0) c=0;
1529 if(n==4) printf("%X", c);
1530 c+= c +dc_pred_dir;
1531 }
1532 #endif
1504 if (level < 0){ 1533 if (level < 0){
1505 fprintf(stderr, "dc overflow-\n"); 1534 fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
1506 return -1; 1535 return -1;
1507 } 1536 }
1508 if (n < 4) { 1537 if (n < 4) {
1509 rl = &rl_table[s->rl_table_index]; 1538 rl = &rl_table[s->rl_table_index];
1510 if(level > 256*s->y_dc_scale){ 1539 if(level > 256*s->y_dc_scale){
1511 fprintf(stderr, "dc overflow+\n"); 1540 fprintf(stderr, "dc overflow+ L qscale: %d//\n", s->qscale);
1512 return -1; 1541 return -1;
1513 } 1542 }
1514 } else { 1543 } else {
1515 rl = &rl_table[3 + s->rl_chroma_table_index]; 1544 rl = &rl_table[3 + s->rl_chroma_table_index];
1516 if(level > 256*s->c_dc_scale){ 1545 if(level > 256*s->c_dc_scale){
1517 fprintf(stderr, "dc overflow+\n"); 1546 fprintf(stderr, "dc overflow+ C qscale: %d//\n", s->qscale);
1518 return -1; 1547 return -1;
1519 } 1548 }
1520 } 1549 }
1521 block[0] = level; 1550 block[0] = level;
1522 1551
1728 1757
1729 /* update predictor */ 1758 /* update predictor */
1730 *dc_val= level; 1759 *dc_val= level;
1731 }else{ 1760 }else{
1732 UINT16 *dc_val; 1761 UINT16 *dc_val;
1733 if(s->msmpeg4_version<=3) 1762 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1734 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1735 else
1736 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1737 level += pred; 1763 level += pred;
1738 1764
1739 /* update predictor */ 1765 /* update predictor */
1740 if (n < 4) { 1766 if (n < 4) {
1741 *dc_val = level * s->y_dc_scale; 1767 *dc_val = level * s->y_dc_scale;