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)