Mercurial > libavcodec.hg
comparison mpeg12.c @ 2202:8079b177ff5c libavcodec
optional non spec compliant optimizations for mpeg1
author | michael |
---|---|
date | Thu, 02 Sep 2004 15:46:03 +0000 |
parents | ccff80bb955f |
children | edf4787f3baf |
comparison
equal
deleted
inserted
replaced
2201:ccff80bb955f | 2202:8079b177ff5c |
---|---|
62 DCTELEM *block, | 62 DCTELEM *block, |
63 int n); | 63 int n); |
64 static inline int mpeg1_decode_block_intra(MpegEncContext *s, | 64 static inline int mpeg1_decode_block_intra(MpegEncContext *s, |
65 DCTELEM *block, | 65 DCTELEM *block, |
66 int n); | 66 int n); |
67 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n); | |
67 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, | 68 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, |
68 DCTELEM *block, | 69 DCTELEM *block, |
69 int n); | 70 int n); |
70 static inline int mpeg2_decode_block_intra(MpegEncContext *s, | 71 static inline int mpeg2_decode_block_intra(MpegEncContext *s, |
71 DCTELEM *block, | 72 DCTELEM *block, |
1380 } | 1381 } |
1381 cbp+=cbp; | 1382 cbp+=cbp; |
1382 } | 1383 } |
1383 } | 1384 } |
1384 } else { | 1385 } else { |
1385 for(i=0;i<6;i++) { | 1386 if(s->flags2 & CODEC_FLAG2_FAST){ |
1386 if (cbp & 32) { | 1387 for(i=0;i<6;i++) { |
1387 if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) | 1388 if (cbp & 32) { |
1388 return -1; | 1389 mpeg1_fast_decode_block_inter(s, s->pblocks[i], i); |
1389 } else { | 1390 } else { |
1390 s->block_last_index[i] = -1; | 1391 s->block_last_index[i] = -1; |
1392 } | |
1393 cbp+=cbp; | |
1391 } | 1394 } |
1392 cbp+=cbp; | 1395 }else{ |
1396 for(i=0;i<6;i++) { | |
1397 if (cbp & 32) { | |
1398 if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) | |
1399 return -1; | |
1400 } else { | |
1401 s->block_last_index[i] = -1; | |
1402 } | |
1403 cbp+=cbp; | |
1404 } | |
1393 } | 1405 } |
1394 } | 1406 } |
1395 }else{ | 1407 }else{ |
1396 for(i=0;i<6;i++) | 1408 for(i=0;i<6;i++) |
1397 s->block_last_index[i] = -1; | 1409 s->block_last_index[i] = -1; |
1601 CLOSE_READER(re, &s->gb); | 1613 CLOSE_READER(re, &s->gb); |
1602 } | 1614 } |
1603 s->block_last_index[n] = i; | 1615 s->block_last_index[n] = i; |
1604 return 0; | 1616 return 0; |
1605 } | 1617 } |
1618 | |
1619 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n) | |
1620 { | |
1621 int level, i, j, run; | |
1622 RLTable *rl = &rl_mpeg1; | |
1623 uint8_t * const scantable= s->intra_scantable.permutated; | |
1624 const int qscale= s->qscale; | |
1625 | |
1626 { | |
1627 int v; | |
1628 OPEN_READER(re, &s->gb); | |
1629 i = -1; | |
1630 /* special case for the first coef. no need to add a second vlc table */ | |
1631 UPDATE_CACHE(re, &s->gb); | |
1632 v= SHOW_UBITS(re, &s->gb, 2); | |
1633 if (v & 2) { | |
1634 LAST_SKIP_BITS(re, &s->gb, 2); | |
1635 level= (3*qscale)>>4; | |
1636 level= (level-1)|1; | |
1637 if(v&1) | |
1638 level= -level; | |
1639 block[0] = level; | |
1640 i++; | |
1641 } | |
1642 | |
1643 /* now quantify & encode AC coefs */ | |
1644 for(;;) { | |
1645 UPDATE_CACHE(re, &s->gb); | |
1646 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2); | |
1647 | |
1648 if(level == 127){ | |
1649 break; | |
1650 } else if(level != 0) { | |
1651 i += run; | |
1652 j = scantable[i]; | |
1653 level= ((level*2+1)*qscale)>>1; | |
1654 level= (level-1)|1; | |
1655 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
1656 LAST_SKIP_BITS(re, &s->gb, 1); | |
1657 } else { | |
1658 /* escape */ | |
1659 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
1660 UPDATE_CACHE(re, &s->gb); | |
1661 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | |
1662 if (level == -128) { | |
1663 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); | |
1664 } else if (level == 0) { | |
1665 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8); | |
1666 } | |
1667 i += run; | |
1668 j = scantable[i]; | |
1669 if(level<0){ | |
1670 level= -level; | |
1671 level= ((level*2+1)*qscale)>>1; | |
1672 level= (level-1)|1; | |
1673 level= -level; | |
1674 }else{ | |
1675 level= ((level*2+1)*qscale)>>1; | |
1676 level= (level-1)|1; | |
1677 } | |
1678 } | |
1679 | |
1680 block[j] = level; | |
1681 } | |
1682 CLOSE_READER(re, &s->gb); | |
1683 } | |
1684 s->block_last_index[n] = i; | |
1685 return 0; | |
1686 } | |
1687 | |
1606 | 1688 |
1607 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, | 1689 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, |
1608 DCTELEM *block, | 1690 DCTELEM *block, |
1609 int n) | 1691 int n) |
1610 { | 1692 { |