Mercurial > libavcodec.hg
comparison msmpeg4.c @ 542:d55978a3c369 libavcodec
rl vlc decoding optimizations
author | michaelni |
---|---|
date | Sat, 13 Jul 2002 14:55:12 +0000 |
parents | f5d7fcc81787 |
children | 762c67fd4078 |
comparison
equal
deleted
inserted
replaced
541:4273be971bf8 | 542:d55978a3c369 |
---|---|
1627 } | 1627 } |
1628 | 1628 |
1629 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | 1629 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
1630 int n, int coded) | 1630 int n, int coded) |
1631 { | 1631 { |
1632 int code, level, i, j, last, run, run_diff; | 1632 int level, i, last, run, run_diff; |
1633 int dc_pred_dir; | 1633 int dc_pred_dir; |
1634 RLTable *rl; | 1634 RLTable *rl; |
1635 RL_VLC_ELEM *rl_vlc; | |
1635 const UINT8 *scan_table; | 1636 const UINT8 *scan_table; |
1636 int qmul, qadd; | 1637 int qmul, qadd; |
1637 | 1638 |
1638 if (s->mb_intra) { | 1639 if (s->mb_intra) { |
1639 qmul=1; | 1640 qmul=1; |
1669 } | 1670 } |
1670 } | 1671 } |
1671 block[0] = level; | 1672 block[0] = level; |
1672 | 1673 |
1673 run_diff = 0; | 1674 run_diff = 0; |
1674 i = 1; | 1675 i = 0; |
1675 if (!coded) { | 1676 if (!coded) { |
1676 goto not_coded; | 1677 goto not_coded; |
1677 } | 1678 } |
1678 if (s->ac_pred) { | 1679 if (s->ac_pred) { |
1679 if (dc_pred_dir == 0) | 1680 if (dc_pred_dir == 0) |
1682 scan_table = s->intra_h_scantable; /* top */ | 1683 scan_table = s->intra_h_scantable; /* top */ |
1683 } else { | 1684 } else { |
1684 scan_table = s->intra_scantable; | 1685 scan_table = s->intra_scantable; |
1685 } | 1686 } |
1686 set_stat(ST_INTRA_AC); | 1687 set_stat(ST_INTRA_AC); |
1688 rl_vlc= rl->rl_vlc[0]; | |
1687 } else { | 1689 } else { |
1688 qmul = s->qscale << 1; | 1690 qmul = s->qscale << 1; |
1689 qadd = (s->qscale - 1) | 1; | 1691 qadd = (s->qscale - 1) | 1; |
1690 i = 0; | 1692 i = -1; |
1691 rl = &rl_table[3 + s->rl_table_index]; | 1693 rl = &rl_table[3 + s->rl_table_index]; |
1692 | 1694 |
1693 if(s->msmpeg4_version==2) | 1695 if(s->msmpeg4_version==2) |
1694 run_diff = 0; | 1696 run_diff = 0; |
1695 else | 1697 else |
1696 run_diff = 1; | 1698 run_diff = 1; |
1697 | 1699 |
1698 if (!coded) { | 1700 if (!coded) { |
1699 s->block_last_index[n] = i - 1; | 1701 s->block_last_index[n] = i; |
1700 return 0; | 1702 return 0; |
1701 } | 1703 } |
1702 scan_table = s->inter_scantable; | 1704 scan_table = s->inter_scantable; |
1703 set_stat(ST_INTER_AC); | 1705 set_stat(ST_INTER_AC); |
1704 } | 1706 rl_vlc= rl->rl_vlc[s->qscale]; |
1705 | 1707 } |
1708 { | |
1709 OPEN_READER(re, &s->gb); | |
1706 for(;;) { | 1710 for(;;) { |
1707 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); | 1711 UPDATE_CACHE(re, &s->gb); |
1708 if (code < 0){ | 1712 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2); |
1709 fprintf(stderr, "illegal AC-VLC code at %d %d\n", s->mb_x, s->mb_y); | 1713 if (level==0) { |
1710 return -1; | 1714 int cache; |
1711 } | 1715 cache= GET_CACHE(re, &s->gb); |
1712 if (code == rl->n) { | |
1713 /* escape */ | 1716 /* escape */ |
1714 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) { | 1717 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) { |
1715 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) { | 1718 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) { |
1716 /* third escape */ | 1719 /* third escape */ |
1720 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2); | |
1721 UPDATE_CACHE(re, &s->gb); | |
1717 if(s->msmpeg4_version<=3){ | 1722 if(s->msmpeg4_version<=3){ |
1718 last= get_bits1(&s->gb); | 1723 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); |
1719 run= get_bits(&s->gb, 6); | 1724 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6); |
1720 level= get_bits(&s->gb, 8); | 1725 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8); |
1721 level= ((int8_t)level); | 1726 SKIP_COUNTER(re, &s->gb, 1+6+8); |
1722 }else{ | 1727 }else{ |
1723 int sign; | 1728 int sign; |
1724 last= get_bits1(&s->gb); | 1729 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1); |
1725 if(!s->esc3_level_length){ | 1730 if(!s->esc3_level_length){ |
1726 int ll; | 1731 int ll; |
1727 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y); | 1732 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y); |
1728 if(s->qscale<8){ | 1733 if(s->qscale<8){ |
1729 ll= get_bits(&s->gb, 3); | 1734 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3); |
1730 if(ll==0){ | 1735 if(ll==0){ |
1731 if(get_bits1(&s->gb)) printf("cool a new vlc code ,contact the ffmpeg developers and upload the file\n"); | 1736 if(SHOW_UBITS(re, &s->gb, 1)) printf("cool a new vlc code ,contact the ffmpeg developers and upload the file\n"); |
1737 SKIP_BITS(re, &s->gb, 1); | |
1732 ll=8; | 1738 ll=8; |
1733 } | 1739 } |
1734 }else{ | 1740 }else{ |
1735 ll=2; | 1741 ll=2; |
1736 while(ll<8 && get_bits1(&s->gb)==0) ll++; | 1742 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){ |
1743 ll++; | |
1744 SKIP_BITS(re, &s->gb, 1); | |
1745 } | |
1746 SKIP_BITS(re, &s->gb, 1); | |
1737 } | 1747 } |
1738 | 1748 |
1739 s->esc3_level_length= ll; | 1749 s->esc3_level_length= ll; |
1740 s->esc3_run_length= get_bits(&s->gb, 2) + 3; | 1750 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2); |
1741 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length); | 1751 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length); |
1742 } | 1752 } |
1743 run= get_bits(&s->gb, s->esc3_run_length); | 1753 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length); |
1744 sign= get_bits1(&s->gb); | 1754 SKIP_BITS(re, &s->gb, s->esc3_run_length); |
1745 level= get_bits(&s->gb, s->esc3_level_length); | 1755 |
1756 sign= SHOW_UBITS(re, &s->gb, 1); | |
1757 SKIP_BITS(re, &s->gb, 1); | |
1758 | |
1759 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length); | |
1760 SKIP_BITS(re, &s->gb, s->esc3_level_length); | |
1746 if(sign) level= -level; | 1761 if(sign) level= -level; |
1747 } | 1762 } |
1748 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y); | 1763 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y); |
1749 #if 0 // waste of time / this will detect very few errors | 1764 #if 0 // waste of time / this will detect very few errors |
1750 { | 1765 { |
1773 if(level>2048 || level<-2048){ | 1788 if(level>2048 || level<-2048){ |
1774 fprintf(stderr, "|level| overflow in 3. esc\n"); | 1789 fprintf(stderr, "|level| overflow in 3. esc\n"); |
1775 return DECODING_AC_LOST; | 1790 return DECODING_AC_LOST; |
1776 } | 1791 } |
1777 #endif | 1792 #endif |
1793 i+= run + 1; | |
1794 if(last) i+=192; | |
1778 } else { | 1795 } else { |
1779 /* second escape */ | 1796 /* second escape */ |
1780 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); | 1797 #if MIN_CACHE_BITS < 23 |
1781 if (code < 0 || code >= rl->n){ | 1798 LAST_SKIP_BITS(re, &s->gb, 2); |
1782 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y); | 1799 UPDATE_CACHE(re, &s->gb); |
1783 return -1; | 1800 #else |
1784 } | 1801 SKIP_BITS(re, &s->gb, 2); |
1785 run = rl->table_run[code]; | 1802 #endif |
1786 level = rl->table_level[code]; | 1803 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2); |
1787 last = code >= rl->last; | 1804 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing |
1788 run += rl->max_run[last][level] + run_diff; | 1805 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
1789 level= level * qmul + qadd; | 1806 LAST_SKIP_BITS(re, &s->gb, 1); |
1790 if (get_bits1(&s->gb)) | |
1791 level = -level; | |
1792 } | 1807 } |
1793 } else { | 1808 } else { |
1794 /* first escape */ | 1809 /* first escape */ |
1795 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); | 1810 #if MIN_CACHE_BITS < 22 |
1796 if (code < 0 || code >= rl->n){ | 1811 LAST_SKIP_BITS(re, &s->gb, 1); |
1797 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y); | 1812 UPDATE_CACHE(re, &s->gb); |
1798 return -1; | 1813 #else |
1799 } | 1814 SKIP_BITS(re, &s->gb, 1); |
1800 run = rl->table_run[code]; | 1815 #endif |
1801 level = rl->table_level[code]; | 1816 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2); |
1802 last = code >= rl->last; | 1817 i+= run; |
1803 level += rl->max_level[last][run]; | 1818 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing |
1804 level= level * qmul + qadd; | 1819 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
1805 if (get_bits1(&s->gb)) | 1820 LAST_SKIP_BITS(re, &s->gb, 1); |
1806 level = -level; | |
1807 } | 1821 } |
1808 } else { | 1822 } else { |
1809 run = rl->table_run[code]; | 1823 i+= run; |
1810 level = rl->table_level[code] * qmul + qadd; | 1824 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
1811 last = code >= rl->last; | 1825 LAST_SKIP_BITS(re, &s->gb, 1); |
1812 if (get_bits1(&s->gb)) | 1826 } |
1813 level = -level; | 1827 if (i > 62){ |
1814 } | 1828 i-= 192; |
1815 i += run; | 1829 if(i&(~63)){ |
1816 if (i >= 64){ | 1830 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
1817 fprintf(stderr, "run too long at %d %d\n", s->mb_x, s->mb_y); | 1831 return -1; |
1818 return -1; | 1832 } |
1819 } | 1833 |
1820 | 1834 block[scan_table[i]] = level; |
1821 j = scan_table[i]; | |
1822 block[j] = level; | |
1823 i++; | |
1824 if (last) | |
1825 break; | 1835 break; |
1826 } | 1836 } |
1837 | |
1838 block[scan_table[i]] = level; | |
1839 } | |
1840 CLOSE_READER(re, &s->gb); | |
1841 } | |
1827 not_coded: | 1842 not_coded: |
1828 if (s->mb_intra) { | 1843 if (s->mb_intra) { |
1829 mpeg4_pred_ac(s, block, n, dc_pred_dir); | 1844 mpeg4_pred_ac(s, block, n, dc_pred_dir); |
1830 if (s->ac_pred) { | 1845 if (s->ac_pred) { |
1831 i = 64; /* XXX: not optimal */ | 1846 i = 63; /* XXX: not optimal */ |
1832 } | 1847 } |
1833 } | 1848 } |
1834 if(s->msmpeg4_version==4 && i>1) i=64; //FIXME/XXX optimize | 1849 if(s->msmpeg4_version==4 && i>0) i=63; //FIXME/XXX optimize |
1835 s->block_last_index[n] = i - 1; | 1850 s->block_last_index[n] = i; |
1836 | 1851 |
1837 return 0; | 1852 return 0; |
1838 } | 1853 } |
1839 | 1854 |
1840 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) | 1855 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |