analyse.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:119k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * analyse.c: h264 encoder library
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2008 x264 project
  5.  *
  6.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  7.  *          Loren Merritt <lorenm@u.washington.edu>
  8.  *          Jason Garrett-Glaser <darkshikari@gmail.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. #define _ISOC99_SOURCE
  25. #include <math.h>
  26. //配置MS VC环境 --@lia
  27. #ifndef _MSC_VER
  28. #include <unistd.h>
  29. #endif
  30. #include "common/common.h"
  31. #include "common/cpu.h"
  32. #include "macroblock.h"
  33. #include "me.h"
  34. #include "ratecontrol.h"
  35. #include "analyse.h"
  36. #include "rdo.c"
  37. //配置MS VC环境 --@lia
  38. #ifdef _MSC_VER
  39. #define log2f(x)     ((float)log((double)(x)))/(log((double)2))
  40. #endif
  41. typedef struct
  42. {
  43.     /* 16x16 */
  44.     int i_ref;
  45.     int       i_rd16x16;
  46.     x264_me_t me16x16;
  47.     /* 8x8 */
  48.     int       i_cost8x8;
  49.     /* [ref][0] is 16x16 mv, [ref][1..4] are 8x8 mv from partition [0..3] */
  50.     ALIGNED_4( int16_t mvc[32][5][2] );
  51.     x264_me_t me8x8[4];
  52.     /* Sub 4x4 */
  53.     int       i_cost4x4[4]; /* cost per 8x8 partition */
  54.     x264_me_t me4x4[4][4];
  55.     /* Sub 8x4 */
  56.     int       i_cost8x4[4]; /* cost per 8x8 partition */
  57.     x264_me_t me8x4[4][2];
  58.     /* Sub 4x8 */
  59.     int       i_cost4x8[4]; /* cost per 8x8 partition */
  60.     x264_me_t me4x8[4][2];
  61.     /* 16x8 */
  62.     int       i_cost16x8;
  63.     x264_me_t me16x8[2];
  64.     /* 8x16 */
  65.     int       i_cost8x16;
  66.     x264_me_t me8x16[2];
  67. } x264_mb_analysis_list_t;
  68. typedef struct
  69. {
  70.     /* conduct the analysis using this lamda and QP */
  71.     int i_lambda;
  72.     int i_lambda2;
  73.     int i_qp;
  74.     uint16_t *p_cost_mv;
  75.     uint16_t *p_cost_ref0;
  76.     uint16_t *p_cost_ref1;
  77.     int i_mbrd;
  78.     /* I: Intra part */
  79.     /* Take some shortcuts in intra search if intra is deemed unlikely */
  80.     int b_fast_intra;
  81.     int b_try_pskip;
  82.     /* Luma part */
  83.     int i_satd_i16x16;
  84.     int i_satd_i16x16_dir[7];
  85.     int i_predict16x16;
  86.     int i_satd_i8x8;
  87.     int i_cbp_i8x8_luma;
  88.     int i_satd_i8x8_dir[12][4];
  89.     int i_predict8x8[4];
  90.     int i_satd_i4x4;
  91.     int i_predict4x4[16];
  92.     int i_satd_pcm;
  93.     /* Chroma part */
  94.     int i_satd_i8x8chroma;
  95.     int i_satd_i8x8chroma_dir[4];
  96.     int i_predict8x8chroma;
  97.     /* II: Inter part P/B frame */
  98.     x264_mb_analysis_list_t l0;
  99.     x264_mb_analysis_list_t l1;
  100.     int i_cost16x16bi; /* used the same ref and mv as l0 and l1 (at least for now) */
  101.     int i_cost16x16direct;
  102.     int i_cost8x8bi;
  103.     int i_cost8x8direct[4];
  104.     int i_cost16x8bi;
  105.     int i_cost8x16bi;
  106.     int i_rd16x16bi;
  107.     int i_rd16x16direct;
  108.     int i_rd16x8bi;
  109.     int i_rd8x16bi;
  110.     int i_rd8x8bi;
  111.     int i_mb_partition16x8[2]; /* mb_partition_e */
  112.     int i_mb_partition8x16[2];
  113.     int i_mb_type16x8; /* mb_class_e */
  114.     int i_mb_type8x16;
  115.     int b_direct_available;
  116. } x264_mb_analysis_t;
  117. /* lambda = pow(2,qp/6-2) */
  118. const int x264_lambda_tab[52] = {
  119.    1, 1, 1, 1, 1, 1, 1, 1,  /*  0-7 */
  120.    1, 1, 1, 1,              /*  8-11 */
  121.    1, 1, 1, 1, 2, 2, 2, 2,  /* 12-19 */
  122.    3, 3, 3, 4, 4, 4, 5, 6,  /* 20-27 */
  123.    6, 7, 8, 9,10,11,13,14,  /* 28-35 */
  124.   16,18,20,23,25,29,32,36,  /* 36-43 */
  125.   40,45,51,57,64,72,81,91   /* 44-51 */
  126. };
  127. /* lambda2 = pow(lambda,2) * .9 * 256 */
  128. const int x264_lambda2_tab[52] = {
  129.     14,      18,      22,      28,     36,     45,     57,     72, /*  0 -  7 */
  130.     91,     115,     145,     182,    230,    290,    365,    460, /*  8 - 15 */
  131.    580,     731,     921,    1161,   1462,   1843,   2322,   2925, /* 16 - 23 */
  132.   3686,    4644,    5851,    7372,   9289,  11703,  14745,  18578, /* 24 - 31 */
  133.  23407,   29491,   37156,   46814,  58982,  74313,  93628, 117964, /* 32 - 39 */
  134. 148626,  187257,  235929,  297252, 374514, 471859, 594505, 749029, /* 40 - 47 */
  135. 943718, 1189010, 1498059, 1887436                                  /* 48 - 51 */
  136. };
  137. const uint8_t x264_exp2_lut[64] = {
  138.       1,   4,   7,  10,  13,  16,  19,  22,  25,  28,  31,  34,  37,  40,  44,  47,
  139.      50,  53,  57,  60,  64,  67,  71,  74,  78,  81,  85,  89,  93,  96, 100, 104,
  140.     108, 112, 116, 120, 124, 128, 132, 137, 141, 145, 150, 154, 159, 163, 168, 172,
  141.     177, 182, 186, 191, 196, 201, 206, 211, 216, 221, 226, 232, 237, 242, 248, 253,
  142. };
  143. const float x264_log2_lut[128] = {
  144.     0.00000, 0.01123, 0.02237, 0.03342, 0.04439, 0.05528, 0.06609, 0.07682,
  145.     0.08746, 0.09803, 0.10852, 0.11894, 0.12928, 0.13955, 0.14975, 0.15987,
  146.     0.16993, 0.17991, 0.18982, 0.19967, 0.20945, 0.21917, 0.22882, 0.23840,
  147.     0.24793, 0.25739, 0.26679, 0.27612, 0.28540, 0.29462, 0.30378, 0.31288,
  148.     0.32193, 0.33092, 0.33985, 0.34873, 0.35755, 0.36632, 0.37504, 0.38370,
  149.     0.39232, 0.40088, 0.40939, 0.41785, 0.42626, 0.43463, 0.44294, 0.45121,
  150.     0.45943, 0.46761, 0.47573, 0.48382, 0.49185, 0.49985, 0.50779, 0.51570,
  151.     0.52356, 0.53138, 0.53916, 0.54689, 0.55459, 0.56224, 0.56986, 0.57743,
  152.     0.58496, 0.59246, 0.59991, 0.60733, 0.61471, 0.62205, 0.62936, 0.63662,
  153.     0.64386, 0.65105, 0.65821, 0.66534, 0.67243, 0.67948, 0.68650, 0.69349,
  154.     0.70044, 0.70736, 0.71425, 0.72110, 0.72792, 0.73471, 0.74147, 0.74819,
  155.     0.75489, 0.76155, 0.76818, 0.77479, 0.78136, 0.78790, 0.79442, 0.80090,
  156.     0.80735, 0.81378, 0.82018, 0.82655, 0.83289, 0.83920, 0.84549, 0.85175,
  157.     0.85798, 0.86419, 0.87036, 0.87652, 0.88264, 0.88874, 0.89482, 0.90087,
  158.     0.90689, 0.91289, 0.91886, 0.92481, 0.93074, 0.93664, 0.94251, 0.94837,
  159.     0.95420, 0.96000, 0.96578, 0.97154, 0.97728, 0.98299, 0.98868, 0.99435,
  160. };
  161. /* Avoid an int/float conversion. */
  162. const float x264_log2_lz_lut[32] = {
  163.     31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  164. };
  165. // should the intra and inter lambdas be different?
  166. // I'm just matching the behaviour of deadzone quant.
  167. static const int x264_trellis_lambda2_tab[2][52] = {
  168.     // inter lambda = .85 * .85 * 2**(qp/3. + 10 - LAMBDA_BITS)
  169.     {    46,      58,      73,      92,     117,     147,
  170.         185,     233,     294,     370,     466,     587,
  171.         740,     932,    1174,    1480,    1864,    2349,
  172.        2959,    3728,    4697,    5918,    7457,    9395,
  173.       11837,   14914,   18790,   23674,   29828,   37581,
  174.       47349,   59656,   75163,   94699,  119313,  150326,
  175.      189399,  238627,  300652,  378798,  477255,  601304,
  176.      757596,  954511, 1202608, 1515192, 1909022, 2405217,
  177.     3030384, 3818045, 4810435, 6060769 },
  178.     // intra lambda = .65 * .65 * 2**(qp/3. + 10 - LAMBDA_BITS)
  179.     {    27,      34,      43,      54,      68,      86,
  180.         108,     136,     172,     216,     273,     343,
  181.         433,     545,     687,     865,    1090,    1374,
  182.        1731,    2180,    2747,    3461,    4361,    5494,
  183.        6922,    8721,   10988,   13844,   17442,   21976,
  184.       27688,   34885,   43953,   55377,   69771,   87906,
  185.      110755,  139543,  175813,  221511,  279087,  351627,
  186.      443023,  558174,  703255,  886046, 1116348, 1406511,
  187.     1772093, 2232697, 2813022, 3544186 }
  188. };
  189. static const uint16_t x264_chroma_lambda2_offset_tab[] = {
  190.        16,    20,    25,    32,    40,    50,
  191.        64,    80,   101,   128,   161,   203,
  192.       256,   322,   406,   512,   645,   812,
  193.      1024,  1290,  1625,  2048,  2580,  3250,
  194.      4096,  5160,  6501,  8192, 10321, 13003,
  195.     16384, 20642, 26007, 32768, 41285, 52015,
  196.     65535
  197. };
  198. /* TODO: calculate CABAC costs */
  199. static const int i_mb_b_cost_table[X264_MBTYPE_MAX] = {
  200.     9, 9, 9, 9, 0, 0, 0, 1, 3, 7, 7, 7, 3, 7, 7, 7, 5, 9, 0
  201. };
  202. static const int i_mb_b16x8_cost_table[17] = {
  203.     0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 7, 5, 7, 9, 9, 9
  204. };
  205. static const int i_sub_mb_b_cost_table[13] = {
  206.     7, 5, 5, 3, 7, 5, 7, 3, 7, 7, 7, 5, 1
  207. };
  208. static const int i_sub_mb_p_cost_table[4] = {
  209.     5, 3, 3, 1
  210. };
  211. static void x264_analyse_update_cache( x264_t *h, x264_mb_analysis_t *a );
  212. static uint16_t x264_cost_ref[92][3][33];
  213. static x264_pthread_mutex_t cost_ref_mutex = X264_PTHREAD_MUTEX_INITIALIZER;
  214. int x264_analyse_init_costs( x264_t *h, int qp )
  215. {
  216.     int i, j;
  217.     int lambda = x264_lambda_tab[qp];
  218.     if( h->cost_mv[lambda] )
  219.         return 0;
  220.     /* factor of 4 from qpel, 2 from sign, and 2 because mv can be opposite from mvp */
  221.     CHECKED_MALLOC( h->cost_mv[lambda], (4*4*2048 + 1) * sizeof(uint16_t) );
  222.     h->cost_mv[lambda] += 2*4*2048;
  223.     for( i = 0; i <= 2*4*2048; i++ )
  224.     {
  225.         h->cost_mv[lambda][-i] =
  226.         h->cost_mv[lambda][i]  = lambda * (log2f(i+1)*2 + 0.718f + !!i) + .5f;
  227.     }
  228.     x264_pthread_mutex_lock( &cost_ref_mutex );
  229.     for( i = 0; i < 3; i++ )
  230.         for( j = 0; j < 33; j++ )
  231.             x264_cost_ref[lambda][i][j] = i ? lambda * bs_size_te( i, j ) : 0;
  232.     x264_pthread_mutex_unlock( &cost_ref_mutex );
  233.     if( h->param.analyse.i_me_method >= X264_ME_ESA && !h->cost_mv_fpel[lambda][0] )
  234.     {
  235.         for( j=0; j<4; j++ )
  236.         {
  237.             CHECKED_MALLOC( h->cost_mv_fpel[lambda][j], (4*2048 + 1) * sizeof(uint16_t) );
  238.             h->cost_mv_fpel[lambda][j] += 2*2048;
  239.             for( i = -2*2048; i < 2*2048; i++ )
  240.                 h->cost_mv_fpel[lambda][j][i] = h->cost_mv[lambda][i*4+j];
  241.         }
  242.     }
  243.     return 0;
  244. fail:
  245.     return -1;
  246. }
  247. void x264_analyse_free_costs( x264_t *h )
  248. {
  249.     int i, j;
  250.     for( i = 0; i < 92; i++ )
  251.     {
  252.         if( h->cost_mv[i] )
  253.             x264_free( h->cost_mv[i] - 2*4*2048 );
  254.         if( h->cost_mv_fpel[i][0] )
  255.             for( j = 0; j < 4; j++ )
  256.                 x264_free( h->cost_mv_fpel[i][j] - 2*2048 );
  257.     }
  258. }
  259. /* initialize an array of lambda*nbits for all possible mvs */
  260. static void x264_mb_analyse_load_costs( x264_t *h, x264_mb_analysis_t *a )
  261. {
  262.     a->p_cost_mv = h->cost_mv[a->i_lambda];
  263.     a->p_cost_ref0 = x264_cost_ref[a->i_lambda][x264_clip3(h->sh.i_num_ref_idx_l0_active-1,0,2)];
  264.     a->p_cost_ref1 = x264_cost_ref[a->i_lambda][x264_clip3(h->sh.i_num_ref_idx_l1_active-1,0,2)];
  265. }
  266. static void x264_mb_analyse_init( x264_t *h, x264_mb_analysis_t *a, int i_qp )
  267. {
  268.     int i = h->param.analyse.i_subpel_refine - (h->sh.i_type == SLICE_TYPE_B);
  269.     /* mbrd == 1 -> RD mode decision */
  270.     /* mbrd == 2 -> RD refinement */
  271.     /* mbrd == 3 -> QPRD */
  272.     a->i_mbrd = (i>=6) + (i>=8) + (h->param.analyse.i_subpel_refine>=10);
  273.     /* conduct the analysis using this lamda and QP */
  274.     a->i_qp = h->mb.i_qp = i_qp;
  275.     h->mb.i_chroma_qp = h->chroma_qp_table[i_qp];
  276.     a->i_lambda = x264_lambda_tab[i_qp];
  277.     a->i_lambda2 = x264_lambda2_tab[i_qp];
  278.     h->mb.b_trellis = h->param.analyse.i_trellis > 1 && a->i_mbrd;
  279.     if( h->param.analyse.i_trellis )
  280.     {
  281.         h->mb.i_trellis_lambda2[0][0] = x264_trellis_lambda2_tab[0][h->mb.i_qp];
  282.         h->mb.i_trellis_lambda2[0][1] = x264_trellis_lambda2_tab[1][h->mb.i_qp];
  283.         h->mb.i_trellis_lambda2[1][0] = x264_trellis_lambda2_tab[0][h->mb.i_chroma_qp];
  284.         h->mb.i_trellis_lambda2[1][1] = x264_trellis_lambda2_tab[1][h->mb.i_chroma_qp];
  285.     }
  286.     h->mb.i_psy_rd_lambda = a->i_lambda;
  287.     /* Adjusting chroma lambda based on QP offset hurts PSNR but improves visual quality. */
  288.     h->mb.i_chroma_lambda2_offset = h->param.analyse.b_psy ? x264_chroma_lambda2_offset_tab[h->mb.i_qp-h->mb.i_chroma_qp+12] : 256;
  289.     h->mb.i_me_method = h->param.analyse.i_me_method;
  290.     h->mb.i_subpel_refine = h->param.analyse.i_subpel_refine;
  291.     h->mb.b_chroma_me = h->param.analyse.b_chroma_me && h->sh.i_type == SLICE_TYPE_P
  292.                         && h->mb.i_subpel_refine >= 5;
  293.     h->mb.b_transform_8x8 = 0;
  294.     h->mb.b_noise_reduction = 0;
  295.     /* I: Intra part */
  296.     a->i_satd_i16x16 =
  297.     a->i_satd_i8x8   =
  298.     a->i_satd_i4x4   =
  299.     a->i_satd_i8x8chroma = COST_MAX;
  300.     /* non-RD PCM decision is inaccurate (as is psy-rd), so don't do it */
  301.     a->i_satd_pcm = !h->mb.i_psy_rd && a->i_mbrd ? ((uint64_t)X264_PCM_COST*a->i_lambda2 + 128) >> 8 : COST_MAX;
  302.     a->b_fast_intra = 0;
  303.     h->mb.i_skip_intra =
  304.         h->mb.b_lossless ? 0 :
  305.         a->i_mbrd ? 2 :
  306.         !h->param.analyse.i_trellis && !h->param.analyse.i_noise_reduction;
  307.     /* II: Inter part P/B frame */
  308.     if( h->sh.i_type != SLICE_TYPE_I )
  309.     {
  310.         int i, j;
  311.         int i_fmv_range = 4 * h->param.analyse.i_mv_range;
  312.         // limit motion search to a slightly smaller range than the theoretical limit,
  313.         // since the search may go a few iterations past its given range
  314.         int i_fpel_border = 6; // umh: 1 for diamond, 2 for octagon, 2 for hpel
  315.         /* Calculate max allowed MV range */
  316. #define CLIP_FMV(mv) x264_clip3( mv, -i_fmv_range, i_fmv_range-1 )
  317.         h->mb.mv_min[0] = 4*( -16*h->mb.i_mb_x - 24 );
  318.         h->mb.mv_max[0] = 4*( 16*( h->sps->i_mb_width - h->mb.i_mb_x - 1 ) + 24 );
  319.         h->mb.mv_min_spel[0] = CLIP_FMV( h->mb.mv_min[0] );
  320.         h->mb.mv_max_spel[0] = CLIP_FMV( h->mb.mv_max[0] );
  321.         h->mb.mv_min_fpel[0] = (h->mb.mv_min_spel[0]>>2) + i_fpel_border;
  322.         h->mb.mv_max_fpel[0] = (h->mb.mv_max_spel[0]>>2) - i_fpel_border;
  323.         if( h->mb.i_mb_x == 0)
  324.         {
  325.             int mb_y = h->mb.i_mb_y >> h->sh.b_mbaff;
  326.             int mb_height = h->sps->i_mb_height >> h->sh.b_mbaff;
  327.             int thread_mvy_range = i_fmv_range;
  328.             if( h->param.i_threads > 1 )
  329.             {
  330.                 int pix_y = (h->mb.i_mb_y | h->mb.b_interlaced) * 16;
  331.                 int thresh = pix_y + h->param.analyse.i_mv_range_thread;
  332.                 for( i = (h->sh.i_type == SLICE_TYPE_B); i >= 0; i-- )
  333.                 {
  334.                     x264_frame_t **fref = i ? h->fref1 : h->fref0;
  335.                     int i_ref = i ? h->i_ref1 : h->i_ref0;
  336.                     for( j=0; j<i_ref; j++ )
  337.                     {
  338.                         x264_frame_cond_wait( fref[j], thresh );
  339.                         thread_mvy_range = X264_MIN( thread_mvy_range, fref[j]->i_lines_completed - pix_y );
  340.                     }
  341.                 }
  342.                 if( h->param.b_deterministic )
  343.                     thread_mvy_range = h->param.analyse.i_mv_range_thread;
  344.                 if( h->mb.b_interlaced )
  345.                     thread_mvy_range >>= 1;
  346.             }
  347.             h->mb.mv_min[1] = 4*( -16*mb_y - 24 );
  348.             h->mb.mv_max[1] = 4*( 16*( mb_height - mb_y - 1 ) + 24 );
  349.             h->mb.mv_min_spel[1] = x264_clip3( h->mb.mv_min[1], -i_fmv_range, i_fmv_range );
  350.             h->mb.mv_max_spel[1] = CLIP_FMV( h->mb.mv_max[1] );
  351.             h->mb.mv_max_spel[1] = X264_MIN( h->mb.mv_max_spel[1], thread_mvy_range*4 );
  352.             h->mb.mv_min_fpel[1] = (h->mb.mv_min_spel[1]>>2) + i_fpel_border;
  353.             h->mb.mv_max_fpel[1] = (h->mb.mv_max_spel[1]>>2) - i_fpel_border;
  354.         }
  355. #undef CLIP_FMV
  356.         a->l0.me16x16.cost =
  357.         a->l0.i_rd16x16    =
  358.         a->l0.i_cost8x8    = COST_MAX;
  359.         for( i = 0; i < 4; i++ )
  360.         {
  361.             a->l0.i_cost4x4[i] =
  362.             a->l0.i_cost8x4[i] =
  363.             a->l0.i_cost4x8[i] = COST_MAX;
  364.         }
  365.         a->l0.i_cost16x8   =
  366.         a->l0.i_cost8x16   = COST_MAX;
  367.         if( h->sh.i_type == SLICE_TYPE_B )
  368.         {
  369.             a->l1.me16x16.cost =
  370.             a->l1.i_rd16x16    =
  371.             a->l1.i_cost8x8    = COST_MAX;
  372.             for( i = 0; i < 4; i++ )
  373.             {
  374.                 a->l1.i_cost4x4[i] =
  375.                 a->l1.i_cost8x4[i] =
  376.                 a->l1.i_cost4x8[i] =
  377.                 a->i_cost8x8direct[i] = COST_MAX;
  378.             }
  379.             a->l1.i_cost16x8   =
  380.             a->l1.i_cost8x16   =
  381.             a->i_rd16x16bi     =
  382.             a->i_rd16x16direct =
  383.             a->i_rd8x8bi       =
  384.             a->i_rd16x8bi      =
  385.             a->i_rd8x16bi      =
  386.             a->i_cost16x16bi   =
  387.             a->i_cost16x16direct =
  388.             a->i_cost8x8bi     =
  389.             a->i_cost16x8bi    =
  390.             a->i_cost8x16bi    = COST_MAX;
  391.         }
  392.         /* Fast intra decision */
  393.         if( h->mb.i_mb_xy - h->sh.i_first_mb > 4 )
  394.         {
  395.             if(   IS_INTRA( h->mb.i_mb_type_left )
  396.                || IS_INTRA( h->mb.i_mb_type_top )
  397.                || IS_INTRA( h->mb.i_mb_type_topleft )
  398.                || IS_INTRA( h->mb.i_mb_type_topright )
  399.                || (h->sh.i_type == SLICE_TYPE_P && IS_INTRA( h->fref0[0]->mb_type[h->mb.i_mb_xy] ))
  400.                || (h->mb.i_mb_xy - h->sh.i_first_mb < 3*(h->stat.frame.i_mb_count[I_4x4] + h->stat.frame.i_mb_count[I_8x8] + h->stat.frame.i_mb_count[I_16x16])) )
  401.             { /* intra is likely */ }
  402.             else
  403.             {
  404.                 a->b_fast_intra = 1;
  405.             }
  406.         }
  407.         h->mb.b_skip_mc = 0;
  408.     }
  409. }
  410. /*
  411.  * Handle intra mb
  412.  */
  413. /* Max = 4 */
  414. static void predict_16x16_mode_available( unsigned int i_neighbour, int *mode, int *pi_count )
  415. {
  416.     int b_top = i_neighbour & MB_TOP;
  417.     int b_left = i_neighbour & MB_LEFT;
  418.     if( b_top && b_left )
  419.     {
  420.         /* top and left available */
  421.         *mode++ = I_PRED_16x16_V;
  422.         *mode++ = I_PRED_16x16_H;
  423.         *mode++ = I_PRED_16x16_DC;
  424.         *pi_count = 3;
  425.         if( i_neighbour & MB_TOPLEFT )
  426.         {
  427.             /* top left available*/
  428.             *mode++ = I_PRED_16x16_P;
  429.             *pi_count = 4;
  430.         }
  431.     }
  432.     else if( b_left )
  433.     {
  434.         /* left available*/
  435.         *mode++ = I_PRED_16x16_DC_LEFT;
  436.         *mode++ = I_PRED_16x16_H;
  437.         *pi_count = 2;
  438.     }
  439.     else if( b_top )
  440.     {
  441.         /* top available*/
  442.         *mode++ = I_PRED_16x16_DC_TOP;
  443.         *mode++ = I_PRED_16x16_V;
  444.         *pi_count = 2;
  445.     }
  446.     else
  447.     {
  448.         /* none available */
  449.         *mode = I_PRED_16x16_DC_128;
  450.         *pi_count = 1;
  451.     }
  452. }
  453. /* Max = 4 */
  454. static void predict_8x8chroma_mode_available( unsigned int i_neighbour, int *mode, int *pi_count )
  455. {
  456.     int b_top = i_neighbour & MB_TOP;
  457.     int b_left = i_neighbour & MB_LEFT;
  458.     if( b_top && b_left )
  459.     {
  460.         /* top and left available */
  461.         *mode++ = I_PRED_CHROMA_V;
  462.         *mode++ = I_PRED_CHROMA_H;
  463.         *mode++ = I_PRED_CHROMA_DC;
  464.         *pi_count = 3;
  465.         if( i_neighbour & MB_TOPLEFT )
  466.         {
  467.             /* top left available */
  468.             *mode++ = I_PRED_CHROMA_P;
  469.             *pi_count = 4;
  470.         }
  471.     }
  472.     else if( b_left )
  473.     {
  474.         /* left available*/
  475.         *mode++ = I_PRED_CHROMA_DC_LEFT;
  476.         *mode++ = I_PRED_CHROMA_H;
  477.         *pi_count = 2;
  478.     }
  479.     else if( b_top )
  480.     {
  481.         /* top available*/
  482.         *mode++ = I_PRED_CHROMA_DC_TOP;
  483.         *mode++ = I_PRED_CHROMA_V;
  484.         *pi_count = 2;
  485.     }
  486.     else
  487.     {
  488.         /* none available */
  489.         *mode = I_PRED_CHROMA_DC_128;
  490.         *pi_count = 1;
  491.     }
  492. }
  493. /* MAX = 9 */
  494. static void predict_4x4_mode_available( unsigned int i_neighbour,
  495.                                         int *mode, int *pi_count )
  496. {
  497.     int b_top = i_neighbour & MB_TOP;
  498.     int b_left = i_neighbour & MB_LEFT;
  499.     if( b_top && b_left )
  500.     {
  501.         *pi_count = 6;
  502.         *mode++ = I_PRED_4x4_DC;
  503.         *mode++ = I_PRED_4x4_H;
  504.         *mode++ = I_PRED_4x4_V;
  505.         *mode++ = I_PRED_4x4_DDL;
  506.         if( i_neighbour & MB_TOPLEFT )
  507.         {
  508.             *mode++ = I_PRED_4x4_DDR;
  509.             *mode++ = I_PRED_4x4_VR;
  510.             *mode++ = I_PRED_4x4_HD;
  511.             *pi_count += 3;
  512.         }
  513.         *mode++ = I_PRED_4x4_VL;
  514.         *mode++ = I_PRED_4x4_HU;
  515.     }
  516.     else if( b_left )
  517.     {
  518.         *mode++ = I_PRED_4x4_DC_LEFT;
  519.         *mode++ = I_PRED_4x4_H;
  520.         *mode++ = I_PRED_4x4_HU;
  521.         *pi_count = 3;
  522.     }
  523.     else if( b_top )
  524.     {
  525.         *mode++ = I_PRED_4x4_DC_TOP;
  526.         *mode++ = I_PRED_4x4_V;
  527.         *mode++ = I_PRED_4x4_DDL;
  528.         *mode++ = I_PRED_4x4_VL;
  529.         *pi_count = 4;
  530.     }
  531.     else
  532.     {
  533.         *mode++ = I_PRED_4x4_DC_128;
  534.         *pi_count = 1;
  535.     }
  536. }
  537. /* For trellis=2, we need to do this for both sizes of DCT, for trellis=1 we only need to use it on the chosen mode. */
  538. static void inline x264_psy_trellis_init( x264_t *h, int do_both_dct )
  539. {
  540.     ALIGNED_ARRAY_16( int16_t, dct8x8,[4],[8][8] );
  541.     ALIGNED_ARRAY_16( int16_t, dct4x4,[16],[4][4] );
  542.     ALIGNED_16( static uint8_t zero[16*FDEC_STRIDE] ) = {0};
  543.     int i;
  544.     if( do_both_dct || h->mb.b_transform_8x8 )
  545.     {
  546.         h->dctf.sub16x16_dct8( dct8x8, h->mb.pic.p_fenc[0], zero );
  547.         for( i = 0; i < 4; i++ )
  548.             h->zigzagf.scan_8x8( h->mb.pic.fenc_dct8[i], dct8x8[i] );
  549.     }
  550.     if( do_both_dct || !h->mb.b_transform_8x8 )
  551.     {
  552.         h->dctf.sub16x16_dct( dct4x4, h->mb.pic.p_fenc[0], zero );
  553.         for( i = 0; i < 16; i++ )
  554.             h->zigzagf.scan_4x4( h->mb.pic.fenc_dct4[i], dct4x4[i] );
  555.     }
  556. }
  557. /* Pre-calculate fenc satd scores for psy RD, minus DC coefficients */
  558. static inline void x264_mb_cache_fenc_satd( x264_t *h )
  559. {
  560.     ALIGNED_16( static uint8_t zero[16] ) = {0};
  561.     uint8_t *fenc;
  562.     int x, y, satd_sum = 0, sa8d_sum = 0;
  563.     if( h->param.analyse.i_trellis == 2 && h->mb.i_psy_trellis )
  564.         x264_psy_trellis_init( h, h->param.analyse.b_transform_8x8 );
  565.     if( !h->mb.i_psy_rd )
  566.         return;
  567.     for( y = 0; y < 4; y++ )
  568.         for( x = 0; x < 4; x++ )
  569.         {
  570.             fenc = h->mb.pic.p_fenc[0]+x*4+y*4*FENC_STRIDE;
  571.             h->mb.pic.fenc_satd[y][x] = h->pixf.satd[PIXEL_4x4]( zero, 0, fenc, FENC_STRIDE )
  572.                                       - (h->pixf.sad[PIXEL_4x4]( zero, 0, fenc, FENC_STRIDE )>>1);
  573.             satd_sum += h->mb.pic.fenc_satd[y][x];
  574.         }
  575.     for( y = 0; y < 2; y++ )
  576.         for( x = 0; x < 2; x++ )
  577.         {
  578.             fenc = h->mb.pic.p_fenc[0]+x*8+y*8*FENC_STRIDE;
  579.             h->mb.pic.fenc_sa8d[y][x] = h->pixf.sa8d[PIXEL_8x8]( zero, 0, fenc, FENC_STRIDE )
  580.                                       - (h->pixf.sad[PIXEL_8x8]( zero, 0, fenc, FENC_STRIDE )>>2);
  581.             sa8d_sum += h->mb.pic.fenc_sa8d[y][x];
  582.         }
  583.     h->mb.pic.fenc_satd_sum = satd_sum;
  584.     h->mb.pic.fenc_sa8d_sum = sa8d_sum;
  585. }
  586. static void x264_mb_analyse_intra_chroma( x264_t *h, x264_mb_analysis_t *a )
  587. {
  588.     int i;
  589.     int i_max;
  590.     int predict_mode[4];
  591.     int b_merged_satd = !!h->pixf.intra_mbcmp_x3_8x8c && !h->mb.b_lossless;
  592.     uint8_t *p_dstc[2], *p_srcc[2];
  593.     if( a->i_satd_i8x8chroma < COST_MAX )
  594.         return;
  595.     /* 8x8 prediction selection for chroma */
  596.     p_dstc[0] = h->mb.pic.p_fdec[1];
  597.     p_dstc[1] = h->mb.pic.p_fdec[2];
  598.     p_srcc[0] = h->mb.pic.p_fenc[1];
  599.     p_srcc[1] = h->mb.pic.p_fenc[2];
  600.     predict_8x8chroma_mode_available( h->mb.i_neighbour_intra, predict_mode, &i_max );
  601.     a->i_satd_i8x8chroma = COST_MAX;
  602.     if( i_max == 4 && b_merged_satd )
  603.     {
  604.         int satdu[4], satdv[4];
  605.         h->pixf.intra_mbcmp_x3_8x8c( p_srcc[0], p_dstc[0], satdu );
  606.         h->pixf.intra_mbcmp_x3_8x8c( p_srcc[1], p_dstc[1], satdv );
  607.         h->predict_8x8c[I_PRED_CHROMA_P]( p_dstc[0] );
  608.         h->predict_8x8c[I_PRED_CHROMA_P]( p_dstc[1] );
  609.         satdu[I_PRED_CHROMA_P] =
  610.             h->pixf.mbcmp[PIXEL_8x8]( p_dstc[0], FDEC_STRIDE, p_srcc[0], FENC_STRIDE );
  611.         satdv[I_PRED_CHROMA_P] =
  612.             h->pixf.mbcmp[PIXEL_8x8]( p_dstc[1], FDEC_STRIDE, p_srcc[1], FENC_STRIDE );
  613.         for( i=0; i<i_max; i++ )
  614.         {
  615.             int i_mode = predict_mode[i];
  616.             int i_satd = satdu[i_mode] + satdv[i_mode]
  617.                        + a->i_lambda * bs_size_ue(i_mode);
  618.             a->i_satd_i8x8chroma_dir[i] = i_satd;
  619.             COPY2_IF_LT( a->i_satd_i8x8chroma, i_satd, a->i_predict8x8chroma, i_mode );
  620.         }
  621.     }
  622.     else
  623.     {
  624.         for( i=0; i<i_max; i++ )
  625.         {
  626.             int i_satd;
  627.             int i_mode = predict_mode[i];
  628.             /* we do the prediction */
  629.             if( h->mb.b_lossless )
  630.                 x264_predict_lossless_8x8_chroma( h, i_mode );
  631.             else
  632.             {
  633.                 h->predict_8x8c[i_mode]( p_dstc[0] );
  634.                 h->predict_8x8c[i_mode]( p_dstc[1] );
  635.             }
  636.             /* we calculate the cost */
  637.             i_satd = h->pixf.mbcmp[PIXEL_8x8]( p_dstc[0], FDEC_STRIDE,
  638.                                                p_srcc[0], FENC_STRIDE ) +
  639.                      h->pixf.mbcmp[PIXEL_8x8]( p_dstc[1], FDEC_STRIDE,
  640.                                                p_srcc[1], FENC_STRIDE ) +
  641.                      a->i_lambda * bs_size_ue( x264_mb_pred_mode8x8c_fix[i_mode] );
  642.             a->i_satd_i8x8chroma_dir[i] = i_satd;
  643.             COPY2_IF_LT( a->i_satd_i8x8chroma, i_satd, a->i_predict8x8chroma, i_mode );
  644.         }
  645.     }
  646.     h->mb.i_chroma_pred_mode = a->i_predict8x8chroma;
  647. }
  648. static void x264_mb_analyse_intra( x264_t *h, x264_mb_analysis_t *a, int i_satd_inter )
  649. {
  650.     const unsigned int flags = h->sh.i_type == SLICE_TYPE_I ? h->param.analyse.intra : h->param.analyse.inter;
  651.     uint8_t  *p_src = h->mb.pic.p_fenc[0];
  652.     uint8_t  *p_dst = h->mb.pic.p_fdec[0];
  653.     int i, idx;
  654.     int i_max;
  655.     int predict_mode[9];
  656.     int b_merged_satd = !!h->pixf.intra_mbcmp_x3_16x16 && !h->mb.b_lossless;
  657.     /*---------------- Try all mode and calculate their score ---------------*/
  658.     /* 16x16 prediction selection */
  659.     predict_16x16_mode_available( h->mb.i_neighbour_intra, predict_mode, &i_max );
  660.     if( b_merged_satd && i_max == 4 )
  661.     {
  662.         h->pixf.intra_mbcmp_x3_16x16( p_src, p_dst, a->i_satd_i16x16_dir );
  663.         h->predict_16x16[I_PRED_16x16_P]( p_dst );
  664.         a->i_satd_i16x16_dir[I_PRED_16x16_P] =
  665.             h->pixf.mbcmp[PIXEL_16x16]( p_dst, FDEC_STRIDE, p_src, FENC_STRIDE );
  666.         for( i=0; i<4; i++ )
  667.         {
  668.             int cost = a->i_satd_i16x16_dir[i] += a->i_lambda * bs_size_ue(i);
  669.             COPY2_IF_LT( a->i_satd_i16x16, cost, a->i_predict16x16, i );
  670.         }
  671.     }
  672.     else
  673.     {
  674.         for( i = 0; i < i_max; i++ )
  675.         {
  676.             int i_satd;
  677.             int i_mode = predict_mode[i];
  678.             if( h->mb.b_lossless )
  679.                 x264_predict_lossless_16x16( h, i_mode );
  680.             else
  681.                 h->predict_16x16[i_mode]( p_dst );
  682.             i_satd = h->pixf.mbcmp[PIXEL_16x16]( p_dst, FDEC_STRIDE, p_src, FENC_STRIDE ) +
  683.                     a->i_lambda * bs_size_ue( x264_mb_pred_mode16x16_fix[i_mode] );
  684.             COPY2_IF_LT( a->i_satd_i16x16, i_satd, a->i_predict16x16, i_mode );
  685.             a->i_satd_i16x16_dir[i_mode] = i_satd;
  686.         }
  687.     }
  688.     if( h->sh.i_type == SLICE_TYPE_B )
  689.         /* cavlc mb type prefix */
  690.         a->i_satd_i16x16 += a->i_lambda * i_mb_b_cost_table[I_16x16];
  691.     if( a->b_fast_intra && a->i_satd_i16x16 > 2*i_satd_inter )
  692.         return;
  693.     /* 8x8 prediction selection */
  694.     if( flags & X264_ANALYSE_I8x8 )
  695.     {
  696.         ALIGNED_ARRAY_16( uint8_t, edge,[33] );
  697.         x264_pixel_cmp_t sa8d = (h->pixf.mbcmp[0] == h->pixf.satd[0]) ? h->pixf.sa8d[PIXEL_8x8] : h->pixf.mbcmp[PIXEL_8x8];
  698.         int i_satd_thresh = a->i_mbrd ? COST_MAX : X264_MIN( i_satd_inter, a->i_satd_i16x16 );
  699.         int i_cost = 0;
  700.         h->mb.i_cbp_luma = 0;
  701.         b_merged_satd = h->pixf.intra_mbcmp_x3_8x8 && !h->mb.b_lossless;
  702.         // FIXME some bias like in i4x4?
  703.         if( h->sh.i_type == SLICE_TYPE_B )
  704.             i_cost += a->i_lambda * i_mb_b_cost_table[I_8x8];
  705.         for( idx = 0;; idx++ )
  706.         {
  707.             int x = idx&1;
  708.             int y = idx>>1;
  709.             uint8_t *p_src_by = p_src + 8*x + 8*y*FENC_STRIDE;
  710.             uint8_t *p_dst_by = p_dst + 8*x + 8*y*FDEC_STRIDE;
  711.             int i_best = COST_MAX;
  712.             int i_pred_mode = x264_mb_predict_intra4x4_mode( h, 4*idx );
  713.             predict_4x4_mode_available( h->mb.i_neighbour8[idx], predict_mode, &i_max );
  714.             h->predict_8x8_filter( p_dst_by, edge, h->mb.i_neighbour8[idx], ALL_NEIGHBORS );
  715.             if( b_merged_satd && i_max == 9 )
  716.             {
  717.                 int satd[9];
  718.                 h->pixf.intra_mbcmp_x3_8x8( p_src_by, edge, satd );
  719.                 satd[i_pred_mode] -= 3 * a->i_lambda;
  720.                 for( i=2; i>=0; i-- )
  721.                 {
  722.                     int cost = a->i_satd_i8x8_dir[i][idx] = satd[i] + 4 * a->i_lambda;
  723.                     COPY2_IF_LT( i_best, cost, a->i_predict8x8[idx], i );
  724.                 }
  725.                 i = 3;
  726.             }
  727.             else
  728.                 i = 0;
  729.             for( ; i<i_max; i++ )
  730.             {
  731.                 int i_satd;
  732.                 int i_mode = predict_mode[i];
  733.                 if( h->mb.b_lossless )
  734.                     x264_predict_lossless_8x8( h, p_dst_by, idx, i_mode, edge );
  735.                 else
  736.                     h->predict_8x8[i_mode]( p_dst_by, edge );
  737.                 i_satd = sa8d( p_dst_by, FDEC_STRIDE, p_src_by, FENC_STRIDE )
  738.                        + a->i_lambda * (i_pred_mode == x264_mb_pred_mode4x4_fix(i_mode) ? 1 : 4);
  739.                 COPY2_IF_LT( i_best, i_satd, a->i_predict8x8[idx], i_mode );
  740.                 a->i_satd_i8x8_dir[i_mode][idx] = i_satd;
  741.             }
  742.             i_cost += i_best;
  743.             if( idx == 3 || i_cost > i_satd_thresh )
  744.                 break;
  745.             /* we need to encode this block now (for next ones) */
  746.             h->predict_8x8[a->i_predict8x8[idx]]( p_dst_by, edge );
  747.             x264_mb_encode_i8x8( h, idx, a->i_qp );
  748.             x264_macroblock_cache_intra8x8_pred( h, 2*x, 2*y, a->i_predict8x8[idx] );
  749.         }
  750.         if( idx == 3 )
  751.         {
  752.             a->i_satd_i8x8 = i_cost;
  753.             if( h->mb.i_skip_intra )
  754.             {
  755.                 h->mc.copy[PIXEL_16x16]( h->mb.pic.i8x8_fdec_buf, 16, p_dst, FDEC_STRIDE, 16 );
  756.                 h->mb.pic.i8x8_nnz_buf[0] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[ 0]];
  757.                 h->mb.pic.i8x8_nnz_buf[1] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[ 2]];
  758.                 h->mb.pic.i8x8_nnz_buf[2] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[ 8]];
  759.                 h->mb.pic.i8x8_nnz_buf[3] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[10]];
  760.                 h->mb.pic.i8x8_cbp = h->mb.i_cbp_luma;
  761.                 if( h->mb.i_skip_intra == 2 )
  762.                     h->mc.memcpy_aligned( h->mb.pic.i8x8_dct_buf, h->dct.luma8x8, sizeof(h->mb.pic.i8x8_dct_buf) );
  763.             }
  764.         }
  765.         else
  766.         {
  767.             static const uint16_t cost_div_fix8[3] = {1024,512,341};
  768.             a->i_satd_i8x8 = COST_MAX;
  769.             i_cost = (i_cost * cost_div_fix8[idx]) >> 8;
  770.         }
  771.         if( X264_MIN(i_cost, a->i_satd_i16x16) > i_satd_inter*(5+!!a->i_mbrd)/4 )
  772.             return;
  773.     }
  774.     /* 4x4 prediction selection */
  775.     if( flags & X264_ANALYSE_I4x4 )
  776.     {
  777.         int i_cost;
  778.         int i_satd_thresh = X264_MIN3( i_satd_inter, a->i_satd_i16x16, a->i_satd_i8x8 );
  779.         h->mb.i_cbp_luma = 0;
  780.         b_merged_satd = h->pixf.intra_mbcmp_x3_4x4 && !h->mb.b_lossless;
  781.         if( a->i_mbrd )
  782.             i_satd_thresh = i_satd_thresh * (10-a->b_fast_intra)/8;
  783.         i_cost = a->i_lambda * 24;    /* from JVT (SATD0) */
  784.         if( h->sh.i_type == SLICE_TYPE_B )
  785.             i_cost += a->i_lambda * i_mb_b_cost_table[I_4x4];
  786.         for( idx = 0;; idx++ )
  787.         {
  788.             uint8_t *p_src_by = p_src + block_idx_xy_fenc[idx];
  789.             uint8_t *p_dst_by = p_dst + block_idx_xy_fdec[idx];
  790.             int i_best = COST_MAX;
  791.             int i_pred_mode = x264_mb_predict_intra4x4_mode( h, idx );
  792.             predict_4x4_mode_available( h->mb.i_neighbour4[idx], predict_mode, &i_max );
  793.             if( (h->mb.i_neighbour4[idx] & (MB_TOPRIGHT|MB_TOP)) == MB_TOP )
  794.                 /* emulate missing topright samples */
  795.                 *(uint32_t*) &p_dst_by[4 - FDEC_STRIDE] = p_dst_by[3 - FDEC_STRIDE] * 0x01010101U;
  796.             if( b_merged_satd && i_max >= 6 )
  797.             {
  798.                 int satd[9];
  799.                 h->pixf.intra_mbcmp_x3_4x4( p_src_by, p_dst_by, satd );
  800.                 satd[i_pred_mode] -= 3 * a->i_lambda;
  801.                 for( i=2; i>=0; i-- )
  802.                     COPY2_IF_LT( i_best, satd[i] + 4 * a->i_lambda,
  803.                                  a->i_predict4x4[idx], i );
  804.                 i = 3;
  805.             }
  806.             else
  807.                 i = 0;
  808.             for( ; i<i_max; i++ )
  809.             {
  810.                 int i_satd;
  811.                 int i_mode = predict_mode[i];
  812.                 if( h->mb.b_lossless )
  813.                     x264_predict_lossless_4x4( h, p_dst_by, idx, i_mode );
  814.                 else
  815.                     h->predict_4x4[i_mode]( p_dst_by );
  816.                 i_satd = h->pixf.mbcmp[PIXEL_4x4]( p_dst_by, FDEC_STRIDE,
  817.                                                    p_src_by, FENC_STRIDE )
  818.                        + a->i_lambda * (i_pred_mode == x264_mb_pred_mode4x4_fix(i_mode) ? 1 : 4);
  819.                 COPY2_IF_LT( i_best, i_satd, a->i_predict4x4[idx], i_mode );
  820.             }
  821.             i_cost += i_best;
  822.             if( i_cost > i_satd_thresh || idx == 15 )
  823.                 break;
  824.             /* we need to encode this block now (for next ones) */
  825.             h->predict_4x4[a->i_predict4x4[idx]]( p_dst_by );
  826.             x264_mb_encode_i4x4( h, idx, a->i_qp );
  827.             h->mb.cache.intra4x4_pred_mode[x264_scan8[idx]] = a->i_predict4x4[idx];
  828.         }
  829.         if( idx == 15 )
  830.         {
  831.             a->i_satd_i4x4 = i_cost;
  832.             if( h->mb.i_skip_intra )
  833.             {
  834.                 h->mc.copy[PIXEL_16x16]( h->mb.pic.i4x4_fdec_buf, 16, p_dst, FDEC_STRIDE, 16 );
  835.                 h->mb.pic.i4x4_nnz_buf[0] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[ 0]];
  836.                 h->mb.pic.i4x4_nnz_buf[1] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[ 2]];
  837.                 h->mb.pic.i4x4_nnz_buf[2] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[ 8]];
  838.                 h->mb.pic.i4x4_nnz_buf[3] = *(uint32_t*)&h->mb.cache.non_zero_count[x264_scan8[10]];
  839.                 h->mb.pic.i4x4_cbp = h->mb.i_cbp_luma;
  840.                 if( h->mb.i_skip_intra == 2 )
  841.                     h->mc.memcpy_aligned( h->mb.pic.i4x4_dct_buf, h->dct.luma4x4, sizeof(h->mb.pic.i4x4_dct_buf) );
  842.             }
  843.         }
  844.         else
  845.             a->i_satd_i4x4 = COST_MAX;
  846.     }
  847. }
  848. static void x264_intra_rd( x264_t *h, x264_mb_analysis_t *a, int i_satd_thresh )
  849. {
  850.     if( a->i_satd_i16x16 <= i_satd_thresh )
  851.     {
  852.         h->mb.i_type = I_16x16;
  853.         x264_analyse_update_cache( h, a );
  854.         a->i_satd_i16x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  855.     }
  856.     else
  857.         a->i_satd_i16x16 = COST_MAX;
  858.     if( a->i_satd_i4x4 <= i_satd_thresh && a->i_satd_i4x4 < COST_MAX )
  859.     {
  860.         h->mb.i_type = I_4x4;
  861.         x264_analyse_update_cache( h, a );
  862.         a->i_satd_i4x4 = x264_rd_cost_mb( h, a->i_lambda2 );
  863.     }
  864.     else
  865.         a->i_satd_i4x4 = COST_MAX;
  866.     if( a->i_satd_i8x8 <= i_satd_thresh && a->i_satd_i8x8 < COST_MAX )
  867.     {
  868.         h->mb.i_type = I_8x8;
  869.         x264_analyse_update_cache( h, a );
  870.         a->i_satd_i8x8 = x264_rd_cost_mb( h, a->i_lambda2 );
  871.         a->i_cbp_i8x8_luma = h->mb.i_cbp_luma;
  872.     }
  873.     else
  874.         a->i_satd_i8x8 = COST_MAX;
  875. }
  876. static void x264_intra_rd_refine( x264_t *h, x264_mb_analysis_t *a )
  877. {
  878.     uint8_t  *p_dst = h->mb.pic.p_fdec[0];
  879.     int i, j, idx, x, y;
  880.     int i_max, i_mode, i_thresh;
  881.     uint64_t i_satd, i_best;
  882.     int predict_mode[9];
  883.     h->mb.i_skip_intra = 0;
  884.     if( h->mb.i_type == I_16x16 )
  885.     {
  886.         int old_pred_mode = a->i_predict16x16;
  887.         i_thresh = a->i_satd_i16x16_dir[old_pred_mode] * 9/8;
  888.         i_best = a->i_satd_i16x16;
  889.         predict_16x16_mode_available( h->mb.i_neighbour_intra, predict_mode, &i_max );
  890.         for( i = 0; i < i_max; i++ )
  891.         {
  892.             int i_mode = predict_mode[i];
  893.             if( i_mode == old_pred_mode || a->i_satd_i16x16_dir[i_mode] > i_thresh )
  894.                 continue;
  895.             h->mb.i_intra16x16_pred_mode = i_mode;
  896.             i_satd = x264_rd_cost_mb( h, a->i_lambda2 );
  897.             COPY2_IF_LT( i_best, i_satd, a->i_predict16x16, i_mode );
  898.         }
  899.     }
  900.     /* RD selection for chroma prediction */
  901.     predict_8x8chroma_mode_available( h->mb.i_neighbour_intra, predict_mode, &i_max );
  902.     if( i_max > 1 )
  903.     {
  904.         i_thresh = a->i_satd_i8x8chroma * 5/4;
  905.         for( i = j = 0; i < i_max; i++ )
  906.             if( a->i_satd_i8x8chroma_dir[i] < i_thresh &&
  907.                 predict_mode[i] != a->i_predict8x8chroma )
  908.             {
  909.                 predict_mode[j++] = predict_mode[i];
  910.             }
  911.         i_max = j;
  912.         if( i_max > 0 )
  913.         {
  914.             int i_cbp_chroma_best = h->mb.i_cbp_chroma;
  915.             int i_chroma_lambda = x264_lambda2_tab[h->mb.i_chroma_qp];
  916.             /* the previous thing encoded was x264_intra_rd(), so the pixels and
  917.              * coefs for the current chroma mode are still around, so we only
  918.              * have to recount the bits. */
  919.             i_best = x264_rd_cost_i8x8_chroma( h, i_chroma_lambda, a->i_predict8x8chroma, 0 );
  920.             for( i = 0; i < i_max; i++ )
  921.             {
  922.                 i_mode = predict_mode[i];
  923.                 if( h->mb.b_lossless )
  924.                     x264_predict_lossless_8x8_chroma( h, i_mode );
  925.                 else
  926.                 {
  927.                     h->predict_8x8c[i_mode]( h->mb.pic.p_fdec[1] );
  928.                     h->predict_8x8c[i_mode]( h->mb.pic.p_fdec[2] );
  929.                 }
  930.                 /* if we've already found a mode that needs no residual, then
  931.                  * probably any mode with a residual will be worse.
  932.                  * so avoid dct on the remaining modes to improve speed. */
  933.                 i_satd = x264_rd_cost_i8x8_chroma( h, i_chroma_lambda, i_mode, h->mb.i_cbp_chroma != 0x00 );
  934.                 COPY3_IF_LT( i_best, i_satd, a->i_predict8x8chroma, i_mode, i_cbp_chroma_best, h->mb.i_cbp_chroma );
  935.             }
  936.             h->mb.i_chroma_pred_mode = a->i_predict8x8chroma;
  937.             h->mb.i_cbp_chroma = i_cbp_chroma_best;
  938.         }
  939.     }
  940.     if( h->mb.i_type == I_4x4 )
  941.     {
  942.         uint32_t pels[4] = {0}; // doesn't need initting, just shuts up a gcc warning
  943.         int i_nnz = 0;
  944.         for( idx = 0; idx < 16; idx++ )
  945.         {
  946.             uint8_t *p_dst_by = p_dst + block_idx_xy_fdec[idx];
  947.             i_best = COST_MAX64;
  948.             predict_4x4_mode_available( h->mb.i_neighbour4[idx], predict_mode, &i_max );
  949.             if( (h->mb.i_neighbour4[idx] & (MB_TOPRIGHT|MB_TOP)) == MB_TOP )
  950.                 /* emulate missing topright samples */
  951.                 *(uint32_t*) &p_dst_by[4 - FDEC_STRIDE] = p_dst_by[3 - FDEC_STRIDE] * 0x01010101U;
  952.             for( i = 0; i < i_max; i++ )
  953.             {
  954.                 i_mode = predict_mode[i];
  955.                 if( h->mb.b_lossless )
  956.                     x264_predict_lossless_4x4( h, p_dst_by, idx, i_mode );
  957.                 else
  958.                     h->predict_4x4[i_mode]( p_dst_by );
  959.                 i_satd = x264_rd_cost_i4x4( h, a->i_lambda2, idx, i_mode );
  960.                 if( i_best > i_satd )
  961.                 {
  962.                     a->i_predict4x4[idx] = i_mode;
  963.                     i_best = i_satd;
  964.                     pels[0] = *(uint32_t*)(p_dst_by+0*FDEC_STRIDE);
  965.                     pels[1] = *(uint32_t*)(p_dst_by+1*FDEC_STRIDE);
  966.                     pels[2] = *(uint32_t*)(p_dst_by+2*FDEC_STRIDE);
  967.                     pels[3] = *(uint32_t*)(p_dst_by+3*FDEC_STRIDE);
  968.                     i_nnz = h->mb.cache.non_zero_count[x264_scan8[idx]];
  969.                 }
  970.             }
  971.             *(uint32_t*)(p_dst_by+0*FDEC_STRIDE) = pels[0];
  972.             *(uint32_t*)(p_dst_by+1*FDEC_STRIDE) = pels[1];
  973.             *(uint32_t*)(p_dst_by+2*FDEC_STRIDE) = pels[2];
  974.             *(uint32_t*)(p_dst_by+3*FDEC_STRIDE) = pels[3];
  975.             h->mb.cache.non_zero_count[x264_scan8[idx]] = i_nnz;
  976.             h->mb.cache.intra4x4_pred_mode[x264_scan8[idx]] = a->i_predict4x4[idx];
  977.         }
  978.     }
  979.     else if( h->mb.i_type == I_8x8 )
  980.     {
  981.         ALIGNED_ARRAY_16( uint8_t, edge,[33] );
  982.         for( idx = 0; idx < 4; idx++ )
  983.         {
  984.             uint64_t pels_h = 0;
  985.             uint8_t pels_v[7];
  986.             uint16_t i_nnz[2];
  987.             uint8_t *p_dst_by;
  988.             int j;
  989.             int cbp_luma_new = 0;
  990.             i_thresh = a->i_satd_i8x8_dir[a->i_predict8x8[idx]][idx] * 11/8;
  991.             i_best = COST_MAX64;
  992.             x = idx&1;
  993.             y = idx>>1;
  994.             p_dst_by = p_dst + 8*x + 8*y*FDEC_STRIDE;
  995.             predict_4x4_mode_available( h->mb.i_neighbour8[idx], predict_mode, &i_max );
  996.             h->predict_8x8_filter( p_dst_by, edge, h->mb.i_neighbour8[idx], ALL_NEIGHBORS );
  997.             for( i = 0; i < i_max; i++ )
  998.             {
  999.                 i_mode = predict_mode[i];
  1000.                 if( a->i_satd_i8x8_dir[i_mode][idx] > i_thresh )
  1001.                     continue;
  1002.                 if( h->mb.b_lossless )
  1003.                     x264_predict_lossless_8x8( h, p_dst_by, idx, i_mode, edge );
  1004.                 else
  1005.                     h->predict_8x8[i_mode]( p_dst_by, edge );
  1006.                 h->mb.i_cbp_luma = a->i_cbp_i8x8_luma;
  1007.                 i_satd = x264_rd_cost_i8x8( h, a->i_lambda2, idx, i_mode );
  1008.                 if( i_best > i_satd )
  1009.                 {
  1010.                     a->i_predict8x8[idx] = i_mode;
  1011.                     cbp_luma_new = h->mb.i_cbp_luma;
  1012.                     i_best = i_satd;
  1013.                     pels_h = *(uint64_t*)(p_dst_by+7*FDEC_STRIDE);
  1014.                     if( !(idx&1) )
  1015.                         for( j=0; j<7; j++ )
  1016.                             pels_v[j] = p_dst_by[7+j*FDEC_STRIDE];
  1017.                     i_nnz[0] = *(uint16_t*)&h->mb.cache.non_zero_count[x264_scan8[4*idx+0]];
  1018.                     i_nnz[1] = *(uint16_t*)&h->mb.cache.non_zero_count[x264_scan8[4*idx+2]];
  1019.                 }
  1020.             }
  1021.             a->i_cbp_i8x8_luma = cbp_luma_new;
  1022.             *(uint64_t*)(p_dst_by+7*FDEC_STRIDE) = pels_h;
  1023.             if( !(idx&1) )
  1024.                 for( j=0; j<7; j++ )
  1025.                     p_dst_by[7+j*FDEC_STRIDE] = pels_v[j];
  1026.             *(uint16_t*)&h->mb.cache.non_zero_count[x264_scan8[4*idx+0]] = i_nnz[0];
  1027.             *(uint16_t*)&h->mb.cache.non_zero_count[x264_scan8[4*idx+2]] = i_nnz[1];
  1028.             x264_macroblock_cache_intra8x8_pred( h, 2*x, 2*y, a->i_predict8x8[idx] );
  1029.         }
  1030.     }
  1031. }
  1032. #define LOAD_FENC( m, src, xoff, yoff) 
  1033.     (m)->i_stride[0] = h->mb.pic.i_stride[0]; 
  1034.     (m)->i_stride[1] = h->mb.pic.i_stride[1]; 
  1035.     (m)->p_fenc[0] = &(src)[0][(xoff)+(yoff)*FENC_STRIDE]; 
  1036.     (m)->p_fenc[1] = &(src)[1][((xoff)>>1)+((yoff)>>1)*FENC_STRIDE]; 
  1037.     (m)->p_fenc[2] = &(src)[2][((xoff)>>1)+((yoff)>>1)*FENC_STRIDE];
  1038. #define LOAD_HPELS(m, src, list, ref, xoff, yoff) 
  1039.     (m)->p_fref[0] = &(src)[0][(xoff)+(yoff)*(m)->i_stride[0]]; 
  1040.     (m)->p_fref[1] = &(src)[1][(xoff)+(yoff)*(m)->i_stride[0]]; 
  1041.     (m)->p_fref[2] = &(src)[2][(xoff)+(yoff)*(m)->i_stride[0]]; 
  1042.     (m)->p_fref[3] = &(src)[3][(xoff)+(yoff)*(m)->i_stride[0]]; 
  1043.     (m)->p_fref[4] = &(src)[4][((xoff)>>1)+((yoff)>>1)*(m)->i_stride[1]]; 
  1044.     (m)->p_fref[5] = &(src)[5][((xoff)>>1)+((yoff)>>1)*(m)->i_stride[1]]; 
  1045.     (m)->integral = &h->mb.pic.p_integral[list][ref][(xoff)+(yoff)*(m)->i_stride[0]];
  1046. #define REF_COST(list, ref) 
  1047.     (a->p_cost_ref##list[ref])
  1048. static void x264_mb_analyse_inter_p16x16( x264_t *h, x264_mb_analysis_t *a )
  1049. {
  1050.     x264_me_t m;
  1051.     int i_ref, i_mvc;
  1052.     ALIGNED_4( int16_t mvc[8][2] );
  1053.     int i_halfpel_thresh = INT_MAX;
  1054.     int *p_halfpel_thresh = h->mb.pic.i_fref[0]>1 ? &i_halfpel_thresh : NULL;
  1055.     /* 16x16 Search on all ref frame */
  1056.     m.i_pixel = PIXEL_16x16;
  1057.     m.p_cost_mv = a->p_cost_mv;
  1058.     LOAD_FENC( &m, h->mb.pic.p_fenc, 0, 0 );
  1059.     a->l0.me16x16.cost = INT_MAX;
  1060.     for( i_ref = 0; i_ref < h->mb.pic.i_fref[0]; i_ref++ )
  1061.     {
  1062.         const int i_ref_cost = REF_COST( 0, i_ref );
  1063.         i_halfpel_thresh -= i_ref_cost;
  1064.         m.i_ref_cost = i_ref_cost;
  1065.         m.i_ref = i_ref;
  1066.         /* search with ref */
  1067.         LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 0, 0 );
  1068.         x264_mb_predict_mv_16x16( h, 0, i_ref, m.mvp );
  1069.         x264_mb_predict_mv_ref16x16( h, 0, i_ref, mvc, &i_mvc );
  1070.         x264_me_search_ref( h, &m, mvc, i_mvc, p_halfpel_thresh );
  1071.         /* early termination
  1072.          * SSD threshold would probably be better than SATD */
  1073.         if( i_ref == 0
  1074.             && a->b_try_pskip
  1075.             && m.cost-m.cost_mv < 300*a->i_lambda
  1076.             &&  abs(m.mv[0]-h->mb.cache.pskip_mv[0])
  1077.               + abs(m.mv[1]-h->mb.cache.pskip_mv[1]) <= 1
  1078.             && x264_macroblock_probe_pskip( h ) )
  1079.         {
  1080.             h->mb.i_type = P_SKIP;
  1081.             x264_analyse_update_cache( h, a );
  1082.             assert( h->mb.cache.pskip_mv[1] <= h->mb.mv_max_spel[1] || h->param.i_threads == 1 );
  1083.             return;
  1084.         }
  1085.         m.cost += i_ref_cost;
  1086.         i_halfpel_thresh += i_ref_cost;
  1087.         if( m.cost < a->l0.me16x16.cost )
  1088.             h->mc.memcpy_aligned( &a->l0.me16x16, &m, sizeof(x264_me_t) );
  1089.         /* save mv for predicting neighbors */
  1090.         *(uint32_t*)a->l0.mvc[i_ref][0] =
  1091.         *(uint32_t*)h->mb.mvr[0][i_ref][h->mb.i_mb_xy] = *(uint32_t*)m.mv;
  1092.     }
  1093.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.me16x16.i_ref );
  1094.     assert( a->l0.me16x16.mv[1] <= h->mb.mv_max_spel[1] || h->param.i_threads == 1 );
  1095.     h->mb.i_type = P_L0;
  1096.     if( a->i_mbrd )
  1097.     {
  1098.         x264_mb_cache_fenc_satd( h );
  1099.         if( a->l0.me16x16.i_ref == 0 && *(uint32_t*)a->l0.me16x16.mv == *(uint32_t*)h->mb.cache.pskip_mv )
  1100.         {
  1101.             h->mb.i_partition = D_16x16;
  1102.             x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv );
  1103.             a->l0.i_rd16x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  1104.             if( !(h->mb.i_cbp_luma|h->mb.i_cbp_chroma) )
  1105.                 h->mb.i_type = P_SKIP;
  1106.         }
  1107.     }
  1108. }
  1109. static void x264_mb_analyse_inter_p8x8_mixed_ref( x264_t *h, x264_mb_analysis_t *a )
  1110. {
  1111.     x264_me_t m;
  1112.     int i_ref;
  1113.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  1114.     int i_halfpel_thresh = INT_MAX;
  1115.     int *p_halfpel_thresh = /*h->mb.pic.i_fref[0]>1 ? &i_halfpel_thresh : */NULL;
  1116.     int i;
  1117.     int i_maxref = h->mb.pic.i_fref[0]-1;
  1118.     h->mb.i_partition = D_8x8;
  1119.     /* early termination: if 16x16 chose ref 0, then evalute no refs older
  1120.      * than those used by the neighbors */
  1121.     if( i_maxref > 0 && a->l0.me16x16.i_ref == 0 &&
  1122.         h->mb.i_mb_type_top && h->mb.i_mb_type_left )
  1123.     {
  1124.         i_maxref = 0;
  1125.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 - 1 ] );
  1126.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 + 0 ] );
  1127.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 + 2 ] );
  1128.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 + 4 ] );
  1129.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 + 0 - 1 ] );
  1130.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 + 2*8 - 1 ] );
  1131.     }
  1132.     for( i_ref = 0; i_ref <= i_maxref; i_ref++ )
  1133.          *(uint32_t*)a->l0.mvc[i_ref][0] = *(uint32_t*)h->mb.mvr[0][i_ref][h->mb.i_mb_xy];
  1134.     for( i = 0; i < 4; i++ )
  1135.     {
  1136.         x264_me_t *l0m = &a->l0.me8x8[i];
  1137.         const int x8 = i%2;
  1138.         const int y8 = i/2;
  1139.         m.i_pixel = PIXEL_8x8;
  1140.         m.p_cost_mv = a->p_cost_mv;
  1141.         LOAD_FENC( &m, p_fenc, 8*x8, 8*y8 );
  1142.         l0m->cost = INT_MAX;
  1143.         for( i_ref = 0; i_ref <= i_maxref; i_ref++ )
  1144.         {
  1145.             const int i_ref_cost = REF_COST( 0, i_ref );
  1146.             i_halfpel_thresh -= i_ref_cost;
  1147.             m.i_ref_cost = i_ref_cost;
  1148.             m.i_ref = i_ref;
  1149.             LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 8*x8, 8*y8 );
  1150.             x264_macroblock_cache_ref( h, 2*x8, 2*y8, 2, 2, 0, i_ref );
  1151.             x264_mb_predict_mv( h, 0, 4*i, 2, m.mvp );
  1152.             x264_me_search_ref( h, &m, a->l0.mvc[i_ref], i+1, p_halfpel_thresh );
  1153.             m.cost += i_ref_cost;
  1154.             i_halfpel_thresh += i_ref_cost;
  1155.             *(uint32_t*)a->l0.mvc[i_ref][i+1] = *(uint32_t*)m.mv;
  1156.             if( m.cost < l0m->cost )
  1157.                 h->mc.memcpy_aligned( l0m, &m, sizeof(x264_me_t) );
  1158.         }
  1159.         x264_macroblock_cache_mv_ptr( h, 2*x8, 2*y8, 2, 2, 0, l0m->mv );
  1160.         x264_macroblock_cache_ref( h, 2*x8, 2*y8, 2, 2, 0, l0m->i_ref );
  1161.         /* If CABAC is on and we're not doing sub-8x8 analysis, the costs
  1162.            are effectively zero. */
  1163.         if( !h->param.b_cabac || (h->param.analyse.inter & X264_ANALYSE_PSUB8x8) )
  1164.             l0m->cost += a->i_lambda * i_sub_mb_p_cost_table[D_L0_8x8];
  1165.     }
  1166.     a->l0.i_cost8x8 = a->l0.me8x8[0].cost + a->l0.me8x8[1].cost +
  1167.                       a->l0.me8x8[2].cost + a->l0.me8x8[3].cost;
  1168.     /* P_8x8 ref0 has no ref cost */
  1169.     if( !h->param.b_cabac && !(a->l0.me8x8[0].i_ref | a->l0.me8x8[1].i_ref |
  1170.                                a->l0.me8x8[2].i_ref | a->l0.me8x8[3].i_ref) )
  1171.         a->l0.i_cost8x8 -= REF_COST( 0, 0 ) * 4;
  1172.     h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  1173.     h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  1174. }
  1175. static void x264_mb_analyse_inter_p8x8( x264_t *h, x264_mb_analysis_t *a )
  1176. {
  1177.     const int i_ref = a->l0.me16x16.i_ref;
  1178.     const int i_ref_cost = h->param.b_cabac || i_ref ? REF_COST( 0, i_ref ) : 0;
  1179.     uint8_t  **p_fref = h->mb.pic.p_fref[0][i_ref];
  1180.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  1181.     int i_mvc;
  1182.     int16_t (*mvc)[2] = a->l0.mvc[i_ref];
  1183.     int i;
  1184.     /* XXX Needed for x264_mb_predict_mv */
  1185.     h->mb.i_partition = D_8x8;
  1186.     i_mvc = 1;
  1187.     *(uint32_t*)mvc[0] = *(uint32_t*)a->l0.me16x16.mv;
  1188.     for( i = 0; i < 4; i++ )
  1189.     {
  1190.         x264_me_t *m = &a->l0.me8x8[i];
  1191.         const int x8 = i%2;
  1192.         const int y8 = i/2;
  1193.         m->i_pixel = PIXEL_8x8;
  1194.         m->p_cost_mv = a->p_cost_mv;
  1195.         m->i_ref_cost = i_ref_cost;
  1196.         m->i_ref = i_ref;
  1197.         LOAD_FENC( m, p_fenc, 8*x8, 8*y8 );
  1198.         LOAD_HPELS( m, p_fref, 0, i_ref, 8*x8, 8*y8 );
  1199.         x264_mb_predict_mv( h, 0, 4*i, 2, m->mvp );
  1200.         x264_me_search( h, m, mvc, i_mvc );
  1201.         x264_macroblock_cache_mv_ptr( h, 2*x8, 2*y8, 2, 2, 0, m->mv );
  1202.         *(uint32_t*)mvc[i_mvc] = *(uint32_t*)m->mv;
  1203.         i_mvc++;
  1204.         /* mb type cost */
  1205.         m->cost += i_ref_cost;
  1206.         if( !h->param.b_cabac || (h->param.analyse.inter & X264_ANALYSE_PSUB8x8) )
  1207.             m->cost += a->i_lambda * i_sub_mb_p_cost_table[D_L0_8x8];
  1208.     }
  1209.     a->l0.i_cost8x8 = a->l0.me8x8[0].cost + a->l0.me8x8[1].cost +
  1210.                       a->l0.me8x8[2].cost + a->l0.me8x8[3].cost;
  1211.     /* theoretically this should include 4*ref_cost,
  1212.      * but 3 seems a better approximation of cabac. */
  1213.     if( h->param.b_cabac )
  1214.         a->l0.i_cost8x8 -= i_ref_cost;
  1215.     h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  1216.     h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  1217. }
  1218. static void x264_mb_analyse_inter_p16x8( x264_t *h, x264_mb_analysis_t *a )
  1219. {
  1220.     x264_me_t m;
  1221.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  1222.     ALIGNED_4( int16_t mvc[3][2] );
  1223.     int i, j;
  1224.     /* XXX Needed for x264_mb_predict_mv */
  1225.     h->mb.i_partition = D_16x8;
  1226.     for( i = 0; i < 2; i++ )
  1227.     {
  1228.         x264_me_t *l0m = &a->l0.me16x8[i];
  1229.         const int ref8[2] = { a->l0.me8x8[2*i].i_ref, a->l0.me8x8[2*i+1].i_ref };
  1230.         const int i_ref8s = ( ref8[0] == ref8[1] ) ? 1 : 2;
  1231.         m.i_pixel = PIXEL_16x8;
  1232.         m.p_cost_mv = a->p_cost_mv;
  1233.         LOAD_FENC( &m, p_fenc, 0, 8*i );
  1234.         l0m->cost = INT_MAX;
  1235.         for( j = 0; j < i_ref8s; j++ )
  1236.         {
  1237.             const int i_ref = ref8[j];
  1238.             const int i_ref_cost = REF_COST( 0, i_ref );
  1239.             m.i_ref_cost = i_ref_cost;
  1240.             m.i_ref = i_ref;
  1241.             /* if we skipped the 16x16 predictor, we wouldn't have to copy anything... */
  1242.             *(uint32_t*)mvc[0] = *(uint32_t*)a->l0.mvc[i_ref][0];
  1243.             *(uint32_t*)mvc[1] = *(uint32_t*)a->l0.mvc[i_ref][2*i+1];
  1244.             *(uint32_t*)mvc[2] = *(uint32_t*)a->l0.mvc[i_ref][2*i+2];
  1245.             LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 0, 8*i );
  1246.             x264_macroblock_cache_ref( h, 0, 2*i, 4, 2, 0, i_ref );
  1247.             x264_mb_predict_mv( h, 0, 8*i, 4, m.mvp );
  1248.             x264_me_search( h, &m, mvc, 3 );
  1249.             m.cost += i_ref_cost;
  1250.             if( m.cost < l0m->cost )
  1251.                 h->mc.memcpy_aligned( l0m, &m, sizeof(x264_me_t) );
  1252.         }
  1253.         x264_macroblock_cache_mv_ptr( h, 0, 2*i, 4, 2, 0, l0m->mv );
  1254.         x264_macroblock_cache_ref( h, 0, 2*i, 4, 2, 0, l0m->i_ref );
  1255.     }
  1256.     a->l0.i_cost16x8 = a->l0.me16x8[0].cost + a->l0.me16x8[1].cost;
  1257. }
  1258. static void x264_mb_analyse_inter_p8x16( x264_t *h, x264_mb_analysis_t *a )
  1259. {
  1260.     x264_me_t m;
  1261.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  1262.     ALIGNED_4( int16_t mvc[3][2] );
  1263.     int i, j;
  1264.     /* XXX Needed for x264_mb_predict_mv */
  1265.     h->mb.i_partition = D_8x16;
  1266.     for( i = 0; i < 2; i++ )
  1267.     {
  1268.         x264_me_t *l0m = &a->l0.me8x16[i];
  1269.         const int ref8[2] = { a->l0.me8x8[i].i_ref, a->l0.me8x8[i+2].i_ref };
  1270.         const int i_ref8s = ( ref8[0] == ref8[1] ) ? 1 : 2;
  1271.         m.i_pixel = PIXEL_8x16;
  1272.         m.p_cost_mv = a->p_cost_mv;
  1273.         LOAD_FENC( &m, p_fenc, 8*i, 0 );
  1274.         l0m->cost = INT_MAX;
  1275.         for( j = 0; j < i_ref8s; j++ )
  1276.         {
  1277.             const int i_ref = ref8[j];
  1278.             const int i_ref_cost = REF_COST( 0, i_ref );
  1279.             m.i_ref_cost = i_ref_cost;
  1280.             m.i_ref = i_ref;
  1281.             *(uint32_t*)mvc[0] = *(uint32_t*)a->l0.mvc[i_ref][0];
  1282.             *(uint32_t*)mvc[1] = *(uint32_t*)a->l0.mvc[i_ref][i+1];
  1283.             *(uint32_t*)mvc[2] = *(uint32_t*)a->l0.mvc[i_ref][i+3];
  1284.             LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 8*i, 0 );
  1285.             x264_macroblock_cache_ref( h, 2*i, 0, 2, 4, 0, i_ref );
  1286.             x264_mb_predict_mv( h, 0, 4*i, 2, m.mvp );
  1287.             x264_me_search( h, &m, mvc, 3 );
  1288.             m.cost += i_ref_cost;
  1289.             if( m.cost < l0m->cost )
  1290.                 h->mc.memcpy_aligned( l0m, &m, sizeof(x264_me_t) );
  1291.         }
  1292.         x264_macroblock_cache_mv_ptr( h, 2*i, 0, 2, 4, 0, l0m->mv );
  1293.         x264_macroblock_cache_ref( h, 2*i, 0, 2, 4, 0, l0m->i_ref );
  1294.     }
  1295.     a->l0.i_cost8x16 = a->l0.me8x16[0].cost + a->l0.me8x16[1].cost;
  1296. }
  1297. static int x264_mb_analyse_inter_p4x4_chroma( x264_t *h, x264_mb_analysis_t *a, uint8_t **p_fref, int i8x8, int pixel )
  1298. {
  1299.     ALIGNED_8( uint8_t pix1[16*8] );
  1300.     uint8_t *pix2 = pix1+8;
  1301.     const int i_stride = h->mb.pic.i_stride[1];
  1302.     const int or = 4*(i8x8&1) + 2*(i8x8&2)*i_stride;
  1303.     const int oe = 4*(i8x8&1) + 2*(i8x8&2)*FENC_STRIDE;
  1304. #define CHROMA4x4MC( width, height, me, x, y ) 
  1305.     h->mc.mc_chroma( &pix1[x+y*16], 16, &p_fref[4][or+x+y*i_stride], i_stride, (me).mv[0], (me).mv[1], width, height ); 
  1306.     h->mc.mc_chroma( &pix2[x+y*16], 16, &p_fref[5][or+x+y*i_stride], i_stride, (me).mv[0], (me).mv[1], width, height );
  1307.     if( pixel == PIXEL_4x4 )
  1308.     {
  1309.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][0], 0,0 );
  1310.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][1], 2,0 );
  1311.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][2], 0,2 );
  1312.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][3], 2,2 );
  1313.     }
  1314.     else if( pixel == PIXEL_8x4 )
  1315.     {
  1316.         CHROMA4x4MC( 4,2, a->l0.me8x4[i8x8][0], 0,0 );
  1317.         CHROMA4x4MC( 4,2, a->l0.me8x4[i8x8][1], 0,2 );
  1318.     }
  1319.     else
  1320.     {
  1321.         CHROMA4x4MC( 2,4, a->l0.me4x8[i8x8][0], 0,0 );
  1322.         CHROMA4x4MC( 2,4, a->l0.me4x8[i8x8][1], 2,0 );
  1323.     }
  1324.     return h->pixf.mbcmp[PIXEL_4x4]( &h->mb.pic.p_fenc[1][oe], FENC_STRIDE, pix1, 16 )
  1325.          + h->pixf.mbcmp[PIXEL_4x4]( &h->mb.pic.p_fenc[2][oe], FENC_STRIDE, pix2, 16 );
  1326. }
  1327. static void x264_mb_analyse_inter_p4x4( x264_t *h, x264_mb_analysis_t *a, int i8x8 )
  1328. {
  1329.     uint8_t  **p_fref = h->mb.pic.p_fref[0][a->l0.me8x8[i8x8].i_ref];
  1330.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  1331.     const int i_ref = a->l0.me8x8[i8x8].i_ref;
  1332.     int i4x4;
  1333.     /* XXX Needed for x264_mb_predict_mv */
  1334.     h->mb.i_partition = D_8x8;
  1335.     for( i4x4 = 0; i4x4 < 4; i4x4++ )
  1336.     {
  1337.         const int idx = 4*i8x8 + i4x4;
  1338.         const int x4 = block_idx_x[idx];
  1339.         const int y4 = block_idx_y[idx];
  1340.         const int i_mvc = (i4x4 == 0);
  1341.         x264_me_t *m = &a->l0.me4x4[i8x8][i4x4];
  1342.         m->i_pixel = PIXEL_4x4;
  1343.         m->p_cost_mv = a->p_cost_mv;
  1344.         LOAD_FENC( m, p_fenc, 4*x4, 4*y4 );
  1345.         LOAD_HPELS( m, p_fref, 0, i_ref, 4*x4, 4*y4 );
  1346.         x264_mb_predict_mv( h, 0, idx, 1, m->mvp );
  1347.         x264_me_search( h, m, &a->l0.me8x8[i8x8].mv, i_mvc );
  1348.         x264_macroblock_cache_mv_ptr( h, x4, y4, 1, 1, 0, m->mv );
  1349.     }
  1350.     a->l0.i_cost4x4[i8x8] = a->l0.me4x4[i8x8][0].cost +
  1351.                             a->l0.me4x4[i8x8][1].cost +
  1352.                             a->l0.me4x4[i8x8][2].cost +
  1353.                             a->l0.me4x4[i8x8][3].cost +
  1354.                             REF_COST( 0, i_ref ) +
  1355.                             a->i_lambda * i_sub_mb_p_cost_table[D_L0_4x4];
  1356.     if( h->mb.b_chroma_me )
  1357.         a->l0.i_cost4x4[i8x8] += x264_mb_analyse_inter_p4x4_chroma( h, a, p_fref, i8x8, PIXEL_4x4 );
  1358. }
  1359. static void x264_mb_analyse_inter_p8x4( x264_t *h, x264_mb_analysis_t *a, int i8x8 )
  1360. {
  1361.     uint8_t  **p_fref = h->mb.pic.p_fref[0][a->l0.me8x8[i8x8].i_ref];
  1362.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  1363.     const int i_ref = a->l0.me8x8[i8x8].i_ref;
  1364.     int i8x4;
  1365.     /* XXX Needed for x264_mb_predict_mv */
  1366.     h->mb.i_partition = D_8x8;
  1367.     for( i8x4 = 0; i8x4 < 2; i8x4++ )
  1368.     {
  1369.         const int idx = 4*i8x8 + 2*i8x4;
  1370.         const int x4 = block_idx_x[idx];
  1371.         const int y4 = block_idx_y[idx];
  1372.         const int i_mvc = (i8x4 == 0);
  1373.         x264_me_t *m = &a->l0.me8x4[i8x8][i8x4];
  1374.         m->i_pixel = PIXEL_8x4;
  1375.         m->p_cost_mv = a->p_cost_mv;
  1376.         LOAD_FENC( m, p_fenc, 4*x4, 4*y4 );
  1377.         LOAD_HPELS( m, p_fref, 0, i_ref, 4*x4, 4*y4 );
  1378.         x264_mb_predict_mv( h, 0, idx, 2, m->mvp );
  1379.         x264_me_search( h, m, &a->l0.me4x4[i8x8][0].mv, i_mvc );
  1380.         x264_macroblock_cache_mv_ptr( h, x4, y4, 2, 1, 0, m->mv );
  1381.     }
  1382.     a->l0.i_cost8x4[i8x8] = a->l0.me8x4[i8x8][0].cost + a->l0.me8x4[i8x8][1].cost +
  1383.                             REF_COST( 0, i_ref ) +
  1384.                             a->i_lambda * i_sub_mb_p_cost_table[D_L0_8x4];
  1385.     if( h->mb.b_chroma_me )
  1386.         a->l0.i_cost8x4[i8x8] += x264_mb_analyse_inter_p4x4_chroma( h, a, p_fref, i8x8, PIXEL_8x4 );
  1387. }
  1388. static void x264_mb_analyse_inter_p4x8( x264_t *h, x264_mb_analysis_t *a, int i8x8 )
  1389. {
  1390.     uint8_t  **p_fref = h->mb.pic.p_fref[0][a->l0.me8x8[i8x8].i_ref];
  1391.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  1392.     const int i_ref = a->l0.me8x8[i8x8].i_ref;
  1393.     int i4x8;
  1394.     /* XXX Needed for x264_mb_predict_mv */
  1395.     h->mb.i_partition = D_8x8;
  1396.     for( i4x8 = 0; i4x8 < 2; i4x8++ )
  1397.     {
  1398.         const int idx = 4*i8x8 + i4x8;
  1399.         const int x4 = block_idx_x[idx];
  1400.         const int y4 = block_idx_y[idx];
  1401.         const int i_mvc = (i4x8 == 0);
  1402.         x264_me_t *m = &a->l0.me4x8[i8x8][i4x8];
  1403.         m->i_pixel = PIXEL_4x8;
  1404.         m->p_cost_mv = a->p_cost_mv;
  1405.         LOAD_FENC( m, p_fenc, 4*x4, 4*y4 );
  1406.         LOAD_HPELS( m, p_fref, 0, i_ref, 4*x4, 4*y4 );
  1407.         x264_mb_predict_mv( h, 0, idx, 1, m->mvp );
  1408.         x264_me_search( h, m, &a->l0.me4x4[i8x8][0].mv, i_mvc );
  1409.         x264_macroblock_cache_mv_ptr( h, x4, y4, 1, 2, 0, m->mv );
  1410.     }
  1411.     a->l0.i_cost4x8[i8x8] = a->l0.me4x8[i8x8][0].cost + a->l0.me4x8[i8x8][1].cost +
  1412.                             REF_COST( 0, i_ref ) +
  1413.                             a->i_lambda * i_sub_mb_p_cost_table[D_L0_4x8];
  1414.     if( h->mb.b_chroma_me )
  1415.         a->l0.i_cost4x8[i8x8] += x264_mb_analyse_inter_p4x4_chroma( h, a, p_fref, i8x8, PIXEL_4x8 );
  1416. }
  1417. static void x264_mb_analyse_inter_direct( x264_t *h, x264_mb_analysis_t *a )
  1418. {
  1419.     /* Assumes that fdec still contains the results of
  1420.      * x264_mb_predict_mv_direct16x16 and x264_mb_mc */
  1421.     uint8_t **p_fenc = h->mb.pic.p_fenc;
  1422.     uint8_t **p_fdec = h->mb.pic.p_fdec;
  1423.     int i;
  1424.     a->i_cost16x16direct = a->i_lambda * i_mb_b_cost_table[B_DIRECT];
  1425.     for( i = 0; i < 4; i++ )
  1426.     {
  1427.         const int x = (i&1)*8;
  1428.         const int y = (i>>1)*8;
  1429.         a->i_cost16x16direct +=
  1430.         a->i_cost8x8direct[i] =
  1431.             h->pixf.mbcmp[PIXEL_8x8]( &p_fenc[0][x+y*FENC_STRIDE], FENC_STRIDE, &p_fdec[0][x+y*FDEC_STRIDE], FDEC_STRIDE );
  1432.         /* mb type cost */
  1433.         a->i_cost8x8direct[i] += a->i_lambda * i_sub_mb_b_cost_table[D_DIRECT_8x8];
  1434.     }
  1435. }
  1436. #define WEIGHTED_AVG( size, pix, stride, src1, stride1, src2, stride2 ) 
  1437.     h->mc.avg[size]( pix, stride, src1, stride1, src2, stride2, h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref] ); 
  1438. }
  1439. static void x264_mb_analyse_inter_b16x16( x264_t *h, x264_mb_analysis_t *a )
  1440. {
  1441.     ALIGNED_ARRAY_16( uint8_t, pix0,[16*16] );
  1442.     ALIGNED_ARRAY_16( uint8_t, pix1,[16*16] );
  1443.     uint8_t *src0, *src1;
  1444.     int stride0 = 16, stride1 = 16;
  1445.     x264_me_t m;
  1446.     int i_ref, i_mvc;
  1447.     ALIGNED_4( int16_t mvc[9][2] );
  1448.     int i_halfpel_thresh = INT_MAX;
  1449.     int *p_halfpel_thresh = h->mb.pic.i_fref[0]>1 ? &i_halfpel_thresh : NULL;
  1450.     /* 16x16 Search on all ref frame */
  1451.     m.i_pixel = PIXEL_16x16;
  1452.     m.p_cost_mv = a->p_cost_mv;
  1453.     LOAD_FENC( &m, h->mb.pic.p_fenc, 0, 0 );
  1454.     /* ME for List 0 */
  1455.     a->l0.me16x16.cost = INT_MAX;
  1456.     for( i_ref = 0; i_ref < h->mb.pic.i_fref[0]; i_ref++ )
  1457.     {
  1458.         /* search with ref */
  1459.         LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 0, 0 );
  1460.         x264_mb_predict_mv_16x16( h, 0, i_ref, m.mvp );
  1461.         x264_mb_predict_mv_ref16x16( h, 0, i_ref, mvc, &i_mvc );
  1462.         x264_me_search_ref( h, &m, mvc, i_mvc, p_halfpel_thresh );
  1463.         /* add ref cost */
  1464.         m.cost += REF_COST( 0, i_ref );
  1465.         if( m.cost < a->l0.me16x16.cost )
  1466.         {
  1467.             a->l0.i_ref = i_ref;
  1468.             h->mc.memcpy_aligned( &a->l0.me16x16, &m, sizeof(x264_me_t) );
  1469.         }
  1470.         /* save mv for predicting neighbors */
  1471.         *(uint32_t*)h->mb.mvr[0][i_ref][h->mb.i_mb_xy] = *(uint32_t*)m.mv;
  1472.     }
  1473.     /* subtract ref cost, so we don't have to add it for the other MB types */
  1474.     a->l0.me16x16.cost -= REF_COST( 0, a->l0.i_ref );
  1475.     /* ME for list 1 */
  1476.     i_halfpel_thresh = INT_MAX;
  1477.     p_halfpel_thresh = h->mb.pic.i_fref[1]>1 ? &i_halfpel_thresh : NULL;
  1478.     a->l1.me16x16.cost = INT_MAX;
  1479.     for( i_ref = 0; i_ref < h->mb.pic.i_fref[1]; i_ref++ )
  1480.     {
  1481.         /* search with ref */
  1482.         LOAD_HPELS( &m, h->mb.pic.p_fref[1][i_ref], 1, i_ref, 0, 0 );
  1483.         x264_mb_predict_mv_16x16( h, 1, i_ref, m.mvp );
  1484.         x264_mb_predict_mv_ref16x16( h, 1, i_ref, mvc, &i_mvc );
  1485.         x264_me_search_ref( h, &m, mvc, i_mvc, p_halfpel_thresh );
  1486.         /* add ref cost */
  1487.         m.cost += REF_COST( 1, i_ref );
  1488.         if( m.cost < a->l1.me16x16.cost )
  1489.         {
  1490.             a->l1.i_ref = i_ref;
  1491.             h->mc.memcpy_aligned( &a->l1.me16x16, &m, sizeof(x264_me_t) );
  1492.         }
  1493.         /* save mv for predicting neighbors */
  1494.         *(uint32_t*)h->mb.mvr[1][i_ref][h->mb.i_mb_xy] = *(uint32_t*)m.mv;
  1495.     }
  1496.     /* subtract ref cost, so we don't have to add it for the other MB types */
  1497.     a->l1.me16x16.cost -= REF_COST( 1, a->l1.i_ref );
  1498.     /* Set global ref, needed for other modes? */
  1499.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.i_ref );
  1500.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, a->l1.i_ref );
  1501.     /* get cost of BI mode */
  1502.     src0 = h->mc.get_ref( pix0, &stride0,
  1503.                            h->mb.pic.p_fref[0][a->l0.i_ref], h->mb.pic.i_stride[0],
  1504.                            a->l0.me16x16.mv[0], a->l0.me16x16.mv[1], 16, 16 );
  1505.     src1 = h->mc.get_ref( pix1, &stride1,
  1506.                            h->mb.pic.p_fref[1][a->l1.i_ref], h->mb.pic.i_stride[0],
  1507.                            a->l1.me16x16.mv[0], a->l1.me16x16.mv[1], 16, 16 );
  1508.     h->mc.avg[PIXEL_16x16]( pix0, 16, src0, stride0, src1, stride1, h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref] );
  1509.     a->i_cost16x16bi = h->pixf.mbcmp[PIXEL_16x16]( h->mb.pic.p_fenc[0], FENC_STRIDE, pix0, 16 )
  1510.                      + REF_COST( 0, a->l0.i_ref )
  1511.                      + REF_COST( 1, a->l1.i_ref )
  1512.                      + a->l0.me16x16.cost_mv
  1513.                      + a->l1.me16x16.cost_mv;
  1514.     /* mb type cost */
  1515.     a->i_cost16x16bi   += a->i_lambda * i_mb_b_cost_table[B_BI_BI];
  1516.     a->l0.me16x16.cost += a->i_lambda * i_mb_b_cost_table[B_L0_L0];
  1517.     a->l1.me16x16.cost += a->i_lambda * i_mb_b_cost_table[B_L1_L1];
  1518. }
  1519. static inline void x264_mb_cache_mv_p8x8( x264_t *h, x264_mb_analysis_t *a, int i )
  1520. {
  1521.     const int x = 2*(i%2);
  1522.     const int y = 2*(i/2);
  1523.     switch( h->mb.i_sub_partition[i] )
  1524.     {
  1525.         case D_L0_8x8:
  1526.             x264_macroblock_cache_mv_ptr( h, x, y, 2, 2, 0, a->l0.me8x8[i].mv );
  1527.             break;
  1528.         case D_L0_8x4:
  1529.             x264_macroblock_cache_mv_ptr( h, x, y+0, 2, 1, 0, a->l0.me8x4[i][0].mv );
  1530.             x264_macroblock_cache_mv_ptr( h, x, y+1, 2, 1, 0, a->l0.me8x4[i][1].mv );
  1531.             break;
  1532.         case D_L0_4x8:
  1533.             x264_macroblock_cache_mv_ptr( h, x+0, y, 1, 2, 0, a->l0.me4x8[i][0].mv );
  1534.             x264_macroblock_cache_mv_ptr( h, x+1, y, 1, 2, 0, a->l0.me4x8[i][1].mv );
  1535.             break;
  1536.         case D_L0_4x4:
  1537.             x264_macroblock_cache_mv_ptr( h, x+0, y+0, 1, 1, 0, a->l0.me4x4[i][0].mv );
  1538.             x264_macroblock_cache_mv_ptr( h, x+1, y+0, 1, 1, 0, a->l0.me4x4[i][1].mv );
  1539.             x264_macroblock_cache_mv_ptr( h, x+0, y+1, 1, 1, 0, a->l0.me4x4[i][2].mv );
  1540.             x264_macroblock_cache_mv_ptr( h, x+1, y+1, 1, 1, 0, a->l0.me4x4[i][3].mv );
  1541.             break;
  1542.         default:
  1543.             x264_log( h, X264_LOG_ERROR, "internal errorn" );
  1544.             break;
  1545.     }
  1546. }
  1547. #define CACHE_MV_BI(x,y,dx,dy,me0,me1,part) 
  1548.     if( x264_mb_partition_listX_table[0][part] ) 
  1549.     { 
  1550.         x264_macroblock_cache_ref( h, x,y,dx,dy, 0, a->l0.i_ref ); 
  1551.         x264_macroblock_cache_mv_ptr( h, x,y,dx,dy, 0, me0.mv ); 
  1552.     } 
  1553.     else 
  1554.     { 
  1555.         x264_macroblock_cache_ref( h, x,y,dx,dy, 0, -1 ); 
  1556.         x264_macroblock_cache_mv(  h, x,y,dx,dy, 0, 0 ); 
  1557.         if( b_mvd ) 
  1558.             x264_macroblock_cache_mvd( h, x,y,dx,dy, 0, 0 ); 
  1559.     } 
  1560.     if( x264_mb_partition_listX_table[1][part] ) 
  1561.     { 
  1562.         x264_macroblock_cache_ref( h, x,y,dx,dy, 1, a->l1.i_ref ); 
  1563.         x264_macroblock_cache_mv_ptr( h, x,y,dx,dy, 1, me1.mv ); 
  1564.     } 
  1565.     else 
  1566.     { 
  1567.         x264_macroblock_cache_ref( h, x,y,dx,dy, 1, -1 ); 
  1568.         x264_macroblock_cache_mv(  h, x,y,dx,dy, 1, 0 ); 
  1569.         if( b_mvd ) 
  1570.             x264_macroblock_cache_mvd( h, x,y,dx,dy, 1, 0 ); 
  1571.     }
  1572. static inline void x264_mb_cache_mv_b8x8( x264_t *h, x264_mb_analysis_t *a, int i, int b_mvd )
  1573. {
  1574.     int x = (i%2)*2;
  1575.     int y = (i/2)*2;
  1576.     if( h->mb.i_sub_partition[i] == D_DIRECT_8x8 )
  1577.     {
  1578.         x264_mb_load_mv_direct8x8( h, i );
  1579.         if( b_mvd )
  1580.         {
  1581.             x264_macroblock_cache_mvd(  h, x, y, 2, 2, 0, 0 );
  1582.             x264_macroblock_cache_mvd(  h, x, y, 2, 2, 1, 0 );
  1583.             x264_macroblock_cache_skip( h, x, y, 2, 2, 1 );
  1584.         }
  1585.     }
  1586.     else
  1587.     {
  1588.         CACHE_MV_BI( x, y, 2, 2, a->l0.me8x8[i], a->l1.me8x8[i], h->mb.i_sub_partition[i] );
  1589.     }
  1590. }
  1591. static inline void x264_mb_cache_mv_b16x8( x264_t *h, x264_mb_analysis_t *a, int i, int b_mvd )
  1592. {
  1593.     CACHE_MV_BI( 0, 2*i, 4, 2, a->l0.me16x8[i], a->l1.me16x8[i], a->i_mb_partition16x8[i] );
  1594. }
  1595. static inline void x264_mb_cache_mv_b8x16( x264_t *h, x264_mb_analysis_t *a, int i, int b_mvd )
  1596. {
  1597.     CACHE_MV_BI( 2*i, 0, 2, 4, a->l0.me8x16[i], a->l1.me8x16[i], a->i_mb_partition8x16[i] );
  1598. }
  1599. #undef CACHE_MV_BI
  1600. static void x264_mb_analyse_inter_b8x8( x264_t *h, x264_mb_analysis_t *a )
  1601. {
  1602.     uint8_t **p_fref[2] =
  1603.         { h->mb.pic.p_fref[0][a->l0.i_ref],
  1604.           h->mb.pic.p_fref[1][a->l1.i_ref] };
  1605.     ALIGNED_8( uint8_t pix[2][8*8] );
  1606.     int i, l;
  1607.     /* XXX Needed for x264_mb_predict_mv */
  1608.     h->mb.i_partition = D_8x8;
  1609.     a->i_cost8x8bi = 0;
  1610.     for( i = 0; i < 4; i++ )
  1611.     {
  1612.         const int x8 = i%2;
  1613.         const int y8 = i/2;
  1614.         int i_part_cost;
  1615.         int i_part_cost_bi = 0;
  1616.         int stride[2] = {8,8};
  1617.         uint8_t *src[2];
  1618.         for( l = 0; l < 2; l++ )
  1619.         {
  1620.             x264_mb_analysis_list_t *lX = l ? &a->l1 : &a->l0;
  1621.             x264_me_t *m = &lX->me8x8[i];
  1622.             m->i_pixel = PIXEL_8x8;
  1623.             m->p_cost_mv = a->p_cost_mv;
  1624.             LOAD_FENC( m, h->mb.pic.p_fenc, 8*x8, 8*y8 );
  1625.             LOAD_HPELS( m, p_fref[l], l, lX->i_ref, 8*x8, 8*y8 );
  1626.             x264_mb_predict_mv( h, l, 4*i, 2, m->mvp );
  1627.             x264_me_search( h, m, &lX->me16x16.mv, 1 );
  1628.             x264_macroblock_cache_mv_ptr( h, 2*x8, 2*y8, 2, 2, l, m->mv );
  1629.             /* BI mode */
  1630.             src[l] = h->mc.get_ref( pix[l], &stride[l], m->p_fref, m->i_stride[0],
  1631.                                     m->mv[0], m->mv[1], 8, 8 );
  1632.             i_part_cost_bi += m->cost_mv;
  1633.             /* FIXME: ref cost */
  1634.         }
  1635.         h->mc.avg[PIXEL_8x8]( pix[0], 8, src[0], stride[0], src[1], stride[1], h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref] );
  1636.         i_part_cost_bi += h->pixf.mbcmp[PIXEL_8x8]( a->l0.me8x8[i].p_fenc[0], FENC_STRIDE, pix[0], 8 )
  1637.                         + a->i_lambda * i_sub_mb_b_cost_table[D_BI_8x8];
  1638.         a->l0.me8x8[i].cost += a->i_lambda * i_sub_mb_b_cost_table[D_L0_8x8];
  1639.         a->l1.me8x8[i].cost += a->i_lambda * i_sub_mb_b_cost_table[D_L1_8x8];
  1640.         i_part_cost = a->l0.me8x8[i].cost;
  1641.         h->mb.i_sub_partition[i] = D_L0_8x8;
  1642.         COPY2_IF_LT( i_part_cost, a->l1.me8x8[i].cost, h->mb.i_sub_partition[i], D_L1_8x8 );
  1643.         COPY2_IF_LT( i_part_cost, i_part_cost_bi, h->mb.i_sub_partition[i], D_BI_8x8 );
  1644.         COPY2_IF_LT( i_part_cost, a->i_cost8x8direct[i], h->mb.i_sub_partition[i], D_DIRECT_8x8 );
  1645.         a->i_cost8x8bi += i_part_cost;
  1646.         /* XXX Needed for x264_mb_predict_mv */
  1647.         x264_mb_cache_mv_b8x8( h, a, i, 0 );
  1648.     }
  1649.     /* mb type cost */
  1650.     a->i_cost8x8bi += a->i_lambda * i_mb_b_cost_table[B_8x8];
  1651. }
  1652. static void x264_mb_analyse_inter_b16x8( x264_t *h, x264_mb_analysis_t *a )
  1653. {
  1654.     uint8_t **p_fref[2] =
  1655.         { h->mb.pic.p_fref[0][a->l0.i_ref],
  1656.           h->mb.pic.p_fref[1][a->l1.i_ref] };
  1657.     ALIGNED_ARRAY_16( uint8_t, pix,[2],[16*8] );
  1658.     ALIGNED_4( int16_t mvc[2][2] );
  1659.     int i, l;
  1660.     h->mb.i_partition = D_16x8;
  1661.     a->i_cost16x8bi = 0;
  1662.     for( i = 0; i < 2; i++ )
  1663.     {
  1664.         int i_part_cost;
  1665.         int i_part_cost_bi = 0;
  1666.         int stride[2] = {16,16};
  1667.         uint8_t *src[2];
  1668.         /* TODO: check only the list(s) that were used in b8x8? */
  1669.         for( l = 0; l < 2; l++ )
  1670.         {
  1671.             x264_mb_analysis_list_t *lX = l ? &a->l1 : &a->l0;
  1672.             x264_me_t *m = &lX->me16x8[i];
  1673.             m->i_pixel = PIXEL_16x8;
  1674.             m->p_cost_mv = a->p_cost_mv;
  1675.             LOAD_FENC( m, h->mb.pic.p_fenc, 0, 8*i );
  1676.             LOAD_HPELS( m, p_fref[l], l, lX->i_ref, 0, 8*i );
  1677.             *(uint32_t*)mvc[0] = *(uint32_t*)lX->me8x8[2*i].mv;
  1678.             *(uint32_t*)mvc[1] = *(uint32_t*)lX->me8x8[2*i+1].mv;
  1679.             x264_mb_predict_mv( h, l, 8*i, 2, m->mvp );
  1680.             x264_me_search( h, m, mvc, 2 );
  1681.             /* BI mode */
  1682.             src[l] = h->mc.get_ref( pix[l], &stride[l], m->p_fref, m->i_stride[0],
  1683.                                     m->mv[0], m->mv[1], 16, 8 );
  1684.             /* FIXME: ref cost */
  1685.             i_part_cost_bi += m->cost_mv;
  1686.         }
  1687.         h->mc.avg[PIXEL_16x8]( pix[0], 16, src[0], stride[0], src[1], stride[1], h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref] );
  1688.         i_part_cost_bi += h->pixf.mbcmp[PIXEL_16x8]( a->l0.me16x8[i].p_fenc[0], FENC_STRIDE, pix[0], 16 );
  1689.         i_part_cost = a->l0.me16x8[i].cost;
  1690.         a->i_mb_partition16x8[i] = D_L0_8x8; /* not actually 8x8, only the L0 matters */
  1691.         if( a->l1.me16x8[i].cost < i_part_cost )
  1692.         {
  1693.             i_part_cost = a->l1.me16x8[i].cost;
  1694.             a->i_mb_partition16x8[i] = D_L1_8x8;
  1695.         }
  1696.         if( i_part_cost_bi + a->i_lambda * 1 < i_part_cost )
  1697.         {
  1698.             i_part_cost = i_part_cost_bi;
  1699.             a->i_mb_partition16x8[i] = D_BI_8x8;
  1700.         }
  1701.         a->i_cost16x8bi += i_part_cost;
  1702.         x264_mb_cache_mv_b16x8( h, a, i, 0 );
  1703.     }
  1704.     /* mb type cost */
  1705.     a->i_mb_type16x8 = B_L0_L0
  1706.         + (a->i_mb_partition16x8[0]>>2) * 3
  1707.         + (a->i_mb_partition16x8[1]>>2);
  1708.     a->i_cost16x8bi += a->i_lambda * i_mb_b16x8_cost_table[a->i_mb_type16x8];
  1709. }
  1710. static void x264_mb_analyse_inter_b8x16( x264_t *h, x264_mb_analysis_t *a )
  1711. {
  1712.     uint8_t **p_fref[2] =
  1713.         { h->mb.pic.p_fref[0][a->l0.i_ref],
  1714.           h->mb.pic.p_fref[1][a->l1.i_ref] };
  1715.     ALIGNED_8( uint8_t pix[2][8*16] );
  1716.     ALIGNED_4( int16_t mvc[2][2] );
  1717.     int i, l;
  1718.     h->mb.i_partition = D_8x16;
  1719.     a->i_cost8x16bi = 0;
  1720.     for( i = 0; i < 2; i++ )
  1721.     {
  1722.         int i_part_cost;
  1723.         int i_part_cost_bi = 0;
  1724.         int stride[2] = {8,8};
  1725.         uint8_t *src[2];
  1726.         for( l = 0; l < 2; l++ )
  1727.         {
  1728.             x264_mb_analysis_list_t *lX = l ? &a->l1 : &a->l0;
  1729.             x264_me_t *m = &lX->me8x16[i];
  1730.             m->i_pixel = PIXEL_8x16;
  1731.             m->p_cost_mv = a->p_cost_mv;
  1732.             LOAD_FENC( m, h->mb.pic.p_fenc, 8*i, 0 );
  1733.             LOAD_HPELS( m, p_fref[l], l, lX->i_ref, 8*i, 0 );
  1734.             *(uint32_t*)mvc[0] = *(uint32_t*)lX->me8x8[i].mv;
  1735.             *(uint32_t*)mvc[1] = *(uint32_t*)lX->me8x8[i+2].mv;
  1736.             x264_mb_predict_mv( h, l, 4*i, 2, m->mvp );
  1737.             x264_me_search( h, m, mvc, 2 );
  1738.             /* BI mode */
  1739.             src[l] = h->mc.get_ref( pix[l], &stride[l], m->p_fref,  m->i_stride[0],
  1740.                                     m->mv[0], m->mv[1], 8, 16 );
  1741.             /* FIXME: ref cost */
  1742.             i_part_cost_bi += m->cost_mv;
  1743.         }
  1744.         h->mc.avg[PIXEL_8x16]( pix[0], 8, src[0], stride[0], src[1], stride[1], h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref] );
  1745.         i_part_cost_bi += h->pixf.mbcmp[PIXEL_8x16]( a->l0.me8x16[i].p_fenc[0], FENC_STRIDE, pix[0], 8 );
  1746.         i_part_cost = a->l0.me8x16[i].cost;
  1747.         a->i_mb_partition8x16[i] = D_L0_8x8;
  1748.         if( a->l1.me8x16[i].cost < i_part_cost )
  1749.         {
  1750.             i_part_cost = a->l1.me8x16[i].cost;
  1751.             a->i_mb_partition8x16[i] = D_L1_8x8;
  1752.         }
  1753.         if( i_part_cost_bi + a->i_lambda * 1 < i_part_cost )
  1754.         {
  1755.             i_part_cost = i_part_cost_bi;
  1756.             a->i_mb_partition8x16[i] = D_BI_8x8;
  1757.         }
  1758.         a->i_cost8x16bi += i_part_cost;
  1759.         x264_mb_cache_mv_b8x16( h, a, i, 0 );
  1760.     }
  1761.     /* mb type cost */
  1762.     a->i_mb_type8x16 = B_L0_L0
  1763.         + (a->i_mb_partition8x16[0]>>2) * 3
  1764.         + (a->i_mb_partition8x16[1]>>2);
  1765.     a->i_cost8x16bi += a->i_lambda * i_mb_b16x8_cost_table[a->i_mb_type8x16];
  1766. }
  1767. static void x264_mb_analyse_p_rd( x264_t *h, x264_mb_analysis_t *a, int i_satd )
  1768. {
  1769.     int thresh = i_satd * 5/4;
  1770.     h->mb.i_type = P_L0;
  1771.     if( a->l0.i_rd16x16 == COST_MAX && a->l0.me16x16.cost <= i_satd * 3/2 )
  1772.     {
  1773.         h->mb.i_partition = D_16x16;
  1774.         x264_analyse_update_cache( h, a );
  1775.         a->l0.i_rd16x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  1776.     }
  1777.     if( a->l0.i_cost16x8 <= thresh )
  1778.     {
  1779.         h->mb.i_partition = D_16x8;
  1780.         x264_analyse_update_cache( h, a );
  1781.         a->l0.i_cost16x8 = x264_rd_cost_mb( h, a->i_lambda2 );
  1782.     }
  1783.     else
  1784.         a->l0.i_cost16x8 = COST_MAX;
  1785.     if( a->l0.i_cost8x16 <= thresh )
  1786.     {
  1787.         h->mb.i_partition = D_8x16;
  1788.         x264_analyse_update_cache( h, a );
  1789.         a->l0.i_cost8x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  1790.     }
  1791.     else
  1792.         a->l0.i_cost8x16 = COST_MAX;
  1793.     if( a->l0.i_cost8x8 <= thresh )
  1794.     {
  1795.         h->mb.i_type = P_8x8;
  1796.         h->mb.i_partition = D_8x8;
  1797.         if( h->param.analyse.inter & X264_ANALYSE_PSUB8x8 )
  1798.         {
  1799.             int i;
  1800.             x264_macroblock_cache_ref( h, 0, 0, 2, 2, 0, a->l0.me8x8[0].i_ref );
  1801.             x264_macroblock_cache_ref( h, 2, 0, 2, 2, 0, a->l0.me8x8[1].i_ref );
  1802.             x264_macroblock_cache_ref( h, 0, 2, 2, 2, 0, a->l0.me8x8[2].i_ref );
  1803.             x264_macroblock_cache_ref( h, 2, 2, 2, 2, 0, a->l0.me8x8[3].i_ref );
  1804.             /* FIXME: In the 8x8 blocks where RDO isn't run, the NNZ values used for context selection
  1805.              * for future blocks are those left over from previous RDO calls. */
  1806.             for( i = 0; i < 4; i++ )
  1807.             {
  1808.                 int costs[4] = {a->l0.i_cost4x4[i], a->l0.i_cost8x4[i], a->l0.i_cost4x8[i], a->l0.me8x8[i].cost};
  1809.                 int thresh = X264_MIN4( costs[0], costs[1], costs[2], costs[3] ) * 5 / 4;
  1810.                 int subtype, btype = D_L0_8x8;
  1811.                 uint64_t bcost = COST_MAX64;
  1812.                 for( subtype = D_L0_4x4; subtype <= D_L0_8x8; subtype++ )
  1813.                 {
  1814.                     uint64_t cost;
  1815.                     if( costs[subtype] > thresh || (subtype == D_L0_8x8 && bcost == COST_MAX64) )
  1816.                         continue;
  1817.                     h->mb.i_sub_partition[i] = subtype;
  1818.                     x264_mb_cache_mv_p8x8( h, a, i );
  1819.                     cost = x264_rd_cost_part( h, a->i_lambda2, i<<2, PIXEL_8x8 );
  1820.                     COPY2_IF_LT( bcost, cost, btype, subtype );
  1821.                 }
  1822.                 h->mb.i_sub_partition[i] = btype;
  1823.                 x264_mb_cache_mv_p8x8( h, a, i );
  1824.             }
  1825.         }
  1826.         else
  1827.             x264_analyse_update_cache( h, a );
  1828.         a->l0.i_cost8x8 = x264_rd_cost_mb( h, a->i_lambda2 );
  1829.     }
  1830.     else
  1831.         a->l0.i_cost8x8 = COST_MAX;
  1832. }
  1833. static void x264_mb_analyse_b_rd( x264_t *h, x264_mb_analysis_t *a, int i_satd_inter )
  1834. {
  1835.     int thresh = i_satd_inter * (17 + (!!h->mb.i_psy_rd))/16;
  1836.     if( a->b_direct_available && a->i_rd16x16direct == COST_MAX )
  1837.     {
  1838.         h->mb.i_type = B_DIRECT;
  1839.         /* Assumes direct/skip MC is still in fdec */
  1840.         /* Requires b-rdo to be done before intra analysis */
  1841.         h->mb.b_skip_mc = 1;
  1842.         x264_analyse_update_cache( h, a );
  1843.         a->i_rd16x16direct = x264_rd_cost_mb( h, a->i_lambda2 );
  1844.         h->mb.b_skip_mc = 0;
  1845.     }
  1846.     //FIXME not all the update_cache calls are needed
  1847.     h->mb.i_partition = D_16x16;
  1848.     /* L0 */
  1849.     if( a->l0.me16x16.cost <= thresh && a->l0.i_rd16x16 == COST_MAX )
  1850.     {
  1851.         h->mb.i_type = B_L0_L0;
  1852.         x264_analyse_update_cache( h, a );
  1853.         a->l0.i_rd16x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  1854.     }
  1855.     /* L1 */
  1856.     if( a->l1.me16x16.cost <= thresh && a->l1.i_rd16x16 == COST_MAX )
  1857.     {
  1858.         h->mb.i_type = B_L1_L1;
  1859.         x264_analyse_update_cache( h, a );
  1860.         a->l1.i_rd16x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  1861.     }
  1862.     /* BI */
  1863.     if( a->i_cost16x16bi <= thresh && a->i_rd16x16bi == COST_MAX )
  1864.     {
  1865.         h->mb.i_type = B_BI_BI;
  1866.         x264_analyse_update_cache( h, a );
  1867.         a->i_rd16x16bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1868.     }
  1869.     /* 8x8 */
  1870.     if( a->i_cost8x8bi <= thresh && a->i_rd8x8bi == COST_MAX )
  1871.     {
  1872.         h->mb.i_type = B_8x8;
  1873.         h->mb.i_partition = D_8x8;
  1874.         x264_analyse_update_cache( h, a );
  1875.         a->i_rd8x8bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1876.         x264_macroblock_cache_skip( h, 0, 0, 4, 4, 0 );
  1877.     }
  1878.     /* 16x8 */
  1879.     if( a->i_cost16x8bi <= thresh && a->i_rd16x8bi == COST_MAX )
  1880.     {
  1881.         h->mb.i_type = a->i_mb_type16x8;
  1882.         h->mb.i_partition = D_16x8;
  1883.         x264_analyse_update_cache( h, a );
  1884.         a->i_rd16x8bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1885.     }
  1886.     /* 8x16 */
  1887.     if( a->i_cost8x16bi <= thresh && a->i_rd8x16bi == COST_MAX )
  1888.     {
  1889.         h->mb.i_type = a->i_mb_type8x16;
  1890.         h->mb.i_partition = D_8x16;
  1891.         x264_analyse_update_cache( h, a );
  1892.         a->i_rd8x16bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1893.     }
  1894. }
  1895. static void x264_refine_bidir( x264_t *h, x264_mb_analysis_t *a )
  1896. {
  1897.     const int i_biweight = h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref];
  1898.     int i;
  1899.     if( IS_INTRA(h->mb.i_type) )
  1900.         return;
  1901.     switch( h->mb.i_partition )
  1902.     {
  1903.         case D_16x16:
  1904.             if( h->mb.i_type == B_BI_BI )
  1905.                 x264_me_refine_bidir_satd( h, &a->l0.me16x16, &a->l1.me16x16, i_biweight );
  1906.             break;
  1907.         case D_16x8:
  1908.             for( i=0; i<2; i++ )
  1909.                 if( a->i_mb_partition16x8[i] == D_BI_8x8 )
  1910.                     x264_me_refine_bidir_satd( h, &a->l0.me16x8[i], &a->l1.me16x8[i], i_biweight );
  1911.             break;
  1912.         case D_8x16:
  1913.             for( i=0; i<2; i++ )
  1914.                 if( a->i_mb_partition8x16[i] == D_BI_8x8 )
  1915.                     x264_me_refine_bidir_satd( h, &a->l0.me8x16[i], &a->l1.me8x16[i], i_biweight );
  1916.             break;
  1917.         case D_8x8:
  1918.             for( i=0; i<4; i++ )
  1919.                 if( h->mb.i_sub_partition[i] == D_BI_8x8 )
  1920.                     x264_me_refine_bidir_satd( h, &a->l0.me8x8[i], &a->l1.me8x8[i], i_biweight );
  1921.             break;
  1922.     }
  1923. }
  1924. static inline void x264_mb_analyse_transform( x264_t *h )
  1925. {
  1926.     if( x264_mb_transform_8x8_allowed( h ) && h->param.analyse.b_transform_8x8 && !h->mb.b_lossless )
  1927.     {
  1928.         int i_cost4, i_cost8;
  1929.         /* Only luma MC is really needed, but the full MC is re-used in macroblock_encode. */
  1930.         x264_mb_mc( h );
  1931.         i_cost8 = h->pixf.sa8d[PIXEL_16x16]( h->mb.pic.p_fenc[0], FENC_STRIDE,
  1932.                                              h->mb.pic.p_fdec[0], FDEC_STRIDE );
  1933.         i_cost4 = h->pixf.satd[PIXEL_16x16]( h->mb.pic.p_fenc[0], FENC_STRIDE,
  1934.                                              h->mb.pic.p_fdec[0], FDEC_STRIDE );
  1935.         h->mb.b_transform_8x8 = i_cost8 < i_cost4;
  1936.         h->mb.b_skip_mc = 1;
  1937.     }
  1938. }
  1939. static inline void x264_mb_analyse_transform_rd( x264_t *h, x264_mb_analysis_t *a, int *i_satd, int *i_rd )
  1940. {
  1941.     if( x264_mb_transform_8x8_allowed( h ) && h->param.analyse.b_transform_8x8 )
  1942.     {
  1943.         int i_rd8;
  1944.         x264_analyse_update_cache( h, a );
  1945.         h->mb.b_transform_8x8 ^= 1;
  1946.         /* FIXME only luma is needed, but the score for comparison already includes chroma */
  1947.         i_rd8 = x264_rd_cost_mb( h, a->i_lambda2 );
  1948.         if( *i_rd >= i_rd8 )
  1949.         {
  1950.             if( *i_rd > 0 )
  1951.                 *i_satd = (int64_t)(*i_satd) * i_rd8 / *i_rd;
  1952.             *i_rd = i_rd8;
  1953.         }
  1954.         else
  1955.             h->mb.b_transform_8x8 ^= 1;
  1956.     }
  1957. }
  1958. /* Rate-distortion optimal QP selection.
  1959.  * FIXME: More than half of the benefit of this function seems to be
  1960.  * in the way it improves the coding of chroma DC (by decimating or
  1961.  * finding a better way to code a single DC coefficient.)
  1962.  * There must be a more efficient way to get that portion of the benefit
  1963.  * without doing full QP-RD, but RD-decimation doesn't seem to do the
  1964.  * trick. */
  1965. static inline void x264_mb_analyse_qp_rd( x264_t *h, x264_mb_analysis_t *a )
  1966. {
  1967.     int bcost, cost, direction, failures, prevcost, origcost;
  1968.     int orig_qp = h->mb.i_qp, bqp = h->mb.i_qp;
  1969.     int last_qp_tried = 0;
  1970.     origcost = bcost = x264_rd_cost_mb( h, a->i_lambda2 );
  1971.     /* If CBP is already zero, don't raise the quantizer any higher. */
  1972.     for( direction = h->mb.cbp[h->mb.i_mb_xy] ? 1 : -1; direction >= -1; direction-=2 )
  1973.     {
  1974.         /* Without psy-RD, require monotonicity when moving quant away from previous
  1975.          * macroblock's quant; allow 1 failure when moving quant towards previous quant.
  1976.          * With psy-RD, allow 1 failure when moving quant away from previous quant,
  1977.          * allow 2 failures when moving quant towards previous quant.
  1978.          * Psy-RD generally seems to result in more chaotic RD score-vs-quantizer curves. */
  1979.         int threshold = (!!h->mb.i_psy_rd);
  1980.         /* Raise the threshold for failures if we're moving towards the last QP. */
  1981.         if( ( h->mb.i_last_qp < orig_qp && direction == -1 ) ||
  1982.             ( h->mb.i_last_qp > orig_qp && direction ==  1 ) )
  1983.             threshold++;
  1984.         h->mb.i_qp = orig_qp;
  1985.         failures = 0;
  1986.         prevcost = origcost;
  1987.         h->mb.i_qp += direction;
  1988.         while( h->mb.i_qp >= h->param.rc.i_qp_min && h->mb.i_qp <= h->param.rc.i_qp_max )
  1989.         {
  1990.             if( h->mb.i_last_qp == h->mb.i_qp )
  1991.                 last_qp_tried = 1;
  1992.             h->mb.i_chroma_qp = h->chroma_qp_table[h->mb.i_qp];
  1993.             cost = x264_rd_cost_mb( h, a->i_lambda2 );
  1994.             COPY2_IF_LT( bcost, cost, bqp, h->mb.i_qp );
  1995.             /* We can't assume that the costs are monotonic over QPs.
  1996.              * Tie case-as-failure seems to give better results. */
  1997.             if( cost < prevcost )
  1998.                 failures = 0;
  1999.             else
  2000.                 failures++;
  2001.             prevcost = cost;
  2002.             if( failures > threshold )
  2003.                 break;
  2004.             if( direction == 1 && !h->mb.cbp[h->mb.i_mb_xy] )
  2005.                 break;
  2006.             h->mb.i_qp += direction;
  2007.         }
  2008.     }
  2009.     /* Always try the last block's QP. */
  2010.     if( !last_qp_tried )
  2011.     {
  2012.         h->mb.i_qp = h->mb.i_last_qp;
  2013.         h->mb.i_chroma_qp = h->chroma_qp_table[h->mb.i_qp];
  2014.         cost = x264_rd_cost_mb( h, a->i_lambda2 );
  2015.         COPY2_IF_LT( bcost, cost, bqp, h->mb.i_qp );
  2016.     }
  2017.     h->mb.i_qp = bqp;
  2018.     h->mb.i_chroma_qp = h->chroma_qp_table[h->mb.i_qp];
  2019.     /* Check transform again; decision from before may no longer be optimal. */
  2020.     if( h->mb.i_qp != orig_qp && h->param.analyse.b_transform_8x8 &&
  2021.         x264_mb_transform_8x8_allowed( h ) )
  2022.     {
  2023.         h->mb.b_transform_8x8 ^= 1;
  2024.         cost = x264_rd_cost_mb( h, a->i_lambda2 );
  2025.         if( cost > bcost )
  2026.             h->mb.b_transform_8x8 ^= 1;
  2027.     }
  2028. }
  2029. /*****************************************************************************
  2030.  * x264_macroblock_analyse:
  2031.  *****************************************************************************/
  2032. void x264_macroblock_analyse( x264_t *h )
  2033. {
  2034.     x264_mb_analysis_t analysis;
  2035.     int i_cost = COST_MAX;
  2036.     int i;
  2037.     h->mb.i_qp = x264_ratecontrol_qp( h );
  2038.     if( h->param.rc.i_aq_mode )
  2039.     {
  2040.         x264_adaptive_quant( h );
  2041.         /* If the QP of this MB is within 1 of the previous MB, code the same QP as the previous MB,
  2042.          * to lower the bit cost of the qp_delta.  Don't do this if QPRD is enabled. */
  2043.         if( h->param.analyse.i_subpel_refine < 10 && abs(h->mb.i_qp - h->mb.i_last_qp) == 1 )
  2044.             h->mb.i_qp = h->mb.i_last_qp;
  2045.     }
  2046.     x264_mb_analyse_init( h, &analysis, h->mb.i_qp );
  2047.     /*--------------------------- Do the analysis ---------------------------*/
  2048.     if( h->sh.i_type == SLICE_TYPE_I )
  2049.     {
  2050.         if( analysis.i_mbrd )
  2051.             x264_mb_cache_fenc_satd( h );
  2052.         x264_mb_analyse_intra( h, &analysis, COST_MAX );
  2053.         if( analysis.i_mbrd )
  2054.             x264_intra_rd( h, &analysis, COST_MAX );
  2055.         i_cost = analysis.i_satd_i16x16;
  2056.         h->mb.i_type = I_16x16;
  2057.         COPY2_IF_LT( i_cost, analysis.i_satd_i4x4, h->mb.i_type, I_4x4 );
  2058.         COPY2_IF_LT( i_cost, analysis.i_satd_i8x8, h->mb.i_type, I_8x8 );
  2059.         if( analysis.i_satd_pcm < i_cost )
  2060.             h->mb.i_type = I_PCM;
  2061.         else if( analysis.i_mbrd >= 2 )
  2062.             x264_intra_rd_refine( h, &analysis );
  2063.     }
  2064.     else if( h->sh.i_type == SLICE_TYPE_P )
  2065.     {
  2066.         int b_skip = 0;
  2067.         h->mc.prefetch_ref( h->mb.pic.p_fref[0][0][h->mb.i_mb_x&3], h->mb.pic.i_stride[0], 0 );
  2068.         /* Fast P_SKIP detection */
  2069.         analysis.b_try_pskip = 0;
  2070.         if( h->param.analyse.b_fast_pskip )
  2071.         {
  2072.             if( h->param.i_threads > 1 && h->mb.cache.pskip_mv[1] > h->mb.mv_max_spel[1] )
  2073.                 // FIXME don't need to check this if the reference frame is done
  2074.                 {}
  2075.             else if( h->param.analyse.i_subpel_refine >= 3 )
  2076.                 analysis.b_try_pskip = 1;
  2077.             else if( h->mb.i_mb_type_left == P_SKIP ||
  2078.                      h->mb.i_mb_type_top == P_SKIP ||
  2079.                      h->mb.i_mb_type_topleft == P_SKIP ||
  2080.                      h->mb.i_mb_type_topright == P_SKIP )
  2081.                 b_skip = x264_macroblock_probe_pskip( h );
  2082.         }
  2083.         h->mc.prefetch_ref( h->mb.pic.p_fref[0][0][h->mb.i_mb_x&3], h->mb.pic.i_stride[0], 1 );
  2084.         if( b_skip )
  2085.         {
  2086.             h->mb.i_type = P_SKIP;
  2087.             h->mb.i_partition = D_16x16;
  2088.             assert( h->mb.cache.pskip_mv[1] <= h->mb.mv_max_spel[1] || h->param.i_threads == 1 );
  2089.         }
  2090.         else
  2091.         {
  2092.             const unsigned int flags = h->param.analyse.inter;
  2093.             int i_type;
  2094.             int i_partition;
  2095.             int i_thresh16x8;
  2096.             int i_satd_inter, i_satd_intra;
  2097.             x264_mb_analyse_load_costs( h, &analysis );
  2098.             x264_mb_analyse_inter_p16x16( h, &analysis );
  2099.             if( h->mb.i_type == P_SKIP )
  2100.                 return;
  2101.             if( flags & X264_ANALYSE_PSUB16x16 )
  2102.             {
  2103.                 if( h->param.analyse.b_mixed_references )
  2104.                     x264_mb_analyse_inter_p8x8_mixed_ref( h, &analysis );
  2105.                 else
  2106.                     x264_mb_analyse_inter_p8x8( h, &analysis );
  2107.             }
  2108.             /* Select best inter mode */
  2109.             i_type = P_L0;
  2110.             i_partition = D_16x16;
  2111.             i_cost = analysis.l0.me16x16.cost;
  2112.             if( ( flags & X264_ANALYSE_PSUB16x16 ) &&
  2113.                 analysis.l0.i_cost8x8 < analysis.l0.me16x16.cost )
  2114.             {
  2115.                 i_type = P_8x8;
  2116.                 i_partition = D_8x8;
  2117.                 i_cost = analysis.l0.i_cost8x8;
  2118.                 /* Do sub 8x8 */
  2119.                 if( flags & X264_ANALYSE_PSUB8x8 )
  2120.                 {
  2121.                     for( i = 0; i < 4; i++ )
  2122.                     {
  2123.                         x264_mb_analyse_inter_p4x4( h, &analysis, i );
  2124.                         if( analysis.l0.i_cost4x4[i] < analysis.l0.me8x8[i].cost )
  2125.                         {
  2126.                             int i_cost8x8 = analysis.l0.i_cost4x4[i];
  2127.                             h->mb.i_sub_partition[i] = D_L0_4x4;
  2128.                             x264_mb_analyse_inter_p8x4( h, &analysis, i );
  2129.                             COPY2_IF_LT( i_cost8x8, analysis.l0.i_cost8x4[i],
  2130.                                          h->mb.i_sub_partition[i], D_L0_8x4 );
  2131.                             x264_mb_analyse_inter_p4x8( h, &analysis, i );
  2132.                             COPY2_IF_LT( i_cost8x8, analysis.l0.i_cost4x8[i],
  2133.                                          h->mb.i_sub_partition[i], D_L0_4x8 );
  2134.                             i_cost += i_cost8x8 - analysis.l0.me8x8[i].cost;
  2135.                         }
  2136.                         x264_mb_cache_mv_p8x8( h, &analysis, i );
  2137.                     }
  2138.                     analysis.l0.i_cost8x8 = i_cost;
  2139.                 }
  2140.             }
  2141.             /* Now do 16x8/8x16 */
  2142.             i_thresh16x8 = analysis.l0.me8x8[1].cost_mv + analysis.l0.me8x8[2].cost_mv;
  2143.             if( ( flags & X264_ANALYSE_PSUB16x16 ) &&
  2144.                 analysis.l0.i_cost8x8 < analysis.l0.me16x16.cost + i_thresh16x8 )
  2145.             {
  2146.                 x264_mb_analyse_inter_p16x8( h, &analysis );
  2147.                 COPY3_IF_LT( i_cost, analysis.l0.i_cost16x8, i_type, P_L0, i_partition, D_16x8 );
  2148.                 x264_mb_analyse_inter_p8x16( h, &analysis );
  2149.                 COPY3_IF_LT( i_cost, analysis.l0.i_cost8x16, i_type, P_L0, i_partition, D_8x16 );
  2150.             }
  2151.             h->mb.i_partition = i_partition;
  2152.             /* refine qpel */
  2153.             //FIXME mb_type costs?
  2154.             if( analysis.i_mbrd )
  2155.             {
  2156.                 /* refine later */
  2157.             }
  2158.             else if( i_partition == D_16x16 )
  2159.             {
  2160.                 x264_me_refine_qpel( h, &analysis.l0.me16x16 );
  2161.                 i_cost = analysis.l0.me16x16.cost;
  2162.             }
  2163.             else if( i_partition == D_16x8 )
  2164.             {
  2165.                 x264_me_refine_qpel( h, &analysis.l0.me16x8[0] );
  2166.                 x264_me_refine_qpel( h, &analysis.l0.me16x8[1] );
  2167.                 i_cost = analysis.l0.me16x8[0].cost + analysis.l0.me16x8[1].cost;
  2168.             }
  2169.             else if( i_partition == D_8x16 )
  2170.             {
  2171.                 x264_me_refine_qpel( h, &analysis.l0.me8x16[0] );
  2172.                 x264_me_refine_qpel( h, &analysis.l0.me8x16[1] );
  2173.                 i_cost = analysis.l0.me8x16[0].cost + analysis.l0.me8x16[1].cost;
  2174.             }
  2175.             else if( i_partition == D_8x8 )
  2176.             {
  2177.                 int i8x8;
  2178.                 i_cost = 0;
  2179.                 for( i8x8 = 0; i8x8 < 4; i8x8++ )
  2180.                 {
  2181.                     switch( h->mb.i_sub_partition[i8x8] )
  2182.                     {
  2183.                         case D_L0_8x8:
  2184.                             x264_me_refine_qpel( h, &analysis.l0.me8x8[i8x8] );
  2185.                             i_cost += analysis.l0.me8x8[i8x8].cost;
  2186.                             break;
  2187.                         case D_L0_8x4:
  2188.                             x264_me_refine_qpel( h, &analysis.l0.me8x4[i8x8][0] );
  2189.                             x264_me_refine_qpel( h, &analysis.l0.me8x4[i8x8][1] );
  2190.                             i_cost += analysis.l0.me8x4[i8x8][0].cost +
  2191.                                       analysis.l0.me8x4[i8x8][1].cost;
  2192.                             break;
  2193.                         case D_L0_4x8:
  2194.                             x264_me_refine_qpel( h, &analysis.l0.me4x8[i8x8][0] );
  2195.                             x264_me_refine_qpel( h, &analysis.l0.me4x8[i8x8][1] );
  2196.                             i_cost += analysis.l0.me4x8[i8x8][0].cost +
  2197.                                       analysis.l0.me4x8[i8x8][1].cost;
  2198.                             break;
  2199.                         case D_L0_4x4:
  2200.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][0] );
  2201.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][1] );
  2202.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][2] );
  2203.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][3] );
  2204.                             i_cost += analysis.l0.me4x4[i8x8][0].cost +
  2205.                                       analysis.l0.me4x4[i8x8][1].cost +
  2206.                                       analysis.l0.me4x4[i8x8][2].cost +
  2207.                                       analysis.l0.me4x4[i8x8][3].cost;
  2208.                             break;
  2209.                         default:
  2210.                             x264_log( h, X264_LOG_ERROR, "internal error (!8x8 && !4x4)n" );
  2211.                             break;
  2212.                     }
  2213.                 }
  2214.             }
  2215.             if( h->mb.b_chroma_me )
  2216.             {
  2217.                 x264_mb_analyse_intra_chroma( h, &analysis );
  2218.                 x264_mb_analyse_intra( h, &analysis, i_cost - analysis.i_satd_i8x8chroma );
  2219.                 analysis.i_satd_i16x16 += analysis.i_satd_i8x8chroma;
  2220.                 analysis.i_satd_i8x8 += analysis.i_satd_i8x8chroma;
  2221.                 analysis.i_satd_i4x4 += analysis.i_satd_i8x8chroma;
  2222.             }
  2223.             else
  2224.                 x264_mb_analyse_intra( h, &analysis, i_cost );
  2225.             i_satd_inter = i_cost;
  2226.             i_satd_intra = X264_MIN3( analysis.i_satd_i16x16,
  2227.                                       analysis.i_satd_i8x8,
  2228.                                       analysis.i_satd_i4x4 );
  2229.             if( analysis.i_mbrd )
  2230.             {
  2231.                 x264_mb_analyse_p_rd( h, &analysis, X264_MIN(i_satd_inter, i_satd_intra) );
  2232.                 i_type = P_L0;
  2233.                 i_partition = D_16x16;
  2234.                 i_cost = analysis.l0.i_rd16x16;
  2235.                 COPY2_IF_LT( i_cost, analysis.l0.i_cost16x8, i_partition, D_16x8 );
  2236.                 COPY2_IF_LT( i_cost, analysis.l0.i_cost8x16, i_partition, D_8x16 );
  2237.                 COPY3_IF_LT( i_cost, analysis.l0.i_cost8x8, i_partition, D_8x8, i_type, P_8x8 );
  2238.                 h->mb.i_type = i_type;
  2239.                 h->mb.i_partition = i_partition;
  2240.                 if( i_cost < COST_MAX )
  2241.                     x264_mb_analyse_transform_rd( h, &analysis, &i_satd_inter, &i_cost );
  2242.                 x264_intra_rd( h, &analysis, i_satd_inter * 5/4 );
  2243.             }
  2244.             COPY2_IF_LT( i_cost, analysis.i_satd_i16x16, i_type, I_16x16 );
  2245.             COPY2_IF_LT( i_cost, analysis.i_satd_i8x8, i_type, I_8x8 );
  2246.             COPY2_IF_LT( i_cost, analysis.i_satd_i4x4, i_type, I_4x4 );
  2247.             COPY2_IF_LT( i_cost, analysis.i_satd_pcm, i_type, I_PCM );
  2248.             h->mb.i_type = i_type;
  2249.             if( analysis.i_mbrd >= 2 && h->mb.i_type != I_PCM )
  2250.             {
  2251.                 if( IS_INTRA( h->mb.i_type ) )
  2252.                 {
  2253.                     x264_intra_rd_refine( h, &analysis );
  2254.                 }
  2255.                 else if( i_partition == D_16x16 )
  2256.                 {
  2257.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, analysis.l0.me16x16.i_ref );
  2258.                     analysis.l0.me16x16.cost = i_cost;
  2259.                     x264_me_refine_qpel_rd( h, &analysis.l0.me16x16, analysis.i_lambda2, 0, 0 );
  2260.                 }
  2261.                 else if( i_partition == D_16x8 )
  2262.                 {
  2263.                     h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  2264.                     h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  2265.                     x264_macroblock_cache_ref( h, 0, 0, 4, 2, 0, analysis.l0.me16x8[0].i_ref );
  2266.                     x264_macroblock_cache_ref( h, 0, 2, 4, 2, 0, analysis.l0.me16x8[1].i_ref );
  2267.                     x264_me_refine_qpel_rd( h, &analysis.l0.me16x8[0], analysis.i_lambda2, 0, 0 );
  2268.                     x264_me_refine_qpel_rd( h, &analysis.l0.me16x8[1], analysis.i_lambda2, 8, 0 );
  2269.                 }
  2270.                 else if( i_partition == D_8x16 )
  2271.                 {
  2272.                     h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  2273.                     h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  2274.                     x264_macroblock_cache_ref( h, 0, 0, 2, 4, 0, analysis.l0.me8x16[0].i_ref );
  2275.                     x264_macroblock_cache_ref( h, 2, 0, 2, 4, 0, analysis.l0.me8x16[1].i_ref );
  2276.                     x264_me_refine_qpel_rd( h, &analysis.l0.me8x16[0], analysis.i_lambda2, 0, 0 );
  2277.                     x264_me_refine_qpel_rd( h, &analysis.l0.me8x16[1], analysis.i_lambda2, 4, 0 );
  2278.                 }
  2279.                 else if( i_partition == D_8x8 )
  2280.                 {
  2281.                     int i8x8;
  2282.                     x264_analyse_update_cache( h, &analysis );
  2283.                     for( i8x8 = 0; i8x8 < 4; i8x8++ )
  2284.                     {
  2285.                         if( h->mb.i_sub_partition[i8x8] == D_L0_8x8 )
  2286.                         {
  2287.                             x264_me_refine_qpel_rd( h, &analysis.l0.me8x8[i8x8], analysis.i_lambda2, i8x8*4, 0 );
  2288.                         }
  2289.                         else if( h->mb.i_sub_partition[i8x8] == D_L0_8x4 )
  2290.                         {
  2291.                             x264_me_refine_qpel_rd( h, &analysis.l0.me8x4[i8x8][0], analysis.i_lambda2, i8x8*4+0, 0 );
  2292.                             x264_me_refine_qpel_rd( h, &analysis.l0.me8x4[i8x8][1], analysis.i_lambda2, i8x8*4+2, 0 );
  2293.                         }
  2294.                         else if( h->mb.i_sub_partition[i8x8] == D_L0_4x8 )
  2295.                         {
  2296.                             x264_me_refine_qpel_rd( h, &analysis.l0.me4x8[i8x8][0], analysis.i_lambda2, i8x8*4+0, 0 );
  2297.                             x264_me_refine_qpel_rd( h, &analysis.l0.me4x8[i8x8][1], analysis.i_lambda2, i8x8*4+1, 0 );
  2298.                         }
  2299.                         else if( h->mb.i_sub_partition[i8x8] == D_L0_4x4 )
  2300.                         {
  2301.                             x264_me_refine_qpel_rd( h, &analysis.l0.me4x4[i8x8][0], analysis.i_lambda2, i8x8*4+0, 0 );
  2302.                             x264_me_refine_qpel_rd( h, &analysis.l0.me4x4[i8x8][1], analysis.i_lambda2, i8x8*4+1, 0 );
  2303.                             x264_me_refine_qpel_rd( h, &analysis.l0.me4x4[i8x8][2], analysis.i_lambda2, i8x8*4+2, 0 );
  2304.                             x264_me_refine_qpel_rd( h, &analysis.l0.me4x4[i8x8][3], analysis.i_lambda2, i8x8*4+3, 0 );
  2305.                         }
  2306.                     }
  2307.                 }
  2308.             }
  2309.         }
  2310.     }
  2311.     else if( h->sh.i_type == SLICE_TYPE_B )
  2312.     {
  2313.         int i_bskip_cost = COST_MAX;
  2314.         int b_skip = 0;
  2315.         if( analysis.i_mbrd )
  2316.             x264_mb_cache_fenc_satd( h );
  2317.         h->mb.i_type = B_SKIP;
  2318.         if( h->mb.b_direct_auto_write )
  2319.         {
  2320.             /* direct=auto heuristic: prefer whichever mode allows more Skip macroblocks */
  2321.             for( i = 0; i < 2; i++ )
  2322.             {
  2323.                 int b_changed = 1;
  2324.                 h->sh.b_direct_spatial_mv_pred ^= 1;
  2325.                 analysis.b_direct_available = x264_mb_predict_mv_direct16x16( h, i && analysis.b_direct_available ? &b_changed : NULL );
  2326.                 if( analysis.b_direct_available )
  2327.                 {
  2328.                     if( b_changed )
  2329.                     {
  2330.                         x264_mb_mc( h );
  2331.                         b_skip = x264_macroblock_probe_bskip( h );
  2332.                     }
  2333.                     h->stat.frame.i_direct_score[ h->sh.b_direct_spatial_mv_pred ] += b_skip;
  2334.                 }
  2335.                 else
  2336.                     b_skip = 0;
  2337.             }
  2338.         }
  2339.         else
  2340.             analysis.b_direct_available = x264_mb_predict_mv_direct16x16( h, NULL );
  2341.         if( analysis.b_direct_available )
  2342.         {
  2343.             if( !h->mb.b_direct_auto_write )
  2344.                 x264_mb_mc( h );
  2345.             if( analysis.i_mbrd )
  2346.             {
  2347.                 i_bskip_cost = ssd_mb( h );
  2348.                 /* 6 = minimum cavlc cost of a non-skipped MB */
  2349.                 b_skip = h->mb.b_skip_mc = i_bskip_cost <= ((6 * analysis.i_lambda2 + 128) >> 8);
  2350.             }
  2351.             else if( !h->mb.b_direct_auto_write )
  2352.             {
  2353.                 /* Conditioning the probe on neighboring block types
  2354.                  * doesn't seem to help speed or quality. */
  2355.                 b_skip = x264_macroblock_probe_bskip( h );
  2356.             }
  2357.         }
  2358.         if( !b_skip )
  2359.         {
  2360.             const unsigned int flags = h->param.analyse.inter;
  2361.             int i_type;
  2362.             int i_partition;
  2363.             int i_satd_inter;
  2364.             h->mb.b_skip_mc = 0;
  2365.             x264_mb_analyse_load_costs( h, &analysis );
  2366.             /* select best inter mode */
  2367.             /* direct must be first */
  2368.             if( analysis.b_direct_available )
  2369.                 x264_mb_analyse_inter_direct( h, &analysis );
  2370.             x264_mb_analyse_inter_b16x16( h, &analysis );
  2371.             i_type = B_L0_L0;
  2372.             i_partition = D_16x16;
  2373.             i_cost = analysis.l0.me16x16.cost;
  2374.             COPY2_IF_LT( i_cost, analysis.l1.me16x16.cost, i_type, B_L1_L1 );
  2375.             COPY2_IF_LT( i_cost, analysis.i_cost16x16bi, i_type, B_BI_BI );
  2376.             COPY2_IF_LT( i_cost, analysis.i_cost16x16direct, i_type, B_DIRECT );
  2377.             if( analysis.i_mbrd && analysis.i_cost16x16direct <= i_cost * 33/32 )
  2378.             {
  2379.                 x264_mb_analyse_b_rd( h, &analysis, i_cost );
  2380.                 if( i_bskip_cost < analysis.i_rd16x16direct &&
  2381.                     i_bskip_cost < analysis.i_rd16x16bi &&
  2382.                     i_bskip_cost < analysis.l0.i_rd16x16 &&
  2383.                     i_bskip_cost < analysis.l1.i_rd16x16 )
  2384.                 {
  2385.                     h->mb.i_type = B_SKIP;
  2386.                     x264_analyse_update_cache( h, &analysis );
  2387.                     return;
  2388.                 }
  2389.             }
  2390.             if( flags & X264_ANALYSE_BSUB16x16 )
  2391.             {
  2392.                 x264_mb_analyse_inter_b8x8( h, &analysis );
  2393.                 if( analysis.i_cost8x8bi < i_cost )
  2394.                 {
  2395.                     i_type = B_8x8;
  2396.                     i_partition = D_8x8;
  2397.                     i_cost = analysis.i_cost8x8bi;
  2398.                     if( h->mb.i_sub_partition[0] == h->mb.i_sub_partition[1] ||
  2399.                         h->mb.i_sub_partition[2] == h->mb.i_sub_partition[3] )
  2400.                     {
  2401.                         x264_mb_analyse_inter_b16x8( h, &analysis );
  2402.                         COPY3_IF_LT( i_cost, analysis.i_cost16x8bi,
  2403.                                      i_type, analysis.i_mb_type16x8,
  2404.                                      i_partition, D_16x8 );
  2405.                     }
  2406.                     if( h->mb.i_sub_partition[0] == h->mb.i_sub_partition[2] ||
  2407.                         h->mb.i_sub_partition[1] == h->mb.i_sub_partition[3] )
  2408.                     {
  2409.                         x264_mb_analyse_inter_b8x16( h, &analysis );
  2410.                         COPY3_IF_LT( i_cost, analysis.i_cost8x16bi,
  2411.                                      i_type, analysis.i_mb_type8x16,
  2412.                                      i_partition, D_8x16 );
  2413.                     }
  2414.                 }
  2415.             }
  2416.             if( analysis.i_mbrd )
  2417.             {
  2418.                 /* refine later */
  2419.             }
  2420.             /* refine qpel */
  2421.             else if( i_partition == D_16x16 )
  2422.             {
  2423.                 analysis.l0.me16x16.cost -= analysis.i_lambda * i_mb_b_cost_table[B_L0_L0];
  2424.                 analysis.l1.me16x16.cost -= analysis.i_lambda * i_mb_b_cost_table[B_L1_L1];
  2425.                 if( i_type == B_L0_L0 )
  2426.                 {
  2427.                     x264_me_refine_qpel( h, &analysis.l0.me16x16 );
  2428.                     i_cost = analysis.l0.me16x16.cost
  2429.                            + analysis.i_lambda * i_mb_b_cost_table[B_L0_L0];
  2430.                 }
  2431.                 else if( i_type == B_L1_L1 )
  2432.                 {
  2433.                     x264_me_refine_qpel( h, &analysis.l1.me16x16 );
  2434.                     i_cost = analysis.l1.me16x16.cost
  2435.                            + analysis.i_lambda * i_mb_b_cost_table[B_L1_L1];
  2436.                 }
  2437.                 else if( i_type == B_BI_BI )
  2438.                 {
  2439.                     x264_me_refine_qpel( h, &analysis.l0.me16x16 );
  2440.                     x264_me_refine_qpel( h, &analysis.l1.me16x16 );
  2441.                 }
  2442.             }
  2443.             else if( i_partition == D_16x8 )
  2444.             {
  2445.                 for( i=0; i<2; i++ )
  2446.                 {
  2447.                     if( analysis.i_mb_partition16x8[i] != D_L1_8x8 )
  2448.                         x264_me_refine_qpel( h, &analysis.l0.me16x8[i] );
  2449.                     if( analysis.i_mb_partition16x8[i] != D_L0_8x8 )
  2450.                         x264_me_refine_qpel( h, &analysis.l1.me16x8[i] );
  2451.                 }
  2452.             }
  2453.             else if( i_partition == D_8x16 )
  2454.             {
  2455.                 for( i=0; i<2; i++ )
  2456.                 {
  2457.                     if( analysis.i_mb_partition8x16[i] != D_L1_8x8 )
  2458.                         x264_me_refine_qpel( h, &analysis.l0.me8x16[i] );
  2459.                     if( analysis.i_mb_partition8x16[i] != D_L0_8x8 )
  2460.                         x264_me_refine_qpel( h, &analysis.l1.me8x16[i] );
  2461.                 }
  2462.             }
  2463.             else if( i_partition == D_8x8 )
  2464.             {
  2465.                 for( i=0; i<4; i++ )
  2466.                 {
  2467.                     x264_me_t *m;
  2468.                     int i_part_cost_old;
  2469.                     int i_type_cost;
  2470.                     int i_part_type = h->mb.i_sub_partition[i];
  2471.                     int b_bidir = (i_part_type == D_BI_8x8);
  2472.                     if( i_part_type == D_DIRECT_8x8 )
  2473.                         continue;
  2474.                     if( x264_mb_partition_listX_table[0][i_part_type] )
  2475.                     {
  2476.                         m = &analysis.l0.me8x8[i];
  2477.                         i_part_cost_old = m->cost;
  2478.                         i_type_cost = analysis.i_lambda * i_sub_mb_b_cost_table[D_L0_8x8];
  2479.                         m->cost -= i_type_cost;
  2480.                         x264_me_refine_qpel( h, m );
  2481.                         if( !b_bidir )
  2482.                             analysis.i_cost8x8bi += m->cost + i_type_cost - i_part_cost_old;
  2483.                     }
  2484.                     if( x264_mb_partition_listX_table[1][i_part_type] )
  2485.                     {
  2486.                         m = &analysis.l1.me8x8[i];
  2487.                         i_part_cost_old = m->cost;
  2488.                         i_type_cost = analysis.i_lambda * i_sub_mb_b_cost_table[D_L1_8x8];
  2489.                         m->cost -= i_type_cost;
  2490.                         x264_me_refine_qpel( h, m );
  2491.                         if( !b_bidir )
  2492.                             analysis.i_cost8x8bi += m->cost + i_type_cost - i_part_cost_old;
  2493.                     }
  2494.                     /* TODO: update mvp? */
  2495.                 }
  2496.             }
  2497.             i_satd_inter = i_cost;
  2498.             if( analysis.i_mbrd )
  2499.             {
  2500.                 x264_mb_analyse_b_rd( h, &analysis, i_satd_inter );
  2501.                 i_type = B_SKIP;
  2502.                 i_cost = i_bskip_cost;
  2503.                 i_partition = D_16x16;
  2504.                 COPY2_IF_LT( i_cost, analysis.l0.i_rd16x16, i_type, B_L0_L0 );
  2505.                 COPY2_IF_LT( i_cost, analysis.l1.i_rd16x16, i_type, B_L1_L1 );
  2506.                 COPY2_IF_LT( i_cost, analysis.i_rd16x16bi, i_type, B_BI_BI );
  2507.                 COPY2_IF_LT( i_cost, analysis.i_rd16x16direct, i_type, B_DIRECT );
  2508.                 COPY3_IF_LT( i_cost, analysis.i_rd16x8bi, i_type, analysis.i_mb_type16x8, i_partition, D_16x8 );
  2509.                 COPY3_IF_LT( i_cost, analysis.i_rd8x16bi, i_type, analysis.i_mb_type8x16, i_partition, D_8x16 );
  2510.                 COPY3_IF_LT( i_cost, analysis.i_rd8x8bi, i_type, B_8x8, i_partition, D_8x8 );
  2511.                 h->mb.i_type = i_type;
  2512.                 h->mb.i_partition = i_partition;
  2513.             }
  2514.             x264_mb_analyse_intra( h, &analysis, i_satd_inter );
  2515.             if( analysis.i_mbrd )
  2516.             {
  2517.                 x264_mb_analyse_transform_rd( h, &analysis, &i_satd_inter, &i_cost );
  2518.                 x264_intra_rd( h, &analysis, i_satd_inter * 17/16 );
  2519.             }
  2520.             COPY2_IF_LT( i_cost, analysis.i_satd_i16x16, i_type, I_16x16 );
  2521.             COPY2_IF_LT( i_cost, analysis.i_satd_i8x8, i_type, I_8x8 );
  2522.             COPY2_IF_LT( i_cost, analysis.i_satd_i4x4, i_type, I_4x4 );
  2523.             COPY2_IF_LT( i_cost, analysis.i_satd_pcm, i_type, I_PCM );
  2524.             h->mb.i_type = i_type;
  2525.             h->mb.i_partition = i_partition;
  2526.             if( analysis.i_mbrd >= 2 && IS_INTRA( i_type ) && i_type != I_PCM )
  2527.                 x264_intra_rd_refine( h, &analysis );
  2528.             if( h->mb.i_subpel_refine >= 5 )
  2529.                 x264_refine_bidir( h, &analysis );
  2530.             if( analysis.i_mbrd >= 2 && i_type > B_DIRECT && i_type < B_SKIP )
  2531.             {
  2532.                 const int i_biweight = h->mb.bipred_weight[analysis.l0.i_ref][analysis.l1.i_ref];
  2533.                 x264_analyse_update_cache( h, &analysis );
  2534.                 if( i_partition == D_16x16 )
  2535.                 {
  2536.                     if( i_type == B_L0_L0 )
  2537.                     {
  2538.                         analysis.l0.me16x16.cost = i_cost;
  2539.                         x264_me_refine_qpel_rd( h, &analysis.l0.me16x16, analysis.i_lambda2, 0, 0 );
  2540.                     }
  2541.                     else if( i_type == B_L1_L1 )
  2542.                     {
  2543.                         analysis.l1.me16x16.cost = i_cost;
  2544.                         x264_me_refine_qpel_rd( h, &analysis.l1.me16x16, analysis.i_lambda2, 0, 1 );
  2545.                     }
  2546.                     else if( i_type == B_BI_BI )
  2547.                         x264_me_refine_bidir_rd( h, &analysis.l0.me16x16, &analysis.l1.me16x16, i_biweight, 0, analysis.i_lambda2 );
  2548.                 }
  2549.                 else if( i_partition == D_16x8 )
  2550.                 {
  2551.                     for( i = 0; i < 2; i++ )
  2552.                     {
  2553.                         h->mb.i_sub_partition[i*2] = h->mb.i_sub_partition[i*2+1] = analysis.i_mb_partition16x8[i];
  2554.                         if( analysis.i_mb_partition16x8[i] == D_L0_8x8 )
  2555.                             x264_me_refine_qpel_rd( h, &analysis.l0.me16x8[i], analysis.i_lambda2, i*8, 0 );
  2556.                         else if( analysis.i_mb_partition16x8[i] == D_L1_8x8 )
  2557.                             x264_me_refine_qpel_rd( h, &analysis.l1.me16x8[i], analysis.i_lambda2, i*8, 1 );
  2558.                         else if( analysis.i_mb_partition16x8[i] == D_BI_8x8 )
  2559.                             x264_me_refine_bidir_rd( h, &analysis.l0.me16x8[i], &analysis.l1.me16x8[i], i_biweight, i*2, analysis.i_lambda2 );
  2560.                     }
  2561.                 }
  2562.                 else if( i_partition == D_8x16 )
  2563.                 {
  2564.                     for( i = 0; i < 2; i++ )
  2565.                     {
  2566.                         h->mb.i_sub_partition[i] = h->mb.i_sub_partition[i+2] = analysis.i_mb_partition8x16[i];
  2567.                         if( analysis.i_mb_partition8x16[i] == D_L0_8x8 )
  2568.                             x264_me_refine_qpel_rd( h, &analysis.l0.me8x16[i], analysis.i_lambda2, i*4, 0 );
  2569.                         else if( analysis.i_mb_partition8x16[i] == D_L1_8x8 )
  2570.                             x264_me_refine_qpel_rd( h, &analysis.l1.me8x16[i], analysis.i_lambda2, i*4, 1 );
  2571.                         else if( analysis.i_mb_partition8x16[i] == D_BI_8x8 )
  2572.                             x264_me_refine_bidir_rd( h, &analysis.l0.me8x16[i], &analysis.l1.me8x16[i], i_biweight, i, analysis.i_lambda2 );
  2573.                     }
  2574.                 }
  2575.                 else if( i_partition == D_8x8 )
  2576.                 {
  2577.                     for( i = 0; i < 4; i++ )
  2578.                     {
  2579.                         if( h->mb.i_sub_partition[i] == D_L0_8x8 )
  2580.                             x264_me_refine_qpel_rd( h, &analysis.l0.me8x8[i], analysis.i_lambda2, i*4, 0 );
  2581.                         else if( h->mb.i_sub_partition[i] == D_L1_8x8 )
  2582.                             x264_me_refine_qpel_rd( h, &analysis.l1.me8x8[i], analysis.i_lambda2, i*4, 1 );
  2583.                         else if( h->mb.i_sub_partition[i] == D_BI_8x8 )
  2584.                             x264_me_refine_bidir_rd( h, &analysis.l0.me8x8[i], &analysis.l1.me8x8[i], i_biweight, i, analysis.i_lambda2 );
  2585.                     }
  2586.                 }
  2587.             }
  2588.         }
  2589.     }
  2590.     x264_analyse_update_cache( h, &analysis );
  2591.     /* In rare cases we can end up qpel-RDing our way back to a larger partition size
  2592.      * without realizing it.  Check for this and account for it if necessary. */
  2593.     if( analysis.i_mbrd >= 2 )
  2594.     {
  2595.         /* Don't bother with bipred or 8x8-and-below, the odds are incredibly low. */
  2596. //C不支持这种数组赋值 --@lia
  2597. static /*const*/ uint8_t check_mv_lists[X264_MBTYPE_MAX] = {0};//{[P_L0]=1, [B_L0_L0]=1, [B_L1_L1]=2};
  2598.         int list = check_mv_lists[h->mb.i_type] - 1;
  2599. //C不支持这种数组赋值 --@lia
  2600. check_mv_lists[4]=1;
  2601. check_mv_lists[8]=1;
  2602. check_mv_lists[12]=2;
  2603.         if( list >= 0 && h->mb.i_partition != D_16x16 &&
  2604.             *(uint32_t*)&h->mb.cache.mv[list][x264_scan8[0]] == *(uint32_t*)&h->mb.cache.mv[list][x264_scan8[12]] &&
  2605.             h->mb.cache.ref[list][x264_scan8[0]] == h->mb.cache.ref[list][x264_scan8[12]] )
  2606.                 h->mb.i_partition = D_16x16;
  2607.     }
  2608.     if( !analysis.i_mbrd )
  2609.         x264_mb_analyse_transform( h );
  2610.     if( analysis.i_mbrd == 3 && !IS_SKIP(h->mb.i_type) )
  2611.         x264_mb_analyse_qp_rd( h, &analysis );
  2612.     h->mb.b_trellis = h->param.analyse.i_trellis;
  2613.     h->mb.b_noise_reduction = !!h->param.analyse.i_noise_reduction;
  2614.     if( !IS_SKIP(h->mb.i_type) && h->mb.i_psy_trellis && h->param.analyse.i_trellis == 1 )
  2615.         x264_psy_trellis_init( h, 0 );
  2616.     if( h->mb.b_trellis == 1 || h->mb.b_noise_reduction )
  2617.         h->mb.i_skip_intra = 0;
  2618. }
  2619. /*-------------------- Update MB from the analysis ----------------------*/
  2620. static void x264_analyse_update_cache( x264_t *h, x264_mb_analysis_t *a  )
  2621. {
  2622.     int i;
  2623.     switch( h->mb.i_type )
  2624.     {
  2625.         case I_4x4:
  2626.             for( i = 0; i < 16; i++ )
  2627.                 h->mb.cache.intra4x4_pred_mode[x264_scan8[i]] = a->i_predict4x4[i];
  2628.             x264_mb_analyse_intra_chroma( h, a );
  2629.             break;
  2630.         case I_8x8:
  2631.             for( i = 0; i < 4; i++ )
  2632.                 x264_macroblock_cache_intra8x8_pred( h, 2*(i&1), 2*(i>>1), a->i_predict8x8[i] );
  2633.             x264_mb_analyse_intra_chroma( h, a );
  2634.             break;
  2635.         case I_16x16:
  2636.             h->mb.i_intra16x16_pred_mode = a->i_predict16x16;
  2637.             x264_mb_analyse_intra_chroma( h, a );
  2638.             break;
  2639.         case I_PCM:
  2640.             break;
  2641.         case P_L0:
  2642.             switch( h->mb.i_partition )
  2643.             {
  2644.                 case D_16x16:
  2645.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.me16x16.i_ref );
  2646.                     x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv );
  2647.                     break;
  2648.                 case D_16x8:
  2649.                     x264_macroblock_cache_ref( h, 0, 0, 4, 2, 0, a->l0.me16x8[0].i_ref );
  2650.                     x264_macroblock_cache_ref( h, 0, 2, 4, 2, 0, a->l0.me16x8[1].i_ref );
  2651.                     x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 2, 0, a->l0.me16x8[0].mv );
  2652.                     x264_macroblock_cache_mv_ptr( h, 0, 2, 4, 2, 0, a->l0.me16x8[1].mv );
  2653.                     break;
  2654.                 case D_8x16:
  2655.                     x264_macroblock_cache_ref( h, 0, 0, 2, 4, 0, a->l0.me8x16[0].i_ref );
  2656.                     x264_macroblock_cache_ref( h, 2, 0, 2, 4, 0, a->l0.me8x16[1].i_ref );
  2657.                     x264_macroblock_cache_mv_ptr( h, 0, 0, 2, 4, 0, a->l0.me8x16[0].mv );
  2658.                     x264_macroblock_cache_mv_ptr( h, 2, 0, 2, 4, 0, a->l0.me8x16[1].mv );
  2659.                     break;
  2660.                 default:
  2661.                     x264_log( h, X264_LOG_ERROR, "internal error P_L0 and partition=%dn", h->mb.i_partition );
  2662.                     break;
  2663.             }
  2664.             break;
  2665.         case P_8x8:
  2666.             x264_macroblock_cache_ref( h, 0, 0, 2, 2, 0, a->l0.me8x8[0].i_ref );
  2667.             x264_macroblock_cache_ref( h, 2, 0, 2, 2, 0, a->l0.me8x8[1].i_ref );
  2668.             x264_macroblock_cache_ref( h, 0, 2, 2, 2, 0, a->l0.me8x8[2].i_ref );
  2669.             x264_macroblock_cache_ref( h, 2, 2, 2, 2, 0, a->l0.me8x8[3].i_ref );
  2670.             for( i = 0; i < 4; i++ )
  2671.                 x264_mb_cache_mv_p8x8( h, a, i );
  2672.             break;
  2673.         case P_SKIP:
  2674.         {
  2675.             h->mb.i_partition = D_16x16;
  2676.             x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, 0 );
  2677.             x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 4, 0, h->mb.cache.pskip_mv );
  2678.             break;
  2679.         }
  2680.         case B_SKIP:
  2681.         case B_DIRECT:
  2682.             x264_mb_load_mv_direct8x8( h, 0 );
  2683.             x264_mb_load_mv_direct8x8( h, 1 );
  2684.             x264_mb_load_mv_direct8x8( h, 2 );
  2685.             x264_mb_load_mv_direct8x8( h, 3 );
  2686.             break;
  2687.         case B_8x8:
  2688.             /* optimize: cache might not need to be rewritten */
  2689.             for( i = 0; i < 4; i++ )
  2690.                 x264_mb_cache_mv_b8x8( h, a, i, 1 );
  2691.             break;
  2692.         default: /* the rest of the B types */
  2693.             switch( h->mb.i_partition )
  2694.             {
  2695.             case D_16x16:
  2696.                 switch( h->mb.i_type )
  2697.                 {
  2698.                 case B_L0_L0:
  2699.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.i_ref );
  2700.                     x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv );
  2701.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, -1 );
  2702.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 1, 0 );
  2703.                     x264_macroblock_cache_mvd( h, 0, 0, 4, 4, 1, 0 );
  2704.                     break;
  2705.                 case B_L1_L1:
  2706.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, -1 );
  2707.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 0, 0 );
  2708.                     x264_macroblock_cache_mvd( h, 0, 0, 4, 4, 0, 0 );
  2709.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, a->l1.i_ref );
  2710.                     x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 4, 1, a->l1.me16x16.mv );
  2711.                     break;
  2712.                 case B_BI_BI:
  2713.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.i_ref );
  2714.                     x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv );
  2715.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, a->l1.i_ref );
  2716.                     x264_macroblock_cache_mv_ptr( h, 0, 0, 4, 4, 1, a->l1.me16x16.mv );
  2717.                     break;
  2718.                 }
  2719.                 break;
  2720.             case D_16x8:
  2721.                 x264_mb_cache_mv_b16x8( h, a, 0, 1 );
  2722.                 x264_mb_cache_mv_b16x8( h, a, 1, 1 );
  2723.                 break;
  2724.             case D_8x16:
  2725.                 x264_mb_cache_mv_b8x16( h, a, 0, 1 );
  2726.                 x264_mb_cache_mv_b8x16( h, a, 1, 1 );
  2727.                 break;
  2728.             default:
  2729.                 x264_log( h, X264_LOG_ERROR, "internal error (invalid MB type)n" );
  2730.                 break;
  2731.             }
  2732.     }
  2733. #ifndef NDEBUG
  2734.     if( h->param.i_threads > 1 && !IS_INTRA(h->mb.i_type) )
  2735.     {
  2736.         int l;
  2737.         for( l=0; l <= (h->sh.i_type == SLICE_TYPE_B); l++ )
  2738.         {
  2739.             int completed;
  2740.             int ref = h->mb.cache.ref[l][x264_scan8[0]];
  2741.             if( ref < 0 )
  2742.                 continue;
  2743.             completed = (l ? h->fref1 : h->fref0)[ ref >> h->mb.b_interlaced ]->i_lines_completed;
  2744.             if( (h->mb.cache.mv[l][x264_scan8[15]][1] >> (2 - h->mb.b_interlaced)) + h->mb.i_mb_y*16 > completed )
  2745.             {
  2746.                 x264_log( h, X264_LOG_WARNING, "internal error (MV out of thread range)n");
  2747.                 fprintf(stderr, "mb type: %d n", h->mb.i_type);
  2748.                 fprintf(stderr, "mv: l%dr%d (%d,%d) n", l, ref,
  2749.                                 h->mb.cache.mv[l][x264_scan8[15]][0],
  2750.                                 h->mb.cache.mv[l][x264_scan8[15]][1] );
  2751.                 fprintf(stderr, "limit: %d n", h->mb.mv_max_spel[1]);
  2752.                 fprintf(stderr, "mb_xy: %d,%d n", h->mb.i_mb_x, h->mb.i_mb_y);
  2753.                 fprintf(stderr, "completed: %d n", completed );
  2754.                 x264_log( h, X264_LOG_WARNING, "recovering by using intra moden");
  2755.                 x264_mb_analyse_intra( h, a, COST_MAX );
  2756.                 h->mb.i_type = I_16x16;
  2757.                 h->mb.i_intra16x16_pred_mode = a->i_predict16x16;
  2758.                 x264_mb_analyse_intra_chroma( h, a );
  2759.             }
  2760.         }
  2761.     }
  2762. #endif
  2763. }
  2764. #include "slicetype.c"