Mercurial > libavcodec.hg
comparison mpeg12.c @ 2201:ccff80bb955f libavcodec
optional non spec compliant optimizations
| author | michael |
|---|---|
| date | Thu, 02 Sep 2004 15:30:46 +0000 |
| parents | 76334bbb5038 |
| children | 8079b177ff5c |
comparison
equal
deleted
inserted
replaced
| 2200:733c60a6e30c | 2201:ccff80bb955f |
|---|---|
| 68 DCTELEM *block, | 68 DCTELEM *block, |
| 69 int n); | 69 int n); |
| 70 static inline int mpeg2_decode_block_intra(MpegEncContext *s, | 70 static inline int mpeg2_decode_block_intra(MpegEncContext *s, |
| 71 DCTELEM *block, | 71 DCTELEM *block, |
| 72 int n); | 72 int n); |
| 73 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, DCTELEM *block, int n); | |
| 73 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); | 74 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); |
| 74 static void exchange_uv(MpegEncContext *s); | 75 static void exchange_uv(MpegEncContext *s); |
| 75 | 76 |
| 76 #ifdef HAVE_XVMC | 77 #ifdef HAVE_XVMC |
| 77 extern int XVMC_field_start(MpegEncContext *s, AVCodecContext *avctx); | 78 extern int XVMC_field_start(MpegEncContext *s, AVCodecContext *avctx); |
| 1356 } | 1357 } |
| 1357 } | 1358 } |
| 1358 #endif | 1359 #endif |
| 1359 | 1360 |
| 1360 if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | 1361 if (s->codec_id == CODEC_ID_MPEG2VIDEO) { |
| 1361 cbp<<= 12-mb_block_count; | 1362 if(s->flags2 & CODEC_FLAG2_FAST){ |
| 1362 | 1363 for(i=0;i<6;i++) { |
| 1363 for(i=0;i<mb_block_count;i++) { | 1364 if(cbp & 32) { |
| 1364 if ( cbp & (1<<11) ) { | 1365 mpeg2_fast_decode_block_non_intra(s, s->pblocks[i], i); |
| 1365 if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0) | 1366 } else { |
| 1366 return -1; | 1367 s->block_last_index[i] = -1; |
| 1367 } else { | 1368 } |
| 1368 s->block_last_index[i] = -1; | 1369 cbp+=cbp; |
| 1369 } | 1370 } |
| 1370 cbp+=cbp; | 1371 }else{ |
| 1372 cbp<<= 12-mb_block_count; | |
| 1373 | |
| 1374 for(i=0;i<mb_block_count;i++) { | |
| 1375 if ( cbp & (1<<11) ) { | |
| 1376 if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0) | |
| 1377 return -1; | |
| 1378 } else { | |
| 1379 s->block_last_index[i] = -1; | |
| 1380 } | |
| 1381 cbp+=cbp; | |
| 1382 } | |
| 1371 } | 1383 } |
| 1372 } else { | 1384 } else { |
| 1373 for(i=0;i<6;i++) { | 1385 for(i=0;i<6;i++) { |
| 1374 if (cbp & 32) { | 1386 if (cbp & 32) { |
| 1375 if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) | 1387 if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) |
| 1590 } | 1602 } |
| 1591 s->block_last_index[n] = i; | 1603 s->block_last_index[n] = i; |
| 1592 return 0; | 1604 return 0; |
| 1593 } | 1605 } |
| 1594 | 1606 |
| 1595 /* Also does unquantization here, since I will never support mpeg2 | |
| 1596 encoding */ | |
| 1597 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, | 1607 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, |
| 1598 DCTELEM *block, | 1608 DCTELEM *block, |
| 1599 int n) | 1609 int n) |
| 1600 { | 1610 { |
| 1601 int level, i, j, run; | 1611 int level, i, j, run; |
| 1670 block[63] ^= (mismatch & 1); | 1680 block[63] ^= (mismatch & 1); |
| 1671 | 1681 |
| 1672 s->block_last_index[n] = i; | 1682 s->block_last_index[n] = i; |
| 1673 return 0; | 1683 return 0; |
| 1674 } | 1684 } |
| 1685 | |
| 1686 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, | |
| 1687 DCTELEM *block, | |
| 1688 int n) | |
| 1689 { | |
| 1690 int level, i, j, run; | |
| 1691 RLTable *rl = &rl_mpeg1; | |
| 1692 uint8_t * const scantable= s->intra_scantable.permutated; | |
| 1693 const int qscale= s->qscale; | |
| 1694 int v; | |
| 1695 OPEN_READER(re, &s->gb); | |
| 1696 i = -1; | |
| 1697 | |
| 1698 /* special case for the first coef. no need to add a second vlc table */ | |
| 1699 UPDATE_CACHE(re, &s->gb); | |
| 1700 v= SHOW_UBITS(re, &s->gb, 2); | |
| 1701 if (v & 2) { | |
| 1702 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 1703 level= (3*qscale)>>1; | |
| 1704 if(v&1) | |
| 1705 level= -level; | |
| 1706 block[0] = level; | |
| 1707 i++; | |
| 1708 } | |
| 1709 | |
| 1710 /* now quantify & encode AC coefs */ | |
| 1711 for(;;) { | |
| 1712 UPDATE_CACHE(re, &s->gb); | |
| 1713 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2); | |
| 1714 | |
| 1715 if(level == 127){ | |
| 1716 break; | |
| 1717 } else if(level != 0) { | |
| 1718 i += run; | |
| 1719 j = scantable[i]; | |
| 1720 level= ((level*2+1)*qscale)>>1; | |
| 1721 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1722 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 1723 } else { | |
| 1724 /* escape */ | |
| 1725 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1726 UPDATE_CACHE(re, &s->gb); | |
| 1727 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 1728 | |
| 1729 i += run; | |
| 1730 j = scantable[i]; | |
| 1731 if(level<0){ | |
| 1732 level= ((-level*2+1)*qscale)>>1; | |
| 1733 level= -level; | |
| 1734 }else{ | |
| 1735 level= ((level*2+1)*qscale)>>1; | |
| 1736 } | |
| 1737 } | |
| 1738 | |
| 1739 block[j] = level; | |
| 1740 } | |
| 1741 CLOSE_READER(re, &s->gb); | |
| 1742 s->block_last_index[n] = i; | |
| 1743 return 0; | |
| 1744 } | |
| 1745 | |
| 1675 | 1746 |
| 1676 static inline int mpeg2_decode_block_intra(MpegEncContext *s, | 1747 static inline int mpeg2_decode_block_intra(MpegEncContext *s, |
| 1677 DCTELEM *block, | 1748 DCTELEM *block, |
| 1678 int n) | 1749 int n) |
| 1679 { | 1750 { |
