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 {