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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * analyse.c: h264 encoder library
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 x264 project
  5.  * $Id: analyse.c,v 1.1 2004/06/03 19:27:08 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Loren Merritt <lorenm@u.washington.edu>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <math.h>
  27. #include <limits.h>
  28. #include "common/common.h"
  29. #include "macroblock.h"
  30. #include "me.h"
  31. #include "ratecontrol.h"
  32. #include "analyse.h"
  33. #include "rdo.c"
  34. typedef struct
  35. {
  36.     /* 16x16 */
  37.     int i_ref;
  38.     x264_me_t me16x16;
  39.     /* 8x8 */
  40.     int       i_cost8x8;
  41.     int       mvc[16][5][2]; /* [ref][0] is 16x16 mv,
  42.                                 [ref][1..4] are 8x8 mv from partition [0..3] */
  43.     x264_me_t me8x8[4];
  44.     /* Sub 4x4 */
  45.     int       i_cost4x4[4]; /* cost per 8x8 partition */
  46.     x264_me_t me4x4[4][4];
  47.     /* Sub 8x4 */
  48.     int       i_cost8x4[4]; /* cost per 8x8 partition */
  49.     x264_me_t me8x4[4][2];
  50.     /* Sub 4x8 */
  51.     int       i_cost4x8[4]; /* cost per 8x8 partition */
  52.     x264_me_t me4x8[4][4];
  53.     /* 16x8 */
  54.     int       i_cost16x8;
  55.     x264_me_t me16x8[2];
  56.     /* 8x16 */
  57.     int       i_cost8x16;
  58.     x264_me_t me8x16[2];
  59. } x264_mb_analysis_list_t;
  60. typedef struct
  61. {
  62.     /* conduct the analysis using this lamda and QP */
  63.     int i_lambda;
  64.     int i_lambda2;
  65.     int i_qp;
  66.     int16_t *p_cost_mv;
  67.     int b_mbrd;
  68.     /* I: Intra part */
  69.     /* Take some shortcuts in intra search if intra is deemed unlikely */
  70.     int b_fast_intra;
  71.     int i_best_satd;
  72.     int b_try_pskip;
  73.     /* Luma part */
  74.     int i_sad_i16x16;
  75.     int i_predict16x16;
  76.     int i_sad_i8x8;
  77.     int i_predict8x8[2][2];
  78.     int i_sad_i4x4;
  79.     int i_predict4x4[4][4];
  80.     /* Chroma part */
  81.     int i_sad_i8x8chroma;
  82.     int i_predict8x8chroma;
  83.     /* II: Inter part P/B frame */
  84.     x264_mb_analysis_list_t l0;
  85.     x264_mb_analysis_list_t l1;
  86.     int i_cost16x16bi; /* used the same ref and mv as l0 and l1 (at least for now) */
  87.     int i_cost16x16direct;
  88.     int i_cost8x8bi;
  89.     int i_cost8x8direct[4];
  90.     int i_cost16x8bi;
  91.     int i_cost8x16bi;
  92.     int i_mb_partition16x8[2]; /* mb_partition_e */
  93.     int i_mb_partition8x16[2];
  94.     int i_mb_type16x8; /* mb_class_e */
  95.     int i_mb_type8x16;
  96.     int b_direct_available;
  97. } x264_mb_analysis_t;
  98. /* lambda = pow(2,qp/6-2) */
  99. static const int i_qp0_cost_table[52] = {
  100.    1, 1, 1, 1, 1, 1, 1, 1,  /*  0-7 */
  101.    1, 1, 1, 1,              /*  8-11 */
  102.    1, 1, 1, 1, 2, 2, 2, 2,  /* 12-19 */
  103.    3, 3, 3, 4, 4, 4, 5, 6,  /* 20-27 */
  104.    6, 7, 8, 9,10,11,13,14,  /* 28-35 */
  105.   16,18,20,23,25,29,32,36,  /* 36-43 */
  106.   40,45,51,57,64,72,81,91   /* 44-51 */
  107. };
  108. /* pow(lambda,2) * .9 */
  109. static const int i_qp0_cost2_table[52] = {
  110.    1,   1,   1,   1,   1,   1, /*  0-5  */
  111.    1,   1,   1,   1,   1,   1, /*  6-11 */
  112.    1,   1,   1,   2,   2,   3, /* 12-17 */
  113.    4,   5,   6,   7,   9,  11, /* 18-23 */
  114.   14,  18,  23,  29,  36,  46, /* 24-29 */
  115.   58,  73,  91, 115, 145, 183, /* 30-35 */
  116.  230, 290, 366, 461, 581, 731, /* 36-41 */
  117.  922,1161,1463,1843,2322,2926, /* 42-47 */
  118. 3686,4645,5852,7373
  119. };
  120. /* TODO: calculate CABAC costs */
  121. static const int i_mb_b_cost_table[19] = {
  122.     9, 9, 9, 9, 0, 0, 0, 1, 3, 7, 7, 7, 3, 7, 7, 7, 5, 9, 0
  123. };
  124. static const int i_mb_b16x8_cost_table[17] = {
  125.     0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 7, 5, 7, 9, 9, 9
  126. };
  127. static const int i_sub_mb_b_cost_table[13] = {
  128.     7, 5, 5, 3, 7, 5, 7, 3, 7, 7, 7, 5, 1
  129. };
  130. static const int i_sub_mb_p_cost_table[4] = {
  131.     5, 3, 3, 1
  132. };
  133. static void x264_analyse_update_cache( x264_t *h, x264_mb_analysis_t *a );
  134. /* initialize an array of lambda*nbits for all possible mvs */
  135. static void x264_mb_analyse_load_costs( x264_t *h, x264_mb_analysis_t *a )
  136. {
  137.     static int16_t *p_cost_mv[52];
  138.     if( !p_cost_mv[a->i_qp] )
  139.     {
  140.         /* could be faster, but isn't called many times */
  141.         /* factor of 4 from qpel, 2 from sign, and 2 because mv can be opposite from mvp */
  142.         int i;
  143.         p_cost_mv[a->i_qp] = x264_malloc( (4*4*2048 + 1) * sizeof(int16_t) );
  144.         p_cost_mv[a->i_qp] += 2*4*2048;
  145.         for( i = 0; i <= 2*4*2048; i++ )
  146.         {
  147.             p_cost_mv[a->i_qp][-i] =
  148.             p_cost_mv[a->i_qp][i]  = a->i_lambda * bs_size_se( i );
  149.         }
  150.     }
  151.     a->p_cost_mv = p_cost_mv[a->i_qp];
  152. }
  153. static void x264_mb_analyse_init( x264_t *h, x264_mb_analysis_t *a, int i_qp )
  154. {
  155.     memset( a, 0, sizeof( x264_mb_analysis_t ) );
  156.     /* conduct the analysis using this lamda and QP */
  157.     a->i_qp = h->mb.i_qp = i_qp;
  158.     a->i_lambda = i_qp0_cost_table[i_qp];
  159.     a->i_lambda2 = i_qp0_cost2_table[i_qp];
  160.     a->b_mbrd = h->param.analyse.i_subpel_refine >= 6 &&
  161.                 ( h->sh.i_type != SLICE_TYPE_B || h->param.analyse.b_bframe_rdo );
  162.     h->mb.i_me_method = h->param.analyse.i_me_method;
  163.     h->mb.i_subpel_refine = h->param.analyse.i_subpel_refine;
  164.     h->mb.b_chroma_me = h->param.analyse.b_chroma_me && h->sh.i_type == SLICE_TYPE_P
  165.                         && h->mb.i_subpel_refine >= 5;
  166.     h->mb.b_trellis = h->param.analyse.i_trellis > 1 && a->b_mbrd;
  167.     h->mb.b_transform_8x8 = 0;
  168.     h->mb.b_noise_reduction = 0;
  169.     /* I: Intra part */
  170.     a->i_sad_i16x16 =
  171.     a->i_sad_i8x8   =
  172.     a->i_sad_i4x4   =
  173.     a->i_sad_i8x8chroma = COST_MAX;
  174.     a->b_fast_intra = 0;
  175.     a->i_best_satd = COST_MAX;
  176.     /* II: Inter part P/B frame */
  177.     if( h->sh.i_type != SLICE_TYPE_I )
  178.     {
  179.         int i;
  180.         int i_fmv_range = h->param.analyse.i_mv_range - 16;
  181.         /* Calculate max allowed MV range */
  182. #define CLIP_FMV(mv) x264_clip3( mv, -i_fmv_range, i_fmv_range )
  183.         h->mb.mv_min[0] = 4*( -16*h->mb.i_mb_x - 24 );
  184.         h->mb.mv_max[0] = 4*( 16*( h->sps->i_mb_width - h->mb.i_mb_x - 1 ) + 24 );
  185.         h->mb.mv_min_fpel[0] = CLIP_FMV( -16*h->mb.i_mb_x - 8 );
  186.         h->mb.mv_max_fpel[0] = CLIP_FMV( 16*( h->sps->i_mb_width - h->mb.i_mb_x - 1 ) + 8 );
  187.         h->mb.mv_min_spel[0] = 4*( h->mb.mv_min_fpel[0] - 16 );
  188.         h->mb.mv_max_spel[0] = 4*( h->mb.mv_max_fpel[0] + 16 );
  189.         if( h->mb.i_mb_x == 0)
  190.         {
  191.             h->mb.mv_min[1] = 4*( -16*h->mb.i_mb_y - 24 );
  192.             h->mb.mv_max[1] = 4*( 16*( h->sps->i_mb_height - h->mb.i_mb_y - 1 ) + 24 );
  193.             h->mb.mv_min_fpel[1] = CLIP_FMV( -16*h->mb.i_mb_y - 8 );
  194.             h->mb.mv_max_fpel[1] = CLIP_FMV( 16*( h->sps->i_mb_height - h->mb.i_mb_y - 1 ) + 8 );
  195.             h->mb.mv_min_spel[1] = 4*( h->mb.mv_min_fpel[1] - 16 );
  196.             h->mb.mv_max_spel[1] = 4*( h->mb.mv_max_fpel[1] + 16 );
  197.         }
  198. #undef CLIP_FMV
  199.         a->l0.me16x16.cost =
  200.         a->l0.i_cost8x8    = COST_MAX;
  201.         for( i = 0; i < 4; i++ )
  202.         {
  203.             a->l0.i_cost4x4[i] =
  204.             a->l0.i_cost8x4[i] =
  205.             a->l0.i_cost4x8[i] = COST_MAX;
  206.         }
  207.         a->l0.i_cost16x8   =
  208.         a->l0.i_cost8x16   = COST_MAX;
  209.         if( h->sh.i_type == SLICE_TYPE_B )
  210.         {
  211.             a->l1.me16x16.cost =
  212.             a->l1.i_cost8x8    = COST_MAX;
  213.             for( i = 0; i < 4; i++ )
  214.             {
  215.                 a->l1.i_cost4x4[i] =
  216.                 a->l1.i_cost8x4[i] =
  217.                 a->l1.i_cost4x8[i] =
  218.                 a->i_cost8x8direct[i] = COST_MAX;
  219.             }
  220.             a->l1.i_cost16x8   =
  221.             a->l1.i_cost8x16   =
  222.             a->i_cost16x16bi   =
  223.             a->i_cost16x16direct =
  224.             a->i_cost8x8bi     =
  225.             a->i_cost16x8bi    =
  226.             a->i_cost8x16bi    = COST_MAX;
  227.         }
  228.         /* Fast intra decision */
  229.         if( h->mb.i_mb_xy - h->sh.i_first_mb > 4 )
  230.         {
  231.             if( a->b_mbrd
  232.                || IS_INTRA( h->mb.i_mb_type_left )
  233.                || IS_INTRA( h->mb.i_mb_type_top )
  234.                || IS_INTRA( h->mb.i_mb_type_topleft )
  235.                || IS_INTRA( h->mb.i_mb_type_topright )
  236.                || (h->sh.i_type == SLICE_TYPE_P && IS_INTRA( h->fref0[0]->mb_type[h->mb.i_mb_xy] ))
  237.                || (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])) )
  238.             { /* intra is likely */ }
  239.             else
  240.             {
  241.                 a->b_fast_intra = 1;
  242.             }
  243.         }
  244.     }
  245. }
  246. /*
  247.  * Handle intra mb
  248.  */
  249. /* Max = 4 */
  250. static void predict_16x16_mode_available( unsigned int i_neighbour, int *mode, int *pi_count )
  251. {
  252.     if( i_neighbour & MB_TOPLEFT )
  253.     {
  254.         /* top and left avaible */
  255.         *mode++ = I_PRED_16x16_V;
  256.         *mode++ = I_PRED_16x16_H;
  257.         *mode++ = I_PRED_16x16_DC;
  258.         *mode++ = I_PRED_16x16_P;
  259.         *pi_count = 4;
  260.     }
  261.     else if( i_neighbour & MB_LEFT )
  262.     {
  263.         /* left available*/
  264.         *mode++ = I_PRED_16x16_DC_LEFT;
  265.         *mode++ = I_PRED_16x16_H;
  266.         *pi_count = 2;
  267.     }
  268.     else if( i_neighbour & MB_TOP )
  269.     {
  270.         /* top available*/
  271.         *mode++ = I_PRED_16x16_DC_TOP;
  272.         *mode++ = I_PRED_16x16_V;
  273.         *pi_count = 2;
  274.     }
  275.     else
  276.     {
  277.         /* none avaible */
  278.         *mode = I_PRED_16x16_DC_128;
  279.         *pi_count = 1;
  280.     }
  281. }
  282. /* Max = 4 */
  283. static void predict_8x8chroma_mode_available( unsigned int i_neighbour, int *mode, int *pi_count )
  284. {
  285.     if( i_neighbour & MB_TOPLEFT )
  286.     {
  287.         /* top and left avaible */
  288.         *mode++ = I_PRED_CHROMA_V;
  289.         *mode++ = I_PRED_CHROMA_H;
  290.         *mode++ = I_PRED_CHROMA_DC;
  291.         *mode++ = I_PRED_CHROMA_P;
  292.         *pi_count = 4;
  293.     }
  294.     else if( i_neighbour & MB_LEFT )
  295.     {
  296.         /* left available*/
  297.         *mode++ = I_PRED_CHROMA_DC_LEFT;
  298.         *mode++ = I_PRED_CHROMA_H;
  299.         *pi_count = 2;
  300.     }
  301.     else if( i_neighbour & MB_TOP )
  302.     {
  303.         /* top available*/
  304.         *mode++ = I_PRED_CHROMA_DC_TOP;
  305.         *mode++ = I_PRED_CHROMA_V;
  306.         *pi_count = 2;
  307.     }
  308.     else
  309.     {
  310.         /* none avaible */
  311.         *mode = I_PRED_CHROMA_DC_128;
  312.         *pi_count = 1;
  313.     }
  314. }
  315. /* MAX = 9 */
  316. static void predict_4x4_mode_available( unsigned int i_neighbour,
  317.                                         int *mode, int *pi_count )
  318. {
  319.     int b_l = i_neighbour & MB_LEFT;
  320.     int b_t = i_neighbour & MB_TOP;
  321.     if( b_l && b_t )
  322.     {
  323.         *pi_count = 6;
  324.         *mode++ = I_PRED_4x4_DC;
  325.         *mode++ = I_PRED_4x4_H;
  326.         *mode++ = I_PRED_4x4_V;
  327.         *mode++ = I_PRED_4x4_DDL;
  328.         if( i_neighbour & MB_TOPLEFT )
  329.         {
  330.             *mode++ = I_PRED_4x4_DDR;
  331.             *mode++ = I_PRED_4x4_VR;
  332.             *mode++ = I_PRED_4x4_HD;
  333.             *pi_count += 3;
  334.         }
  335.         *mode++ = I_PRED_4x4_VL;
  336.         *mode++ = I_PRED_4x4_HU;
  337.     }
  338.     else if( b_l )
  339.     {
  340.         *mode++ = I_PRED_4x4_DC_LEFT;
  341.         *mode++ = I_PRED_4x4_H;
  342.         *mode++ = I_PRED_4x4_HU;
  343.         *pi_count = 3;
  344.     }
  345.     else if( b_t )
  346.     {
  347.         *mode++ = I_PRED_4x4_DC_TOP;
  348.         *mode++ = I_PRED_4x4_V;
  349.         *mode++ = I_PRED_4x4_DDL;
  350.         *mode++ = I_PRED_4x4_VL;
  351.         *pi_count = 4;
  352.     }
  353.     else
  354.     {
  355.         *mode++ = I_PRED_4x4_DC_128;
  356.         *pi_count = 1;
  357.     }
  358. }
  359. static void x264_mb_analyse_intra_chroma( x264_t *h, x264_mb_analysis_t *a )
  360. {
  361.     int i;
  362.     int i_max;
  363.     int predict_mode[9];
  364.     uint8_t *p_dstc[2], *p_srcc[2];
  365.     if( a->i_sad_i8x8chroma < COST_MAX )
  366.         return;
  367.     /* 8x8 prediction selection for chroma */
  368.     p_dstc[0] = h->mb.pic.p_fdec[1];
  369.     p_dstc[1] = h->mb.pic.p_fdec[2];
  370.     p_srcc[0] = h->mb.pic.p_fenc[1];
  371.     p_srcc[1] = h->mb.pic.p_fenc[2];
  372.     predict_8x8chroma_mode_available( h->mb.i_neighbour, predict_mode, &i_max );
  373.     a->i_sad_i8x8chroma = COST_MAX;
  374.     for( i = 0; i < i_max; i++ )
  375.     {
  376.         int i_sad;
  377.         int i_mode;
  378.         i_mode = predict_mode[i];
  379.         /* we do the prediction */
  380.         h->predict_8x8c[i_mode]( p_dstc[0] );
  381.         h->predict_8x8c[i_mode]( p_dstc[1] );
  382.         /* we calculate the cost */
  383.         i_sad = h->pixf.mbcmp[PIXEL_8x8]( p_dstc[0], FDEC_STRIDE,
  384.                                           p_srcc[0], FENC_STRIDE ) +
  385.                 h->pixf.mbcmp[PIXEL_8x8]( p_dstc[1], FDEC_STRIDE,
  386.                                           p_srcc[1], FENC_STRIDE ) +
  387.                 a->i_lambda * bs_size_ue( x264_mb_pred_mode8x8c_fix[i_mode] );
  388.         /* if i_score is lower it is better */
  389.         if( a->i_sad_i8x8chroma > i_sad )
  390.         {
  391.             a->i_predict8x8chroma = i_mode;
  392.             a->i_sad_i8x8chroma   = i_sad;
  393.         }
  394.     }
  395.     h->mb.i_chroma_pred_mode = a->i_predict8x8chroma;
  396. }
  397. static void x264_mb_analyse_intra( x264_t *h, x264_mb_analysis_t *a, int i_cost_inter )
  398. {
  399.     const unsigned int flags = h->sh.i_type == SLICE_TYPE_I ? h->param.analyse.intra : h->param.analyse.inter;
  400.     uint8_t  *p_src = h->mb.pic.p_fenc[0];
  401.     uint8_t  *p_dst = h->mb.pic.p_fdec[0];
  402.     int      f8_satd_rd_ratio = 0;
  403.     int i, idx;
  404.     int i_max;
  405.     int predict_mode[9];
  406.     int i_satd_thresh;
  407.     if( h->sh.i_type == SLICE_TYPE_B )
  408.         i_satd_thresh = a->i_best_satd * 9/8;
  409.     else
  410.         i_satd_thresh = a->i_best_satd * 5/4 + a->i_lambda * 10;
  411.     /*---------------- Try all mode and calculate their score ---------------*/
  412.     /* 16x16 prediction selection */
  413.     predict_16x16_mode_available( h->mb.i_neighbour, predict_mode, &i_max );
  414.     for( i = 0; i < i_max; i++ )
  415.     {
  416.         int i_sad;
  417.         int i_mode;
  418.         i_mode = predict_mode[i];
  419.         h->predict_16x16[i_mode]( p_dst );
  420.         i_sad = h->pixf.mbcmp[PIXEL_16x16]( p_dst, FDEC_STRIDE, p_src, FENC_STRIDE ) +
  421.                 a->i_lambda * bs_size_ue( x264_mb_pred_mode16x16_fix[i_mode] );
  422.         if( a->i_sad_i16x16 > i_sad )
  423.         {
  424.             a->i_predict16x16 = i_mode;
  425.             a->i_sad_i16x16   = i_sad;
  426.         }
  427.     }
  428.     if( a->b_mbrd )
  429.     {
  430.         f8_satd_rd_ratio = ((unsigned)i_cost_inter << 8) / a->i_best_satd + 1;
  431.         x264_mb_analyse_intra_chroma( h, a );
  432.         if( h->mb.b_chroma_me )
  433.             a->i_sad_i16x16 += a->i_sad_i8x8chroma;
  434.         if( a->i_sad_i16x16 < i_satd_thresh )
  435.         {
  436.             h->mb.i_type = I_16x16;
  437.             h->mb.i_intra16x16_pred_mode = a->i_predict16x16;
  438.             a->i_sad_i16x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  439.         }
  440.         else
  441.             a->i_sad_i16x16 = a->i_sad_i16x16 * f8_satd_rd_ratio >> 8;
  442.     }
  443.     else
  444.     {
  445.         if( h->sh.i_type == SLICE_TYPE_B )
  446.             /* cavlc mb type prefix */
  447.             a->i_sad_i16x16 += a->i_lambda * i_mb_b_cost_table[I_16x16];
  448.         if( a->b_fast_intra && a->i_sad_i16x16 > 2*i_cost_inter )
  449.             return;
  450.     }
  451.     /* 4x4 prediction selection */
  452.     if( flags & X264_ANALYSE_I4x4 )
  453.     {
  454.         a->i_sad_i4x4 = 0;
  455.         for( idx = 0; idx < 16; idx++ )
  456.         {
  457.             uint8_t *p_src_by;
  458.             uint8_t *p_dst_by;
  459.             int     i_best;
  460.             int x, y;
  461.             int i_pred_mode;
  462.             i_pred_mode= x264_mb_predict_intra4x4_mode( h, idx );
  463.             x = block_idx_x[idx];
  464.             y = block_idx_y[idx];
  465.             p_src_by = p_src + 4 * x + 4 * y * FENC_STRIDE;
  466.             p_dst_by = p_dst + 4 * x + 4 * y * FDEC_STRIDE;
  467.             i_best = COST_MAX;
  468.             predict_4x4_mode_available( h->mb.i_neighbour4[idx], predict_mode, &i_max );
  469.             if( (h->mb.i_neighbour4[idx] & (MB_TOPRIGHT|MB_TOP)) == MB_TOP )
  470.                 /* emulate missing topright samples */
  471.                 *(uint32_t*) &p_dst_by[4 - FDEC_STRIDE] = p_dst_by[3 - FDEC_STRIDE] * 0x01010101U;
  472.             for( i = 0; i < i_max; i++ )
  473.             {
  474.                 int i_sad;
  475.                 int i_mode;
  476.                 i_mode = predict_mode[i];
  477.                 h->predict_4x4[i_mode]( p_dst_by );
  478.                 i_sad = h->pixf.mbcmp[PIXEL_4x4]( p_dst_by, FDEC_STRIDE,
  479.                                                   p_src_by, FENC_STRIDE )
  480.                       + a->i_lambda * (i_pred_mode == x264_mb_pred_mode4x4_fix(i_mode) ? 1 : 4);
  481.                 if( i_best > i_sad )
  482.                 {
  483.                     a->i_predict4x4[x][y] = i_mode;
  484.                     i_best = i_sad;
  485.                 }
  486.             }
  487.             a->i_sad_i4x4 += i_best;
  488.             /* we need to encode this block now (for next ones) */
  489.             h->predict_4x4[a->i_predict4x4[x][y]]( p_dst_by );
  490.             x264_mb_encode_i4x4( h, idx, a->i_qp );
  491.             h->mb.cache.intra4x4_pred_mode[x264_scan8[idx]] = a->i_predict4x4[x][y];
  492.         }
  493.         a->i_sad_i4x4 += a->i_lambda * 24;    /* from JVT (SATD0) */
  494.         if( a->b_mbrd )
  495.         {
  496.             if( h->mb.b_chroma_me )
  497.                 a->i_sad_i4x4 += a->i_sad_i8x8chroma;
  498.             if( a->i_sad_i4x4 < i_satd_thresh )
  499.             {
  500.                 h->mb.i_type = I_4x4;
  501.                 a->i_sad_i4x4 = x264_rd_cost_mb( h, a->i_lambda2 );
  502.             }
  503.             else
  504.                 a->i_sad_i4x4 = a->i_sad_i4x4 * f8_satd_rd_ratio >> 8;
  505.         }
  506.         else
  507.         {
  508.             if( h->sh.i_type == SLICE_TYPE_B )
  509.                 a->i_sad_i4x4 += a->i_lambda * i_mb_b_cost_table[I_4x4];
  510.         }
  511.     }
  512.     /* 8x8 prediction selection */
  513.     if( flags & X264_ANALYSE_I8x8 )
  514.     {
  515.         a->i_sad_i8x8 = 0;
  516.         for( idx = 0; idx < 4; idx++ )
  517.         {
  518.             uint8_t *p_src_by;
  519.             uint8_t *p_dst_by;
  520.             int     i_best;
  521.             int x, y;
  522.             int i_pred_mode;
  523.             i_pred_mode= x264_mb_predict_intra4x4_mode( h, 4*idx );
  524.             x = idx&1;
  525.             y = idx>>1;
  526.             p_src_by = p_src + 8 * x + 8 * y * FENC_STRIDE;
  527.             p_dst_by = p_dst + 8 * x + 8 * y * FDEC_STRIDE;
  528.             i_best = COST_MAX;
  529.             predict_4x4_mode_available( h->mb.i_neighbour8[idx], predict_mode, &i_max );
  530.             for( i = 0; i < i_max; i++ )
  531.             {
  532.                 int i_sad;
  533.                 int i_mode;
  534.                 i_mode = predict_mode[i];
  535.                 h->predict_8x8[i_mode]( p_dst_by, h->mb.i_neighbour8[idx] );
  536.                 /* could use sa8d, but it doesn't seem worth the speed cost (without mmx at least) */
  537.                 i_sad = h->pixf.mbcmp[PIXEL_8x8]( p_dst_by, FDEC_STRIDE,
  538.                                                   p_src_by, FENC_STRIDE )
  539.                       + a->i_lambda * (i_pred_mode == x264_mb_pred_mode4x4_fix(i_mode) ? 1 : 4);
  540.                 if( i_best > i_sad )
  541.                 {
  542.                     a->i_predict8x8[x][y] = i_mode;
  543.                     i_best = i_sad;
  544.                 }
  545.             }
  546.             a->i_sad_i8x8 += i_best;
  547.             /* we need to encode this block now (for next ones) */
  548.             h->predict_8x8[a->i_predict8x8[x][y]]( p_dst_by, h->mb.i_neighbour8[idx] );
  549.             x264_mb_encode_i8x8( h, idx, a->i_qp );
  550.             x264_macroblock_cache_intra8x8_pred( h, 2*x, 2*y, a->i_predict8x8[x][y] );
  551.         }
  552.         if( a->b_mbrd )
  553.         {
  554.             if( h->mb.b_chroma_me )
  555.                 a->i_sad_i8x8 += a->i_sad_i8x8chroma;
  556.             if( a->i_sad_i8x8 < i_satd_thresh )
  557.             {
  558.                 h->mb.i_type = I_8x8;
  559.                 a->i_sad_i8x8 = x264_rd_cost_mb( h, a->i_lambda2 );
  560.             }
  561.             else
  562.                 a->i_sad_i8x8 = a->i_sad_i8x8 * f8_satd_rd_ratio >> 8;
  563.         }
  564.         else
  565.         {
  566.             // FIXME some bias like in i4x4?
  567.             if( h->sh.i_type == SLICE_TYPE_B )
  568.                 a->i_sad_i8x8 += a->i_lambda * i_mb_b_cost_table[I_8x8];
  569.         }
  570.     }
  571. }
  572. #define LOAD_FENC( m, src, xoff, yoff) 
  573.     (m)->i_stride[0] = h->mb.pic.i_stride[0]; 
  574.     (m)->i_stride[1] = h->mb.pic.i_stride[1]; 
  575.     (m)->p_fenc[0] = &(src)[0][(xoff)+(yoff)*FENC_STRIDE]; 
  576.     (m)->p_fenc[1] = &(src)[1][((xoff)>>1)+((yoff)>>1)*FENC_STRIDE]; 
  577.     (m)->p_fenc[2] = &(src)[2][((xoff)>>1)+((yoff)>>1)*FENC_STRIDE];
  578. #define LOAD_HPELS(m, src, list, ref, xoff, yoff) 
  579.     (m)->p_fref[0] = &(src)[0][(xoff)+(yoff)*(m)->i_stride[0]]; 
  580.     (m)->p_fref[1] = &(src)[1][(xoff)+(yoff)*(m)->i_stride[0]]; 
  581.     (m)->p_fref[2] = &(src)[2][(xoff)+(yoff)*(m)->i_stride[0]]; 
  582.     (m)->p_fref[3] = &(src)[3][(xoff)+(yoff)*(m)->i_stride[0]]; 
  583.     (m)->p_fref[4] = &(src)[4][((xoff)>>1)+((yoff)>>1)*(m)->i_stride[1]]; 
  584.     (m)->p_fref[5] = &(src)[5][((xoff)>>1)+((yoff)>>1)*(m)->i_stride[1]]; 
  585.     (m)->integral = &h->mb.pic.p_integral[list][ref][(xoff)+(yoff)*(m)->i_stride[0]];
  586. #define REF_COST(list, ref) 
  587.     (a->i_lambda * bs_size_te( h->sh.i_num_ref_idx_l##list##_active - 1, ref ))
  588. static void x264_mb_analyse_inter_p16x16( x264_t *h, x264_mb_analysis_t *a )
  589. {
  590.     x264_me_t m;
  591.     int i_ref;
  592.     int mvc[7][2], i_mvc;
  593.     int i_halfpel_thresh = INT_MAX;
  594.     int *p_halfpel_thresh = h->i_ref0>1 ? &i_halfpel_thresh : NULL;
  595.     /* 16x16 Search on all ref frame */
  596.     m.i_pixel = PIXEL_16x16;
  597.     m.p_cost_mv = a->p_cost_mv;
  598.     LOAD_FENC( &m, h->mb.pic.p_fenc, 0, 0 );
  599.     a->l0.me16x16.cost = INT_MAX;
  600.     for( i_ref = 0; i_ref < h->i_ref0; i_ref++ )
  601.     {
  602.         const int i_ref_cost = REF_COST( 0, i_ref );
  603.         i_halfpel_thresh -= i_ref_cost;
  604.         m.i_ref_cost = i_ref_cost;
  605.         m.i_ref = i_ref;
  606.         /* search with ref */
  607.         LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 0, 0 );
  608.         x264_mb_predict_mv_16x16( h, 0, i_ref, m.mvp );
  609.         x264_mb_predict_mv_ref16x16( h, 0, i_ref, mvc, &i_mvc );
  610.         x264_me_search_ref( h, &m, mvc, i_mvc, p_halfpel_thresh );
  611.         /* early termination
  612.          * SSD threshold would probably be better than SATD */
  613.         if( i_ref == 0 && a->b_try_pskip && m.cost-m.cost_mv < 300*a->i_lambda )
  614.         {
  615.             int mvskip[2];
  616.             x264_mb_predict_mv_pskip( h, mvskip );
  617.             if( abs(m.mv[0]-mvskip[0]) + abs(m.mv[1]-mvskip[1]) <= 1
  618.                 && x264_macroblock_probe_pskip( h ) )
  619.             {
  620.                 h->mb.i_type = P_SKIP;
  621.                 x264_analyse_update_cache( h, a );
  622.                 return;
  623.             }
  624.         }
  625.         m.cost += i_ref_cost;
  626.         i_halfpel_thresh += i_ref_cost;
  627.         if( m.cost < a->l0.me16x16.cost )
  628.             a->l0.me16x16 = m;
  629.         /* save mv for predicting neighbors */
  630.         a->l0.mvc[i_ref][0][0] =
  631.         h->mb.mvr[0][i_ref][h->mb.i_mb_xy][0] = m.mv[0];
  632.         a->l0.mvc[i_ref][0][1] =
  633.         h->mb.mvr[0][i_ref][h->mb.i_mb_xy][1] = m.mv[1];
  634.     }
  635.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.me16x16.i_ref );
  636.     h->mb.i_type = P_L0;
  637.     if( a->b_mbrd )
  638.     {
  639.         a->i_best_satd = a->l0.me16x16.cost;
  640.         h->mb.i_partition = D_16x16;
  641.         x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv[0], a->l0.me16x16.mv[1] );
  642.         a->l0.me16x16.cost = x264_rd_cost_mb( h, a->i_lambda2 );
  643.     }
  644. }
  645. static void x264_mb_analyse_inter_p8x8_mixed_ref( x264_t *h, x264_mb_analysis_t *a )
  646. {
  647.     x264_me_t m;
  648.     int i_ref;
  649.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  650.     int i_halfpel_thresh = INT_MAX;
  651.     int *p_halfpel_thresh = /*h->i_ref0>1 ? &i_halfpel_thresh : */NULL;
  652.     int i;
  653.     int i_maxref = h->i_ref0-1;
  654.     h->mb.i_partition = D_8x8;
  655.     /* early termination: if 16x16 chose ref 0, then evalute no refs older
  656.      * than those used by the neighbors */
  657.     if( i_maxref > 0 && a->l0.me16x16.i_ref == 0 &&
  658.         h->mb.i_mb_type_top && h->mb.i_mb_type_left )
  659.     {
  660.         i_maxref = 0;
  661.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 - 1 ] );
  662.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 + 0 ] );
  663.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 + 2 ] );
  664.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 - 8 + 4 ] );
  665.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 + 0 - 1 ] );
  666.         i_maxref = X264_MAX( i_maxref, h->mb.cache.ref[0][ X264_SCAN8_0 + 2*8 - 1 ] );
  667.     }
  668.     for( i_ref = 0; i_ref <= i_maxref; i_ref++ )
  669.     {
  670.          a->l0.mvc[i_ref][0][0] = h->mb.mvr[0][i_ref][h->mb.i_mb_xy][0];
  671.          a->l0.mvc[i_ref][0][1] = h->mb.mvr[0][i_ref][h->mb.i_mb_xy][1];
  672.     }
  673.     for( i = 0; i < 4; i++ )
  674.     {
  675.         x264_me_t *l0m = &a->l0.me8x8[i];
  676.         const int x8 = i%2;
  677.         const int y8 = i/2;
  678.         m.i_pixel = PIXEL_8x8;
  679.         m.p_cost_mv = a->p_cost_mv;
  680.         LOAD_FENC( &m, p_fenc, 8*x8, 8*y8 );
  681.         l0m->cost = INT_MAX;
  682.         for( i_ref = 0; i_ref <= i_maxref; i_ref++ )
  683.         {
  684.              const int i_ref_cost = REF_COST( 0, i_ref );
  685.              i_halfpel_thresh -= i_ref_cost;
  686.              m.i_ref_cost = i_ref_cost;
  687.              m.i_ref = i_ref;
  688.              LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 8*x8, 8*y8 );
  689.              x264_macroblock_cache_ref( h, 2*x8, 2*y8, 2, 2, 0, i_ref );
  690.              x264_mb_predict_mv( h, 0, 4*i, 2, m.mvp );
  691.              x264_me_search_ref( h, &m, a->l0.mvc[i_ref], i+1, p_halfpel_thresh );
  692.              m.cost += i_ref_cost;
  693.              i_halfpel_thresh += i_ref_cost;
  694.              *(uint64_t*)a->l0.mvc[i_ref][i+1] = *(uint64_t*)m.mv;
  695.              if( m.cost < l0m->cost )
  696.                  *l0m = m;
  697.         }
  698.         x264_macroblock_cache_mv( h, 2*x8, 2*y8, 2, 2, 0, l0m->mv[0], l0m->mv[1] );
  699.         x264_macroblock_cache_ref( h, 2*x8, 2*y8, 2, 2, 0, l0m->i_ref );
  700.         /* mb type cost */
  701.         l0m->cost += a->i_lambda * i_sub_mb_p_cost_table[D_L0_8x8];
  702.     }
  703.     a->l0.i_cost8x8 = a->l0.me8x8[0].cost + a->l0.me8x8[1].cost +
  704.                       a->l0.me8x8[2].cost + a->l0.me8x8[3].cost;
  705.     if( a->b_mbrd )
  706.     {
  707.         if( a->i_best_satd > a->l0.i_cost8x8 )
  708.             a->i_best_satd = a->l0.i_cost8x8;
  709.         h->mb.i_type = P_8x8;
  710.         h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  711.         h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  712.         a->l0.i_cost8x8 = x264_rd_cost_mb( h, a->i_lambda2 );
  713.     }
  714. }
  715. static void x264_mb_analyse_inter_p8x8( x264_t *h, x264_mb_analysis_t *a )
  716. {
  717.     const int i_ref = a->l0.me16x16.i_ref;
  718.     const int i_ref_cost = REF_COST( 0, i_ref );
  719.     uint8_t  **p_fref = h->mb.pic.p_fref[0][i_ref];
  720.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  721.     int i_mvc;
  722.     int (*mvc)[2] = a->l0.mvc[i_ref];
  723.     int i;
  724.     /* XXX Needed for x264_mb_predict_mv */
  725.     h->mb.i_partition = D_8x8;
  726.     i_mvc = 1;
  727.     *(uint64_t*)mvc[0] = *(uint64_t*)a->l0.me16x16.mv;
  728.     for( i = 0; i < 4; i++ )
  729.     {
  730.         x264_me_t *m = &a->l0.me8x8[i];
  731.         const int x8 = i%2;
  732.         const int y8 = i/2;
  733.         m->i_pixel = PIXEL_8x8;
  734.         m->p_cost_mv = a->p_cost_mv;
  735.         m->i_ref_cost = i_ref_cost;
  736.         m->i_ref = i_ref;
  737.         LOAD_FENC( m, p_fenc, 8*x8, 8*y8 );
  738.         LOAD_HPELS( m, p_fref, 0, i_ref, 8*x8, 8*y8 );
  739.         x264_mb_predict_mv( h, 0, 4*i, 2, m->mvp );
  740.         x264_me_search( h, m, mvc, i_mvc );
  741.         x264_macroblock_cache_mv( h, 2*x8, 2*y8, 2, 2, 0, m->mv[0], m->mv[1] );
  742.         *(uint64_t*)mvc[i_mvc] = *(uint64_t*)m->mv;
  743.         i_mvc++;
  744.         /* mb type cost */
  745.         m->cost += i_ref_cost;
  746.         m->cost += a->i_lambda * i_sub_mb_p_cost_table[D_L0_8x8];
  747.     }
  748.     /* theoretically this should include 4*ref_cost,
  749.      * but 3 seems a better approximation of cabac. */
  750.     a->l0.i_cost8x8 = a->l0.me8x8[0].cost + a->l0.me8x8[1].cost +
  751.                       a->l0.me8x8[2].cost + a->l0.me8x8[3].cost -
  752.                       REF_COST( 0, a->l0.me16x16.i_ref );
  753.     if( a->b_mbrd )
  754.     {
  755.         if( a->i_best_satd > a->l0.i_cost8x8 )
  756.             a->i_best_satd = a->l0.i_cost8x8;
  757.         h->mb.i_type = P_8x8;
  758.         h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  759.         h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  760.         a->l0.i_cost8x8 = x264_rd_cost_mb( h, a->i_lambda2 );
  761.     }
  762. }
  763. static void x264_mb_analyse_inter_p16x8( x264_t *h, x264_mb_analysis_t *a )
  764. {
  765.     x264_me_t m;
  766.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  767.     int mvc[3][2];
  768.     int i, j;
  769.     /* XXX Needed for x264_mb_predict_mv */
  770.     h->mb.i_partition = D_16x8;
  771.     for( i = 0; i < 2; i++ )
  772.     {
  773.         x264_me_t *l0m = &a->l0.me16x8[i];
  774.         const int ref8[2] = { a->l0.me8x8[2*i].i_ref, a->l0.me8x8[2*i+1].i_ref };
  775.         const int i_ref8s = ( ref8[0] == ref8[1] ) ? 1 : 2;
  776.         m.i_pixel = PIXEL_16x8;
  777.         m.p_cost_mv = a->p_cost_mv;
  778.         LOAD_FENC( &m, p_fenc, 0, 8*i );
  779.         l0m->cost = INT_MAX;
  780.         for( j = 0; j < i_ref8s; j++ )
  781.         {
  782.              const int i_ref = ref8[j];
  783.              const int i_ref_cost = REF_COST( 0, i_ref );
  784.              m.i_ref_cost = i_ref_cost;
  785.              m.i_ref = i_ref;
  786.              /* if we skipped the 16x16 predictor, we wouldn't have to copy anything... */
  787.              *(uint64_t*)mvc[0] = *(uint64_t*)a->l0.mvc[i_ref][0];
  788.              *(uint64_t*)mvc[1] = *(uint64_t*)a->l0.mvc[i_ref][2*i+1];
  789.              *(uint64_t*)mvc[2] = *(uint64_t*)a->l0.mvc[i_ref][2*i+2];
  790.              LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 0, 8*i );
  791.              x264_macroblock_cache_ref( h, 0, 2*i, 4, 2, 0, i_ref );
  792.              x264_mb_predict_mv( h, 0, 8*i, 4, m.mvp );
  793.              x264_me_search( h, &m, mvc, 3 );
  794.              m.cost += i_ref_cost;
  795.              if( m.cost < l0m->cost )
  796.                  *l0m = m;
  797.         }
  798.         x264_macroblock_cache_mv( h, 0, 2*i, 4, 2, 0, l0m->mv[0], l0m->mv[1] );
  799.         x264_macroblock_cache_ref( h, 0, 2*i, 4, 2, 0, l0m->i_ref );
  800.     }
  801.     a->l0.i_cost16x8 = a->l0.me16x8[0].cost + a->l0.me16x8[1].cost;
  802.     if( a->b_mbrd )
  803.     {
  804.         if( a->i_best_satd > a->l0.i_cost16x8 )
  805.             a->i_best_satd = a->l0.i_cost16x8;
  806.         h->mb.i_type = P_L0;
  807.         a->l0.i_cost16x8 = x264_rd_cost_mb( h, a->i_lambda2 );
  808.     }
  809. }
  810. static void x264_mb_analyse_inter_p8x16( x264_t *h, x264_mb_analysis_t *a )
  811. {
  812.     x264_me_t m;
  813.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  814.     int mvc[3][2];
  815.     int i, j;
  816.     /* XXX Needed for x264_mb_predict_mv */
  817.     h->mb.i_partition = D_8x16;
  818.     for( i = 0; i < 2; i++ )
  819.     {
  820.         x264_me_t *l0m = &a->l0.me8x16[i];
  821.         const int ref8[2] = { a->l0.me8x8[i].i_ref, a->l0.me8x8[i+2].i_ref };
  822.         const int i_ref8s = ( ref8[0] == ref8[1] ) ? 1 : 2;
  823.         m.i_pixel = PIXEL_8x16;
  824.         m.p_cost_mv = a->p_cost_mv;
  825.         LOAD_FENC( &m, p_fenc, 8*i, 0 );
  826.         l0m->cost = INT_MAX;
  827.         for( j = 0; j < i_ref8s; j++ )
  828.         {
  829.              const int i_ref = ref8[j];
  830.              const int i_ref_cost = REF_COST( 0, i_ref );
  831.              m.i_ref_cost = i_ref_cost;
  832.              m.i_ref = i_ref;
  833.              *(uint64_t*)mvc[0] = *(uint64_t*)a->l0.mvc[i_ref][0];
  834.              *(uint64_t*)mvc[1] = *(uint64_t*)a->l0.mvc[i_ref][i+1];
  835.              *(uint64_t*)mvc[2] = *(uint64_t*)a->l0.mvc[i_ref][i+3];
  836.              LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 8*i, 0 );
  837.              x264_macroblock_cache_ref( h, 2*i, 0, 2, 4, 0, i_ref );
  838.              x264_mb_predict_mv( h, 0, 4*i, 2, m.mvp );
  839.              x264_me_search( h, &m, mvc, 3 );
  840.              m.cost += i_ref_cost;
  841.              if( m.cost < l0m->cost )
  842.                  *l0m = m;
  843.         }
  844.         x264_macroblock_cache_mv( h, 2*i, 0, 2, 4, 0, l0m->mv[0], l0m->mv[1] );
  845.         x264_macroblock_cache_ref( h, 2*i, 0, 2, 4, 0, l0m->i_ref );
  846.     }
  847.     a->l0.i_cost8x16 = a->l0.me8x16[0].cost + a->l0.me8x16[1].cost;
  848.     if( a->b_mbrd )
  849.     {
  850.         if( a->i_best_satd > a->l0.i_cost8x16 )
  851.             a->i_best_satd = a->l0.i_cost8x16;
  852.         h->mb.i_type = P_L0;
  853.         a->l0.i_cost8x16 = x264_rd_cost_mb( h, a->i_lambda2 );
  854.     }
  855. }
  856. static int x264_mb_analyse_inter_p4x4_chroma( x264_t *h, x264_mb_analysis_t *a, uint8_t **p_fref, int i8x8, int pixel )
  857. {
  858.     DECLARE_ALIGNED( uint8_t, pix1[8*8], 8 );
  859.     DECLARE_ALIGNED( uint8_t, pix2[8*8], 8 );
  860.     const int i_stride = h->mb.pic.i_stride[1];
  861.     const int or = 4*(i8x8&1) + 2*(i8x8&2)*i_stride;
  862.     const int oe = 4*(i8x8&1) + 2*(i8x8&2)*FENC_STRIDE;
  863. #define CHROMA4x4MC( width, height, me, x, y ) 
  864.     h->mc.mc_chroma( &p_fref[4][or+x+y*i_stride], i_stride, &pix1[x+y*8], 8, (me).mv[0], (me).mv[1], width, height ); 
  865.     h->mc.mc_chroma( &p_fref[5][or+x+y*i_stride], i_stride, &pix2[x+y*8], 8, (me).mv[0], (me).mv[1], width, height );
  866.     if( pixel == PIXEL_4x4 )
  867.     {
  868.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][0], 0,0 );
  869.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][1], 0,2 );
  870.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][2], 2,0 );
  871.         CHROMA4x4MC( 2,2, a->l0.me4x4[i8x8][3], 2,2 );
  872.     }
  873.     else if( pixel == PIXEL_8x4 )
  874.     {
  875.         CHROMA4x4MC( 4,2, a->l0.me8x4[i8x8][0], 0,0 );
  876.         CHROMA4x4MC( 4,2, a->l0.me8x4[i8x8][1], 0,2 );
  877.     }
  878.     else
  879.     {
  880.         CHROMA4x4MC( 2,4, a->l0.me4x8[i8x8][0], 0,0 );
  881.         CHROMA4x4MC( 2,4, a->l0.me4x8[i8x8][1], 2,0 );
  882.     }
  883.     return h->pixf.mbcmp[PIXEL_4x4]( &h->mb.pic.p_fenc[1][oe], FENC_STRIDE, pix1, 8 )
  884.          + h->pixf.mbcmp[PIXEL_4x4]( &h->mb.pic.p_fenc[2][oe], FENC_STRIDE, pix2, 8 );
  885. }
  886. static void x264_mb_analyse_inter_p4x4( x264_t *h, x264_mb_analysis_t *a, int i8x8 )
  887. {
  888.     uint8_t  **p_fref = h->mb.pic.p_fref[0][a->l0.me8x8[i8x8].i_ref];
  889.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  890.     const int i_ref = a->l0.me8x8[i8x8].i_ref;
  891.     int i4x4;
  892.     /* XXX Needed for x264_mb_predict_mv */
  893.     h->mb.i_partition = D_8x8;
  894.     for( i4x4 = 0; i4x4 < 4; i4x4++ )
  895.     {
  896.         const int idx = 4*i8x8 + i4x4;
  897.         const int x4 = block_idx_x[idx];
  898.         const int y4 = block_idx_y[idx];
  899.         const int i_mvc = (i4x4 == 0);
  900.         x264_me_t *m = &a->l0.me4x4[i8x8][i4x4];
  901.         m->i_pixel = PIXEL_4x4;
  902.         m->p_cost_mv = a->p_cost_mv;
  903.         LOAD_FENC( m, p_fenc, 4*x4, 4*y4 );
  904.         LOAD_HPELS( m, p_fref, 0, i_ref, 4*x4, 4*y4 );
  905.         x264_mb_predict_mv( h, 0, idx, 1, m->mvp );
  906.         x264_me_search( h, m, &a->l0.me8x8[i8x8].mv, i_mvc );
  907.         x264_macroblock_cache_mv( h, x4, y4, 1, 1, 0, m->mv[0], m->mv[1] );
  908.     }
  909.     a->l0.i_cost4x4[i8x8] = a->l0.me4x4[i8x8][0].cost +
  910.                             a->l0.me4x4[i8x8][1].cost +
  911.                             a->l0.me4x4[i8x8][2].cost +
  912.                             a->l0.me4x4[i8x8][3].cost +
  913.                             REF_COST( 0, i_ref ) +
  914.                             a->i_lambda * i_sub_mb_p_cost_table[D_L0_4x4];
  915.     if( h->mb.b_chroma_me )
  916.         a->l0.i_cost4x4[i8x8] += x264_mb_analyse_inter_p4x4_chroma( h, a, p_fref, i8x8, PIXEL_4x4 );
  917. }
  918. static void x264_mb_analyse_inter_p8x4( x264_t *h, x264_mb_analysis_t *a, int i8x8 )
  919. {
  920.     uint8_t  **p_fref = h->mb.pic.p_fref[0][a->l0.me8x8[i8x8].i_ref];
  921.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  922.     const int i_ref = a->l0.me8x8[i8x8].i_ref;
  923.     int i8x4;
  924.     /* XXX Needed for x264_mb_predict_mv */
  925.     h->mb.i_partition = D_8x8;
  926.     for( i8x4 = 0; i8x4 < 2; i8x4++ )
  927.     {
  928.         const int idx = 4*i8x8 + 2*i8x4;
  929.         const int x4 = block_idx_x[idx];
  930.         const int y4 = block_idx_y[idx];
  931.         const int i_mvc = (i8x4 == 0);
  932.         x264_me_t *m = &a->l0.me8x4[i8x8][i8x4];
  933.         m->i_pixel = PIXEL_8x4;
  934.         m->p_cost_mv = a->p_cost_mv;
  935.         LOAD_FENC( m, p_fenc, 4*x4, 4*y4 );
  936.         LOAD_HPELS( m, p_fref, 0, i_ref, 4*x4, 4*y4 );
  937.         x264_mb_predict_mv( h, 0, idx, 2, m->mvp );
  938.         x264_me_search( h, m, &a->l0.me4x4[i8x8][0].mv, i_mvc );
  939.         x264_macroblock_cache_mv( h, x4, y4, 2, 1, 0, m->mv[0], m->mv[1] );
  940.     }
  941.     a->l0.i_cost8x4[i8x8] = a->l0.me8x4[i8x8][0].cost + a->l0.me8x4[i8x8][1].cost +
  942.                             REF_COST( 0, i_ref ) +
  943.                             a->i_lambda * i_sub_mb_p_cost_table[D_L0_8x4];
  944.     if( h->mb.b_chroma_me )
  945.         a->l0.i_cost8x4[i8x8] += x264_mb_analyse_inter_p4x4_chroma( h, a, p_fref, i8x8, PIXEL_8x4 );
  946. }
  947. static void x264_mb_analyse_inter_p4x8( x264_t *h, x264_mb_analysis_t *a, int i8x8 )
  948. {
  949.     uint8_t  **p_fref = h->mb.pic.p_fref[0][a->l0.me8x8[i8x8].i_ref];
  950.     uint8_t  **p_fenc = h->mb.pic.p_fenc;
  951.     const int i_ref = a->l0.me8x8[i8x8].i_ref;
  952.     int i4x8;
  953.     /* XXX Needed for x264_mb_predict_mv */
  954.     h->mb.i_partition = D_8x8;
  955.     for( i4x8 = 0; i4x8 < 2; i4x8++ )
  956.     {
  957.         const int idx = 4*i8x8 + i4x8;
  958.         const int x4 = block_idx_x[idx];
  959.         const int y4 = block_idx_y[idx];
  960.         const int i_mvc = (i4x8 == 0);
  961.         x264_me_t *m = &a->l0.me4x8[i8x8][i4x8];
  962.         m->i_pixel = PIXEL_4x8;
  963.         m->p_cost_mv = a->p_cost_mv;
  964.         LOAD_FENC( m, p_fenc, 4*x4, 4*y4 );
  965.         LOAD_HPELS( m, p_fref, 0, i_ref, 4*x4, 4*y4 );
  966.         x264_mb_predict_mv( h, 0, idx, 1, m->mvp );
  967.         x264_me_search( h, m, &a->l0.me4x4[i8x8][0].mv, i_mvc );
  968.         x264_macroblock_cache_mv( h, x4, y4, 1, 2, 0, m->mv[0], m->mv[1] );
  969.     }
  970.     a->l0.i_cost4x8[i8x8] = a->l0.me4x8[i8x8][0].cost + a->l0.me4x8[i8x8][1].cost +
  971.                             REF_COST( 0, i_ref ) +
  972.                             a->i_lambda * i_sub_mb_p_cost_table[D_L0_4x8];
  973.     if( h->mb.b_chroma_me )
  974.         a->l0.i_cost4x8[i8x8] += x264_mb_analyse_inter_p4x4_chroma( h, a, p_fref, i8x8, PIXEL_4x8 );
  975. }
  976. static void x264_mb_analyse_inter_direct( x264_t *h, x264_mb_analysis_t *a )
  977. {
  978.     /* Assumes that fdec still contains the results of
  979.      * x264_mb_predict_mv_direct16x16 and x264_mb_mc */
  980.     uint8_t **p_fenc = h->mb.pic.p_fenc;
  981.     uint8_t **p_fdec = h->mb.pic.p_fdec;
  982.     int i;
  983.     a->i_cost16x16direct = 0;
  984.     for( i = 0; i < 4; i++ )
  985.     {
  986.         const int x = (i&1)*8;
  987.         const int y = (i>>1)*8;
  988.         a->i_cost16x16direct +=
  989.         a->i_cost8x8direct[i] =
  990.             h->pixf.mbcmp[PIXEL_8x8]( &p_fenc[0][x+y*FENC_STRIDE], FENC_STRIDE, &p_fdec[0][x+y*FDEC_STRIDE], FDEC_STRIDE );
  991.         /* mb type cost */
  992.         a->i_cost8x8direct[i] += a->i_lambda * i_sub_mb_b_cost_table[D_DIRECT_8x8];
  993.     }
  994.     a->i_cost16x16direct += a->i_lambda * i_mb_b_cost_table[B_DIRECT];
  995.     if( a->b_mbrd )
  996.     {
  997.         if( a->i_cost16x16direct < a->i_best_satd )
  998.             a->i_best_satd = a->i_cost16x16direct;
  999.         h->mb.i_type = B_DIRECT;
  1000.         a->i_cost16x16direct = x264_rd_cost_mb( h, a->i_lambda2 );
  1001.     }
  1002. }
  1003. #define WEIGHTED_AVG( size, pix1, stride1, src2, stride2 ) 
  1004.     { 
  1005.         if( h->param.analyse.b_weighted_bipred ) 
  1006.             h->mc.avg_weight[size]( pix1, stride1, src2, stride2, 
  1007.                     h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref] ); 
  1008.         else 
  1009.             h->mc.avg[size]( pix1, stride1, src2, stride2 ); 
  1010.     }
  1011. static void x264_mb_analyse_inter_b16x16( x264_t *h, x264_mb_analysis_t *a )
  1012. {
  1013.     uint8_t pix1[16*16], pix2[16*16];
  1014.     uint8_t *src2;
  1015.     int stride2 = 16;
  1016.     int src2_ref, pix1_ref;
  1017.     x264_me_t m;
  1018.     int i_ref;
  1019.     int mvc[8][2], i_mvc;
  1020.     int i_halfpel_thresh = INT_MAX;
  1021.     int *p_halfpel_thresh = h->i_ref0>1 ? &i_halfpel_thresh : NULL;
  1022.     /* 16x16 Search on all ref frame */
  1023.     m.i_pixel = PIXEL_16x16;
  1024.     m.p_cost_mv = a->p_cost_mv;
  1025.     LOAD_FENC( &m, h->mb.pic.p_fenc, 0, 0 );
  1026.     /* ME for List 0 */
  1027.     a->l0.me16x16.cost = INT_MAX;
  1028.     for( i_ref = 0; i_ref < h->i_ref0; i_ref++ )
  1029.     {
  1030.         /* search with ref */
  1031.         LOAD_HPELS( &m, h->mb.pic.p_fref[0][i_ref], 0, i_ref, 0, 0 );
  1032.         x264_mb_predict_mv_16x16( h, 0, i_ref, m.mvp );
  1033.         x264_mb_predict_mv_ref16x16( h, 0, i_ref, mvc, &i_mvc );
  1034.         x264_me_search_ref( h, &m, mvc, i_mvc, p_halfpel_thresh );
  1035.         /* add ref cost */
  1036.         m.cost += REF_COST( 0, i_ref );
  1037.         if( m.cost < a->l0.me16x16.cost )
  1038.         {
  1039.             a->l0.i_ref = i_ref;
  1040.             a->l0.me16x16 = m;
  1041.         }
  1042.         /* save mv for predicting neighbors */
  1043.         h->mb.mvr[0][i_ref][h->mb.i_mb_xy][0] = m.mv[0];
  1044.         h->mb.mvr[0][i_ref][h->mb.i_mb_xy][1] = m.mv[1];
  1045.     }
  1046.     /* subtract ref cost, so we don't have to add it for the other MB types */
  1047.     a->l0.me16x16.cost -= REF_COST( 0, a->l0.i_ref );
  1048.     /* ME for list 1 */
  1049.     i_halfpel_thresh = INT_MAX;
  1050.     p_halfpel_thresh = h->i_ref1>1 ? &i_halfpel_thresh : NULL;
  1051.     a->l1.me16x16.cost = INT_MAX;
  1052.     for( i_ref = 0; i_ref < h->i_ref1; i_ref++ )
  1053.     {
  1054.         /* search with ref */
  1055.         LOAD_HPELS( &m, h->mb.pic.p_fref[1][i_ref], 1, i_ref, 0, 0 );
  1056.         x264_mb_predict_mv_16x16( h, 1, i_ref, m.mvp );
  1057.         x264_mb_predict_mv_ref16x16( h, 1, i_ref, mvc, &i_mvc );
  1058.         x264_me_search_ref( h, &m, mvc, i_mvc, p_halfpel_thresh );
  1059.         /* add ref cost */
  1060.         m.cost += REF_COST( 1, i_ref );
  1061.         if( m.cost < a->l1.me16x16.cost )
  1062.         {
  1063.             a->l1.i_ref = i_ref;
  1064.             a->l1.me16x16 = m;
  1065.         }
  1066.         /* save mv for predicting neighbors */
  1067.         h->mb.mvr[1][i_ref][h->mb.i_mb_xy][0] = m.mv[0];
  1068.         h->mb.mvr[1][i_ref][h->mb.i_mb_xy][1] = m.mv[1];
  1069.     }
  1070.     /* subtract ref cost, so we don't have to add it for the other MB types */
  1071.     a->l1.me16x16.cost -= REF_COST( 1, a->l1.i_ref );
  1072.     /* Set global ref, needed for other modes? */
  1073.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.i_ref );
  1074.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, a->l1.i_ref );
  1075.     /* get cost of BI mode */
  1076.     if ( ((a->l0.me16x16.mv[0] | a->l0.me16x16.mv[1]) & 1) == 0 )
  1077.     {
  1078.         /* l0 reference is halfpel, so get_ref on it will make it faster */
  1079.         src2 = h->mc.get_ref( h->mb.pic.p_fref[0][a->l0.i_ref], h->mb.pic.i_stride[0],
  1080.                         pix2, &stride2,
  1081.                         a->l0.me16x16.mv[0], a->l0.me16x16.mv[1],
  1082.                         16, 16 );
  1083.         h->mc.mc_luma( h->mb.pic.p_fref[1][a->l1.i_ref], h->mb.pic.i_stride[0],
  1084.                         pix1, 16,
  1085.                         a->l1.me16x16.mv[0], a->l1.me16x16.mv[1],
  1086.                         16, 16 );
  1087.         src2_ref = a->l0.i_ref;
  1088.         pix1_ref = a->l1.i_ref;
  1089.     } 
  1090.     else
  1091.     {
  1092.         /* if l0 was qpel, we'll use get_ref on l1 instead */
  1093.         h->mc.mc_luma( h->mb.pic.p_fref[0][a->l0.i_ref], h->mb.pic.i_stride[0],
  1094.                         pix1, 16,
  1095.                         a->l0.me16x16.mv[0], a->l0.me16x16.mv[1],
  1096.                         16, 16 );
  1097.         src2 = h->mc.get_ref( h->mb.pic.p_fref[1][a->l1.i_ref], h->mb.pic.i_stride[0],
  1098.                         pix2, &stride2,
  1099.                         a->l1.me16x16.mv[0], a->l1.me16x16.mv[1],
  1100.                         16, 16 );
  1101.         src2_ref = a->l1.i_ref;
  1102.         pix1_ref = a->l0.i_ref;
  1103.     }
  1104.     if( h->param.analyse.b_weighted_bipred )
  1105.         h->mc.avg_weight[PIXEL_16x16]( pix1, 16, src2, stride2,
  1106.                 h->mb.bipred_weight[pix1_ref][src2_ref] );
  1107.     else
  1108.         h->mc.avg[PIXEL_16x16]( pix1, 16, src2, stride2 );
  1109.     a->i_cost16x16bi = h->pixf.mbcmp[PIXEL_16x16]( h->mb.pic.p_fenc[0], FENC_STRIDE, pix1, 16 )
  1110.                      + REF_COST( 0, a->l0.i_ref )
  1111.                      + REF_COST( 1, a->l1.i_ref )
  1112.                      + a->l0.me16x16.cost_mv
  1113.                      + a->l1.me16x16.cost_mv;
  1114.     /* mb type cost */
  1115.     a->i_cost16x16bi   += a->i_lambda * i_mb_b_cost_table[B_BI_BI];
  1116.     a->l0.me16x16.cost += a->i_lambda * i_mb_b_cost_table[B_L0_L0];
  1117.     a->l1.me16x16.cost += a->i_lambda * i_mb_b_cost_table[B_L1_L1];
  1118.     if( a->b_mbrd )
  1119.     {
  1120.         int i_satd_thresh;
  1121.         if( a->l0.me16x16.cost < a->i_best_satd )
  1122.             a->i_best_satd = a->l0.me16x16.cost;
  1123.         if( a->l1.me16x16.cost < a->i_best_satd )
  1124.             a->i_best_satd = a->l1.me16x16.cost;
  1125.         if( a->i_cost16x16bi < a->i_best_satd )
  1126.             a->i_best_satd = a->i_cost16x16bi;
  1127.         i_satd_thresh = a->i_best_satd * 3/2;
  1128.         h->mb.i_partition = D_16x16;
  1129.         /* L0 */
  1130.         if( a->l0.me16x16.cost < i_satd_thresh )
  1131.         {
  1132.             h->mb.i_type = B_L0_L0;
  1133.             x264_macroblock_cache_mv( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv[0], a->l0.me16x16.mv[1] );
  1134.             a->l0.me16x16.cost = x264_rd_cost_mb( h, a->i_lambda2 );
  1135.         }
  1136.         else
  1137.             a->l0.me16x16.cost = COST_MAX;
  1138.         /* L1 */
  1139.         if( a->l1.me16x16.cost < i_satd_thresh )
  1140.         {
  1141.             h->mb.i_type = B_L1_L1;
  1142.             x264_macroblock_cache_mv( h, 0, 0, 4, 4, 1, a->l1.me16x16.mv[0], a->l1.me16x16.mv[1] );
  1143.             a->l1.me16x16.cost = x264_rd_cost_mb( h, a->i_lambda2 );
  1144.         }
  1145.         else
  1146.             a->l1.me16x16.cost = COST_MAX;
  1147.         /* BI */
  1148.         if( a->i_cost16x16bi < i_satd_thresh )
  1149.         {
  1150.             h->mb.i_type = B_BI_BI;
  1151.             a->i_cost16x16bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1152.         }
  1153.         else
  1154.             a->i_cost16x16bi = COST_MAX;
  1155.     }
  1156. }
  1157. static inline void x264_mb_cache_mv_p8x8( x264_t *h, x264_mb_analysis_t *a, int i )
  1158. {
  1159.     const int x = 2*(i%2);
  1160.     const int y = 2*(i/2);
  1161.     switch( h->mb.i_sub_partition[i] )
  1162.     {
  1163.         case D_L0_8x8:
  1164.             x264_macroblock_cache_mv( h, x, y, 2, 2, 0, a->l0.me8x8[i].mv[0], a->l0.me8x8[i].mv[1] );
  1165.             break;
  1166.         case D_L0_8x4:
  1167.             x264_macroblock_cache_mv( h, x, y+0, 2, 1, 0, a->l0.me8x4[i][0].mv[0], a->l0.me8x4[i][0].mv[1] );
  1168.             x264_macroblock_cache_mv( h, x, y+1, 2, 1, 0, a->l0.me8x4[i][1].mv[0], a->l0.me8x4[i][1].mv[1] );
  1169.             break;
  1170.         case D_L0_4x8:
  1171.             x264_macroblock_cache_mv( h, x+0, y, 1, 2, 0, a->l0.me4x8[i][0].mv[0], a->l0.me4x8[i][0].mv[1] );
  1172.             x264_macroblock_cache_mv( h, x+1, y, 1, 2, 0, a->l0.me4x8[i][1].mv[0], a->l0.me4x8[i][1].mv[1] );
  1173.             break;
  1174.         case D_L0_4x4:
  1175.             x264_macroblock_cache_mv( h, x+0, y+0, 1, 1, 0, a->l0.me4x4[i][0].mv[0], a->l0.me4x4[i][0].mv[1] );
  1176.             x264_macroblock_cache_mv( h, x+1, y+0, 1, 1, 0, a->l0.me4x4[i][1].mv[0], a->l0.me4x4[i][1].mv[1] );
  1177.             x264_macroblock_cache_mv( h, x+0, y+1, 1, 1, 0, a->l0.me4x4[i][2].mv[0], a->l0.me4x4[i][2].mv[1] );
  1178.             x264_macroblock_cache_mv( h, x+1, y+1, 1, 1, 0, a->l0.me4x4[i][3].mv[0], a->l0.me4x4[i][3].mv[1] );
  1179.             break;
  1180.         default:
  1181.             x264_log( h, X264_LOG_ERROR, "internal errorn" );
  1182.             break;
  1183.     }
  1184. }
  1185. #define CACHE_MV_BI(x,y,dx,dy,me0,me1,part) 
  1186.     if( x264_mb_partition_listX_table[0][part] ) 
  1187.     { 
  1188.         x264_macroblock_cache_ref( h, x,y,dx,dy, 0, a->l0.i_ref ); 
  1189.         x264_macroblock_cache_mv(  h, x,y,dx,dy, 0, me0.mv[0], me0.mv[1] ); 
  1190.     } 
  1191.     else 
  1192.     { 
  1193.         x264_macroblock_cache_ref( h, x,y,dx,dy, 0, -1 ); 
  1194.         x264_macroblock_cache_mv(  h, x,y,dx,dy, 0, 0, 0 ); 
  1195.         if( b_mvd ) 
  1196.             x264_macroblock_cache_mvd( h, x,y,dx,dy, 0, 0, 0 ); 
  1197.     } 
  1198.     if( x264_mb_partition_listX_table[1][part] ) 
  1199.     { 
  1200.         x264_macroblock_cache_ref( h, x,y,dx,dy, 1, a->l1.i_ref ); 
  1201.         x264_macroblock_cache_mv(  h, x,y,dx,dy, 1, me1.mv[0], me1.mv[1] ); 
  1202.     } 
  1203.     else 
  1204.     { 
  1205.         x264_macroblock_cache_ref( h, x,y,dx,dy, 1, -1 ); 
  1206.         x264_macroblock_cache_mv(  h, x,y,dx,dy, 1, 0, 0 ); 
  1207.         if( b_mvd ) 
  1208.             x264_macroblock_cache_mvd( h, x,y,dx,dy, 1, 0, 0 ); 
  1209.     }
  1210. static inline void x264_mb_cache_mv_b8x8( x264_t *h, x264_mb_analysis_t *a, int i, int b_mvd )
  1211. {
  1212.     int x = (i%2)*2;
  1213.     int y = (i/2)*2;
  1214.     if( h->mb.i_sub_partition[i] == D_DIRECT_8x8 )
  1215.     {
  1216.         x264_mb_load_mv_direct8x8( h, i );
  1217.         if( b_mvd )
  1218.         {
  1219.             x264_macroblock_cache_mvd(  h, x, y, 2, 2, 0, 0, 0 );
  1220.             x264_macroblock_cache_mvd(  h, x, y, 2, 2, 1, 0, 0 );
  1221.             x264_macroblock_cache_skip( h, x, y, 2, 2, 1 );
  1222.         }
  1223.     }
  1224.     else
  1225.     {
  1226.         CACHE_MV_BI( x, y, 2, 2, a->l0.me8x8[i], a->l1.me8x8[i], h->mb.i_sub_partition[i] );
  1227.     }
  1228. }
  1229. static inline void x264_mb_cache_mv_b16x8( x264_t *h, x264_mb_analysis_t *a, int i, int b_mvd )
  1230. {
  1231.     CACHE_MV_BI( 0, 2*i, 4, 2, a->l0.me16x8[i], a->l1.me16x8[i], a->i_mb_partition16x8[i] );
  1232. }
  1233. static inline void x264_mb_cache_mv_b8x16( x264_t *h, x264_mb_analysis_t *a, int i, int b_mvd )
  1234. {
  1235.     CACHE_MV_BI( 2*i, 0, 2, 4, a->l0.me8x16[i], a->l1.me8x16[i], a->i_mb_partition8x16[i] );
  1236. }
  1237. #undef CACHE_MV_BI
  1238. static void x264_mb_analyse_inter_b8x8( x264_t *h, x264_mb_analysis_t *a )
  1239. {
  1240.     uint8_t **p_fref[2] =
  1241.         { h->mb.pic.p_fref[0][a->l0.i_ref],
  1242.           h->mb.pic.p_fref[1][a->l1.i_ref] };
  1243.     uint8_t pix[2][8*8];
  1244.     int i, l;
  1245.     /* XXX Needed for x264_mb_predict_mv */
  1246.     h->mb.i_partition = D_8x8;
  1247.     a->i_cost8x8bi = 0;
  1248.     for( i = 0; i < 4; i++ )
  1249.     {
  1250.         const int x8 = i%2;
  1251.         const int y8 = i/2;
  1252.         int i_part_cost;
  1253.         int i_part_cost_bi = 0;
  1254.         for( l = 0; l < 2; l++ )
  1255.         {
  1256.             x264_mb_analysis_list_t *lX = l ? &a->l1 : &a->l0;
  1257.             x264_me_t *m = &lX->me8x8[i];
  1258.             m->i_pixel = PIXEL_8x8;
  1259.             m->p_cost_mv = a->p_cost_mv;
  1260.             LOAD_FENC( m, h->mb.pic.p_fenc, 8*x8, 8*y8 );
  1261.             LOAD_HPELS( m, p_fref[l], l, lX->i_ref, 8*x8, 8*y8 );
  1262.             x264_mb_predict_mv( h, l, 4*i, 2, m->mvp );
  1263.             x264_me_search( h, m, &lX->me16x16.mv, 1 );
  1264.             x264_macroblock_cache_mv( h, 2*x8, 2*y8, 2, 2, l, m->mv[0], m->mv[1] );
  1265.             /* BI mode */
  1266.             h->mc.mc_luma( m->p_fref, m->i_stride[0], pix[l], 8,
  1267.                             m->mv[0], m->mv[1], 8, 8 );
  1268.             i_part_cost_bi += m->cost_mv;
  1269.             /* FIXME: ref cost */
  1270.         }
  1271.         WEIGHTED_AVG( PIXEL_8x8, pix[0], 8, pix[1], 8 );
  1272.         i_part_cost_bi += h->pixf.mbcmp[PIXEL_8x8]( a->l0.me8x8[i].p_fenc[0], FENC_STRIDE, pix[0], 8 )
  1273.                         + a->i_lambda * i_sub_mb_b_cost_table[D_BI_8x8];
  1274.         a->l0.me8x8[i].cost += a->i_lambda * i_sub_mb_b_cost_table[D_L0_8x8];
  1275.         a->l1.me8x8[i].cost += a->i_lambda * i_sub_mb_b_cost_table[D_L1_8x8];
  1276.         i_part_cost = a->l0.me8x8[i].cost;
  1277.         h->mb.i_sub_partition[i] = D_L0_8x8;
  1278.         if( a->l1.me8x8[i].cost < i_part_cost )
  1279.         {
  1280.             i_part_cost = a->l1.me8x8[i].cost;
  1281.             h->mb.i_sub_partition[i] = D_L1_8x8;
  1282.         }
  1283.         if( i_part_cost_bi < i_part_cost )
  1284.         {
  1285.             i_part_cost = i_part_cost_bi;
  1286.             h->mb.i_sub_partition[i] = D_BI_8x8;
  1287.         }
  1288.         if( a->i_cost8x8direct[i] < i_part_cost )
  1289.         {
  1290.             i_part_cost = a->i_cost8x8direct[i];
  1291.             h->mb.i_sub_partition[i] = D_DIRECT_8x8;
  1292.         }
  1293.         a->i_cost8x8bi += i_part_cost;
  1294.         /* XXX Needed for x264_mb_predict_mv */
  1295.         x264_mb_cache_mv_b8x8( h, a, i, 0 );
  1296.     }
  1297.     /* mb type cost */
  1298.     a->i_cost8x8bi += a->i_lambda * i_mb_b_cost_table[B_8x8];
  1299.     if( a->b_mbrd )
  1300.     {
  1301.         if( a->i_cost8x8bi < a->i_best_satd )
  1302.             a->i_best_satd = a->i_cost8x8bi;
  1303.         if( a->i_cost8x8bi < a->i_best_satd * 3/2 )
  1304.         {
  1305.             h->mb.i_type = B_8x8;
  1306.             h->mb.i_partition = D_8x8;
  1307.             a->i_cost8x8bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1308.         }
  1309.         else
  1310.             a->i_cost8x8bi = COST_MAX;
  1311.     }
  1312. }
  1313. static void x264_mb_analyse_inter_b16x8( x264_t *h, x264_mb_analysis_t *a )
  1314. {
  1315.     uint8_t **p_fref[2] =
  1316.         { h->mb.pic.p_fref[0][a->l0.i_ref],
  1317.           h->mb.pic.p_fref[1][a->l1.i_ref] };
  1318.     DECLARE_ALIGNED( uint8_t,  pix[2][16*8], 16 );
  1319.     int mvc[2][2];
  1320.     int i, l;
  1321.     h->mb.i_partition = D_16x8;
  1322.     a->i_cost16x8bi = 0;
  1323.     for( i = 0; i < 2; i++ )
  1324.     {
  1325.         int i_part_cost;
  1326.         int i_part_cost_bi = 0;
  1327.         /* TODO: check only the list(s) that were used in b8x8? */
  1328.         for( l = 0; l < 2; l++ )
  1329.         {
  1330.             x264_mb_analysis_list_t *lX = l ? &a->l1 : &a->l0;
  1331.             x264_me_t *m = &lX->me16x8[i];
  1332.             m->i_pixel = PIXEL_16x8;
  1333.             m->p_cost_mv = a->p_cost_mv;
  1334.             LOAD_FENC( m, h->mb.pic.p_fenc, 0, 8*i );
  1335.             LOAD_HPELS( m, p_fref[l], l, lX->i_ref, 0, 8*i );
  1336.             mvc[0][0] = lX->me8x8[2*i].mv[0];
  1337.             mvc[0][1] = lX->me8x8[2*i].mv[1];
  1338.             mvc[1][0] = lX->me8x8[2*i+1].mv[0];
  1339.             mvc[1][1] = lX->me8x8[2*i+1].mv[1];
  1340.             x264_mb_predict_mv( h, 0, 8*i, 2, m->mvp );
  1341.             x264_me_search( h, m, mvc, 2 );
  1342.             /* BI mode */
  1343.             h->mc.mc_luma( m->p_fref, m->i_stride[0], pix[l], 16,
  1344.                             m->mv[0], m->mv[1], 16, 8 );
  1345.             /* FIXME: ref cost */
  1346.             i_part_cost_bi += m->cost_mv;
  1347.         }
  1348.         WEIGHTED_AVG( PIXEL_16x8, pix[0], 16, pix[1], 16 );
  1349.         i_part_cost_bi += h->pixf.mbcmp[PIXEL_16x8]( a->l0.me16x8[i].p_fenc[0], FENC_STRIDE, pix[0], 16 );
  1350.         i_part_cost = a->l0.me16x8[i].cost;
  1351.         a->i_mb_partition16x8[i] = D_L0_8x8; /* not actually 8x8, only the L0 matters */
  1352.         if( a->l1.me16x8[i].cost < i_part_cost )
  1353.         {
  1354.             i_part_cost = a->l1.me16x8[i].cost;
  1355.             a->i_mb_partition16x8[i] = D_L1_8x8;
  1356.         }
  1357.         if( i_part_cost_bi + a->i_lambda * 1 < i_part_cost )
  1358.         {
  1359.             i_part_cost = i_part_cost_bi;
  1360.             a->i_mb_partition16x8[i] = D_BI_8x8;
  1361.         }
  1362.         a->i_cost16x8bi += i_part_cost;
  1363.         x264_mb_cache_mv_b16x8( h, a, i, 0 );
  1364.     }
  1365.     /* mb type cost */
  1366.     a->i_mb_type16x8 = B_L0_L0
  1367.         + (a->i_mb_partition16x8[0]>>2) * 3
  1368.         + (a->i_mb_partition16x8[1]>>2);
  1369.     a->i_cost16x8bi += a->i_lambda * i_mb_b16x8_cost_table[a->i_mb_type16x8];
  1370.     if( a->b_mbrd )
  1371.     {
  1372.         if( a->i_cost16x8bi < a->i_best_satd )
  1373.             a->i_best_satd = a->i_cost16x8bi;
  1374.         if( a->i_cost16x8bi < a->i_best_satd * 3/2 )
  1375.         {
  1376.             h->mb.i_type = a->i_mb_type16x8;
  1377.             h->mb.i_partition = D_16x8;
  1378.             a->i_cost16x8bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1379.         }
  1380.         else
  1381.             a->i_cost16x8bi = COST_MAX;
  1382.     }
  1383. }
  1384. static void x264_mb_analyse_inter_b8x16( x264_t *h, x264_mb_analysis_t *a )
  1385. {
  1386.     uint8_t **p_fref[2] =
  1387.         { h->mb.pic.p_fref[0][a->l0.i_ref],
  1388.           h->mb.pic.p_fref[1][a->l1.i_ref] };
  1389.     uint8_t pix[2][8*16];
  1390.     int mvc[2][2];
  1391.     int i, l;
  1392.     h->mb.i_partition = D_8x16;
  1393.     a->i_cost8x16bi = 0;
  1394.     for( i = 0; i < 2; i++ )
  1395.     {
  1396.         int i_part_cost;
  1397.         int i_part_cost_bi = 0;
  1398.         for( l = 0; l < 2; l++ )
  1399.         {
  1400.             x264_mb_analysis_list_t *lX = l ? &a->l1 : &a->l0;
  1401.             x264_me_t *m = &lX->me8x16[i];
  1402.             m->i_pixel = PIXEL_8x16;
  1403.             m->p_cost_mv = a->p_cost_mv;
  1404.             LOAD_FENC( m, h->mb.pic.p_fenc, 8*i, 0 );
  1405.             LOAD_HPELS( m, p_fref[l], l, lX->i_ref, 8*i, 0 );
  1406.             mvc[0][0] = lX->me8x8[i].mv[0];
  1407.             mvc[0][1] = lX->me8x8[i].mv[1];
  1408.             mvc[1][0] = lX->me8x8[i+2].mv[0];
  1409.             mvc[1][1] = lX->me8x8[i+2].mv[1];
  1410.             x264_mb_predict_mv( h, 0, 4*i, 2, m->mvp );
  1411.             x264_me_search( h, m, mvc, 2 );
  1412.             /* BI mode */
  1413.             h->mc.mc_luma( m->p_fref, m->i_stride[0], pix[l], 8,
  1414.                             m->mv[0], m->mv[1], 8, 16 );
  1415.             /* FIXME: ref cost */
  1416.             i_part_cost_bi += m->cost_mv;
  1417.         }
  1418.         WEIGHTED_AVG( PIXEL_8x16, pix[0], 8, pix[1], 8 );
  1419.         i_part_cost_bi += h->pixf.mbcmp[PIXEL_8x16]( a->l0.me8x16[i].p_fenc[0], FENC_STRIDE, pix[0], 8 );
  1420.         i_part_cost = a->l0.me8x16[i].cost;
  1421.         a->i_mb_partition8x16[i] = D_L0_8x8;
  1422.         if( a->l1.me8x16[i].cost < i_part_cost )
  1423.         {
  1424.             i_part_cost = a->l1.me8x16[i].cost;
  1425.             a->i_mb_partition8x16[i] = D_L1_8x8;
  1426.         }
  1427.         if( i_part_cost_bi + a->i_lambda * 1 < i_part_cost )
  1428.         {
  1429.             i_part_cost = i_part_cost_bi;
  1430.             a->i_mb_partition8x16[i] = D_BI_8x8;
  1431.         }
  1432.         a->i_cost8x16bi += i_part_cost;
  1433.         x264_mb_cache_mv_b8x16( h, a, i, 0 );
  1434.     }
  1435.     /* mb type cost */
  1436.     a->i_mb_type8x16 = B_L0_L0
  1437.         + (a->i_mb_partition8x16[0]>>2) * 3
  1438.         + (a->i_mb_partition8x16[1]>>2);
  1439.     a->i_cost8x16bi += a->i_lambda * i_mb_b16x8_cost_table[a->i_mb_type8x16];
  1440.     if( a->b_mbrd )
  1441.     {
  1442.         if( a->i_cost8x16bi < a->i_best_satd )
  1443.             a->i_best_satd = a->i_cost8x16bi;
  1444.         if( a->i_cost8x16bi < a->i_best_satd * 3/2 )
  1445.         {
  1446.             h->mb.i_type = a->i_mb_type8x16;
  1447.             h->mb.i_partition = D_8x16;
  1448.             a->i_cost8x16bi = x264_rd_cost_mb( h, a->i_lambda2 );
  1449.         }
  1450.         else
  1451.             a->i_cost8x16bi = COST_MAX;
  1452.     }
  1453. }
  1454. static void refine_bidir( x264_t *h, x264_mb_analysis_t *a )
  1455. {
  1456.     const int i_biweight = h->mb.bipred_weight[a->l0.i_ref][a->l1.i_ref];
  1457.     int i;
  1458.     switch( h->mb.i_partition )
  1459.     {
  1460.     case D_16x16:
  1461.         if( h->mb.i_type == B_BI_BI )
  1462.             x264_me_refine_bidir( h, &a->l0.me16x16, &a->l1.me16x16, i_biweight );
  1463.         break;
  1464.     case D_16x8:
  1465.         for( i=0; i<2; i++ )
  1466.             if( a->i_mb_partition16x8[i] == D_BI_8x8 )
  1467.                 x264_me_refine_bidir( h, &a->l0.me16x8[i], &a->l1.me16x8[i], i_biweight );
  1468.         break;
  1469.     case D_8x16:
  1470.         for( i=0; i<2; i++ )
  1471.             if( a->i_mb_partition8x16[i] == D_BI_8x8 )
  1472.                 x264_me_refine_bidir( h, &a->l0.me8x16[i], &a->l1.me8x16[i], i_biweight );
  1473.         break;
  1474.     case D_8x8:
  1475.         for( i=0; i<4; i++ )
  1476.             if( h->mb.i_sub_partition[i] == D_BI_8x8 )
  1477.                 x264_me_refine_bidir( h, &a->l0.me8x8[i], &a->l1.me8x8[i], i_biweight );
  1478.         break;
  1479.     }
  1480. }
  1481. static inline void x264_mb_analyse_transform( x264_t *h )
  1482. {
  1483.     h->mb.cache.b_transform_8x8_allowed =
  1484.         h->param.analyse.b_transform_8x8
  1485.         && !IS_INTRA( h->mb.i_type ) && x264_mb_transform_8x8_allowed( h );
  1486.     if( h->mb.cache.b_transform_8x8_allowed )
  1487.     {
  1488.         int i_cost4, i_cost8;
  1489.         /* FIXME only luma mc is needed */
  1490.         x264_mb_mc( h );
  1491.         i_cost8 = h->pixf.sa8d[PIXEL_16x16]( h->mb.pic.p_fenc[0], FENC_STRIDE,
  1492.                                              h->mb.pic.p_fdec[0], FDEC_STRIDE );
  1493.         i_cost4 = h->pixf.satd[PIXEL_16x16]( h->mb.pic.p_fenc[0], FENC_STRIDE,
  1494.                                              h->mb.pic.p_fdec[0], FDEC_STRIDE );
  1495.         h->mb.b_transform_8x8 = i_cost8 < i_cost4;
  1496.     }
  1497. }
  1498. static inline void x264_mb_analyse_transform_rd( x264_t *h, x264_mb_analysis_t *a, int *i_cost )
  1499. {
  1500.     h->mb.cache.b_transform_8x8_allowed =
  1501.         h->param.analyse.b_transform_8x8 && x264_mb_transform_8x8_allowed( h );
  1502.     if( h->mb.cache.b_transform_8x8_allowed )
  1503.     {
  1504.         int i_cost8;
  1505.         x264_analyse_update_cache( h, a );
  1506.         h->mb.b_transform_8x8 = !h->mb.b_transform_8x8;
  1507.         /* FIXME only luma is needed, but the score for comparison already includes chroma */
  1508.         i_cost8 = x264_rd_cost_mb( h, a->i_lambda2 );
  1509.         if( *i_cost >= i_cost8 )
  1510.         {
  1511.             if( *i_cost > 0 )
  1512.                 a->i_best_satd = (int64_t)a->i_best_satd * i_cost8 / *i_cost;
  1513.             /* prevent a rare division by zero in x264_mb_analyse_intra */
  1514.             if( a->i_best_satd == 0 )
  1515.                 a->i_best_satd = 1;
  1516.             *i_cost = i_cost8;
  1517.         }
  1518.         else
  1519.             h->mb.b_transform_8x8 = !h->mb.b_transform_8x8;
  1520.     }
  1521. }
  1522. /*****************************************************************************
  1523.  * x264_macroblock_analyse:
  1524.  *****************************************************************************/
  1525. void x264_macroblock_analyse( x264_t *h )
  1526. {
  1527.     x264_mb_analysis_t analysis;
  1528.     int i_cost = COST_MAX;
  1529.     int i;
  1530.     /* init analysis */
  1531.     x264_mb_analyse_init( h, &analysis, x264_ratecontrol_qp( h ) );
  1532.     /*--------------------------- Do the analysis ---------------------------*/
  1533.     if( h->sh.i_type == SLICE_TYPE_I )
  1534.     {
  1535.         x264_mb_analyse_intra( h, &analysis, COST_MAX );
  1536.         i_cost = analysis.i_sad_i16x16;
  1537.         h->mb.i_type = I_16x16;
  1538.         if( analysis.i_sad_i4x4 < i_cost )
  1539.         {
  1540.             i_cost = analysis.i_sad_i4x4;
  1541.             h->mb.i_type = I_4x4;
  1542.         }
  1543.         if( analysis.i_sad_i8x8 < i_cost )
  1544.             h->mb.i_type = I_8x8;
  1545.     }
  1546.     else if( h->sh.i_type == SLICE_TYPE_P )
  1547.     {
  1548.         int b_skip = 0;
  1549.         int i_intra_cost, i_intra_type;
  1550.         /* Fast P_SKIP detection */
  1551.         analysis.b_try_pskip = 0;
  1552.         if( h->param.analyse.b_fast_pskip )
  1553.         {
  1554.             if( h->param.analyse.i_subpel_refine >= 3 )
  1555.                 analysis.b_try_pskip = 1;
  1556.             else if( h->mb.i_mb_type_left == P_SKIP ||
  1557.                      h->mb.i_mb_type_top == P_SKIP ||
  1558.                      h->mb.i_mb_type_topleft == P_SKIP ||
  1559.                      h->mb.i_mb_type_topright == P_SKIP )
  1560.                 b_skip = x264_macroblock_probe_pskip( h );
  1561.         }
  1562.         if( b_skip )
  1563.         {
  1564.             h->mb.i_type = P_SKIP;
  1565.             h->mb.i_partition = D_16x16;
  1566.         }
  1567.         else
  1568.         {
  1569.             const unsigned int flags = h->param.analyse.inter;
  1570.             int i_type;
  1571.             int i_partition;
  1572.             int i_thresh16x8;
  1573.             x264_mb_analyse_load_costs( h, &analysis );
  1574.             x264_mb_analyse_inter_p16x16( h, &analysis );
  1575.             if( h->mb.i_type == P_SKIP )
  1576.                 return;
  1577.             if( flags & X264_ANALYSE_PSUB16x16 )
  1578.             {
  1579.                 if( h->param.analyse.b_mixed_references )
  1580.                     x264_mb_analyse_inter_p8x8_mixed_ref( h, &analysis );
  1581.                 else
  1582.                     x264_mb_analyse_inter_p8x8( h, &analysis );
  1583.             }
  1584.             /* Select best inter mode */
  1585.             i_type = P_L0;
  1586.             i_partition = D_16x16;
  1587.             i_cost = analysis.l0.me16x16.cost;
  1588.             if( ( flags & X264_ANALYSE_PSUB16x16 ) &&
  1589.                 analysis.l0.i_cost8x8 < analysis.l0.me16x16.cost )
  1590.             {
  1591.                 int i;
  1592.                 i_type = P_8x8;
  1593.                 i_partition = D_8x8;
  1594.                 h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  1595.                 h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  1596.                 i_cost = analysis.l0.i_cost8x8;
  1597.                 /* Do sub 8x8 */
  1598.                 if( flags & X264_ANALYSE_PSUB8x8 )
  1599.                 {
  1600.                     int i_cost_bak = i_cost;
  1601.                     int b_sub8x8 = 0;
  1602.                     for( i = 0; i < 4; i++ )
  1603.                     {
  1604.                         x264_mb_analyse_inter_p4x4( h, &analysis, i );
  1605.                         if( analysis.l0.i_cost4x4[i] < analysis.l0.me8x8[i].cost )
  1606.                         {
  1607.                             int i_cost8x8 = analysis.l0.i_cost4x4[i];
  1608.                             h->mb.i_sub_partition[i] = D_L0_4x4;
  1609.                             x264_mb_analyse_inter_p8x4( h, &analysis, i );
  1610.                             if( analysis.l0.i_cost8x4[i] < i_cost8x8 )
  1611.                             {
  1612.                                 h->mb.i_sub_partition[i] = D_L0_8x4;
  1613.                                 i_cost8x8 = analysis.l0.i_cost8x4[i];
  1614.                             }
  1615.                             x264_mb_analyse_inter_p4x8( h, &analysis, i );
  1616.                             if( analysis.l0.i_cost4x8[i] < i_cost8x8 )
  1617.                             {
  1618.                                 h->mb.i_sub_partition[i] = D_L0_4x8;
  1619.                                 i_cost8x8 = analysis.l0.i_cost4x8[i];
  1620.                             }
  1621.                             i_cost += i_cost8x8 - analysis.l0.me8x8[i].cost;
  1622.                             b_sub8x8 = 1;
  1623.                         }
  1624.                         x264_mb_cache_mv_p8x8( h, &analysis, i );
  1625.                     }
  1626.                     /* TODO: RD per subpartition */
  1627.                     if( b_sub8x8 && analysis.b_mbrd )
  1628.                     {
  1629.                         i_cost = x264_rd_cost_mb( h, analysis.i_lambda2 );
  1630.                         if( i_cost > i_cost_bak )
  1631.                         {
  1632.                             i_cost = i_cost_bak;
  1633.                             h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
  1634.                             h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
  1635.                         }
  1636.                     }
  1637.                 }
  1638.             }
  1639.             /* Now do 16x8/8x16 */
  1640.             i_thresh16x8 = analysis.l0.me8x8[1].cost_mv + analysis.l0.me8x8[2].cost_mv;
  1641.             if( analysis.b_mbrd )
  1642.                 i_thresh16x8 = i_thresh16x8 * analysis.i_lambda2 / analysis.i_lambda;
  1643.             if( ( flags & X264_ANALYSE_PSUB16x16 ) &&
  1644.                 analysis.l0.i_cost8x8 < analysis.l0.me16x16.cost + i_thresh16x8 )
  1645.             {
  1646.                 x264_mb_analyse_inter_p16x8( h, &analysis );
  1647.                 if( analysis.l0.i_cost16x8 < i_cost )
  1648.                 {
  1649.                     i_type = P_L0;
  1650.                     i_partition = D_16x8;
  1651.                     i_cost = analysis.l0.i_cost16x8;
  1652.                 }
  1653.                 x264_mb_analyse_inter_p8x16( h, &analysis );
  1654.                 if( analysis.l0.i_cost8x16 < i_cost )
  1655.                 {
  1656.                     i_type = P_L0;
  1657.                     i_partition = D_8x16;
  1658.                     i_cost = analysis.l0.i_cost8x16;
  1659.                 }
  1660.             }
  1661.             h->mb.i_partition = i_partition;
  1662.             /* refine qpel */
  1663.             //FIXME mb_type costs?
  1664.             if( analysis.b_mbrd )
  1665.             {
  1666.                 h->mb.i_type = i_type;
  1667.                 x264_mb_analyse_transform_rd( h, &analysis, &i_cost );
  1668.             }
  1669.             else if( i_partition == D_16x16 )
  1670.             {
  1671.                 x264_me_refine_qpel( h, &analysis.l0.me16x16 );
  1672.                 i_cost = analysis.l0.me16x16.cost;
  1673.             }
  1674.             else if( i_partition == D_16x8 )
  1675.             {
  1676.                 x264_me_refine_qpel( h, &analysis.l0.me16x8[0] );
  1677.                 x264_me_refine_qpel( h, &analysis.l0.me16x8[1] );
  1678.                 i_cost = analysis.l0.me16x8[0].cost + analysis.l0.me16x8[1].cost;
  1679.             }
  1680.             else if( i_partition == D_8x16 )
  1681.             {
  1682.                 x264_me_refine_qpel( h, &analysis.l0.me8x16[0] );
  1683.                 x264_me_refine_qpel( h, &analysis.l0.me8x16[1] );
  1684.                 i_cost = analysis.l0.me8x16[0].cost + analysis.l0.me8x16[1].cost;
  1685.             }
  1686.             else if( i_partition == D_8x8 )
  1687.             {
  1688.                 int i8x8;
  1689.                 i_cost = 0;
  1690.                 for( i8x8 = 0; i8x8 < 4; i8x8++ )
  1691.                 {
  1692.                     switch( h->mb.i_sub_partition[i8x8] )
  1693.                     {
  1694.                         case D_L0_8x8:
  1695.                             x264_me_refine_qpel( h, &analysis.l0.me8x8[i8x8] );
  1696.                             i_cost += analysis.l0.me8x8[i8x8].cost;
  1697.                             break;
  1698.                         case D_L0_8x4:
  1699.                             x264_me_refine_qpel( h, &analysis.l0.me8x4[i8x8][0] );
  1700.                             x264_me_refine_qpel( h, &analysis.l0.me8x4[i8x8][1] );
  1701.                             i_cost += analysis.l0.me8x4[i8x8][0].cost +
  1702.                                       analysis.l0.me8x4[i8x8][1].cost;
  1703.                             break;
  1704.                         case D_L0_4x8:
  1705.                             x264_me_refine_qpel( h, &analysis.l0.me4x8[i8x8][0] );
  1706.                             x264_me_refine_qpel( h, &analysis.l0.me4x8[i8x8][1] );
  1707.                             i_cost += analysis.l0.me4x8[i8x8][0].cost +
  1708.                                       analysis.l0.me4x8[i8x8][1].cost;
  1709.                             break;
  1710.                         case D_L0_4x4:
  1711.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][0] );
  1712.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][1] );
  1713.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][2] );
  1714.                             x264_me_refine_qpel( h, &analysis.l0.me4x4[i8x8][3] );
  1715.                             i_cost += analysis.l0.me4x4[i8x8][0].cost +
  1716.                                       analysis.l0.me4x4[i8x8][1].cost +
  1717.                                       analysis.l0.me4x4[i8x8][2].cost +
  1718.                                       analysis.l0.me4x4[i8x8][3].cost;
  1719.                             break;
  1720.                         default:
  1721.                             x264_log( h, X264_LOG_ERROR, "internal error (!8x8 && !4x4)n" );
  1722.                             break;
  1723.                     }
  1724.                 }
  1725.             }
  1726.             x264_mb_analyse_intra( h, &analysis, i_cost );
  1727.             if( h->mb.b_chroma_me && !analysis.b_mbrd &&
  1728.                 ( analysis.i_sad_i16x16 < i_cost
  1729.                || analysis.i_sad_i8x8 < i_cost
  1730.                || analysis.i_sad_i4x4 < i_cost ))
  1731.             {
  1732.                 x264_mb_analyse_intra_chroma( h, &analysis );
  1733.                 analysis.i_sad_i16x16 += analysis.i_sad_i8x8chroma;
  1734.                 analysis.i_sad_i8x8 += analysis.i_sad_i8x8chroma;
  1735.                 analysis.i_sad_i4x4 += analysis.i_sad_i8x8chroma;
  1736.             }
  1737.             i_intra_type = I_16x16;
  1738.             i_intra_cost = analysis.i_sad_i16x16;
  1739.             if( analysis.i_sad_i8x8 < i_intra_cost )
  1740.             {
  1741.                 i_intra_type = I_8x8;
  1742.                 i_intra_cost = analysis.i_sad_i8x8;
  1743.             }
  1744.             if( analysis.i_sad_i4x4 < i_intra_cost )
  1745.             {
  1746.                 i_intra_type = I_4x4;
  1747.                 i_intra_cost = analysis.i_sad_i4x4;
  1748.             }
  1749.             if( i_intra_cost < i_cost )
  1750.             {
  1751.                 i_type = i_intra_type;
  1752.                 i_cost = i_intra_cost;
  1753.             }
  1754.             h->mb.i_type = i_type;
  1755.             h->stat.frame.i_intra_cost += i_intra_cost;
  1756.             h->stat.frame.i_inter_cost += i_cost;
  1757.         }
  1758.     }
  1759.     else if( h->sh.i_type == SLICE_TYPE_B )
  1760.     {
  1761.         int i_bskip_cost = COST_MAX;
  1762.         int b_skip = 0;
  1763.         h->mb.i_type = B_SKIP;
  1764.         if( h->mb.b_direct_auto_write )
  1765.         {
  1766.             /* direct=auto heuristic: prefer whichever mode allows more Skip macroblocks */
  1767.             for( i = 0; i < 2; i++ )
  1768.             {
  1769.                 int b_changed = 1;
  1770.                 h->sh.b_direct_spatial_mv_pred ^= 1;
  1771.                 analysis.b_direct_available = x264_mb_predict_mv_direct16x16( h, i && analysis.b_direct_available ? &b_changed : NULL );
  1772.                 if( analysis.b_direct_available )
  1773.                 {
  1774.                     if( b_changed )
  1775.                     {
  1776.                         x264_mb_mc( h );
  1777.                         b_skip = x264_macroblock_probe_bskip( h );
  1778.                     }
  1779.                     h->stat.frame.i_direct_score[ h->sh.b_direct_spatial_mv_pred ] += b_skip;
  1780.                 }
  1781.                 else
  1782.                     b_skip = 0;
  1783.             }
  1784.         }
  1785.         else
  1786.             analysis.b_direct_available = x264_mb_predict_mv_direct16x16( h, NULL );
  1787.         if( analysis.b_direct_available )
  1788.         {
  1789.             if( !h->mb.b_direct_auto_write )
  1790.                 x264_mb_mc( h );
  1791.             if( h->mb.b_lossless )
  1792.             {
  1793.                 /* chance of skip is too small to bother */
  1794.             }
  1795.             else if( analysis.b_mbrd )
  1796.             {
  1797.                 i_bskip_cost = ssd_mb( h );
  1798.                 /* 6 = minimum cavlc cost of a non-skipped MB */
  1799.                 if( i_bskip_cost <= 6 * analysis.i_lambda2 )
  1800.                 {
  1801.                     h->mb.i_type = B_SKIP;
  1802.                     x264_analyse_update_cache( h, &analysis );
  1803.                     return;
  1804.                 }
  1805.             }
  1806.             else if( !h->mb.b_direct_auto_write )
  1807.             {
  1808.                 /* Conditioning the probe on neighboring block types
  1809.                  * doesn't seem to help speed or quality. */
  1810.                 b_skip = x264_macroblock_probe_bskip( h );
  1811.             }
  1812.         }
  1813.         if( !b_skip )
  1814.         {
  1815.             const unsigned int flags = h->param.analyse.inter;
  1816.             int i_type;
  1817.             int i_partition;
  1818.             x264_mb_analyse_load_costs( h, &analysis );
  1819.             /* select best inter mode */
  1820.             /* direct must be first */
  1821.             if( analysis.b_direct_available )
  1822.                 x264_mb_analyse_inter_direct( h, &analysis );
  1823.             x264_mb_analyse_inter_b16x16( h, &analysis );
  1824.             i_type = B_L0_L0;
  1825.             i_partition = D_16x16;
  1826.             i_cost = analysis.l0.me16x16.cost;
  1827.             if( analysis.l1.me16x16.cost < i_cost )
  1828.             {
  1829.                 i_type = B_L1_L1;
  1830.                 i_cost = analysis.l1.me16x16.cost;
  1831.             }
  1832.             if( analysis.i_cost16x16bi < i_cost )
  1833.             {
  1834.                 i_type = B_BI_BI;
  1835.                 i_cost = analysis.i_cost16x16bi;
  1836.             }
  1837.             if( analysis.i_cost16x16direct < i_cost )
  1838.             {
  1839.                 i_type = B_DIRECT;
  1840.                 i_cost = analysis.i_cost16x16direct;
  1841.             }
  1842.             if( i_bskip_cost <= i_cost )
  1843.             {
  1844.                 h->mb.i_type = B_SKIP;
  1845.                 x264_analyse_update_cache( h, &analysis );
  1846.                 return;
  1847.             }
  1848.             if( flags & X264_ANALYSE_BSUB16x16 )
  1849.             {
  1850.                 x264_mb_analyse_inter_b8x8( h, &analysis );
  1851.                 if( analysis.i_cost8x8bi < i_cost )
  1852.                 {
  1853.                     i_type = B_8x8;
  1854.                     i_partition = D_8x8;
  1855.                     i_cost = analysis.i_cost8x8bi;
  1856.                     if( h->mb.i_sub_partition[0] == h->mb.i_sub_partition[1] ||
  1857.                         h->mb.i_sub_partition[2] == h->mb.i_sub_partition[3] )
  1858.                     {
  1859.                         x264_mb_analyse_inter_b16x8( h, &analysis );
  1860.                         if( analysis.i_cost16x8bi < i_cost )
  1861.                         {
  1862.                             i_partition = D_16x8;
  1863.                             i_cost = analysis.i_cost16x8bi;
  1864.                             i_type = analysis.i_mb_type16x8;
  1865.                         }
  1866.                     }
  1867.                     if( h->mb.i_sub_partition[0] == h->mb.i_sub_partition[2] ||
  1868.                         h->mb.i_sub_partition[1] == h->mb.i_sub_partition[3] )
  1869.                     {
  1870.                         x264_mb_analyse_inter_b8x16( h, &analysis );
  1871.                         if( analysis.i_cost8x16bi < i_cost )
  1872.                         {
  1873.                             i_partition = D_8x16;
  1874.                             i_cost = analysis.i_cost8x16bi;
  1875.                             i_type = analysis.i_mb_type8x16;
  1876.                         }
  1877.                     }
  1878.                 }
  1879.             }
  1880.             h->mb.i_partition = i_partition;
  1881.             if( analysis.b_mbrd )
  1882.             {
  1883.                 h->mb.i_type = i_type;
  1884.                 x264_mb_analyse_transform_rd( h, &analysis, &i_cost );
  1885.             }
  1886.             /* refine qpel */
  1887.             else if( i_partition == D_16x16 )
  1888.             {
  1889.                 analysis.l0.me16x16.cost -= analysis.i_lambda * i_mb_b_cost_table[B_L0_L0];
  1890.                 analysis.l1.me16x16.cost -= analysis.i_lambda * i_mb_b_cost_table[B_L1_L1];
  1891.                 if( i_type == B_L0_L0 )
  1892.                 {
  1893.                     x264_me_refine_qpel( h, &analysis.l0.me16x16 );
  1894.                     i_cost = analysis.l0.me16x16.cost
  1895.                            + analysis.i_lambda * i_mb_b_cost_table[B_L0_L0];
  1896.                 }
  1897.                 else if( i_type == B_L1_L1 )
  1898.                 {
  1899.                     x264_me_refine_qpel( h, &analysis.l1.me16x16 );
  1900.                     i_cost = analysis.l1.me16x16.cost
  1901.                            + analysis.i_lambda * i_mb_b_cost_table[B_L1_L1];
  1902.                 }
  1903.                 else if( i_type == B_BI_BI )
  1904.                 {
  1905.                     x264_me_refine_qpel( h, &analysis.l0.me16x16 );
  1906.                     x264_me_refine_qpel( h, &analysis.l1.me16x16 );
  1907.                 }
  1908.             }
  1909.             else if( i_partition == D_16x8 )
  1910.             {
  1911.                 for( i=0; i<2; i++ )
  1912.                 {
  1913.                     if( analysis.i_mb_partition16x8[i] != D_L1_8x8 )
  1914.                         x264_me_refine_qpel( h, &analysis.l0.me16x8[i] );
  1915.                     if( analysis.i_mb_partition16x8[i] != D_L0_8x8 )
  1916.                         x264_me_refine_qpel( h, &analysis.l1.me16x8[i] );
  1917.                 }
  1918.             }
  1919.             else if( i_partition == D_8x16 )
  1920.             {
  1921.                 for( i=0; i<2; i++ )
  1922.                 {
  1923.                     if( analysis.i_mb_partition8x16[i] != D_L1_8x8 )
  1924.                         x264_me_refine_qpel( h, &analysis.l0.me8x16[i] );
  1925.                     if( analysis.i_mb_partition8x16[i] != D_L0_8x8 )
  1926.                         x264_me_refine_qpel( h, &analysis.l1.me8x16[i] );
  1927.                 }
  1928.             }
  1929.             else if( i_partition == D_8x8 )
  1930.             {
  1931.                 for( i=0; i<4; i++ )
  1932.                 {
  1933.                     x264_me_t *m;
  1934.                     int i_part_cost_old;
  1935.                     int i_type_cost;
  1936.                     int i_part_type = h->mb.i_sub_partition[i];
  1937.                     int b_bidir = (i_part_type == D_BI_8x8);
  1938.                     if( i_part_type == D_DIRECT_8x8 )
  1939.                         continue;
  1940.                     if( x264_mb_partition_listX_table[0][i_part_type] )
  1941.                     {
  1942.                         m = &analysis.l0.me8x8[i];
  1943.                         i_part_cost_old = m->cost;
  1944.                         i_type_cost = analysis.i_lambda * i_sub_mb_b_cost_table[D_L0_8x8];
  1945.                         m->cost -= i_type_cost;
  1946.                         x264_me_refine_qpel( h, m );
  1947.                         if( !b_bidir )
  1948.                             analysis.i_cost8x8bi += m->cost + i_type_cost - i_part_cost_old;
  1949.                     }
  1950.                     if( x264_mb_partition_listX_table[1][i_part_type] )
  1951.                     {
  1952.                         m = &analysis.l1.me8x8[i];
  1953.                         i_part_cost_old = m->cost;
  1954.                         i_type_cost = analysis.i_lambda * i_sub_mb_b_cost_table[D_L1_8x8];
  1955.                         m->cost -= i_type_cost;
  1956.                         x264_me_refine_qpel( h, m );
  1957.                         if( !b_bidir )
  1958.                             analysis.i_cost8x8bi += m->cost + i_type_cost - i_part_cost_old;
  1959.                     }
  1960.                     /* TODO: update mvp? */
  1961.                 }
  1962.             }
  1963.             /* best intra mode */
  1964.             x264_mb_analyse_intra( h, &analysis, i_cost );
  1965.             if( analysis.i_sad_i16x16 < i_cost )
  1966.             {
  1967.                 i_type = I_16x16;
  1968.                 i_cost = analysis.i_sad_i16x16;
  1969.             }
  1970.             if( analysis.i_sad_i8x8 < i_cost )
  1971.             {
  1972.                 i_type = I_8x8;
  1973.                 i_cost = analysis.i_sad_i8x8;
  1974.             }
  1975.             if( analysis.i_sad_i4x4 < i_cost )
  1976.             {
  1977.                 i_type = I_4x4;
  1978.                 i_cost = analysis.i_sad_i4x4;
  1979.             }
  1980.             h->mb.i_type = i_type;
  1981.             if( h->param.analyse.b_bidir_me )
  1982.                 refine_bidir( h, &analysis );
  1983.         }
  1984.     }
  1985.     x264_analyse_update_cache( h, &analysis );
  1986.     if( !analysis.b_mbrd )
  1987.         x264_mb_analyse_transform( h );
  1988.     h->mb.b_trellis = h->param.analyse.i_trellis;
  1989.     h->mb.b_noise_reduction = h->param.analyse.i_noise_reduction;
  1990. }
  1991. /*-------------------- Update MB from the analysis ----------------------*/
  1992. static void x264_analyse_update_cache( x264_t *h, x264_mb_analysis_t *a  )
  1993. {
  1994.     int i;
  1995.     switch( h->mb.i_type )
  1996.     {
  1997.         case I_4x4:
  1998.             for( i = 0; i < 16; i++ )
  1999.             {
  2000.                 h->mb.cache.intra4x4_pred_mode[x264_scan8[i]] =
  2001.                     a->i_predict4x4[block_idx_x[i]][block_idx_y[i]];
  2002.             }
  2003.             x264_mb_analyse_intra_chroma( h, a );
  2004.             break;
  2005.         case I_8x8:
  2006.             for( i = 0; i < 4; i++ )
  2007.                 x264_macroblock_cache_intra8x8_pred( h, 2*(i&1), 2*(i>>1),
  2008.                     a->i_predict8x8[i&1][i>>1] );
  2009.             x264_mb_analyse_intra_chroma( h, a );
  2010.             break;
  2011.         case I_16x16:
  2012.             h->mb.i_intra16x16_pred_mode = a->i_predict16x16;
  2013.             x264_mb_analyse_intra_chroma( h, a );
  2014.             break;
  2015.         case P_L0:
  2016.             switch( h->mb.i_partition )
  2017.             {
  2018.                 case D_16x16:
  2019.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.me16x16.i_ref );
  2020.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv[0], a->l0.me16x16.mv[1] );
  2021.                     break;
  2022.                 case D_16x8:
  2023.                     x264_macroblock_cache_ref( h, 0, 0, 4, 2, 0, a->l0.me16x8[0].i_ref );
  2024.                     x264_macroblock_cache_ref( h, 0, 2, 4, 2, 0, a->l0.me16x8[1].i_ref );
  2025.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 2, 0, a->l0.me16x8[0].mv[0], a->l0.me16x8[0].mv[1] );
  2026.                     x264_macroblock_cache_mv ( h, 0, 2, 4, 2, 0, a->l0.me16x8[1].mv[0], a->l0.me16x8[1].mv[1] );
  2027.                     break;
  2028.                 case D_8x16:
  2029.                     x264_macroblock_cache_ref( h, 0, 0, 2, 4, 0, a->l0.me8x16[0].i_ref );
  2030.                     x264_macroblock_cache_ref( h, 2, 0, 2, 4, 0, a->l0.me8x16[1].i_ref );
  2031.                     x264_macroblock_cache_mv ( h, 0, 0, 2, 4, 0, a->l0.me8x16[0].mv[0], a->l0.me8x16[0].mv[1] );
  2032.                     x264_macroblock_cache_mv ( h, 2, 0, 2, 4, 0, a->l0.me8x16[1].mv[0], a->l0.me8x16[1].mv[1] );
  2033.                     break;
  2034.                 default:
  2035.                     x264_log( h, X264_LOG_ERROR, "internal error P_L0 and partition=%dn", h->mb.i_partition );
  2036.                     break;
  2037.             }
  2038.             break;
  2039.         case P_8x8:
  2040.             x264_macroblock_cache_ref( h, 0, 0, 2, 2, 0, a->l0.me8x8[0].i_ref );
  2041.             x264_macroblock_cache_ref( h, 2, 0, 2, 2, 0, a->l0.me8x8[1].i_ref );
  2042.             x264_macroblock_cache_ref( h, 0, 2, 2, 2, 0, a->l0.me8x8[2].i_ref );
  2043.             x264_macroblock_cache_ref( h, 2, 2, 2, 2, 0, a->l0.me8x8[3].i_ref );
  2044.             for( i = 0; i < 4; i++ )
  2045.                 x264_mb_cache_mv_p8x8( h, a, i );
  2046.             break;
  2047.         case P_SKIP:
  2048.         {
  2049.             int mvp[2];
  2050.             x264_mb_predict_mv_pskip( h, mvp );
  2051.             /* */
  2052.             h->mb.i_partition = D_16x16;
  2053.             x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, 0 );
  2054.             x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 0, mvp[0], mvp[1] );
  2055.             break;
  2056.         }
  2057.         case B_SKIP:
  2058.         case B_DIRECT:
  2059.             x264_mb_load_mv_direct8x8( h, 0 );
  2060.             x264_mb_load_mv_direct8x8( h, 1 );
  2061.             x264_mb_load_mv_direct8x8( h, 2 );
  2062.             x264_mb_load_mv_direct8x8( h, 3 );
  2063.             break;
  2064.         case B_8x8:
  2065.             /* optimize: cache might not need to be rewritten */
  2066.             for( i = 0; i < 4; i++ )
  2067.                 x264_mb_cache_mv_b8x8( h, a, i, 1 );
  2068.             break;
  2069.         default: /* the rest of the B types */
  2070.             switch( h->mb.i_partition )
  2071.             {
  2072.             case D_16x16:
  2073.                 switch( h->mb.i_type )
  2074.                 {
  2075.                 case B_L0_L0:
  2076.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.i_ref );
  2077.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv[0], a->l0.me16x16.mv[1] );
  2078.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, -1 );
  2079.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 1,  0, 0 );
  2080.                     x264_macroblock_cache_mvd( h, 0, 0, 4, 4, 1,  0, 0 );
  2081.                     break;
  2082.                 case B_L1_L1:
  2083.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, -1 );
  2084.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 0,  0, 0 );
  2085.                     x264_macroblock_cache_mvd( h, 0, 0, 4, 4, 0,  0, 0 );
  2086.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, a->l1.i_ref );
  2087.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 1, a->l1.me16x16.mv[0], a->l1.me16x16.mv[1] );
  2088.                     break;
  2089.                 case B_BI_BI:
  2090.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.i_ref );
  2091.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 0, a->l0.me16x16.mv[0], a->l0.me16x16.mv[1] );
  2092.                     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, a->l1.i_ref );
  2093.                     x264_macroblock_cache_mv ( h, 0, 0, 4, 4, 1, a->l1.me16x16.mv[0], a->l1.me16x16.mv[1] );
  2094.                     break;
  2095.                 }
  2096.                 break;
  2097.             case D_16x8:
  2098.                 x264_mb_cache_mv_b16x8( h, a, 0, 1 );
  2099.                 x264_mb_cache_mv_b16x8( h, a, 1, 1 );
  2100.                 break;
  2101.             case D_8x16:
  2102.                 x264_mb_cache_mv_b8x16( h, a, 0, 1 );
  2103.                 x264_mb_cache_mv_b8x16( h, a, 1, 1 );
  2104.                 break;
  2105.             default:
  2106.                 x264_log( h, X264_LOG_ERROR, "internal error (invalid MB type)n" );
  2107.                 break;
  2108.             }
  2109.     }
  2110. }
  2111. #include "slicetype_decision.c"