@ -1218,21 +1218,26 @@ void vp8_mc(VP8Context *s, int luma,
vp8_mc_func mc_func [ 3 ] [ 3 ] )
vp8_mc_func mc_func [ 3 ] [ 3 ] )
{
{
if ( AV_RN32A ( mv ) ) {
if ( AV_RN32A ( mv ) ) {
static const uint8_t idx [ 8 ] = { 0 , 1 , 2 , 1 , 2 , 1 , 2 , 1 } ;
static const uint8_t idx [ 3 ] [ 8 ] = {
int mx = ( mv - > x < < luma ) & 7 , mx_idx = idx [ mx ] ;
{ 0 , 1 , 2 , 1 , 2 , 1 , 2 , 1 } , // nr. of left extra pixels,
int my = ( mv - > y < < luma ) & 7 , my_idx = idx [ my ] ;
// also function pointer index
{ 0 , 3 , 5 , 3 , 5 , 3 , 5 , 3 } , // nr. of extra pixels required
{ 0 , 2 , 3 , 2 , 3 , 2 , 3 , 2 } , // nr. of right extra pixels
} ;
int mx = ( mv - > x < < luma ) & 7 , mx_idx = idx [ 0 ] [ mx ] ;
int my = ( mv - > y < < luma ) & 7 , my_idx = idx [ 0 ] [ my ] ;
x_off + = mv - > x > > ( 3 - luma ) ;
x_off + = mv - > x > > ( 3 - luma ) ;
y_off + = mv - > y > > ( 3 - luma ) ;
y_off + = mv - > y > > ( 3 - luma ) ;
// edge emulation
// edge emulation
src + = y_off * linesize + x_off ;
src + = y_off * linesize + x_off ;
if ( x_off < 2 | | x_off > = width - block_w - 3 | |
if ( x_off < mx_idx | | x_off > = width - block_w - idx [ 2 ] [ mx ] | |
y_off < 2 | | y_off > = height - block_h - 3 ) {
y_off < my_idx | | y_off > = height - block_h - idx [ 2 ] [ my ] ) {
ff_emulated_edge_mc ( s - > edge_emu_buffer , src - 2 * linesize - 2 , linesize ,
ff_emulated_edge_mc ( s - > edge_emu_buffer , src - my_idx * linesize - mx_idx , linesize ,
block_w + 5 , block_h + 5 ,
block_w + idx [ 1 ] [ mx ] , block_h + idx [ 1 ] [ my ] ,
x_off - 2 , y_off - 2 , width , height ) ;
x_off - mx_idx , y_off - my_idx , width , height ) ;
src = s - > edge_emu_buffer + 2 + linesize * 2 ;
src = s - > edge_emu_buffer + mx_idx + linesize * my_idx ;
}
}
mc_func [ my_idx ] [ mx_idx ] ( dst , linesize , src , linesize , block_h , mx , my ) ;
mc_func [ my_idx ] [ mx_idx ] ( dst , linesize , src , linesize , block_h , mx , my ) ;
} else
} else