me.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:24k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * me.c: h264 encoder library (Motion Estimation)
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: me.c,v 1.1 2004/06/03 19:27:08 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Loren Merritt <lorenm@u.washington.edu>
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include "common/common.h"
  27. #include "me.h"
  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. static const int subpel_iterations[][4] = 
  33.    {{1,0,0,0},
  34.     {1,1,0,0},
  35.     {0,1,1,0},
  36.     {0,2,1,0},
  37.     {0,2,1,1},
  38.     {0,2,1,2},
  39.     {0,0,2,2}};
  40. 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 );
  41. #define COST_MV_INT( mx, my, bd, d ) 
  42.     int cost = h->pixf.sad[i_pixel]( m->p_fenc[0], FENC_STRIDE, 
  43.                    &p_fref[(my)*m->i_stride[0]+(mx)], m->i_stride[0] ) 
  44.              + p_cost_mvx[ (mx)<<2 ]  
  45.              + p_cost_mvy[ (my)<<2 ]; 
  46.     if( cost < bcost ) 
  47.     {                  
  48.         bcost = cost;  
  49.         bmx = mx;      
  50.         bmy = my;      
  51.         if( bd ) 
  52.             dir = d; 
  53.     } 
  54. }
  55. #define COST_MV( mx, my )         COST_MV_INT( mx, my, 0, 0 )
  56. #define COST_MV_DIR( mx, my, d )  COST_MV_INT( mx, my, 1, d )
  57. #define COST_MV_PDE( mx, my ) 
  58.     int cost = h->pixf.sad_pde[i_pixel]( m->p_fenc[0], FENC_STRIDE, 
  59.                    &p_fref[(my)*m->i_stride[0]+(mx)], m->i_stride[0], 
  60.                    bcost - p_cost_mvx[ (mx)<<2 ] - p_cost_mvy[ (my)<<2 ] ); 
  61.     if( cost < bcost - p_cost_mvx[ (mx)<<2 ] - p_cost_mvy[ (my)<<2 ] ) 
  62.     {                  
  63.         bcost = cost + p_cost_mvx[ (mx)<<2 ] + p_cost_mvy[ (my)<<2 ];  
  64.         bmx = mx;      
  65.         bmy = my;      
  66.     } 
  67. }
  68. #define DIA1_ITER( mx, my )
  69.     {
  70.         omx = mx; omy = my;
  71.         COST_MV( omx  , omy-1 );/*  1  */
  72.         COST_MV( omx  , omy+1 );/* 101 */
  73.         COST_MV( omx-1, omy   );/*  1  */
  74.         COST_MV( omx+1, omy   );
  75.     }
  76. #define DIA2 
  77.     {
  78.         COST_MV( omx  , omy-2 );
  79.         COST_MV( omx-1, omy-1 );/*   1   */
  80.         COST_MV( omx+1, omy-1 );/*  1 1  */
  81.         COST_MV( omx-2, omy   );/* 1 0 1 */
  82.         COST_MV( omx+2, omy   );/*  1 1  */
  83.         COST_MV( omx-1, omy+1 );/*   1   */
  84.         COST_MV( omx+1, omy+1 );
  85.         COST_MV( omx  , omy+2 );
  86.     }
  87. #define OCT2 
  88.     {
  89.         COST_MV( omx-1, omy-2 );
  90.         COST_MV( omx+1, omy-2 );/*  1 1  */
  91.         COST_MV( omx-2, omy-1 );/* 1   1 */
  92.         COST_MV( omx+2, omy-1 );/*   0   */
  93.         COST_MV( omx-2, omy+1 );/* 1   1 */
  94.         COST_MV( omx+2, omy+1 );/*  1 1  */
  95.         COST_MV( omx-1, omy+2 );
  96.         COST_MV( omx+1, omy+2 );
  97.     }
  98. #define CROSS( start, x_max, y_max ) 
  99.     { 
  100.         for( i = start; i < x_max; i+=2 ) 
  101.         { 
  102.             if( omx + i <= mv_x_max ) 
  103.                 COST_MV( omx + i, omy ); 
  104.             if( omx - i >= mv_x_min ) 
  105.                 COST_MV( omx - i, omy ); 
  106.         } 
  107.         for( i = start; i < y_max; i+=2 ) 
  108.         { 
  109.             if( omy + i <= mv_y_max ) 
  110.                 COST_MV( omx, omy + i ); 
  111.             if( omy - i >= mv_y_min ) 
  112.                 COST_MV( omx, omy - i ); 
  113.         } 
  114.     }
  115. void x264_me_search_ref( x264_t *h, x264_me_t *m, int (*mvc)[2], int i_mvc, int *p_halfpel_thresh )
  116. {
  117.     const int i_pixel = m->i_pixel;
  118.     int i_me_range = h->param.analyse.i_me_range;
  119.     int bmx, bmy, bcost;
  120.     int omx, omy, pmx, pmy;
  121.     uint8_t *p_fref = m->p_fref[0];
  122.     int i, j;
  123.     int dir;
  124.     int mv_x_min = h->mb.mv_min_fpel[0];
  125.     int mv_y_min = h->mb.mv_min_fpel[1];
  126.     int mv_x_max = h->mb.mv_max_fpel[0];
  127.     int mv_y_max = h->mb.mv_max_fpel[1];
  128.     const int16_t *p_cost_mvx = m->p_cost_mv - m->mvp[0];
  129.     const int16_t *p_cost_mvy = m->p_cost_mv - m->mvp[1];
  130.     if( h->mb.i_me_method == X264_ME_UMH )
  131.     {
  132.         /* clamp mvp to inside frame+padding, so that we don't have to check it each iteration */
  133.         p_cost_mvx = m->p_cost_mv - x264_clip3( m->mvp[0], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );
  134.         p_cost_mvy = m->p_cost_mv - x264_clip3( m->mvp[1], h->mb.mv_min_spel[1], h->mb.mv_max_spel[1] );
  135.     }
  136.     bmx = pmx = x264_clip3( ( m->mvp[0] + 2 ) >> 2, mv_x_min, mv_x_max );
  137.     bmy = pmy = x264_clip3( ( m->mvp[1] + 2 ) >> 2, mv_y_min, mv_y_max );
  138.     bcost = COST_MAX;
  139.     COST_MV( pmx, pmy );
  140.     /* I don't know why this helps */
  141.     bcost -= p_cost_mvx[ bmx<<2 ] + p_cost_mvy[ bmy<<2 ];
  142.     /* try extra predictors if provided */
  143.     for( i = 0; i < i_mvc; i++ )
  144.     {
  145.         const int mx = x264_clip3( ( mvc[i][0] + 2 ) >> 2, mv_x_min, mv_x_max );
  146.         const int my = x264_clip3( ( mvc[i][1] + 2 ) >> 2, mv_y_min, mv_y_max );
  147.         if( mx != bmx || my != bmy )
  148.             COST_MV( mx, my );
  149.     }
  150.     
  151.     COST_MV( 0, 0 );
  152.     mv_x_max += 8;
  153.     mv_y_max += 8;
  154.     mv_x_min -= 8;
  155.     mv_y_min -= 8;
  156.     switch( h->mb.i_me_method )
  157.     {
  158.     case X264_ME_DIA:
  159.         /* diamond search, radius 1 */
  160.         for( i = 0; i < i_me_range; i++ )
  161.         {
  162.             DIA1_ITER( bmx, bmy );
  163.             if( bmx == omx && bmy == omy )
  164.                 break;
  165.         }
  166.         break;
  167.     case X264_ME_HEX:
  168. me_hex2:
  169.         /* hexagon search, radius 2 */
  170. #if 0
  171.         for( i = 0; i < i_me_range/2; i++ )
  172.         {
  173.             omx = bmx; omy = bmy;
  174.             COST_MV( omx-2, omy   );
  175.             COST_MV( omx-1, omy+2 );
  176.             COST_MV( omx+1, omy+2 );
  177.             COST_MV( omx+2, omy   );
  178.             COST_MV( omx+1, omy-2 );
  179.             COST_MV( omx-1, omy-2 );
  180.             if( bmx == omx && bmy == omy )
  181.                 break;
  182.         }
  183. #else
  184.         /* equivalent to the above, but eliminates duplicate candidates */
  185.         dir = -1;
  186.         omx = bmx; omy = bmy;
  187.         COST_MV_DIR( omx-2, omy,   0 );
  188.         COST_MV_DIR( omx-1, omy+2, 1 );
  189.         COST_MV_DIR( omx+1, omy+2, 2 );
  190.         COST_MV_DIR( omx+2, omy,   3 );
  191.         COST_MV_DIR( omx+1, omy-2, 4 );
  192.         COST_MV_DIR( omx-1, omy-2, 5 );
  193.         if( dir != -1 )
  194.         {
  195.             for( i = 1; i < i_me_range/2; i++ )
  196.             {
  197.                 static const int hex2[8][2] = {{-1,-2}, {-2,0}, {-1,2}, {1,2}, {2,0}, {1,-2}, {-1,-2}, {-2,0}};
  198.                 static const int mod6[8] = {5,0,1,2,3,4,5,0};
  199.                 const int odir = mod6[dir+1];
  200.                 omx = bmx; omy = bmy;
  201.                 COST_MV_DIR( omx + hex2[odir+0][0], omy + hex2[odir+0][1], odir-1 );
  202.                 COST_MV_DIR( omx + hex2[odir+1][0], omy + hex2[odir+1][1], odir   );
  203.                 COST_MV_DIR( omx + hex2[odir+2][0], omy + hex2[odir+2][1], odir+1 );
  204.                 if( bmx == omx && bmy == omy )
  205.                     break;
  206.             }
  207.         }
  208. #endif
  209.         /* square refine */
  210.         DIA1_ITER( bmx, bmy );
  211.         COST_MV( omx-1, omy-1 );
  212.         COST_MV( omx-1, omy+1 );
  213.         COST_MV( omx+1, omy-1 );
  214.         COST_MV( omx+1, omy+1 );
  215.         break;
  216.     case X264_ME_UMH:
  217.         {
  218.             /* Uneven-cross Multi-Hexagon-grid Search
  219.              * as in JM, except with different early termination */
  220.             static const int x264_pixel_size_shift[7] = { 0, 1, 1, 2, 3, 3, 4 };
  221.             int ucost1, ucost2;
  222.             int cross_start = 1;
  223.             /* refine predictors */
  224.             ucost1 = bcost;
  225.             DIA1_ITER( pmx, pmy );
  226.             if( pmx || pmy )
  227.                 DIA1_ITER( 0, 0 );
  228.             if(i_pixel == PIXEL_4x4)
  229.                 goto me_hex2;
  230.             ucost2 = bcost;
  231.             if( (bmx || bmy) && (bmx!=pmx || bmy!=pmy) )
  232.                 DIA1_ITER( bmx, bmy );
  233.             if( bcost == ucost2 )
  234.                 cross_start = 3;
  235.             omx = bmx; omy = bmy;
  236.             /* early termination */
  237. #define SAD_THRESH(v) ( bcost < ( v >> x264_pixel_size_shift[i_pixel] ) )
  238.             if( bcost == ucost2 && SAD_THRESH(2000) )
  239.             {
  240.                 DIA2;
  241.                 if( bcost == ucost1 && SAD_THRESH(500) )
  242.                     break;
  243.                 if( bcost == ucost2 )
  244.                 {
  245.                     int range = (i_me_range>>1) | 1;
  246.                     CROSS( 3, range, range );
  247.                     OCT2;
  248.                     if( bcost == ucost2 )
  249.                         break;
  250.                     cross_start = range + 2;
  251.                 }
  252.             }
  253.             /* adaptive search range */
  254.             if( i_mvc ) 
  255.             {
  256.                 /* range multipliers based on casual inspection of some statistics of
  257.                  * average distance between current predictor and final mv found by ESA.
  258.                  * these have not been tuned much by actual encoding. */
  259.                 static const int range_mul[4][4] =
  260.                 {
  261.                     { 3, 3, 4, 4 },
  262.                     { 3, 4, 4, 4 },
  263.                     { 4, 4, 4, 5 },
  264.                     { 4, 4, 5, 6 },
  265.                 };
  266.                 int mvd;
  267.                 int sad_ctx, mvd_ctx;
  268.                 if( i_mvc == 1 )
  269.                 {
  270.                     if( i_pixel == PIXEL_16x16 )
  271.                         /* mvc is probably the same as mvp, so the difference isn't meaningful.
  272.                          * but prediction usually isn't too bad, so just use medium range */
  273.                         mvd = 25;
  274.                     else
  275.                         mvd = abs( m->mvp[0] - mvc[0][0] )
  276.                             + abs( m->mvp[1] - mvc[0][1] );
  277.                 }
  278.                 else
  279.                 {
  280.                     /* calculate the degree of agreement between predictors. */
  281.                     /* in 16x16, mvc includes all the neighbors used to make mvp,
  282.                      * so don't count mvp separately. */
  283.                     int i_denom = i_mvc - 1;
  284.                     mvd = 0;
  285.                     if( i_pixel != PIXEL_16x16 )
  286.                     {
  287.                         mvd = abs( m->mvp[0] - mvc[0][0] )
  288.                             + abs( m->mvp[1] - mvc[0][1] );
  289.                         i_denom++;
  290.                     }
  291.                     for( i = 0; i < i_mvc-1; i++ )
  292.                         mvd += abs( mvc[i][0] - mvc[i+1][0] )
  293.                              + abs( mvc[i][1] - mvc[i+1][1] );
  294.                     mvd /= i_denom; //FIXME idiv
  295.                 }
  296.                 sad_ctx = SAD_THRESH(1000) ? 0
  297.                         : SAD_THRESH(2000) ? 1
  298.                         : SAD_THRESH(4000) ? 2 : 3;
  299.                 mvd_ctx = mvd < 10 ? 0
  300.                         : mvd < 20 ? 1
  301.                         : mvd < 40 ? 2 : 3;
  302.                 i_me_range = i_me_range * range_mul[mvd_ctx][sad_ctx] / 4;
  303.             }
  304.             /* FIXME if the above DIA2/OCT2/CROSS found a new mv, it has not updated omx/omy.
  305.              * we are still centered on the same place as the DIA2. is this desirable? */
  306.             CROSS( cross_start, i_me_range, i_me_range/2 );
  307.             /* 5x5 ESA */
  308.             omx = bmx; omy = bmy;
  309.             for( i = (bcost == ucost2) ? 4 : 0; i < 24; i++ )
  310.             {
  311.                 static const int square2[24][2] = {
  312.                     { 1, 0}, { 0, 1}, {-1, 0}, { 0,-1},
  313.                     { 1, 1}, {-1, 1}, {-1,-1}, { 1,-1},
  314.                     { 2,-1}, { 2, 0}, { 2, 1}, { 2, 2},
  315.                     { 1, 2}, { 0, 2}, {-1, 2}, {-2, 2},
  316.                     {-2, 1}, {-2, 0}, {-2,-1}, {-2,-2},
  317.                     {-1,-2}, { 0,-2}, { 1,-2}, { 2,-2}
  318.                 };
  319.                 COST_MV( omx + square2[i][0], omy + square2[i][1] );
  320.             }
  321.             /* hexagon grid */
  322.             omx = bmx; omy = bmy;
  323.             for( i = 1; i <= i_me_range/4; i++ )
  324.             {
  325.                 static const int hex4[16][2] = {
  326.                     {-4, 2}, {-4, 1}, {-4, 0}, {-4,-1}, {-4,-2},
  327.                     { 4,-2}, { 4,-1}, { 4, 0}, { 4, 1}, { 4, 2},
  328.                     { 2, 3}, { 0, 4}, {-2, 3},
  329.                     {-2,-3}, { 0,-4}, { 2,-3},
  330.                 };
  331.                 const int bounds_check = 4*i > X264_MIN4( mv_x_max-omx, mv_y_max-omy, omx-mv_x_min, omy-mv_y_min );
  332.                 if( h->pixf.sad_pde[i_pixel] )
  333.                 {
  334.                     for( j = 0; j < 16; j++ )
  335.                     {
  336.                         int mx = omx + hex4[j][0]*i;
  337.                         int my = omy + hex4[j][1]*i;
  338.                         if( !bounds_check || ( mx >= mv_x_min && mx <= mv_x_max
  339.                                             && my >= mv_y_min && my <= mv_y_max ) )
  340.                             COST_MV_PDE( mx, my );
  341.                     }
  342.                 }
  343.                 else
  344.                 {
  345.                     for( j = 0; j < 16; j++ )
  346.                     {
  347.                         int mx = omx + hex4[j][0]*i;
  348.                         int my = omy + hex4[j][1]*i;
  349.                         if( !bounds_check || ( mx >= mv_x_min && mx <= mv_x_max
  350.                                             && my >= mv_y_min && my <= mv_y_max ) )
  351.                             COST_MV( mx, my );
  352.                     }
  353.                 }
  354.             }
  355.             goto me_hex2;
  356.         }
  357.     case X264_ME_ESA:
  358.         {
  359.             const int min_x = X264_MAX( bmx - i_me_range, mv_x_min);
  360.             const int min_y = X264_MAX( bmy - i_me_range, mv_y_min);
  361.             const int max_x = X264_MIN( bmx + i_me_range, mv_x_max);
  362.             const int max_y = X264_MIN( bmy + i_me_range, mv_y_max);
  363.             int mx, my;
  364. #if 0
  365.             /* plain old exhaustive search */
  366.             for( my = min_y; my <= max_y; my++ )
  367.                 for( mx = min_x; mx <= max_x; mx++ )
  368.                     COST_MV( mx, my );
  369. #else
  370.             /* successive elimination by comparing DC before a full SAD,
  371.              * because sum(abs(diff)) >= abs(diff(sum)). */
  372.             const int stride = m->i_stride[0];
  373.             const int dw = x264_pixel_size[i_pixel].w;
  374.             const int dh = x264_pixel_size[i_pixel].h * stride;
  375.             static uint8_t zero[16*16] = {0,};
  376.             const int enc_dc = h->pixf.sad[i_pixel]( m->p_fenc[0], FENC_STRIDE, zero, 16 );
  377.             const uint16_t *integral_base = &m->integral[ -1 - 1*stride ];
  378.             if( h->pixf.sad_pde[i_pixel] )
  379.             {
  380.                 for( my = min_y; my <= max_y; my++ )
  381.                     for( mx = min_x; mx <= max_x; mx++ )
  382.                     {
  383.                         const uint16_t *integral = &integral_base[ mx + my * stride ];
  384.                         const uint16_t ref_dc = integral[  0 ] + integral[ dh + dw ]
  385.                                               - integral[ dw ] - integral[ dh ];
  386.                         const int bsad = bcost - p_cost_mvx[ (mx)<<2 ] - p_cost_mvy[ (my)<<2 ];
  387.                         if( abs( ref_dc - enc_dc ) < bsad )
  388.                             COST_MV_PDE( mx, my );
  389.                     }
  390.             }
  391.             else
  392.             {
  393.                 for( my = min_y; my <= max_y; my++ )
  394.                     for( mx = min_x; mx <= max_x; mx++ )
  395.                     {
  396.                         const uint16_t *integral = &integral_base[ mx + my * stride ];
  397.                         const uint16_t ref_dc = integral[  0 ] + integral[ dh + dw ]
  398.                                               - integral[ dw ] - integral[ dh ];
  399.                         const int bsad = bcost - p_cost_mvx[ (mx)<<2 ] - p_cost_mvy[ (my)<<2 ];
  400.                         if( abs( ref_dc - enc_dc ) < bsad )
  401.                             COST_MV( mx, my );
  402.                     }
  403.             }
  404. #endif
  405.         }
  406.         break;
  407.     }
  408.     /* -> qpel mv */
  409.     m->mv[0] = bmx << 2;
  410.     m->mv[1] = bmy << 2;
  411.     /* compute the real cost */
  412.     m->cost_mv = p_cost_mvx[ m->mv[0] ] + p_cost_mvy[ m->mv[1] ];
  413.     m->cost = bcost;
  414.     if( bmx == pmx && bmy == pmy )
  415.         m->cost += m->cost_mv;
  416.     
  417.     /* subpel refine */
  418.     if( h->mb.i_subpel_refine >= 2 )
  419.     {
  420.         int hpel = subpel_iterations[h->mb.i_subpel_refine][2];
  421.         int qpel = subpel_iterations[h->mb.i_subpel_refine][3];
  422.         refine_subpel( h, m, hpel, qpel, p_halfpel_thresh, 0 );
  423.     }
  424. }
  425. #undef COST_MV
  426. void x264_me_refine_qpel( x264_t *h, x264_me_t *m )
  427. {
  428.     int hpel = subpel_iterations[h->mb.i_subpel_refine][0];
  429.     int qpel = subpel_iterations[h->mb.i_subpel_refine][1];
  430.     if( m->i_pixel <= PIXEL_8x8 && h->sh.i_type == SLICE_TYPE_P )
  431.         m->cost -= m->i_ref_cost;
  432.     refine_subpel( h, m, hpel, qpel, NULL, 1 );
  433. }
  434. #define COST_MV_SAD( mx, my, dir ) 
  435. if( b_refine_qpel || (dir^1) != odir ) 
  436.     int stride = 16; 
  437.     uint8_t *src = h->mc.get_ref( m->p_fref, m->i_stride[0], pix, &stride, mx, my, bw, bh ); 
  438.     int cost = h->pixf.sad[i_pixel]( m->p_fenc[0], FENC_STRIDE, src, stride ) 
  439.              + p_cost_mvx[ mx ] + p_cost_mvy[ my ]; 
  440.     if( cost < bcost ) 
  441.     {                  
  442.         bcost = cost;  
  443.         bmx = mx;      
  444.         bmy = my;      
  445.         bdir = dir;    
  446.     } 
  447. }
  448. #define COST_MV_SATD( mx, my, dir ) 
  449. if( b_refine_qpel || (dir^1) != odir ) 
  450.     int stride = 16; 
  451.     uint8_t *src = h->mc.get_ref( m->p_fref, m->i_stride[0], pix, &stride, mx, my, bw, bh ); 
  452.     int cost = h->pixf.mbcmp[i_pixel]( m->p_fenc[0], FENC_STRIDE, src, stride ) 
  453.              + p_cost_mvx[ mx ] + p_cost_mvy[ my ]; 
  454.     if( b_chroma_me && cost < bcost ) 
  455.     { 
  456.         h->mc.mc_chroma( m->p_fref[4], m->i_stride[1], pix, 8, mx, my, bw/2, bh/2 ); 
  457.         cost += h->pixf.mbcmp[i_pixel+3]( m->p_fenc[1], FENC_STRIDE, pix, 8 ); 
  458.         if( cost < bcost ) 
  459.         { 
  460.             h->mc.mc_chroma( m->p_fref[5], m->i_stride[1], pix, 8, mx, my, bw/2, bh/2 ); 
  461.             cost += h->pixf.mbcmp[i_pixel+3]( m->p_fenc[2], FENC_STRIDE, pix, 8 ); 
  462.         } 
  463.     } 
  464.     if( cost < bcost ) 
  465.     {                  
  466.         bcost = cost;  
  467.         bmx = mx;      
  468.         bmy = my;      
  469.         bdir = dir;    
  470.     } 
  471. }
  472. 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 )
  473. {
  474.     const int bw = x264_pixel_size[m->i_pixel].w;
  475.     const int bh = x264_pixel_size[m->i_pixel].h;
  476.     const int16_t *p_cost_mvx = m->p_cost_mv - m->mvp[0];
  477.     const int16_t *p_cost_mvy = m->p_cost_mv - m->mvp[1];
  478.     const int i_pixel = m->i_pixel;
  479.     const int b_chroma_me = h->mb.b_chroma_me && i_pixel <= PIXEL_8x8;
  480.     DECLARE_ALIGNED( uint8_t, pix[16*16], 16 );
  481.     int omx, omy;
  482.     int i;
  483.     int bmx = m->mv[0];
  484.     int bmy = m->mv[1];
  485.     int bcost = m->cost;
  486.     int odir = -1, bdir;
  487.     /* try the subpel component of the predicted mv */
  488.     if( hpel_iters )
  489.     {
  490.         int mx = x264_clip3( m->mvp[0], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );
  491.         int my = x264_clip3( m->mvp[1], h->mb.mv_min_spel[1], h->mb.mv_max_spel[1] );
  492.         if( mx != bmx || my != bmy )
  493.             COST_MV_SAD( mx, my, -1 );
  494.     }
  495.     
  496.     /* hpel search */
  497.     bdir = -1;
  498.     for( i = hpel_iters; i > 0; i-- )
  499.     {
  500.         odir = bdir;
  501.         omx = bmx;
  502.         omy = bmy;
  503.         COST_MV_SAD( omx, omy - 2, 0 );
  504.         COST_MV_SAD( omx, omy + 2, 1 );
  505.         COST_MV_SAD( omx - 2, omy, 2 );
  506.         COST_MV_SAD( omx + 2, omy, 3 );
  507.         if( bmx == omx && bmy == omy )
  508.             break;
  509.     }
  510.     
  511.     if( !b_refine_qpel )
  512.     {
  513.         bcost = COST_MAX;
  514.         COST_MV_SATD( bmx, bmy, -1 );
  515.     }
  516.     
  517.     /* early termination when examining multiple reference frames */
  518.     if( p_halfpel_thresh )
  519.     {
  520.         if( (bcost*7)>>3 > *p_halfpel_thresh )
  521.         {
  522.             m->cost = bcost;
  523.             m->mv[0] = bmx;
  524.             m->mv[1] = bmy;
  525.             // don't need cost_mv
  526.             return;
  527.         }
  528.         else if( bcost < *p_halfpel_thresh )
  529.             *p_halfpel_thresh = bcost;
  530.     }
  531.     /* qpel search */
  532.     bdir = -1;
  533.     for( i = qpel_iters; i > 0; i-- )
  534.     {
  535.         odir = bdir;
  536.         omx = bmx;
  537.         omy = bmy;
  538.         COST_MV_SATD( omx, omy - 1, 0 );
  539.         COST_MV_SATD( omx, omy + 1, 1 );
  540.         COST_MV_SATD( omx - 1, omy, 2 );
  541.         COST_MV_SATD( omx + 1, omy, 3 );
  542.         if( bmx == omx && bmy == omy )
  543.             break;
  544.     }
  545.     m->cost = bcost;
  546.     m->mv[0] = bmx;
  547.     m->mv[1] = bmy;
  548.     m->cost_mv = p_cost_mvx[ bmx ] + p_cost_mvy[ bmy ];
  549. }
  550. #define BIME_CACHE( dx, dy ) 
  551.     int i = 4 + 3*dx + dy; 
  552.     h->mc.mc_luma( m0->p_fref, m0->i_stride[0], pix0[i], bw, om0x+dx, om0y+dy, bw, bh ); 
  553.     h->mc.mc_luma( m1->p_fref, m1->i_stride[0], pix1[i], bw, om1x+dx, om1y+dy, bw, bh ); 
  554. }
  555. #define BIME_CACHE2(a,b) 
  556.     BIME_CACHE(a,b) 
  557.     BIME_CACHE(-(a),-(b))
  558. #define COST_BIMV_SATD( m0x, m0y, m1x, m1y ) 
  559. if( pass == 0 || !visited[(m0x)&7][(m0y)&7][(m1x)&7][(m1y)&7] ) 
  560.     int cost; 
  561.     int i0 = 4 + 3*(m0x-om0x) + (m0y-om0y); 
  562.     int i1 = 4 + 3*(m1x-om1x) + (m1y-om1y); 
  563.     visited[(m0x)&7][(m0y)&7][(m1x)&7][(m1y)&7] = 1; 
  564.     memcpy( pix, pix0[i0], bs ); 
  565.     if( i_weight == 32 ) 
  566.         h->mc.avg[i_pixel]( pix, bw, pix1[i1], bw ); 
  567.     else 
  568.         h->mc.avg_weight[i_pixel]( pix, bw, pix1[i1], bw, i_weight ); 
  569.     cost = h->pixf.mbcmp[i_pixel]( m0->p_fenc[0], FENC_STRIDE, pix, bw ) 
  570.          + p_cost_m0x[ m0x ] + p_cost_m0y[ m0y ] 
  571.          + p_cost_m1x[ m1x ] + p_cost_m1y[ m1y ]; 
  572.     if( cost < bcost ) 
  573.     {                  
  574.         bcost = cost;  
  575.         bm0x = m0x;    
  576.         bm0y = m0y;    
  577.         bm1x = m1x;    
  578.         bm1y = m1y;    
  579.     } 
  580. }
  581. #define CHECK_BIDIR(a,b,c,d) 
  582.     COST_BIMV_SATD(om0x+a, om0y+b, om1x+c, om1y+d)
  583. #define CHECK_BIDIR2(a,b,c,d) 
  584.     CHECK_BIDIR(a,b,c,d) 
  585.     CHECK_BIDIR(-(a),-(b),-(c),-(d))
  586. #define CHECK_BIDIR8(a,b,c,d) 
  587.     CHECK_BIDIR2(a,b,c,d) 
  588.     CHECK_BIDIR2(b,c,d,a) 
  589.     CHECK_BIDIR2(c,d,a,b) 
  590.     CHECK_BIDIR2(d,a,b,c)
  591. int x264_me_refine_bidir( x264_t *h, x264_me_t *m0, x264_me_t *m1, int i_weight )
  592. {
  593.     const int i_pixel = m0->i_pixel;
  594.     const int bw = x264_pixel_size[i_pixel].w;
  595.     const int bh = x264_pixel_size[i_pixel].h;
  596.     const int bs = bw*bh;
  597.     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] );
  598.     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] );
  599.     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] );
  600.     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] );
  601.     DECLARE_ALIGNED( uint8_t, pix0[9][16*16], 16 );
  602.     DECLARE_ALIGNED( uint8_t, pix1[9][16*16], 16 );
  603.     DECLARE_ALIGNED( uint8_t, pix[16*16], 16 );
  604.     int bm0x = m0->mv[0], om0x = bm0x;
  605.     int bm0y = m0->mv[1], om0y = bm0y;
  606.     int bm1x = m1->mv[0], om1x = bm1x;
  607.     int bm1y = m1->mv[1], om1y = bm1y;
  608.     int bcost = COST_MAX;
  609.     int pass = 0;
  610.     uint8_t visited[8][8][8][8];
  611.     memset( visited, 0, sizeof(visited) );
  612.     BIME_CACHE( 0, 0 );
  613.     CHECK_BIDIR( 0, 0, 0, 0 );
  614.     for( pass = 0; pass < 8; pass++ )
  615.     {
  616.         /* check all mv pairs that differ in at most 2 components from the current mvs. */
  617.         /* doesn't do chroma ME. this probably doesn't matter, as the gains
  618.          * from bidir ME are the same with and without chroma ME. */
  619.         BIME_CACHE2( 1, 0 );
  620.         BIME_CACHE2( 0, 1 );
  621.         BIME_CACHE2( 1, 1 );
  622.         BIME_CACHE2( 1,-1 );
  623.         CHECK_BIDIR8( 0, 0, 0, 1 );
  624.         CHECK_BIDIR8( 0, 0, 1, 1 );
  625.         CHECK_BIDIR2( 0, 1, 0, 1 );
  626.         CHECK_BIDIR2( 1, 0, 1, 0 );
  627.         CHECK_BIDIR8( 0, 0,-1, 1 );
  628.         CHECK_BIDIR2( 0,-1, 0, 1 );
  629.         CHECK_BIDIR2(-1, 0, 1, 0 );
  630.         if( om0x == bm0x && om0y == bm0y && om1x == bm1x && om1y == bm1y )
  631.             break;
  632.         om0x = bm0x;
  633.         om0y = bm0y;
  634.         om1x = bm1x;
  635.         om1y = bm1y;
  636.         BIME_CACHE( 0, 0 );
  637.     }
  638.     m0->mv[0] = bm0x;
  639.     m0->mv[1] = bm0y;
  640.     m1->mv[0] = bm1x;
  641.     m1->mv[1] = bm1y;
  642.     return bcost;
  643. }