Lines 1479-1664
Link Here
|
1479 |
return val; |
1479 |
return val; |
1480 |
} |
1480 |
} |
1481 |
|
1481 |
|
1482 |
static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
|
|
1483 |
{ |
1484 |
int cbp, code, i; |
1485 |
|
1486 |
if (s->pict_type == P_TYPE) { |
1487 |
if (s->use_skip_mb_code) { |
1488 |
if (get_bits1(&s->gb)) { |
1489 |
/* skip mb */ |
1490 |
s->mb_intra = 0; |
1491 |
for(i=0;i<6;i++) |
1492 |
s->block_last_index[i] = -1; |
1493 |
s->mv_dir = MV_DIR_FORWARD; |
1494 |
s->mv_type = MV_TYPE_16X16; |
1495 |
s->mv[0][0][0] = 0; |
1496 |
s->mv[0][0][1] = 0; |
1497 |
s->mb_skipped = 1; |
1498 |
return 0; |
1499 |
} |
1500 |
} |
1501 |
|
1502 |
if(s->msmpeg4_version==2) |
1503 |
code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1); |
1504 |
else |
1505 |
code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3); |
1506 |
if(code<0 || code>7){ |
1507 |
av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y); |
1508 |
return -1; |
1509 |
} |
1510 |
|
1511 |
s->mb_intra = code >>2; |
1512 |
|
1513 |
cbp = code & 0x3; |
1514 |
} else { |
1515 |
s->mb_intra = 1; |
1516 |
if(s->msmpeg4_version==2) |
1517 |
cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1); |
1518 |
else |
1519 |
cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1); |
1520 |
if(cbp<0 || cbp>3){ |
1521 |
av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); |
1522 |
return -1; |
1523 |
} |
1524 |
} |
1525 |
|
1526 |
if (!s->mb_intra) { |
1527 |
int mx, my, cbpy; |
1528 |
|
1529 |
cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
1530 |
if(cbpy<0){ |
1531 |
av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); |
1532 |
return -1; |
1533 |
} |
1534 |
|
1535 |
cbp|= cbpy<<2; |
1536 |
if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C; |
1537 |
|
1538 |
h263_pred_motion(s, 0, 0, &mx, &my); |
1539 |
mx= msmpeg4v2_decode_motion(s, mx, 1); |
1540 |
my= msmpeg4v2_decode_motion(s, my, 1); |
1541 |
|
1542 |
s->mv_dir = MV_DIR_FORWARD; |
1543 |
s->mv_type = MV_TYPE_16X16; |
1544 |
s->mv[0][0][0] = mx; |
1545 |
s->mv[0][0][1] = my; |
1546 |
} else { |
1547 |
if(s->msmpeg4_version==2){ |
1548 |
s->ac_pred = get_bits1(&s->gb); |
1549 |
cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors |
1550 |
} else{ |
1551 |
s->ac_pred = 0; |
1552 |
cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors |
1553 |
if(s->pict_type==P_TYPE) cbp^=0x3C; |
1554 |
} |
1555 |
} |
1556 |
|
1557 |
s->dsp.clear_blocks(s->block[0]); |
1558 |
for (i = 0; i < 6; i++) { |
1559 |
if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
1560 |
{ |
1561 |
av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
1562 |
return -1; |
1563 |
} |
1564 |
} |
1565 |
return 0; |
1566 |
} |
1567 |
|
1568 |
static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
1569 |
{ |
1570 |
int cbp, code, i; |
1571 |
uint8_t *coded_val; |
1572 |
uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]; |
1573 |
|
1574 |
if (s->pict_type == P_TYPE) { |
1575 |
set_stat(ST_INTER_MB); |
1576 |
if (s->use_skip_mb_code) { |
1577 |
if (get_bits1(&s->gb)) { |
1578 |
/* skip mb */ |
1579 |
s->mb_intra = 0; |
1580 |
for(i=0;i<6;i++) |
1581 |
s->block_last_index[i] = -1; |
1582 |
s->mv_dir = MV_DIR_FORWARD; |
1583 |
s->mv_type = MV_TYPE_16X16; |
1584 |
s->mv[0][0][0] = 0; |
1585 |
s->mv[0][0][1] = 0; |
1586 |
s->mb_skipped = 1; |
1587 |
*mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; |
1588 |
|
1589 |
return 0; |
1590 |
} |
1591 |
} |
1592 |
|
1593 |
code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3); |
1594 |
if (code < 0) |
1595 |
return -1; |
1596 |
//s->mb_intra = (code & 0x40) ? 0 : 1; |
1597 |
s->mb_intra = (~code & 0x40) >> 6; |
1598 |
|
1599 |
cbp = code & 0x3f; |
1600 |
} else { |
1601 |
set_stat(ST_INTRA_MB); |
1602 |
s->mb_intra = 1; |
1603 |
code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); |
1604 |
if (code < 0) |
1605 |
return -1; |
1606 |
/* predict coded block pattern */ |
1607 |
cbp = 0; |
1608 |
for(i=0;i<6;i++) { |
1609 |
int val = ((code >> (5 - i)) & 1); |
1610 |
if (i < 4) { |
1611 |
int pred = coded_block_pred(s, i, &coded_val); |
1612 |
val = val ^ pred; |
1613 |
*coded_val = val; |
1614 |
} |
1615 |
cbp |= val << (5 - i); |
1616 |
} |
1617 |
} |
1618 |
|
1619 |
if (!s->mb_intra) { |
1620 |
int mx, my; |
1621 |
//printf("P at %d %d\n", s->mb_x, s->mb_y); |
1622 |
if(s->per_mb_rl_table && cbp){ |
1623 |
s->rl_table_index = decode012(&s->gb); |
1624 |
s->rl_chroma_table_index = s->rl_table_index; |
1625 |
} |
1626 |
set_stat(ST_MV); |
1627 |
h263_pred_motion(s, 0, 0, &mx, &my); |
1628 |
if (msmpeg4_decode_motion(s, &mx, &my) < 0) |
1629 |
return -1; |
1630 |
s->mv_dir = MV_DIR_FORWARD; |
1631 |
s->mv_type = MV_TYPE_16X16; |
1632 |
s->mv[0][0][0] = mx; |
1633 |
s->mv[0][0][1] = my; |
1634 |
*mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16; |
1635 |
} else { |
1636 |
//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)); |
1637 |
set_stat(ST_INTRA_MB); |
1638 |
s->ac_pred = get_bits1(&s->gb); |
1639 |
*mb_type_ptr = MB_TYPE_INTRA; |
1640 |
if(s->inter_intra_pred){ |
1641 |
s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1); |
1642 |
// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); |
1643 |
} |
1644 |
if(s->per_mb_rl_table && cbp){ |
1645 |
s->rl_table_index = decode012(&s->gb); |
1646 |
s->rl_chroma_table_index = s->rl_table_index; |
1647 |
} |
1648 |
} |
1649 |
|
1650 |
s->dsp.clear_blocks(s->block[0]); |
1651 |
for (i = 0; i < 6; i++) { |
1652 |
if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
1653 |
{ |
1654 |
av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
1655 |
return -1; |
1656 |
} |
1657 |
} |
1658 |
|
1659 |
return 0; |
1660 |
} |
1661 |
//#define ERROR_DETAILS |
1662 |
static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
1482 |
static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
1663 |
int n, int coded, const uint8_t *scan_table) |
1483 |
int n, int coded, const uint8_t *scan_table) |
1664 |
{ |
1484 |
{ |
Lines 1909-1914
Link Here
|
1909 |
return 0; |
1729 |
return 0; |
1910 |
} |
1730 |
} |
1911 |
|
1731 |
|
|
|
1732 |
static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
1733 |
{ |
1734 |
int cbp, code, i; |
1735 |
|
1736 |
if (s->pict_type == P_TYPE) { |
1737 |
if (s->use_skip_mb_code) { |
1738 |
if (get_bits1(&s->gb)) { |
1739 |
/* skip mb */ |
1740 |
s->mb_intra = 0; |
1741 |
for(i=0;i<6;i++) |
1742 |
s->block_last_index[i] = -1; |
1743 |
s->mv_dir = MV_DIR_FORWARD; |
1744 |
s->mv_type = MV_TYPE_16X16; |
1745 |
s->mv[0][0][0] = 0; |
1746 |
s->mv[0][0][1] = 0; |
1747 |
s->mb_skipped = 1; |
1748 |
return 0; |
1749 |
} |
1750 |
} |
1751 |
|
1752 |
if(s->msmpeg4_version==2) |
1753 |
code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1); |
1754 |
else |
1755 |
code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3); |
1756 |
if(code<0 || code>7){ |
1757 |
av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y); |
1758 |
return -1; |
1759 |
} |
1760 |
|
1761 |
s->mb_intra = code >>2; |
1762 |
|
1763 |
cbp = code & 0x3; |
1764 |
} else { |
1765 |
s->mb_intra = 1; |
1766 |
if(s->msmpeg4_version==2) |
1767 |
cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1); |
1768 |
else |
1769 |
cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1); |
1770 |
if(cbp<0 || cbp>3){ |
1771 |
av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); |
1772 |
return -1; |
1773 |
} |
1774 |
} |
1775 |
|
1776 |
if (!s->mb_intra) { |
1777 |
int mx, my, cbpy; |
1778 |
|
1779 |
cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
1780 |
if(cbpy<0){ |
1781 |
av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); |
1782 |
return -1; |
1783 |
} |
1784 |
|
1785 |
cbp|= cbpy<<2; |
1786 |
if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C; |
1787 |
|
1788 |
h263_pred_motion(s, 0, 0, &mx, &my); |
1789 |
mx= msmpeg4v2_decode_motion(s, mx, 1); |
1790 |
my= msmpeg4v2_decode_motion(s, my, 1); |
1791 |
|
1792 |
s->mv_dir = MV_DIR_FORWARD; |
1793 |
s->mv_type = MV_TYPE_16X16; |
1794 |
s->mv[0][0][0] = mx; |
1795 |
s->mv[0][0][1] = my; |
1796 |
} else { |
1797 |
if(s->msmpeg4_version==2){ |
1798 |
s->ac_pred = get_bits1(&s->gb); |
1799 |
cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors |
1800 |
} else{ |
1801 |
s->ac_pred = 0; |
1802 |
cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors |
1803 |
if(s->pict_type==P_TYPE) cbp^=0x3C; |
1804 |
} |
1805 |
} |
1806 |
|
1807 |
s->dsp.clear_blocks(s->block[0]); |
1808 |
for (i = 0; i < 6; i++) { |
1809 |
if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
1810 |
{ |
1811 |
av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
1812 |
return -1; |
1813 |
} |
1814 |
} |
1815 |
return 0; |
1816 |
} |
1817 |
|
1818 |
static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
1819 |
{ |
1820 |
int cbp, code, i; |
1821 |
uint8_t *coded_val; |
1822 |
uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]; |
1823 |
|
1824 |
if (s->pict_type == P_TYPE) { |
1825 |
set_stat(ST_INTER_MB); |
1826 |
if (s->use_skip_mb_code) { |
1827 |
if (get_bits1(&s->gb)) { |
1828 |
/* skip mb */ |
1829 |
s->mb_intra = 0; |
1830 |
for(i=0;i<6;i++) |
1831 |
s->block_last_index[i] = -1; |
1832 |
s->mv_dir = MV_DIR_FORWARD; |
1833 |
s->mv_type = MV_TYPE_16X16; |
1834 |
s->mv[0][0][0] = 0; |
1835 |
s->mv[0][0][1] = 0; |
1836 |
s->mb_skipped = 1; |
1837 |
*mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; |
1838 |
|
1839 |
return 0; |
1840 |
} |
1841 |
} |
1842 |
|
1843 |
code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3); |
1844 |
if (code < 0) |
1845 |
return -1; |
1846 |
//s->mb_intra = (code & 0x40) ? 0 : 1; |
1847 |
s->mb_intra = (~code & 0x40) >> 6; |
1848 |
|
1849 |
cbp = code & 0x3f; |
1850 |
} else { |
1851 |
set_stat(ST_INTRA_MB); |
1852 |
s->mb_intra = 1; |
1853 |
code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); |
1854 |
if (code < 0) |
1855 |
return -1; |
1856 |
/* predict coded block pattern */ |
1857 |
cbp = 0; |
1858 |
for(i=0;i<6;i++) { |
1859 |
int val = ((code >> (5 - i)) & 1); |
1860 |
if (i < 4) { |
1861 |
int pred = coded_block_pred(s, i, &coded_val); |
1862 |
val = val ^ pred; |
1863 |
*coded_val = val; |
1864 |
} |
1865 |
cbp |= val << (5 - i); |
1866 |
} |
1867 |
} |
1868 |
|
1869 |
if (!s->mb_intra) { |
1870 |
int mx, my; |
1871 |
//printf("P at %d %d\n", s->mb_x, s->mb_y); |
1872 |
if(s->per_mb_rl_table && cbp){ |
1873 |
s->rl_table_index = decode012(&s->gb); |
1874 |
s->rl_chroma_table_index = s->rl_table_index; |
1875 |
} |
1876 |
set_stat(ST_MV); |
1877 |
h263_pred_motion(s, 0, 0, &mx, &my); |
1878 |
if (msmpeg4_decode_motion(s, &mx, &my) < 0) |
1879 |
return -1; |
1880 |
s->mv_dir = MV_DIR_FORWARD; |
1881 |
s->mv_type = MV_TYPE_16X16; |
1882 |
s->mv[0][0][0] = mx; |
1883 |
s->mv[0][0][1] = my; |
1884 |
*mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16; |
1885 |
} else { |
1886 |
//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)); |
1887 |
set_stat(ST_INTRA_MB); |
1888 |
s->ac_pred = get_bits1(&s->gb); |
1889 |
*mb_type_ptr = MB_TYPE_INTRA; |
1890 |
if(s->inter_intra_pred){ |
1891 |
s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1); |
1892 |
// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); |
1893 |
} |
1894 |
if(s->per_mb_rl_table && cbp){ |
1895 |
s->rl_table_index = decode012(&s->gb); |
1896 |
s->rl_chroma_table_index = s->rl_table_index; |
1897 |
} |
1898 |
} |
1899 |
|
1900 |
s->dsp.clear_blocks(s->block[0]); |
1901 |
for (i = 0; i < 6; i++) { |
1902 |
if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
1903 |
{ |
1904 |
av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
1905 |
return -1; |
1906 |
} |
1907 |
} |
1908 |
|
1909 |
return 0; |
1910 |
} |
1911 |
//#define ERROR_DETAILS |
1912 |
|
1912 |
static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |
1913 |
static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |
1913 |
{ |
1914 |
{ |
1914 |
int level, pred; |
1915 |
int level, pred; |