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 }