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