]> git.sesse.net Git - x264/blob - encoder/me.c
CAVLC optimizations
[x264] / encoder / me.c
1 /*****************************************************************************
2  * me.c: h264 encoder library (Motion Estimation)
3  *****************************************************************************
4  * Copyright (C) 2003-2008 x264 project
5  *
6  * Authors: Loren Merritt <lorenm@u.washington.edu>
7  *          Laurent Aimar <fenrir@via.ecp.fr>
8  *          Fiona Glaser <fiona@x264.com>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 #include "common/common.h"
26 #include "me.h"
27
28 /* presets selected from good points on the speed-vs-quality curve of several test videos
29  * subpel_iters[i_subpel_refine] = { refine_hpel, refine_qpel, me_hpel, me_qpel }
30  * where me_* are the number of EPZS iterations run on all candidate block types,
31  * and refine_* are run only on the winner.
32  * the subme=8,9 values are much higher because any amount of satd search makes
33  * up its time by reducing the number of qpel-rd iterations. */
34 static const int subpel_iterations[][4] =
35    {{0,0,0,0},
36     {1,1,0,0},
37     {0,1,1,0},
38     {0,2,1,0},
39     {0,2,1,1},
40     {0,2,1,2},
41     {0,0,2,2},
42     {0,0,2,2},
43     {0,0,4,10},
44     {0,0,4,10}};
45
46 /* (x-1)%6 */
47 static const int mod6m1[8] = {5,0,1,2,3,4,5,0};
48 /* radius 2 hexagon. repeated entries are to avoid having to compute mod6 every time. */
49 static const int hex2[8][2] = {{-1,-2}, {-2,0}, {-1,2}, {1,2}, {2,0}, {1,-2}, {-1,-2}, {-2,0}};
50 static const int square1[8][2] = {{0,-1}, {0,1}, {-1,0}, {1,0}, {-1,-1}, {1,1}, {-1,1}, {1,-1}};
51
52 static void refine_subpel( x264_t *h, x264_me_t *m, int hpel_iters, int qpel_iters, int *p_halfpel_thresh, int b_refine_qpel );
53
54 #define BITS_MVD( mx, my )\
55     (p_cost_mvx[(mx)<<2] + p_cost_mvy[(my)<<2])
56
57 #define COST_MV( mx, my )\
58 {\
59     int cost = h->pixf.fpelcmp[i_pixel]( m->p_fenc[0], FENC_STRIDE,\
60                    &p_fref[(my)*m->i_stride[0]+(mx)], m->i_stride[0] )\
61              + BITS_MVD(mx,my);\
62     COPY3_IF_LT( bcost, cost, bmx, mx, bmy, my );\
63 }
64
65 #define COST_MV_HPEL( mx, my ) \
66 { \
67     int stride = 16; \
68     uint8_t *src = h->mc.get_ref( pix, &stride, m->p_fref, m->i_stride[0], mx, my, bw, bh ); \
69     int cost = h->pixf.fpelcmp[i_pixel]( m->p_fenc[0], FENC_STRIDE, src, stride ) \
70              + p_cost_mvx[ mx ] + p_cost_mvy[ my ]; \
71     COPY3_IF_LT( bpred_cost, cost, bpred_mx, mx, bpred_my, my ); \
72 }
73
74 #define COST_MV_X3_DIR( m0x, m0y, m1x, m1y, m2x, m2y, costs )\
75 {\
76     uint8_t *pix_base = p_fref + bmx + bmy*m->i_stride[0];\
77     h->pixf.fpelcmp_x3[i_pixel]( m->p_fenc[0],\
78         pix_base + (m0x) + (m0y)*m->i_stride[0],\
79         pix_base + (m1x) + (m1y)*m->i_stride[0],\
80         pix_base + (m2x) + (m2y)*m->i_stride[0],\
81         m->i_stride[0], costs );\
82     (costs)[0] += BITS_MVD( bmx+(m0x), bmy+(m0y) );\
83     (costs)[1] += BITS_MVD( bmx+(m1x), bmy+(m1y) );\
84     (costs)[2] += BITS_MVD( bmx+(m2x), bmy+(m2y) );\
85 }
86
87 #define COST_MV_X4( m0x, m0y, m1x, m1y, m2x, m2y, m3x, m3y )\
88 {\
89     uint8_t *pix_base = p_fref + omx + omy*m->i_stride[0];\
90     h->pixf.fpelcmp_x4[i_pixel]( m->p_fenc[0],\
91         pix_base + (m0x) + (m0y)*m->i_stride[0],\
92         pix_base + (m1x) + (m1y)*m->i_stride[0],\
93         pix_base + (m2x) + (m2y)*m->i_stride[0],\
94         pix_base + (m3x) + (m3y)*m->i_stride[0],\
95         m->i_stride[0], costs );\
96     costs[0] += BITS_MVD( omx+(m0x), omy+(m0y) );\
97     costs[1] += BITS_MVD( omx+(m1x), omy+(m1y) );\
98     costs[2] += BITS_MVD( omx+(m2x), omy+(m2y) );\
99     costs[3] += BITS_MVD( omx+(m3x), omy+(m3y) );\
100     COPY3_IF_LT( bcost, costs[0], bmx, omx+(m0x), bmy, omy+(m0y) );\
101     COPY3_IF_LT( bcost, costs[1], bmx, omx+(m1x), bmy, omy+(m1y) );\
102     COPY3_IF_LT( bcost, costs[2], bmx, omx+(m2x), bmy, omy+(m2y) );\
103     COPY3_IF_LT( bcost, costs[3], bmx, omx+(m3x), bmy, omy+(m3y) );\
104 }
105
106 #define COST_MV_X3_ABS( m0x, m0y, m1x, m1y, m2x, m2y )\
107 {\
108     h->pixf.fpelcmp_x3[i_pixel]( m->p_fenc[0],\
109         p_fref + (m0x) + (m0y)*m->i_stride[0],\
110         p_fref + (m1x) + (m1y)*m->i_stride[0],\
111         p_fref + (m2x) + (m2y)*m->i_stride[0],\
112         m->i_stride[0], costs );\
113     costs[0] += p_cost_mvx[(m0x)<<2]; /* no cost_mvy */\
114     costs[1] += p_cost_mvx[(m1x)<<2];\
115     costs[2] += p_cost_mvx[(m2x)<<2];\
116     COPY3_IF_LT( bcost, costs[0], bmx, m0x, bmy, m0y );\
117     COPY3_IF_LT( bcost, costs[1], bmx, m1x, bmy, m1y );\
118     COPY3_IF_LT( bcost, costs[2], bmx, m2x, bmy, m2y );\
119 }
120
121 /*  1  */
122 /* 101 */
123 /*  1  */
124 #define DIA1_ITER( mx, my )\
125 {\
126     omx = mx; omy = my;\
127     COST_MV_X4( 0,-1, 0,1, -1,0, 1,0 );\
128 }
129
130 #define CROSS( start, x_max, y_max )\
131 {\
132     i = start;\
133     if( x_max <= X264_MIN(mv_x_max-omx, omx-mv_x_min) )\
134         for( ; i < x_max-2; i+=4 )\
135             COST_MV_X4( i,0, -i,0, i+2,0, -i-2,0 );\
136     for( ; i < x_max; i+=2 )\
137     {\
138         if( omx+i <= mv_x_max )\
139             COST_MV( omx+i, omy );\
140         if( omx-i >= mv_x_min )\
141             COST_MV( omx-i, omy );\
142     }\
143     i = start;\
144     if( y_max <= X264_MIN(mv_y_max-omy, omy-mv_y_min) )\
145         for( ; i < y_max-2; i+=4 )\
146             COST_MV_X4( 0,i, 0,-i, 0,i+2, 0,-i-2 );\
147     for( ; i < y_max; i+=2 )\
148     {\
149         if( omy+i <= mv_y_max )\
150             COST_MV( omx, omy+i );\
151         if( omy-i >= mv_y_min )\
152             COST_MV( omx, omy-i );\
153     }\
154 }
155
156 void x264_me_search_ref( x264_t *h, x264_me_t *m, int16_t (*mvc)[2], int i_mvc, int *p_halfpel_thresh )
157 {
158     const int bw = x264_pixel_size[m->i_pixel].w;
159     const int bh = x264_pixel_size[m->i_pixel].h;
160     const int i_pixel = m->i_pixel;
161     int i_me_range = h->param.analyse.i_me_range;
162     int bmx, bmy, bcost;
163     int bpred_mx = 0, bpred_my = 0, bpred_cost = COST_MAX;
164     int omx, omy, pmx, pmy;
165     uint8_t *p_fref = m->p_fref[0];
166     DECLARE_ALIGNED_16( uint8_t pix[16*16] );
167
168     int i, j;
169     int dir;
170     int costs[6];
171
172     int mv_x_min = h->mb.mv_min_fpel[0];
173     int mv_y_min = h->mb.mv_min_fpel[1];
174     int mv_x_max = h->mb.mv_max_fpel[0];
175     int mv_y_max = h->mb.mv_max_fpel[1];
176
177 #define CHECK_MVRANGE(mx,my) ( mx >= mv_x_min && mx <= mv_x_max && my >= mv_y_min && my <= mv_y_max )
178
179     const int16_t *p_cost_mvx = m->p_cost_mv - m->mvp[0];
180     const int16_t *p_cost_mvy = m->p_cost_mv - m->mvp[1];
181
182     bmx = x264_clip3( m->mvp[0], mv_x_min*4, mv_x_max*4 );
183     bmy = x264_clip3( m->mvp[1], mv_y_min*4, mv_y_max*4 );
184     pmx = ( bmx + 2 ) >> 2;
185     pmy = ( bmy + 2 ) >> 2;
186     bcost = COST_MAX;
187
188     /* try extra predictors if provided */
189     if( h->mb.i_subpel_refine >= 3 )
190     {
191         uint32_t bmv = pack16to32_mask(bmx,bmy);
192         COST_MV_HPEL( bmx, bmy );
193         for( i = 0; i < i_mvc; i++ )
194         {
195             if( *(uint32_t*)mvc[i] && (bmv - *(uint32_t*)mvc[i]) )
196             {
197                 int mx = x264_clip3( mvc[i][0], mv_x_min*4, mv_x_max*4 );
198                 int my = x264_clip3( mvc[i][1], mv_y_min*4, mv_y_max*4 );
199                 COST_MV_HPEL( mx, my );
200             }
201         }
202         bmx = ( bpred_mx + 2 ) >> 2;
203         bmy = ( bpred_my + 2 ) >> 2;
204         COST_MV( bmx, bmy );
205     }
206     else
207     {
208         /* check the MVP */
209         COST_MV( pmx, pmy );
210         /* Because we are rounding the predicted motion vector to fullpel, there will be
211          * an extra MV cost in 15 out of 16 cases.  However, when the predicted MV is
212          * chosen as the best predictor, it is often the case that the subpel search will
213          * result in a vector at or next to the predicted motion vector.  Therefore, it is
214          * sensible to remove the cost of the MV from the rounded MVP to avoid unfairly
215          * biasing against use of the predicted motion vector. */
216         bcost -= BITS_MVD( pmx, pmy );
217         for( i = 0; i < i_mvc; i++ )
218         {
219             int mx = (mvc[i][0] + 2) >> 2;
220             int my = (mvc[i][1] + 2) >> 2;
221             if( (mx | my) && ((mx-bmx) | (my-bmy)) )
222             {
223                 mx = x264_clip3( mx, mv_x_min, mv_x_max );
224                 my = x264_clip3( my, mv_y_min, mv_y_max );
225                 COST_MV( mx, my );
226             }
227         }
228     }
229     COST_MV( 0, 0 );
230
231     switch( h->mb.i_me_method )
232     {
233     case X264_ME_DIA:
234         /* diamond search, radius 1 */
235         i = 0;
236         do
237         {
238             DIA1_ITER( bmx, bmy );
239             if( (bmx == omx) & (bmy == omy) )
240                 break;
241             if( !CHECK_MVRANGE(bmx, bmy) )
242                 break;
243         } while( ++i < i_me_range );
244         break;
245
246     case X264_ME_HEX:
247 me_hex2:
248         /* hexagon search, radius 2 */
249 #if 0
250         for( i = 0; i < i_me_range/2; i++ )
251         {
252             omx = bmx; omy = bmy;
253             COST_MV( omx-2, omy   );
254             COST_MV( omx-1, omy+2 );
255             COST_MV( omx+1, omy+2 );
256             COST_MV( omx+2, omy   );
257             COST_MV( omx+1, omy-2 );
258             COST_MV( omx-1, omy-2 );
259             if( bmx == omx && bmy == omy )
260                 break;
261             if( !CHECK_MVRANGE(bmx, bmy) )
262                 break;
263         }
264 #else
265         /* equivalent to the above, but eliminates duplicate candidates */
266         dir = -2;
267
268         /* hexagon */
269         COST_MV_X3_DIR( -2,0, -1, 2,  1, 2, costs   );
270         COST_MV_X3_DIR(  2,0,  1,-2, -1,-2, costs+3 );
271         COPY2_IF_LT( bcost, costs[0], dir, 0 );
272         COPY2_IF_LT( bcost, costs[1], dir, 1 );
273         COPY2_IF_LT( bcost, costs[2], dir, 2 );
274         COPY2_IF_LT( bcost, costs[3], dir, 3 );
275         COPY2_IF_LT( bcost, costs[4], dir, 4 );
276         COPY2_IF_LT( bcost, costs[5], dir, 5 );
277
278         if( dir != -2 )
279         {
280             bmx += hex2[dir+1][0];
281             bmy += hex2[dir+1][1];
282             /* half hexagon, not overlapping the previous iteration */
283             for( i = 1; i < i_me_range/2 && CHECK_MVRANGE(bmx, bmy); i++ )
284             {
285                 const int odir = mod6m1[dir+1];
286                 COST_MV_X3_DIR( hex2[odir+0][0], hex2[odir+0][1],
287                                 hex2[odir+1][0], hex2[odir+1][1],
288                                 hex2[odir+2][0], hex2[odir+2][1],
289                                 costs );
290                 dir = -2;
291                 COPY2_IF_LT( bcost, costs[0], dir, odir-1 );
292                 COPY2_IF_LT( bcost, costs[1], dir, odir   );
293                 COPY2_IF_LT( bcost, costs[2], dir, odir+1 );
294                 if( dir == -2 )
295                     break;
296                 bmx += hex2[dir+1][0];
297                 bmy += hex2[dir+1][1];
298             }
299         }
300 #endif
301         /* square refine */
302         omx = bmx; omy = bmy;
303         COST_MV_X4(  0,-1,  0,1, -1,0, 1,0 );
304         COST_MV_X4( -1,-1, -1,1, 1,-1, 1,1 );
305         break;
306
307     case X264_ME_UMH:
308         {
309             /* Uneven-cross Multi-Hexagon-grid Search
310              * as in JM, except with different early termination */
311
312             static const int x264_pixel_size_shift[7] = { 0, 1, 1, 2, 3, 3, 4 };
313
314             int ucost1, ucost2;
315             int cross_start = 1;
316
317             /* refine predictors */
318             ucost1 = bcost;
319             DIA1_ITER( pmx, pmy );
320             if( pmx | pmy )
321                 DIA1_ITER( 0, 0 );
322
323             if(i_pixel == PIXEL_4x4)
324                 goto me_hex2;
325
326             ucost2 = bcost;
327             if( (bmx | bmy) && ((bmx-pmx) | (bmy-pmy)) )
328                 DIA1_ITER( bmx, bmy );
329             if( bcost == ucost2 )
330                 cross_start = 3;
331             omx = bmx; omy = bmy;
332
333             /* early termination */
334 #define SAD_THRESH(v) ( bcost < ( v >> x264_pixel_size_shift[i_pixel] ) )
335             if( bcost == ucost2 && SAD_THRESH(2000) )
336             {
337                 COST_MV_X4( 0,-2, -1,-1, 1,-1, -2,0 );
338                 COST_MV_X4( 2, 0, -1, 1, 1, 1,  0,2 );
339                 if( bcost == ucost1 && SAD_THRESH(500) )
340                     break;
341                 if( bcost == ucost2 )
342                 {
343                     int range = (i_me_range>>1) | 1;
344                     CROSS( 3, range, range );
345                     COST_MV_X4( -1,-2, 1,-2, -2,-1, 2,-1 );
346                     COST_MV_X4( -2, 1, 2, 1, -1, 2, 1, 2 );
347                     if( bcost == ucost2 )
348                         break;
349                     cross_start = range + 2;
350                 }
351             }
352
353             /* adaptive search range */
354             if( i_mvc )
355             {
356                 /* range multipliers based on casual inspection of some statistics of
357                  * average distance between current predictor and final mv found by ESA.
358                  * these have not been tuned much by actual encoding. */
359                 static const int range_mul[4][4] =
360                 {
361                     { 3, 3, 4, 4 },
362                     { 3, 4, 4, 4 },
363                     { 4, 4, 4, 5 },
364                     { 4, 4, 5, 6 },
365                 };
366                 int mvd;
367                 int sad_ctx, mvd_ctx;
368                 int denom = 1;
369
370                 if( i_mvc == 1 )
371                 {
372                     if( i_pixel == PIXEL_16x16 )
373                         /* mvc is probably the same as mvp, so the difference isn't meaningful.
374                          * but prediction usually isn't too bad, so just use medium range */
375                         mvd = 25;
376                     else
377                         mvd = abs( m->mvp[0] - mvc[0][0] )
378                             + abs( m->mvp[1] - mvc[0][1] );
379                 }
380                 else
381                 {
382                     /* calculate the degree of agreement between predictors. */
383                     /* in 16x16, mvc includes all the neighbors used to make mvp,
384                      * so don't count mvp separately. */
385                     denom = i_mvc - 1;
386                     mvd = 0;
387                     if( i_pixel != PIXEL_16x16 )
388                     {
389                         mvd = abs( m->mvp[0] - mvc[0][0] )
390                             + abs( m->mvp[1] - mvc[0][1] );
391                         denom++;
392                     }
393                     mvd += x264_predictor_difference( mvc, i_mvc );
394                 }
395
396                 sad_ctx = SAD_THRESH(1000) ? 0
397                         : SAD_THRESH(2000) ? 1
398                         : SAD_THRESH(4000) ? 2 : 3;
399                 mvd_ctx = mvd < 10*denom ? 0
400                         : mvd < 20*denom ? 1
401                         : mvd < 40*denom ? 2 : 3;
402
403                 i_me_range = i_me_range * range_mul[mvd_ctx][sad_ctx] / 4;
404             }
405
406             /* FIXME if the above DIA2/OCT2/CROSS found a new mv, it has not updated omx/omy.
407              * we are still centered on the same place as the DIA2. is this desirable? */
408             CROSS( cross_start, i_me_range, i_me_range/2 );
409
410             COST_MV_X4( -2,-2, -2,2, 2,-2, 2,2 );
411
412             /* hexagon grid */
413             omx = bmx; omy = bmy;
414
415             i = 1;
416             do
417             {
418                 static const int hex4[16][2] = {
419                     {-4, 2}, {-4, 1}, {-4, 0}, {-4,-1}, {-4,-2},
420                     { 4,-2}, { 4,-1}, { 4, 0}, { 4, 1}, { 4, 2},
421                     { 2, 3}, { 0, 4}, {-2, 3},
422                     {-2,-3}, { 0,-4}, { 2,-3},
423                 };
424
425                 if( 4*i > X264_MIN4( mv_x_max-omx, omx-mv_x_min,
426                                      mv_y_max-omy, omy-mv_y_min ) )
427                 {
428                     for( j = 0; j < 16; j++ )
429                     {
430                         int mx = omx + hex4[j][0]*i;
431                         int my = omy + hex4[j][1]*i;
432                         if( CHECK_MVRANGE(mx, my) )
433                             COST_MV( mx, my );
434                     }
435                 }
436                 else
437                 {
438                     COST_MV_X4( -4*i, 2*i, -4*i, 1*i, -4*i, 0*i, -4*i,-1*i );
439                     COST_MV_X4( -4*i,-2*i,  4*i,-2*i,  4*i,-1*i,  4*i, 0*i );
440                     COST_MV_X4(  4*i, 1*i,  4*i, 2*i,  2*i, 3*i,  0*i, 4*i );
441                     COST_MV_X4( -2*i, 3*i, -2*i,-3*i,  0*i,-4*i,  2*i,-3*i );
442                 }
443             } while( ++i <= i_me_range/4 );
444             if( bmy <= mv_y_max )
445                 goto me_hex2;
446             break;
447         }
448
449     case X264_ME_ESA:
450     case X264_ME_TESA:
451         {
452             const int min_x = X264_MAX( bmx - i_me_range, mv_x_min );
453             const int min_y = X264_MAX( bmy - i_me_range, mv_y_min );
454             const int max_x = X264_MIN( bmx + i_me_range, mv_x_max );
455             const int max_y = X264_MIN( bmy + i_me_range, mv_y_max );
456             /* SEA is fastest in multiples of 4 */
457             const int width = (max_x - min_x + 3) & ~3;
458             int my;
459 #if 0
460             /* plain old exhaustive search */
461             int mx;
462             for( my = min_y; my <= max_y; my++ )
463                 for( mx = min_x; mx <= max_x; mx++ )
464                     COST_MV( mx, my );
465 #else
466             /* successive elimination by comparing DC before a full SAD,
467              * because sum(abs(diff)) >= abs(diff(sum)). */
468             const int stride = m->i_stride[0];
469             uint16_t *sums_base = m->integral;
470             /* due to a GCC bug on some platforms (win32?), zero[] may not actually be aligned.
471              * unlike the similar case in ratecontrol.c, this is not a problem because it is not used for any
472              * SSE instructions and the only loss is a tiny bit of performance. */
473             DECLARE_ALIGNED_16( static uint8_t zero[8*FENC_STRIDE] );
474             DECLARE_ALIGNED_16( int enc_dc[4] );
475             int sad_size = i_pixel <= PIXEL_8x8 ? PIXEL_8x8 : PIXEL_4x4;
476             int delta = x264_pixel_size[sad_size].w;
477             int16_t *xs = h->scratch_buffer;
478             int xn;
479             uint16_t *cost_fpel_mvx = x264_cost_mv_fpel[h->mb.i_qp][-m->mvp[0]&3] + (-m->mvp[0]>>2);
480
481             h->pixf.sad_x4[sad_size]( zero, m->p_fenc[0], m->p_fenc[0]+delta,
482                 m->p_fenc[0]+delta*FENC_STRIDE, m->p_fenc[0]+delta+delta*FENC_STRIDE,
483                 FENC_STRIDE, enc_dc );
484             if( delta == 4 )
485                 sums_base += stride * (h->fenc->i_lines[0] + PADV*2);
486             if( i_pixel == PIXEL_16x16 || i_pixel == PIXEL_8x16 || i_pixel == PIXEL_4x8 )
487                 delta *= stride;
488             if( i_pixel == PIXEL_8x16 || i_pixel == PIXEL_4x8 )
489                 enc_dc[1] = enc_dc[2];
490
491             if( h->mb.i_me_method == X264_ME_TESA )
492             {
493                 // ADS threshold, then SAD threshold, then keep the best few SADs, then SATD
494                 mvsad_t *mvsads = (mvsad_t *)(xs + ((width+15)&~15));
495                 int nmvsad = 0, limit;
496                 int sad_thresh = i_me_range <= 16 ? 10 : i_me_range <= 24 ? 11 : 12;
497                 int bsad = h->pixf.sad[i_pixel]( m->p_fenc[0], FENC_STRIDE, p_fref+bmy*stride+bmx, stride )
498                          + BITS_MVD( bmx, bmy );
499                 for( my = min_y; my <= max_y; my++ )
500                 {
501                     int ycost = p_cost_mvy[my<<2];
502                     if( bsad <= ycost )
503                         continue;
504                     bsad -= ycost;
505                     xn = h->pixf.ads[i_pixel]( enc_dc, sums_base + min_x + my * stride, delta,
506                                                cost_fpel_mvx+min_x, xs, width, bsad*17/16 );
507                     for( i=0; i<xn-2; i+=3 )
508                     {
509                         uint8_t *ref = p_fref+min_x+my*stride;
510                         int sads[3];
511                         h->pixf.sad_x3[i_pixel]( m->p_fenc[0], ref+xs[i], ref+xs[i+1], ref+xs[i+2], stride, sads );
512                         for( j=0; j<3; j++ )
513                         {
514                             int sad = sads[j] + cost_fpel_mvx[xs[i+j]];
515                             if( sad < bsad*sad_thresh>>3 )
516                             {
517                                 COPY1_IF_LT( bsad, sad );
518                                 mvsads[nmvsad].sad = sad + ycost;
519                                 mvsads[nmvsad].mx = min_x+xs[i+j];
520                                 mvsads[nmvsad].my = my;
521                                 nmvsad++;
522                             }
523                         }
524                     }
525                     for( ; i<xn; i++ )
526                     {
527                         int mx = min_x+xs[i];
528                         int sad = h->pixf.sad[i_pixel]( m->p_fenc[0], FENC_STRIDE, p_fref+mx+my*stride, stride )
529                                 + cost_fpel_mvx[xs[i]];
530                         if( sad < bsad*sad_thresh>>3 )
531                         {
532                             COPY1_IF_LT( bsad, sad );
533                             mvsads[nmvsad].sad = sad + ycost;
534                             mvsads[nmvsad].mx = mx;
535                             mvsads[nmvsad].my = my;
536                             nmvsad++;
537                         }
538                     }
539                     bsad += ycost;
540                 }
541
542                 limit = i_me_range / 2;
543                 if( nmvsad > limit*2 )
544                 {
545                     // halve the range if the domain is too large... eh, close enough
546                     bsad = bsad*(sad_thresh+8)>>4;
547                     for( i=0; i<nmvsad && mvsads[i].sad <= bsad; i++ );
548                     for( j=i; j<nmvsad; j++ )
549                         if( mvsads[j].sad <= bsad )
550                         {
551                             /* mvsad_t is not guaranteed to be 8 bytes on all archs, so check before using explicit write-combining */
552                             if( sizeof( mvsad_t ) == sizeof( uint64_t ) )
553                                 *(uint64_t*)&mvsads[i++] = *(uint64_t*)&mvsads[j];
554                             else
555                                 mvsads[i++] = mvsads[j];
556                         }
557                     nmvsad = i;
558                 }
559                 if( nmvsad > limit )
560                 {
561                     for( i=0; i<limit; i++ )
562                     {
563                         int bj = i;
564                         int bsad = mvsads[bj].sad;
565                         for( j=i+1; j<nmvsad; j++ )
566                             COPY2_IF_LT( bsad, mvsads[j].sad, bj, j );
567                         if( bj > i )
568                         {
569                             if( sizeof( mvsad_t ) == sizeof( uint64_t ) )
570                                 XCHG( uint64_t, *(uint64_t*)&mvsads[i], *(uint64_t*)&mvsads[bj] );
571                             else
572                                 XCHG( mvsad_t, mvsads[i], mvsads[bj] );
573                         }
574                     }
575                     nmvsad = limit;
576                 }
577                 for( i=0; i<nmvsad; i++ )
578                     COST_MV( mvsads[i].mx, mvsads[i].my );
579             }
580             else
581             {
582                 // just ADS and SAD
583                 for( my = min_y; my <= max_y; my++ )
584                 {
585                     int ycost = p_cost_mvy[my<<2];
586                     if( bcost <= ycost )
587                         continue;
588                     bcost -= ycost;
589                     xn = h->pixf.ads[i_pixel]( enc_dc, sums_base + min_x + my * stride, delta,
590                                                cost_fpel_mvx+min_x, xs, width, bcost );
591                     for( i=0; i<xn-2; i+=3 )
592                         COST_MV_X3_ABS( min_x+xs[i],my, min_x+xs[i+1],my, min_x+xs[i+2],my );
593                     bcost += ycost;
594                     for( ; i<xn; i++ )
595                         COST_MV( min_x+xs[i], my );
596                 }
597             }
598 #endif
599         }
600         break;
601     }
602
603     /* -> qpel mv */
604     if( bpred_cost < bcost )
605     {
606         m->mv[0] = bpred_mx;
607         m->mv[1] = bpred_my;
608         m->cost = bpred_cost;
609     }
610     else
611     {
612         m->mv[0] = bmx << 2;
613         m->mv[1] = bmy << 2;
614         m->cost = bcost;
615     }
616
617     /* compute the real cost */
618     m->cost_mv = p_cost_mvx[ m->mv[0] ] + p_cost_mvy[ m->mv[1] ];
619     if( bmx == pmx && bmy == pmy && h->mb.i_subpel_refine < 3 )
620         m->cost += m->cost_mv;
621
622     /* subpel refine */
623     if( h->mb.i_subpel_refine >= 2 )
624     {
625         int hpel = subpel_iterations[h->mb.i_subpel_refine][2];
626         int qpel = subpel_iterations[h->mb.i_subpel_refine][3];
627         refine_subpel( h, m, hpel, qpel, p_halfpel_thresh, 0 );
628     }
629     else if( m->mv[1] > h->mb.mv_max_spel[1] )
630         m->mv[1] = h->mb.mv_max_spel[1];
631 }
632 #undef COST_MV
633
634 void x264_me_refine_qpel( x264_t *h, x264_me_t *m )
635 {
636     int hpel = subpel_iterations[h->mb.i_subpel_refine][0];
637     int qpel = subpel_iterations[h->mb.i_subpel_refine][1];
638
639     if( m->i_pixel <= PIXEL_8x8 && h->sh.i_type == SLICE_TYPE_P )
640         m->cost -= m->i_ref_cost;
641         
642     refine_subpel( h, m, hpel, qpel, NULL, 1 );
643 }
644
645 #define COST_MV_SAD( mx, my ) \
646 { \
647     int stride = 16; \
648     uint8_t *src = h->mc.get_ref( pix[0], &stride, m->p_fref, m->i_stride[0], mx, my, bw, bh ); \
649     int cost = h->pixf.fpelcmp[i_pixel]( m->p_fenc[0], FENC_STRIDE, src, stride ) \
650              + p_cost_mvx[ mx ] + p_cost_mvy[ my ]; \
651     COPY3_IF_LT( bcost, cost, bmx, mx, bmy, my ); \
652 }
653
654 #define COST_MV_SATD( mx, my, dir ) \
655 if( b_refine_qpel || (dir^1) != odir ) \
656 { \
657     int stride = 16; \
658     uint8_t *src = h->mc.get_ref( pix[0], &stride, m->p_fref, m->i_stride[0], mx, my, bw, bh ); \
659     int cost = h->pixf.mbcmp_unaligned[i_pixel]( m->p_fenc[0], FENC_STRIDE, src, stride ) \
660              + p_cost_mvx[ mx ] + p_cost_mvy[ my ]; \
661     if( b_chroma_me && cost < bcost ) \
662     { \
663         h->mc.mc_chroma( pix[0], 8, m->p_fref[4], m->i_stride[1], mx, my, bw/2, bh/2 ); \
664         cost += h->pixf.mbcmp[i_pixel+3]( m->p_fenc[1], FENC_STRIDE, pix[0], 8 ); \
665         if( cost < bcost ) \
666         { \
667             h->mc.mc_chroma( pix[0], 8, m->p_fref[5], m->i_stride[1], mx, my, bw/2, bh/2 ); \
668             cost += h->pixf.mbcmp[i_pixel+3]( m->p_fenc[2], FENC_STRIDE, pix[0], 8 ); \
669         } \
670     } \
671     if( cost < bcost ) \
672     {                  \
673         bcost = cost;  \
674         bmx = mx;      \
675         bmy = my;      \
676         bdir = dir;    \
677     } \
678 }
679
680 static void refine_subpel( x264_t *h, x264_me_t *m, int hpel_iters, int qpel_iters, int *p_halfpel_thresh, int b_refine_qpel )
681 {
682     const int bw = x264_pixel_size[m->i_pixel].w;
683     const int bh = x264_pixel_size[m->i_pixel].h;
684     const int16_t *p_cost_mvx = m->p_cost_mv - m->mvp[0];
685     const int16_t *p_cost_mvy = m->p_cost_mv - m->mvp[1];
686     const int i_pixel = m->i_pixel;
687     const int b_chroma_me = h->mb.b_chroma_me && i_pixel <= PIXEL_8x8;
688
689     DECLARE_ALIGNED_16( uint8_t pix[2][32*18] ); // really 17x17, but round up for alignment
690     int omx, omy;
691     int i;
692
693     int bmx = m->mv[0];
694     int bmy = m->mv[1];
695     int bcost = m->cost;
696     int odir = -1, bdir;
697
698     /* try the subpel component of the predicted mv */
699     if( hpel_iters && h->mb.i_subpel_refine < 3 )
700     {
701         int mx = x264_clip3( m->mvp[0], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );
702         int my = x264_clip3( m->mvp[1], h->mb.mv_min_spel[1], h->mb.mv_max_spel[1] );
703         if( (mx-bmx)|(my-bmy) )
704             COST_MV_SAD( mx, my );
705     }
706
707     /* halfpel diamond search */
708     for( i = hpel_iters; i > 0; i-- )
709     {
710         int omx = bmx, omy = bmy;
711         int costs[4];
712         int stride = 32; // candidates are either all hpel or all qpel, so one stride is enough
713         uint8_t *src0, *src1, *src2, *src3;
714         src0 = h->mc.get_ref( pix[0], &stride, m->p_fref, m->i_stride[0], omx, omy-2, bw, bh+1 );
715         src2 = h->mc.get_ref( pix[1], &stride, m->p_fref, m->i_stride[0], omx-2, omy, bw+4, bh );
716         src1 = src0 + stride;
717         src3 = src2 + 1;
718         h->pixf.fpelcmp_x4[i_pixel]( m->p_fenc[0], src0, src1, src2, src3, stride, costs );
719         COPY2_IF_LT( bcost, costs[0] + p_cost_mvx[omx  ] + p_cost_mvy[omy-2], bmy, omy-2 );
720         COPY2_IF_LT( bcost, costs[1] + p_cost_mvx[omx  ] + p_cost_mvy[omy+2], bmy, omy+2 );
721         COPY3_IF_LT( bcost, costs[2] + p_cost_mvx[omx-2] + p_cost_mvy[omy  ], bmx, omx-2, bmy, omy );
722         COPY3_IF_LT( bcost, costs[3] + p_cost_mvx[omx+2] + p_cost_mvy[omy  ], bmx, omx+2, bmy, omy );
723         if( (bmx == omx) & (bmy == omy) )
724             break;
725     }
726
727     if( !b_refine_qpel )
728     {
729         /* check for mvrange */
730         if( bmy > h->mb.mv_max_spel[1] )
731             bmy = h->mb.mv_max_spel[1];
732         bcost = COST_MAX;
733         COST_MV_SATD( bmx, bmy, -1 );
734     }
735
736     /* early termination when examining multiple reference frames */
737     if( p_halfpel_thresh )
738     {
739         if( (bcost*7)>>3 > *p_halfpel_thresh )
740         {
741             m->cost = bcost;
742             m->mv[0] = bmx;
743             m->mv[1] = bmy;
744             // don't need cost_mv
745             return;
746         }
747         else if( bcost < *p_halfpel_thresh )
748             *p_halfpel_thresh = bcost;
749     }
750
751     /* quarterpel diamond search */
752     bdir = -1;
753     for( i = qpel_iters; i > 0; i-- )
754     {
755         odir = bdir;
756         omx = bmx;
757         omy = bmy;
758         COST_MV_SATD( omx, omy - 1, 0 );
759         COST_MV_SATD( omx, omy + 1, 1 );
760         COST_MV_SATD( omx - 1, omy, 2 );
761         COST_MV_SATD( omx + 1, omy, 3 );
762         if( bmx == omx && bmy == omy )
763             break;
764     }
765
766     /* check for mvrange */
767     if( bmy > h->mb.mv_max_spel[1] )
768     {
769         bmy = h->mb.mv_max_spel[1];
770         bcost = COST_MAX;
771         COST_MV_SATD( bmx, bmy, -1 );
772     }
773
774     m->cost = bcost;
775     m->mv[0] = bmx;
776     m->mv[1] = bmy;
777     m->cost_mv = p_cost_mvx[ bmx ] + p_cost_mvy[ bmy ];
778 }
779
780 #define BIME_CACHE( dx, dy ) \
781 { \
782     int i = 4 + 3*dx + dy; \
783     stride0[i] = bw;\
784     stride1[i] = bw;\
785     src0[i] = h->mc.get_ref( pix0[i], &stride0[i], m0->p_fref, m0->i_stride[0], om0x+dx, om0y+dy, bw, bh ); \
786     src1[i] = h->mc.get_ref( pix1[i], &stride1[i], m1->p_fref, m1->i_stride[0], om1x+dx, om1y+dy, bw, bh ); \
787 }
788
789 #define BIME_CACHE2(a,b) \
790     BIME_CACHE(a,b) \
791     BIME_CACHE(-(a),-(b))
792
793 #define SATD_THRESH 17/16
794
795 #define COST_BIMV_SATD( m0x, m0y, m1x, m1y ) \
796 if( pass == 0 || !((visited[(m0x)&7][(m0y)&7][(m1x)&7] & (1<<((m1y)&7)))) ) \
797 { \
798     int cost; \
799     int i0 = 4 + 3*(m0x-om0x) + (m0y-om0y); \
800     int i1 = 4 + 3*(m1x-om1x) + (m1y-om1y); \
801     visited[(m0x)&7][(m0y)&7][(m1x)&7] |= (1<<((m1y)&7));\
802     h->mc.avg[i_pixel]( pix, bw, src0[i0], stride0[i0], src1[i1], stride1[i1], i_weight ); \
803     cost = h->pixf.mbcmp[i_pixel]( m0->p_fenc[0], FENC_STRIDE, pix, bw ) \
804          + p_cost_m0x[ m0x ] + p_cost_m0y[ m0y ] \
805          + p_cost_m1x[ m1x ] + p_cost_m1y[ m1y ]; \
806     if( rd ) \
807     { \
808         if( cost < bcost * SATD_THRESH ) \
809         { \
810             uint64_t costrd; \
811             if( cost < bcost ) \
812                 bcost = cost; \
813             *(uint32_t*)cache0_mv = *(uint32_t*)cache0_mv2 = pack16to32_mask(m0x,m0y); \
814             *(uint32_t*)cache1_mv = *(uint32_t*)cache1_mv2 = pack16to32_mask(m1x,m1y); \
815             costrd = x264_rd_cost_part( h, i_lambda2, i8, m0->i_pixel ); \
816             if( costrd < bcostrd ) \
817             {\
818                 bcostrd = costrd;\
819                 bm0x = m0x;      \
820                 bm0y = m0y;      \
821                 bm1x = m1x;      \
822                 bm1y = m1y;      \
823             }\
824         } \
825     } \
826     else if( cost < bcost ) \
827     {                  \
828         bcost = cost;  \
829         bm0x = m0x;    \
830         bm0y = m0y;    \
831         bm1x = m1x;    \
832         bm1y = m1y;    \
833     } \
834 }
835
836 #define CHECK_BIDIR(a,b,c,d) \
837     COST_BIMV_SATD(om0x+a, om0y+b, om1x+c, om1y+d)
838
839 #define CHECK_BIDIR2(a,b,c,d) \
840     CHECK_BIDIR(a,b,c,d) \
841     CHECK_BIDIR(-(a),-(b),-(c),-(d))
842
843 #define CHECK_BIDIR8(a,b,c,d) \
844     CHECK_BIDIR2(a,b,c,d) \
845     CHECK_BIDIR2(b,c,d,a) \
846     CHECK_BIDIR2(c,d,a,b) \
847     CHECK_BIDIR2(d,a,b,c)
848
849 static void ALWAYS_INLINE x264_me_refine_bidir( x264_t *h, x264_me_t *m0, x264_me_t *m1, int i_weight, int i8, int i_lambda2, int rd )
850 {
851     static const int pixel_mv_offs[] = { 0, 4, 4*8, 0 };
852     int16_t *cache0_mv = h->mb.cache.mv[0][x264_scan8[i8*4]];
853     int16_t *cache0_mv2 = cache0_mv + pixel_mv_offs[m0->i_pixel];
854     int16_t *cache1_mv = h->mb.cache.mv[1][x264_scan8[i8*4]];
855     int16_t *cache1_mv2 = cache1_mv + pixel_mv_offs[m0->i_pixel];
856     const int i_pixel = m0->i_pixel;
857     const int bw = x264_pixel_size[i_pixel].w;
858     const int bh = x264_pixel_size[i_pixel].h;
859     const int16_t *p_cost_m0x = m0->p_cost_mv - x264_clip3( m0->mvp[0], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );
860     const int16_t *p_cost_m0y = m0->p_cost_mv - x264_clip3( m0->mvp[1], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );
861     const int16_t *p_cost_m1x = m1->p_cost_mv - x264_clip3( m1->mvp[0], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );
862     const int16_t *p_cost_m1y = m1->p_cost_mv - x264_clip3( m1->mvp[1], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );
863     DECLARE_ALIGNED_16( uint8_t pix0[9][16*16] );
864     DECLARE_ALIGNED_16( uint8_t pix1[9][16*16] );
865     DECLARE_ALIGNED_16( uint8_t pix[16*16] );
866     uint8_t *src0[9];
867     uint8_t *src1[9];
868     int stride0[9];
869     int stride1[9];
870     int bm0x = m0->mv[0], om0x = bm0x;
871     int bm0y = m0->mv[1], om0y = bm0y;
872     int bm1x = m1->mv[0], om1x = bm1x;
873     int bm1y = m1->mv[1], om1y = bm1y;
874     int bcost = COST_MAX;
875     int pass = 0;
876     uint64_t bcostrd = COST_MAX64;
877
878     /* each byte of visited represents 8 possible m1y positions, so a 4D array isn't needed */
879     DECLARE_ALIGNED_16( uint8_t visited[8][8][8] );
880
881     if( bm0y > h->mb.mv_max_spel[1] - 8 ||
882         bm1y > h->mb.mv_max_spel[1] - 8 )
883         return;
884
885     h->mc.memzero_aligned( visited, sizeof(visited) );
886
887     BIME_CACHE( 0, 0 );
888     CHECK_BIDIR( 0, 0, 0, 0 );
889
890     for( pass = 0; pass < 8; pass++ )
891     {
892         /* check all mv pairs that differ in at most 2 components from the current mvs. */
893         /* doesn't do chroma ME. this probably doesn't matter, as the gains
894          * from bidir ME are the same with and without chroma ME. */
895
896         BIME_CACHE2( 1, 0 );
897         BIME_CACHE2( 0, 1 );
898         BIME_CACHE2( 1, 1 );
899         BIME_CACHE2( 1,-1 );
900
901         CHECK_BIDIR8( 0, 0, 0, 1 );
902         CHECK_BIDIR8( 0, 0, 1, 1 );
903         CHECK_BIDIR2( 0, 1, 0, 1 );
904         CHECK_BIDIR2( 1, 0, 1, 0 );
905         CHECK_BIDIR8( 0, 0,-1, 1 );
906         CHECK_BIDIR2( 0,-1, 0, 1 );
907         CHECK_BIDIR2(-1, 0, 1, 0 );
908
909         if( om0x == bm0x && om0y == bm0y && om1x == bm1x && om1y == bm1y )
910             break;
911
912         om0x = bm0x;
913         om0y = bm0y;
914         om1x = bm1x;
915         om1y = bm1y;
916         BIME_CACHE( 0, 0 );
917     }
918
919     m0->mv[0] = bm0x;
920     m0->mv[1] = bm0y;
921     m1->mv[0] = bm1x;
922     m1->mv[1] = bm1y;
923 }
924
925 void x264_me_refine_bidir_satd( x264_t *h, x264_me_t *m0, x264_me_t *m1, int i_weight )
926 {
927     x264_me_refine_bidir( h, m0, m1, i_weight, 0, 0, 0 );
928 }
929
930 void x264_me_refine_bidir_rd( x264_t *h, x264_me_t *m0, x264_me_t *m1, int i_weight, int i8, int i_lambda2 )
931 {
932     x264_me_refine_bidir( h, m0, m1, i_weight, i8, i_lambda2, 1 );
933 }
934
935 #undef COST_MV_SATD
936 #define COST_MV_SATD( mx, my, dst, avoid_mvp ) \
937 { \
938     if( !avoid_mvp || !(mx == pmx && my == pmy) ) \
939     { \
940         int stride = 16; \
941         uint8_t *src = h->mc.get_ref( pix, &stride, m->p_fref, m->i_stride[0], mx, my, bw*4, bh*4 ); \
942         dst = h->pixf.mbcmp_unaligned[i_pixel]( m->p_fenc[0], FENC_STRIDE, src, stride ) \
943             + p_cost_mvx[mx] + p_cost_mvy[my]; \
944         COPY1_IF_LT( bsatd, dst ); \
945     } \
946     else \
947         dst = COST_MAX; \
948 }
949
950 #define COST_MV_RD( mx, my, satd, do_dir, mdir ) \
951 { \
952     if( satd <= bsatd * SATD_THRESH ) \
953     { \
954         uint64_t cost; \
955         *(uint32_t*)cache_mv = *(uint32_t*)cache_mv2 = pack16to32_mask(mx,my); \
956         cost = x264_rd_cost_part( h, i_lambda2, i4, m->i_pixel ); \
957         COPY4_IF_LT( bcost, cost, bmx, mx, bmy, my, dir, do_dir?mdir:dir ); \
958     } \
959 }
960
961 void x264_me_refine_qpel_rd( x264_t *h, x264_me_t *m, int i_lambda2, int i4, int i_list )
962 {
963     // don't have to fill the whole mv cache rectangle
964     static const int pixel_mv_offs[] = { 0, 4, 4*8, 0, 2, 2*8, 0 };
965     int16_t *cache_mv = h->mb.cache.mv[i_list][x264_scan8[i4]];
966     int16_t *cache_mv2 = cache_mv + pixel_mv_offs[m->i_pixel];
967     const int16_t *p_cost_mvx, *p_cost_mvy;
968     const int bw = x264_pixel_size[m->i_pixel].w>>2;
969     const int bh = x264_pixel_size[m->i_pixel].h>>2;
970     const int i_pixel = m->i_pixel;
971
972     DECLARE_ALIGNED_16( uint8_t pix[16*16] );
973     uint64_t bcost = m->i_pixel == PIXEL_16x16 ? m->cost : COST_MAX64;
974     int bmx = m->mv[0];
975     int bmy = m->mv[1];
976     int omx = bmx;
977     int omy = bmy;
978     int pmx, pmy, i, j;
979     unsigned bsatd;
980     int satd = 0;
981     int dir = -2;
982     int satds[8];
983
984     if( m->i_pixel != PIXEL_16x16 && i4 != 0 )
985         x264_mb_predict_mv( h, i_list, i4, bw, m->mvp );
986     pmx = m->mvp[0];
987     pmy = m->mvp[1];
988     p_cost_mvx = m->p_cost_mv - pmx;
989     p_cost_mvy = m->p_cost_mv - pmy;
990     COST_MV_SATD( bmx, bmy, bsatd, 0 );
991     COST_MV_RD( bmx, bmy, 0, 0, 0 );
992
993     /* check the predicted mv */
994     if( (bmx != pmx || bmy != pmy)
995         && pmx >= h->mb.mv_min_spel[0] && pmx <= h->mb.mv_max_spel[0]
996         && pmy >= h->mb.mv_min_spel[1] && pmy <= h->mb.mv_max_spel[1] )
997     {
998         COST_MV_SATD( pmx, pmy, satd, 0 );
999         COST_MV_RD( pmx, pmy, satd, 0,0 );
1000         /* The hex motion search is guaranteed to not repeat the center candidate,
1001          * so if pmv is chosen, set the "MV to avoid checking" to bmv instead. */
1002         if( bmx == pmx && bmy == pmy )
1003         {
1004             pmx = m->mv[0];
1005             pmy = m->mv[1];
1006         }
1007     }
1008
1009     /* subpel hex search, same pattern as ME HEX. */
1010     dir = -2;
1011     omx = bmx;
1012     omy = bmy;
1013     for( j=0; j<6; j++ ) COST_MV_SATD( omx + hex2[j+1][0], omy + hex2[j+1][1], satds[j], 1 );
1014     for( j=0; j<6; j++ ) COST_MV_RD  ( omx + hex2[j+1][0], omy + hex2[j+1][1], satds[j], 1,j );
1015
1016     if( dir != -2 )
1017     {
1018         /* half hexagon, not overlapping the previous iteration */
1019         for( i = 1; i < 10; i++ )
1020         {
1021             const int odir = mod6m1[dir+1];
1022             if( bmy > h->mb.mv_max_spel[1] - 2 ||
1023                 bmy < h->mb.mv_min_spel[1] - 2 )
1024                 break;
1025             dir = -2;
1026             omx = bmx;
1027             omy = bmy;
1028             for( j=0; j<3; j++ ) COST_MV_SATD( omx + hex2[odir+j][0], omy + hex2[odir+j][1], satds[j], 1 );
1029             for( j=0; j<3; j++ ) COST_MV_RD  ( omx + hex2[odir+j][0], omy + hex2[odir+j][1], satds[j], 1, odir-1+j );
1030             if( dir == -2 )
1031                 break;
1032         }
1033     }
1034
1035     /* square refine, same as pattern as ME HEX. */
1036     omx = bmx;
1037     omy = bmy;
1038     for( i=0; i<8; i++ ) COST_MV_SATD( omx + square1[i][0], omy  + square1[i][1], satds[i], 1 );
1039     for( i=0; i<8; i++ ) COST_MV_RD  ( omx + square1[i][0], omy  + square1[i][1], satds[i], 0,0 );
1040
1041     bmy = x264_clip3( bmy, h->mb.mv_min_spel[1],  h->mb.mv_max_spel[1] );
1042     m->cost = bcost;
1043     m->mv[0] = bmx;
1044     m->mv[1] = bmy;
1045     x264_macroblock_cache_mv ( h, block_idx_x[i4], block_idx_y[i4], bw, bh, i_list, pack16to32_mask(bmx, bmy) );
1046     x264_macroblock_cache_mvd( h, block_idx_x[i4], block_idx_y[i4], bw, bh, i_list, pack16to32_mask(bmx - m->mvp[0], bmy - m->mvp[1]) );
1047 }