Mercurial > libavcodec.hg
comparison mpegvideo.c @ 1542:576861d6343a libavcodec
emu_edge checks simplification and avoid redundant checks for mpeg1/2 if emu_edge is set
author | michael |
---|---|
date | Fri, 17 Oct 2003 18:56:01 +0000 |
parents | 14d01ccc0081 |
children | 5d06823e2ee9 |
comparison
equal
deleted
inserted
replaced
1541:9c4921a51392 | 1542:576861d6343a |
---|---|
1112 //just to make sure that all data is rendered. | 1112 //just to make sure that all data is rendered. |
1113 if(s->avctx->xvmc_acceleration){ | 1113 if(s->avctx->xvmc_acceleration){ |
1114 XVMC_field_end(s); | 1114 XVMC_field_end(s); |
1115 }else | 1115 }else |
1116 #endif | 1116 #endif |
1117 if(s->codec_id!=CODEC_ID_SVQ1 && s->out_format != FMT_MPEG1){ | 1117 if(s->unrestricted_mv && s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) { |
1118 if (s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) { | |
1119 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH ); | 1118 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH ); |
1120 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2); | 1119 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2); |
1121 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2); | 1120 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2); |
1122 } | |
1123 } | 1121 } |
1124 emms_c(); | 1122 emms_c(); |
1125 | 1123 |
1126 s->last_pict_type = s->pict_type; | 1124 s->last_pict_type = s->pict_type; |
1127 if(s->pict_type!=B_TYPE){ | 1125 if(s->pict_type!=B_TYPE){ |
1686 | 1684 |
1687 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset; | 1685 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset; |
1688 | 1686 |
1689 dest_y+=dest_offset; | 1687 dest_y+=dest_offset; |
1690 if(s->flags&CODEC_FLAG_EMU_EDGE){ | 1688 if(s->flags&CODEC_FLAG_EMU_EDGE){ |
1691 if(src_x<0 || src_y<0 || src_x + 17 >= s->h_edge_pos | 1689 if( (unsigned)src_x >= s->h_edge_pos - 17 |
1692 || src_y + 17 >= s->v_edge_pos){ | 1690 || (unsigned)src_y >= s->v_edge_pos - 17){ |
1693 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos); | 1691 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos); |
1694 ptr= s->edge_emu_buffer; | 1692 ptr= s->edge_emu_buffer; |
1695 } | 1693 } |
1696 } | 1694 } |
1697 | 1695 |
1725 motion_y =0; | 1723 motion_y =0; |
1726 | 1724 |
1727 offset = (src_y * uvlinesize) + src_x + (src_offset>>1); | 1725 offset = (src_y * uvlinesize) + src_x + (src_offset>>1); |
1728 ptr = ref_picture[1] + offset; | 1726 ptr = ref_picture[1] + offset; |
1729 if(s->flags&CODEC_FLAG_EMU_EDGE){ | 1727 if(s->flags&CODEC_FLAG_EMU_EDGE){ |
1730 if(src_x<0 || src_y<0 || src_x + 9 >= s->h_edge_pos>>1 | 1728 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9 |
1731 || src_y + 9 >= s->v_edge_pos>>1){ | 1729 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){ |
1732 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); | 1730 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); |
1733 ptr= s->edge_emu_buffer; | 1731 ptr= s->edge_emu_buffer; |
1734 emu=1; | 1732 emu=1; |
1735 } | 1733 } |
1736 } | 1734 } |
1915 linesize = s->current_picture.linesize[0] << field_based; | 1913 linesize = s->current_picture.linesize[0] << field_based; |
1916 uvlinesize = s->current_picture.linesize[1] << field_based; | 1914 uvlinesize = s->current_picture.linesize[1] << field_based; |
1917 ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset; | 1915 ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset; |
1918 dest_y += dest_offset; | 1916 dest_y += dest_offset; |
1919 | 1917 |
1920 if(s->flags&CODEC_FLAG_EMU_EDGE){ | 1918 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){ |
1921 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos | 1919 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16 |
1922 || src_y + (motion_y&1) + h > v_edge_pos){ | 1920 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){ |
1923 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, //FIXME linesize? and uv below | 1921 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, //FIXME linesize? and uv below |
1924 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos); | 1922 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos); |
1925 ptr= s->edge_emu_buffer + src_offset; | 1923 ptr= s->edge_emu_buffer + src_offset; |
1926 emu=1; | 1924 emu=1; |
1927 } | 1925 } |
2001 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset; | 1999 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset; |
2002 dest_y += dest_offset; | 2000 dest_y += dest_offset; |
2003 //printf("%d %d %d\n", src_x, src_y, dxy); | 2001 //printf("%d %d %d\n", src_x, src_y, dxy); |
2004 | 2002 |
2005 if(s->flags&CODEC_FLAG_EMU_EDGE){ | 2003 if(s->flags&CODEC_FLAG_EMU_EDGE){ |
2006 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos | 2004 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16 |
2007 || src_y + (motion_y&3) + h > v_edge_pos){ | 2005 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){ |
2008 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, | 2006 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, |
2009 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos); | 2007 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos); |
2010 ptr= s->edge_emu_buffer + src_offset; | 2008 ptr= s->edge_emu_buffer + src_offset; |
2011 emu=1; | 2009 emu=1; |
2012 } | 2010 } |
2153 if (src_y == s->height) | 2151 if (src_y == s->height) |
2154 dxy &= ~12; | 2152 dxy &= ~12; |
2155 | 2153 |
2156 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x); | 2154 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x); |
2157 if(s->flags&CODEC_FLAG_EMU_EDGE){ | 2155 if(s->flags&CODEC_FLAG_EMU_EDGE){ |
2158 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos | 2156 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8 |
2159 || src_y + (motion_y&3) + 8 > s->v_edge_pos){ | 2157 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){ |
2160 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); | 2158 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); |
2161 ptr= s->edge_emu_buffer; | 2159 ptr= s->edge_emu_buffer; |
2162 } | 2160 } |
2163 } | 2161 } |
2164 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; | 2162 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; |
2184 if (src_y == s->height) | 2182 if (src_y == s->height) |
2185 dxy &= ~2; | 2183 dxy &= ~2; |
2186 | 2184 |
2187 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x); | 2185 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x); |
2188 if(s->flags&CODEC_FLAG_EMU_EDGE){ | 2186 if(s->flags&CODEC_FLAG_EMU_EDGE){ |
2189 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos | 2187 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 8 |
2190 || src_y + (motion_y&1) + 8 > s->v_edge_pos){ | 2188 || (unsigned)src_y > s->v_edge_pos - (motion_y&1) - 8){ |
2191 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); | 2189 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); |
2192 ptr= s->edge_emu_buffer; | 2190 ptr= s->edge_emu_buffer; |
2193 } | 2191 } |
2194 } | 2192 } |
2195 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; | 2193 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; |
2219 dxy &= ~2; | 2217 dxy &= ~2; |
2220 | 2218 |
2221 offset = (src_y * (s->uvlinesize)) + src_x; | 2219 offset = (src_y * (s->uvlinesize)) + src_x; |
2222 ptr = ref_picture[1] + offset; | 2220 ptr = ref_picture[1] + offset; |
2223 if(s->flags&CODEC_FLAG_EMU_EDGE){ | 2221 if(s->flags&CODEC_FLAG_EMU_EDGE){ |
2224 if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1 | 2222 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8 |
2225 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){ | 2223 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){ |
2226 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); | 2224 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); |
2227 ptr= s->edge_emu_buffer; | 2225 ptr= s->edge_emu_buffer; |
2228 emu=1; | 2226 emu=1; |
2229 } | 2227 } |
2230 } | 2228 } |