Mercurial > libavcodec.hg
comparison mpegvideo.c @ 570:274d9c5a75ee libavcodec
use edge emu for encoding of width or height %16!=0 files
author | michaelni |
---|---|
date | Wed, 17 Jul 2002 23:32:31 +0000 |
parents | 395bb978b9ff |
children | 23eee7d73c4b |
comparison
equal
deleted
inserted
replaced
569:395bb978b9ff | 570:274d9c5a75ee |
---|---|
1638 for(i=0; i<6; i++) skip_dct[i]=0; | 1638 for(i=0; i<6; i++) skip_dct[i]=0; |
1639 | 1639 |
1640 if (s->mb_intra) { | 1640 if (s->mb_intra) { |
1641 UINT8 *ptr; | 1641 UINT8 *ptr; |
1642 int wrap; | 1642 int wrap; |
1643 int emu=0; | |
1643 | 1644 |
1644 wrap = s->linesize; | 1645 wrap = s->linesize; |
1645 ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16; | 1646 ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16; |
1647 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ | |
1648 emulated_edge_mc(s, ptr, wrap, 16, 16, mb_x*16, mb_y*16, s->width, s->height); | |
1649 ptr= s->edge_emu_buffer; | |
1650 emu=1; | |
1651 } | |
1646 get_pixels(s->block[0], ptr , wrap); | 1652 get_pixels(s->block[0], ptr , wrap); |
1647 get_pixels(s->block[1], ptr + 8, wrap); | 1653 get_pixels(s->block[1], ptr + 8, wrap); |
1648 get_pixels(s->block[2], ptr + 8 * wrap , wrap); | 1654 get_pixels(s->block[2], ptr + 8 * wrap , wrap); |
1649 get_pixels(s->block[3], ptr + 8 * wrap + 8, wrap); | 1655 get_pixels(s->block[3], ptr + 8 * wrap + 8, wrap); |
1650 | 1656 |
1652 skip_dct[4]= 1; | 1658 skip_dct[4]= 1; |
1653 skip_dct[5]= 1; | 1659 skip_dct[5]= 1; |
1654 }else{ | 1660 }else{ |
1655 wrap >>=1; | 1661 wrap >>=1; |
1656 ptr = s->new_picture[1] + (mb_y * 8 * wrap) + mb_x * 8; | 1662 ptr = s->new_picture[1] + (mb_y * 8 * wrap) + mb_x * 8; |
1663 if(emu){ | |
1664 emulated_edge_mc(s, ptr, wrap, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | |
1665 ptr= s->edge_emu_buffer; | |
1666 } | |
1657 get_pixels(s->block[4], ptr, wrap); | 1667 get_pixels(s->block[4], ptr, wrap); |
1658 | 1668 |
1659 ptr = s->new_picture[2] + (mb_y * 8 * wrap) + mb_x * 8; | 1669 ptr = s->new_picture[2] + (mb_y * 8 * wrap) + mb_x * 8; |
1670 if(emu){ | |
1671 emulated_edge_mc(s, ptr, wrap, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | |
1672 ptr= s->edge_emu_buffer; | |
1673 } | |
1660 get_pixels(s->block[5], ptr, wrap); | 1674 get_pixels(s->block[5], ptr, wrap); |
1661 } | 1675 } |
1662 }else{ | 1676 }else{ |
1663 op_pixels_func *op_pix; | 1677 op_pixels_func *op_pix; |
1664 qpel_mc_func *op_qpix; | 1678 qpel_mc_func *op_qpix; |
1665 UINT8 *dest_y, *dest_cb, *dest_cr; | 1679 UINT8 *dest_y, *dest_cb, *dest_cr; |
1666 UINT8 *ptr_y, *ptr_cb, *ptr_cr; | 1680 UINT8 *ptr_y, *ptr_cb, *ptr_cr; |
1667 int wrap_y, wrap_c; | 1681 int wrap_y, wrap_c; |
1682 int emu=0; | |
1668 | 1683 |
1669 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize ) + mb_x * 16; | 1684 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize ) + mb_x * 16; |
1670 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8; | 1685 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8; |
1671 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8; | 1686 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8; |
1672 wrap_y = s->linesize; | 1687 wrap_y = s->linesize; |
1692 } | 1707 } |
1693 if (s->mv_dir & MV_DIR_BACKWARD) { | 1708 if (s->mv_dir & MV_DIR_BACKWARD) { |
1694 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix); | 1709 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix); |
1695 } | 1710 } |
1696 | 1711 |
1712 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ | |
1713 emulated_edge_mc(s, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height); | |
1714 ptr_y= s->edge_emu_buffer; | |
1715 emu=1; | |
1716 } | |
1697 diff_pixels(s->block[0], ptr_y , dest_y , wrap_y); | 1717 diff_pixels(s->block[0], ptr_y , dest_y , wrap_y); |
1698 diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y); | 1718 diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y); |
1699 diff_pixels(s->block[2], ptr_y + 8 * wrap_y , dest_y + 8 * wrap_y , wrap_y); | 1719 diff_pixels(s->block[2], ptr_y + 8 * wrap_y , dest_y + 8 * wrap_y , wrap_y); |
1700 diff_pixels(s->block[3], ptr_y + 8 * wrap_y + 8, dest_y + 8 * wrap_y + 8, wrap_y); | 1720 diff_pixels(s->block[3], ptr_y + 8 * wrap_y + 8, dest_y + 8 * wrap_y + 8, wrap_y); |
1701 | 1721 |
1702 if(s->flags&CODEC_FLAG_GRAY){ | 1722 if(s->flags&CODEC_FLAG_GRAY){ |
1703 skip_dct[4]= 1; | 1723 skip_dct[4]= 1; |
1704 skip_dct[5]= 1; | 1724 skip_dct[5]= 1; |
1705 }else{ | 1725 }else{ |
1726 if(emu){ | |
1727 emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | |
1728 ptr_cb= s->edge_emu_buffer; | |
1729 } | |
1706 diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c); | 1730 diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c); |
1731 if(emu){ | |
1732 emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | |
1733 ptr_cr= s->edge_emu_buffer; | |
1734 } | |
1707 diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); | 1735 diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); |
1708 } | 1736 } |
1709 | 1737 |
1710 /* pre quantization */ | 1738 /* pre quantization */ |
1711 if(s->mc_mb_var[s->mb_width*mb_y+ mb_x]<2*s->qscale*s->qscale){ | 1739 if(s->mc_mb_var[s->mb_width*mb_y+ mb_x]<2*s->qscale*s->qscale){ |