Index: encoder/me.c =================================================================== --- encoder/me.c (revision 682) +++ encoder/me.c (working copy) @@ -411,33 +411,30 @@ /* hexagon grid */ omx = bmx; omy = bmy; - for( i = 1; i <= i_me_range/4; i++ ) + int limit = X264_MIN4( mv_x_max-omx, omx-mv_x_min, mv_y_max-omy, omy-mv_y_min ); + limit = X264_MIN( limit, i_me_range ) / 4; + for( i = 1; i <= limit; i++ ) { + COST_MV_X4( -4*i, 2*i, -4*i, 1*i, -4*i, 0*i, -4*i,-1*i ); + COST_MV_X4( -4*i,-2*i, 4*i,-2*i, 4*i,-1*i, 4*i, 0*i ); + COST_MV_X4( 4*i, 1*i, 4*i, 2*i, 2*i, 3*i, 0*i, 4*i ); + COST_MV_X4( -2*i, 3*i, -2*i,-3*i, 0*i,-4*i, 2*i,-3*i ); + } + for( ; i <= i_me_range/4; i++ ) + { static const int hex4[16][2] = { {-4, 2}, {-4, 1}, {-4, 0}, {-4,-1}, {-4,-2}, { 4,-2}, { 4,-1}, { 4, 0}, { 4, 1}, { 4, 2}, { 2, 3}, { 0, 4}, {-2, 3}, {-2,-3}, { 0,-4}, { 2,-3}, }; - - if( 4*i > X264_MIN4( mv_x_max-omx, omx-mv_x_min, - mv_y_max-omy, omy-mv_y_min ) ) + for( j = 0; j < 16; j++ ) { - for( j = 0; j < 16; j++ ) - { - int mx = omx + hex4[j][0]*i; - int my = omy + hex4[j][1]*i; - if( CHECK_MVRANGE(mx, my) ) - COST_MV( mx, my ); - } + int mx = omx + hex4[j][0]*i; + int my = omy + hex4[j][1]*i; + if( CHECK_MVRANGE(mx, my) ) + COST_MV( mx, my ); } - else - { - COST_MV_X4( -4*i, 2*i, -4*i, 1*i, -4*i, 0*i, -4*i,-1*i ); - COST_MV_X4( -4*i,-2*i, 4*i,-2*i, 4*i,-1*i, 4*i, 0*i ); - COST_MV_X4( 4*i, 1*i, 4*i, 2*i, 2*i, 3*i, 0*i, 4*i ); - COST_MV_X4( -2*i, 3*i, -2*i,-3*i, 0*i,-4*i, 2*i,-3*i ); - } } if( bmy <= mv_y_max ) goto me_hex2;