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){