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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * macroblock.c: h264 encoder library
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: macroblock.c,v 1.1 2004/06/03 19:27:06 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include "common.h"
  26. static const int dequant_mf[6][4][4] =
  27. {
  28.     { {10, 13, 10, 13}, {13, 16, 13, 16}, {10, 13, 10, 13}, {13, 16, 13, 16} },
  29.     { {11, 14, 11, 14}, {14, 18, 14, 18}, {11, 14, 11, 14}, {14, 18, 14, 18} },
  30.     { {13, 16, 13, 16}, {16, 20, 16, 20}, {13, 16, 13, 16}, {16, 20, 16, 20} },
  31.     { {14, 18, 14, 18}, {18, 23, 18, 23}, {14, 18, 14, 18}, {18, 23, 18, 23} },
  32.     { {16, 20, 16, 20}, {20, 25, 20, 25}, {16, 20, 16, 20}, {20, 25, 20, 25} },
  33.     { {18, 23, 18, 23}, {23, 29, 23, 29}, {18, 23, 18, 23}, {23, 29, 23, 29} }
  34. };
  35. int x264_mb_predict_intra4x4_mode( x264_t *h, int idx )
  36. {
  37.     const int ma = h->mb.cache.intra4x4_pred_mode[x264_scan8[idx] - 1];
  38.     const int mb = h->mb.cache.intra4x4_pred_mode[x264_scan8[idx] - 8];
  39.     const int m  = X264_MIN( x264_mb_pred_mode4x4_fix(ma),
  40.                              x264_mb_pred_mode4x4_fix(mb) );
  41.     if( m < 0 )
  42.         return I_PRED_4x4_DC;
  43.     return m;
  44. }
  45. int x264_mb_predict_non_zero_code( x264_t *h, int idx )
  46. {
  47.     const int za = h->mb.cache.non_zero_count[x264_scan8[idx] - 1];
  48.     const int zb = h->mb.cache.non_zero_count[x264_scan8[idx] - 8];
  49.     int i_ret = za + zb;
  50.     if( i_ret < 0x80 )
  51.     {
  52.         i_ret = ( i_ret + 1 ) >> 1;
  53.     }
  54.     return i_ret & 0x7f;
  55. }
  56. int x264_mb_transform_8x8_allowed( x264_t *h )
  57. {
  58.     if( IS_SKIP( h->mb.i_type ) )
  59.         return 0;
  60.     if( h->mb.i_type == P_8x8 || h->mb.i_type == B_8x8 )
  61.     {
  62.         int i;
  63.         for( i = 0; i < 4; i++ )
  64.             if( !IS_SUB8x8(h->mb.i_sub_partition[i])
  65.                 || ( h->mb.i_sub_partition[i] == D_DIRECT_8x8 && !h->sps->b_direct8x8_inference ) )
  66.             {
  67.                 return 0;
  68.             }
  69.     }
  70.     if( h->mb.i_type == B_DIRECT && !h->sps->b_direct8x8_inference )
  71.         return 0;
  72.     return 1;
  73. }
  74. void x264_mb_predict_mv( x264_t *h, int i_list, int idx, int i_width, int mvp[2] )
  75. {
  76.     const int i8 = x264_scan8[idx];
  77.     const int i_ref= h->mb.cache.ref[i_list][i8];
  78.     int     i_refa = h->mb.cache.ref[i_list][i8 - 1];
  79.     int16_t *mv_a  = h->mb.cache.mv[i_list][i8 - 1];
  80.     int     i_refb = h->mb.cache.ref[i_list][i8 - 8];
  81.     int16_t *mv_b  = h->mb.cache.mv[i_list][i8 - 8];
  82.     int     i_refc = h->mb.cache.ref[i_list][i8 - 8 + i_width ];
  83.     int16_t *mv_c  = h->mb.cache.mv[i_list][i8 - 8 + i_width];
  84.     int i_count;
  85.     if( (idx&0x03) == 3 || ( i_width == 2 && (idx&0x3) == 2 )|| i_refc == -2 )
  86.     {
  87.         i_refc = h->mb.cache.ref[i_list][i8 - 8 - 1];
  88.         mv_c   = h->mb.cache.mv[i_list][i8 - 8 - 1];
  89.     }
  90.     if( h->mb.i_partition == D_16x8 )
  91.     {
  92.         if( idx == 0 && i_refb == i_ref )
  93.         {
  94.             mvp[0] = mv_b[0];
  95.             mvp[1] = mv_b[1];
  96.             return;
  97.         }
  98.         else if( idx != 0 && i_refa == i_ref )
  99.         {
  100.             mvp[0] = mv_a[0];
  101.             mvp[1] = mv_a[1];
  102.             return;
  103.         }
  104.     }
  105.     else if( h->mb.i_partition == D_8x16 )
  106.     {
  107.         if( idx == 0 && i_refa == i_ref )
  108.         {
  109.             mvp[0] = mv_a[0];
  110.             mvp[1] = mv_a[1];
  111.             return;
  112.         }
  113.         else if( idx != 0 && i_refc == i_ref )
  114.         {
  115.             mvp[0] = mv_c[0];
  116.             mvp[1] = mv_c[1];
  117.             return;
  118.         }
  119.     }
  120.     i_count = 0;
  121.     if( i_refa == i_ref ) i_count++;
  122.     if( i_refb == i_ref ) i_count++;
  123.     if( i_refc == i_ref ) i_count++;
  124.     if( i_count > 1 )
  125.     {
  126.         mvp[0] = x264_median( mv_a[0], mv_b[0], mv_c[0] );
  127.         mvp[1] = x264_median( mv_a[1], mv_b[1], mv_c[1] );
  128.     }
  129.     else if( i_count == 1 )
  130.     {
  131.         if( i_refa == i_ref )
  132.         {
  133.             mvp[0] = mv_a[0];
  134.             mvp[1] = mv_a[1];
  135.         }
  136.         else if( i_refb == i_ref )
  137.         {
  138.             mvp[0] = mv_b[0];
  139.             mvp[1] = mv_b[1];
  140.         }
  141.         else
  142.         {
  143.             mvp[0] = mv_c[0];
  144.             mvp[1] = mv_c[1];
  145.         }
  146.     }
  147.     else if( i_refb == -2 && i_refc == -2 && i_refa != -2 )
  148.     {
  149.         mvp[0] = mv_a[0];
  150.         mvp[1] = mv_a[1];
  151.     }
  152.     else
  153.     {
  154.         mvp[0] = x264_median( mv_a[0], mv_b[0], mv_c[0] );
  155.         mvp[1] = x264_median( mv_a[1], mv_b[1], mv_c[1] );
  156.     }
  157. }
  158. void x264_mb_predict_mv_16x16( x264_t *h, int i_list, int i_ref, int mvp[2] )
  159. {
  160.     int     i_refa = h->mb.cache.ref[i_list][X264_SCAN8_0 - 1];
  161.     int16_t *mv_a  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 1];
  162.     int     i_refb = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8];
  163.     int16_t *mv_b  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8];
  164.     int     i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 + 4];
  165.     int16_t *mv_c  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8 + 4];
  166.     int i_count;
  167.     if( i_refc == -2 )
  168.     {
  169.         i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 - 1];
  170.         mv_c   = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8 - 1];
  171.     }
  172.     i_count = 0;
  173.     if( i_refa == i_ref ) i_count++;
  174.     if( i_refb == i_ref ) i_count++;
  175.     if( i_refc == i_ref ) i_count++;
  176.     if( i_count > 1 )
  177.     {
  178.         mvp[0] = x264_median( mv_a[0], mv_b[0], mv_c[0] );
  179.         mvp[1] = x264_median( mv_a[1], mv_b[1], mv_c[1] );
  180.     }
  181.     else if( i_count == 1 )
  182.     {
  183.         if( i_refa == i_ref )
  184.         {
  185.             mvp[0] = mv_a[0];
  186.             mvp[1] = mv_a[1];
  187.         }
  188.         else if( i_refb == i_ref )
  189.         {
  190.             mvp[0] = mv_b[0];
  191.             mvp[1] = mv_b[1];
  192.         }
  193.         else
  194.         {
  195.             mvp[0] = mv_c[0];
  196.             mvp[1] = mv_c[1];
  197.         }
  198.     }
  199.     else if( i_refb == -2 && i_refc == -2 && i_refa != -2 )
  200.     {
  201.         mvp[0] = mv_a[0];
  202.         mvp[1] = mv_a[1];
  203.     }
  204.     else
  205.     {
  206.         mvp[0] = x264_median( mv_a[0], mv_b[0], mv_c[0] );
  207.         mvp[1] = x264_median( mv_a[1], mv_b[1], mv_c[1] );
  208.     }
  209. }
  210. void x264_mb_predict_mv_pskip( x264_t *h, int mv[2] )
  211. {
  212.     int     i_refa = h->mb.cache.ref[0][X264_SCAN8_0 - 1];
  213.     int     i_refb = h->mb.cache.ref[0][X264_SCAN8_0 - 8];
  214.     int16_t *mv_a  = h->mb.cache.mv[0][X264_SCAN8_0 - 1];
  215.     int16_t *mv_b  = h->mb.cache.mv[0][X264_SCAN8_0 - 8];
  216.     if( i_refa == -2 || i_refb == -2 ||
  217.         ( i_refa == 0 && mv_a[0] == 0 && mv_a[1] == 0 ) ||
  218.         ( i_refb == 0 && mv_b[0] == 0 && mv_b[1] == 0 ) )
  219.     {
  220.         mv[0] = mv[1] = 0;
  221.     }
  222.     else
  223.     {
  224.         x264_mb_predict_mv_16x16( h, 0, 0, mv );
  225.     }
  226. }
  227. static int x264_mb_predict_mv_direct16x16_temporal( x264_t *h )
  228. {
  229.     int i_mb_4x4 = 16 * h->mb.i_mb_stride * h->mb.i_mb_y + 4 * h->mb.i_mb_x;
  230.     int i_mb_8x8 =  4 * h->mb.i_mb_stride * h->mb.i_mb_y + 2 * h->mb.i_mb_x;
  231.     int i8, i4;
  232.     int b8x8;
  233.     const int type_col = h->fref1[0]->mb_type[ h->mb.i_mb_xy ];
  234.     
  235.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, 0 );
  236.     
  237.     if( IS_INTRA( type_col ) )
  238.     {
  239.         x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, 0 );
  240.         x264_macroblock_cache_mv(  h, 0, 0, 4, 4, 0, 0, 0 );
  241.         x264_macroblock_cache_mv(  h, 0, 0, 4, 4, 1, 0, 0 );
  242.         return 1;
  243.     }
  244.     b8x8 = h->sps->b_direct8x8_inference ||
  245.            (type_col != P_8x8 && type_col != B_SKIP && type_col != B_DIRECT && type_col != B_8x8);
  246.     for( i8 = 0; i8 < 4; i8++ )
  247.     {
  248.         const int x8 = i8%2;
  249.         const int y8 = i8/2;
  250.         const int i_part_8x8 = i_mb_8x8 + x8 + y8 * h->mb.i_b8_stride;
  251.         const int i_ref = h->mb.map_col_to_list0[ h->fref1[0]->ref[0][ i_part_8x8 ] ];
  252.         if( i_ref >= 0 )
  253.         {
  254.             const int dist_scale_factor = h->mb.dist_scale_factor[i_ref][0];
  255.             x264_macroblock_cache_ref( h, 2*x8, 2*y8, 2, 2, 0, i_ref );
  256.             if( b8x8 )
  257.             {
  258.                 const int16_t *mv_col = h->fref1[0]->mv[0][ i_mb_4x4 + 3*x8 + 3*y8 * h->mb.i_b4_stride];
  259.                 int mv_l0[2];
  260.                 mv_l0[0] = ( dist_scale_factor * mv_col[0] + 128 ) >> 8;
  261.                 mv_l0[1] = ( dist_scale_factor * mv_col[1] + 128 ) >> 8;
  262.                 x264_macroblock_cache_mv( h, 2*x8, 2*y8, 2, 2, 0, mv_l0[0], mv_l0[1] );
  263.                 x264_macroblock_cache_mv( h, 2*x8, 2*y8, 2, 2, 1, mv_l0[0] - mv_col[0], mv_l0[1] - mv_col[1] );
  264.             }
  265.             else
  266.             {
  267.                 for( i4 = 0; i4 < 4; i4++ )
  268.                 {
  269.                     const int x4 = i4%2 + 2*x8;
  270.                     const int y4 = i4/2 + 2*y8;
  271.                     const int16_t *mv_col = h->fref1[0]->mv[0][ i_mb_4x4 + x4 + y4 * h->mb.i_b4_stride ];
  272.                     int mv_l0[2];
  273.                     mv_l0[0] = ( dist_scale_factor * mv_col[0] + 128 ) >> 8;
  274.                     mv_l0[1] = ( dist_scale_factor * mv_col[1] + 128 ) >> 8;
  275.                     x264_macroblock_cache_mv( h, x4, y4, 1, 1, 0, mv_l0[0], mv_l0[1] );
  276.                     x264_macroblock_cache_mv( h, x4, y4, 1, 1, 1, mv_l0[0] - mv_col[0], mv_l0[1] - mv_col[1] );
  277.                 }
  278.             }
  279.         }
  280.         else
  281.         {
  282.             /* the colocated ref isn't in the current list0 */
  283.             /* FIXME: we might still be able to use direct_8x8 on some partitions */
  284.             /* FIXME: with B-pyramid + extensive ref list reordering
  285.              *   (not currently used), we would also have to check
  286.              *   l1mv1 like in spatial mode */
  287.             return 0;
  288.         }
  289.     }
  290.     return 1;
  291. }
  292. static int x264_mb_predict_mv_direct16x16_spatial( x264_t *h )
  293. {
  294.     int ref[2];
  295.     int mv[2][2];
  296.     int i_list;
  297.     int i8, i4;
  298.     int b8x8;
  299.     const int8_t *l1ref0 = &h->fref1[0]->ref[0][ h->mb.i_b8_xy ];
  300.     const int8_t *l1ref1 = &h->fref1[0]->ref[1][ h->mb.i_b8_xy ];
  301.     const int16_t (*l1mv0)[2] = (const int16_t (*)[2]) &h->fref1[0]->mv[0][ h->mb.i_b4_xy ];
  302.     const int16_t (*l1mv1)[2] = (const int16_t (*)[2]) &h->fref1[0]->mv[1][ h->mb.i_b4_xy ];
  303.     const int type_col = h->fref1[0]->mb_type[ h->mb.i_mb_xy ];
  304.     for( i_list=0; i_list<2; i_list++ )
  305.     {
  306.         int i_refa = h->mb.cache.ref[i_list][X264_SCAN8_0 - 1];
  307.         int i_refb = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8];
  308.         int i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 + 4];
  309.         if( i_refc == -2 )
  310.             i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 - 1];
  311.         ref[i_list] = i_refa;
  312.         if( ref[i_list] < 0 || ( i_refb < ref[i_list] && i_refb >= 0 ))
  313.             ref[i_list] = i_refb;
  314.         if( ref[i_list] < 0 || ( i_refc < ref[i_list] && i_refc >= 0 ))
  315.             ref[i_list] = i_refc;
  316.         if( ref[i_list] < 0 )
  317.             ref[i_list] = -1;
  318.     }
  319.     if( ref[0] < 0 && ref[1] < 0 )
  320.     {
  321.         ref[0] = 
  322.         ref[1] = 0;
  323.         mv[0][0] = 
  324.         mv[0][1] = 
  325.         mv[1][0] = 
  326.         mv[1][1] = 0;
  327.     }
  328.     else
  329.     {
  330.         for( i_list=0; i_list<2; i_list++ )
  331.         {
  332.             if( ref[i_list] >= 0 )
  333.                 x264_mb_predict_mv_16x16( h, i_list, ref[i_list], mv[i_list] );
  334.             else
  335.                 mv[i_list][0] = mv[i_list][1] = 0;
  336.         }
  337.     }
  338.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, ref[0] );
  339.     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 1, ref[1] );
  340.     x264_macroblock_cache_mv(  h, 0, 0, 4, 4, 0, mv[0][0], mv[0][1] );
  341.     x264_macroblock_cache_mv(  h, 0, 0, 4, 4, 1, mv[1][0], mv[1][1] );
  342.     if( IS_INTRA( type_col ) )
  343.         return 1;
  344.     b8x8 = h->sps->b_direct8x8_inference ||
  345.            (type_col != P_8x8 && type_col != B_SKIP && type_col != B_DIRECT && type_col != B_8x8);
  346.     /* col_zero_flag */
  347.     for( i8=0; i8<4; i8++ )
  348.     {
  349.         const int x8 = i8%2;
  350.         const int y8 = i8/2;
  351.         const int o8 = x8 + y8 * h->mb.i_b8_stride;
  352.         if( l1ref0[o8] == 0 || ( l1ref0[o8] < 0 && l1ref1[o8] == 0 ) )
  353.         {
  354.             const int16_t (*l1mv)[2] = (l1ref0[o8] == 0) ? l1mv0 : l1mv1;
  355.             if( b8x8 )
  356.             {
  357.                 const int16_t *mvcol = l1mv[3*x8 + 3*y8 * h->mb.i_b4_stride];
  358.                 if( abs( mvcol[0] ) <= 1 && abs( mvcol[1] ) <= 1 )
  359.                 {
  360.                     if( ref[0] == 0 )
  361.                         x264_macroblock_cache_mv( h, 2*x8, 2*y8, 2, 2, 0, 0, 0 );
  362.                     if( ref[1] == 0 )
  363.                         x264_macroblock_cache_mv( h, 2*x8, 2*y8, 2, 2, 1, 0, 0 );
  364.                 }
  365.             }
  366.             else
  367.             {
  368.                 for( i4=0; i4<4; i4++ )
  369.                 {
  370.                     const int x4 = i4%2 + 2*x8;
  371.                     const int y4 = i4/2 + 2*y8;
  372.                     const int16_t *mvcol = l1mv[x4 + y4 * h->mb.i_b4_stride];
  373.                     if( abs( mvcol[0] ) <= 1 && abs( mvcol[1] ) <= 1 )
  374.                     {
  375.                         if( ref[0] == 0 )
  376.                             x264_macroblock_cache_mv( h, x4, y4, 1, 1, 0, 0, 0 );
  377.                         if( ref[1] == 0 )
  378.                             x264_macroblock_cache_mv( h, x4, y4, 1, 1, 1, 0, 0 );
  379.                     }
  380.                 }
  381.             }
  382.         }
  383.     }
  384.     return 1;
  385. }
  386. int x264_mb_predict_mv_direct16x16( x264_t *h, int *b_changed )
  387. {
  388.     int b_available;
  389.     if( h->param.analyse.i_direct_mv_pred == X264_DIRECT_PRED_NONE )
  390.         return 0;
  391.     else if( h->sh.b_direct_spatial_mv_pred )
  392.         b_available = x264_mb_predict_mv_direct16x16_spatial( h );
  393.     else
  394.         b_available = x264_mb_predict_mv_direct16x16_temporal( h );
  395.     if( b_changed != NULL && b_available )
  396.     {
  397.         int type_col = h->fref1[0]->mb_type[ h->mb.i_mb_xy ];
  398.         if( IS_INTRA(type_col) || type_col == P_SKIP )
  399.         {
  400.             *b_changed = h->mb.cache.direct_ref[0][0] != h->mb.cache.ref[0][X264_SCAN8_0]
  401.                       || h->mb.cache.direct_ref[1][0] != h->mb.cache.ref[1][X264_SCAN8_0]
  402.                       || *(uint32_t*)h->mb.cache.direct_mv[0][X264_SCAN8_0] != *(uint32_t*)h->mb.cache.mv[0][X264_SCAN8_0]
  403.                       || *(uint32_t*)h->mb.cache.direct_mv[1][X264_SCAN8_0] != *(uint32_t*)h->mb.cache.mv[1][X264_SCAN8_0];
  404.         }
  405.         else
  406.         {
  407.             int i, l;
  408.             *b_changed = 0;
  409.             for( l = 0; l < 2; l++ )
  410.                 for( i = 0; i < 4; i++ )
  411.                     *b_changed |= h->mb.cache.direct_ref[l][i] != h->mb.cache.ref[l][x264_scan8[i*4]];
  412.             *b_changed = *b_changed || memcmp(h->mb.cache.direct_mv, h->mb.cache.mv, sizeof(h->mb.cache.mv));
  413.         }
  414.         if( !*b_changed )
  415.             return b_available;
  416.     }
  417.     /* cache ref & mv */
  418.     if( b_available )
  419.     {
  420.         int i, l;
  421.         for( l = 0; l < 2; l++ )
  422.             for( i = 0; i < 4; i++ )
  423.                 h->mb.cache.direct_ref[l][i] = h->mb.cache.ref[l][x264_scan8[i*4]];
  424.         memcpy(h->mb.cache.direct_mv, h->mb.cache.mv, sizeof(h->mb.cache.mv));
  425.     }
  426.     return b_available;
  427. }
  428. void x264_mb_load_mv_direct8x8( x264_t *h, int idx )
  429. {
  430.     const int x = 2*(idx%2);
  431.     const int y = 2*(idx/2);
  432.     int l;
  433.     x264_macroblock_cache_ref( h, x, y, 2, 2, 0, h->mb.cache.direct_ref[0][idx] );
  434.     x264_macroblock_cache_ref( h, x, y, 2, 2, 1, h->mb.cache.direct_ref[1][idx] );
  435.     for( l = 0; l < 2; l++ )
  436.     {
  437.         *(uint64_t*)h->mb.cache.mv[l][x264_scan8[idx*4]] =
  438.         *(uint64_t*)h->mb.cache.direct_mv[l][x264_scan8[idx*4]];
  439.         *(uint64_t*)h->mb.cache.mv[l][x264_scan8[idx*4]+8] =
  440.         *(uint64_t*)h->mb.cache.direct_mv[l][x264_scan8[idx*4]+8];
  441.     }
  442. }
  443. /* This just improves encoder performance, it's not part of the spec */
  444. void x264_mb_predict_mv_ref16x16( x264_t *h, int i_list, int i_ref, int mvc[8][2], int *i_mvc )
  445. {
  446.     int16_t (*mvr)[2] = h->mb.mvr[i_list][i_ref];
  447.     int i = 0;
  448. #define SET_MVP(mvp) { 
  449.         mvc[i][0] = mvp[0]; 
  450.         mvc[i][1] = mvp[1]; 
  451.         i++; 
  452.     }
  453.     /* b_direct */
  454.     if( h->sh.i_type == SLICE_TYPE_B
  455.         && h->mb.cache.ref[i_list][x264_scan8[12]] == i_ref )
  456.     {
  457.         SET_MVP( h->mb.cache.mv[i_list][x264_scan8[12]] );
  458.     }
  459.     /* spatial predictors */
  460.     if( h->mb.i_neighbour & MB_LEFT )
  461.     {
  462.         int i_mb_l = h->mb.i_mb_xy - 1;
  463.         /* skip MBs didn't go through the whole search process, so mvr is undefined */
  464.         if( !IS_SKIP( h->mb.type[i_mb_l] ) )
  465.             SET_MVP( mvr[i_mb_l] );
  466.     }
  467.     if( h->mb.i_neighbour & MB_TOP )
  468.     {
  469.         int i_mb_t = h->mb.i_mb_xy - h->mb.i_mb_stride;
  470.         if( !IS_SKIP( h->mb.type[i_mb_t] ) )
  471.             SET_MVP( mvr[i_mb_t] );
  472.         if( h->mb.i_neighbour & MB_TOPLEFT && !IS_SKIP( h->mb.type[i_mb_t - 1] ) )
  473.             SET_MVP( mvr[i_mb_t-1] );
  474.         if( h->mb.i_mb_x < h->mb.i_mb_stride - 1 && !IS_SKIP( h->mb.type[i_mb_t + 1] ) )
  475.             SET_MVP( mvr[i_mb_t+1] );
  476.     }
  477. #undef SET_MVP
  478.     /* temporal predictors */
  479.     if( h->fref0[0]->i_ref[0] > 0 )
  480.     {
  481.         x264_frame_t *l0 = h->fref0[0];
  482.         int ref_col_cur, ref_col_prev = -1;
  483.         int scale = 0;
  484. #define SET_TMVP(dx, dy) { 
  485.             int i_b4 = h->mb.i_b4_xy + dx*4 + dy*4*h->mb.i_b4_stride; 
  486.             int i_b8 = h->mb.i_b8_xy + dx*2 + dy*2*h->mb.i_b8_stride; 
  487.             ref_col_cur = l0->ref[0][i_b8]; 
  488.             if( ref_col_cur >= 0 ) 
  489.             { 
  490.                 /* TODO: calc once per frame and tablize? */
  491.                 if( ref_col_cur != ref_col_prev ) 
  492.                     scale = 256 * (h->fenc->i_poc - h->fref0[i_ref]->i_poc) 
  493.                                 / (l0->i_poc - l0->ref_poc[0][ref_col_cur]); 
  494.                 mvc[i][0] = l0->mv[0][i_b4][0] * scale / 256; 
  495.                 mvc[i][1] = l0->mv[0][i_b4][1] * scale / 256; 
  496.                 i++; 
  497.                 ref_col_prev = ref_col_cur; 
  498.             } 
  499.         }
  500.         SET_TMVP(0,0);
  501.         if( h->mb.i_mb_x < h->sps->i_mb_width-1 )
  502.             SET_TMVP(1,0);
  503.         if( h->mb.i_mb_y < h->sps->i_mb_height-1 )
  504.             SET_TMVP(0,1);
  505. #undef SET_TMVP
  506.     }
  507.     *i_mvc = i;
  508. }
  509. static inline void x264_mb_mc_0xywh( x264_t *h, int x, int y, int width, int height )
  510. {
  511.     const int i8 = x264_scan8[0]+x+8*y;
  512.     const int i_ref = h->mb.cache.ref[0][i8];
  513.     const int mvx   = x264_clip3( h->mb.cache.mv[0][i8][0], h->mb.mv_min[0], h->mb.mv_max[0] );
  514.     const int mvy   = x264_clip3( h->mb.cache.mv[0][i8][1], h->mb.mv_min[1], h->mb.mv_max[1] );
  515.     h->mc.mc_luma( h->mb.pic.p_fref[0][i_ref], h->mb.pic.i_stride[0],
  516.                     &h->mb.pic.p_fdec[0][4*y*FDEC_STRIDE+4*x], FDEC_STRIDE,
  517.                     mvx + 4*4*x, mvy + 4*4*y, 4*width, 4*height );
  518.     h->mc.mc_chroma( &h->mb.pic.p_fref[0][i_ref][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1],
  519.                       &h->mb.pic.p_fdec[1][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE,
  520.                       mvx, mvy, 2*width, 2*height );
  521.     h->mc.mc_chroma( &h->mb.pic.p_fref[0][i_ref][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2],
  522.                       &h->mb.pic.p_fdec[2][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE,
  523.                       mvx, mvy, 2*width, 2*height );
  524. }
  525. static inline void x264_mb_mc_1xywh( x264_t *h, int x, int y, int width, int height )
  526. {
  527.     const int i8 = x264_scan8[0]+x+8*y;
  528.     const int i_ref = h->mb.cache.ref[1][i8];
  529.     const int mvx   = x264_clip3( h->mb.cache.mv[1][i8][0], h->mb.mv_min[0], h->mb.mv_max[0] );
  530.     const int mvy   = x264_clip3( h->mb.cache.mv[1][i8][1], h->mb.mv_min[1], h->mb.mv_max[1] );
  531.     h->mc.mc_luma( h->mb.pic.p_fref[1][i_ref], h->mb.pic.i_stride[0],
  532.                     &h->mb.pic.p_fdec[0][4*y*FDEC_STRIDE+4*x], FDEC_STRIDE,
  533.                     mvx + 4*4*x, mvy + 4*4*y, 4*width, 4*height );
  534.     h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1],
  535.                       &h->mb.pic.p_fdec[1][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE,
  536.                       mvx, mvy, 2*width, 2*height );
  537.     h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2],
  538.                       &h->mb.pic.p_fdec[2][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE,
  539.                       mvx, mvy, 2*width, 2*height );
  540. }
  541. static inline void x264_mb_mc_01xywh( x264_t *h, int x, int y, int width, int height )
  542. {
  543.     const int i8 = x264_scan8[0]+x+8*y;
  544.     const int i_ref1 = h->mb.cache.ref[1][i8];
  545.     const int mvx1   = x264_clip3( h->mb.cache.mv[1][i8][0], h->mb.mv_min[0], h->mb.mv_max[0] );
  546.     const int mvy1   = x264_clip3( h->mb.cache.mv[1][i8][1], h->mb.mv_min[1], h->mb.mv_max[1] );
  547.     DECLARE_ALIGNED( uint8_t, tmp[16*16], 16 );
  548.     int i_mode = x264_size2pixel[height][width];
  549.     x264_mb_mc_0xywh( h, x, y, width, height );
  550.     h->mc.mc_luma( h->mb.pic.p_fref[1][i_ref1], h->mb.pic.i_stride[0],
  551.                     tmp, 16, mvx1 + 4*4*x, mvy1 + 4*4*y, 4*width, 4*height );
  552.     if( h->param.analyse.b_weighted_bipred )
  553.     {
  554.         const int i_ref0 = h->mb.cache.ref[0][i8];
  555.         const int weight = h->mb.bipred_weight[i_ref0][i_ref1];
  556.         h->mc.avg_weight[i_mode]( &h->mb.pic.p_fdec[0][4*y*FDEC_STRIDE+4*x], FDEC_STRIDE, tmp, 16, weight );
  557.         h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1],
  558.                           tmp, 16, mvx1, mvy1, 2*width, 2*height );
  559.         h->mc.avg_weight[i_mode+3]( &h->mb.pic.p_fdec[1][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE, tmp, 16, weight );
  560.         h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2],
  561.                           tmp, 16, mvx1, mvy1, 2*width, 2*height );
  562.         h->mc.avg_weight[i_mode+3]( &h->mb.pic.p_fdec[2][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE, tmp, 16, weight );
  563.     }
  564.     else
  565.     {
  566.         h->mc.avg[i_mode]( &h->mb.pic.p_fdec[0][4*y*FDEC_STRIDE+4*x], FDEC_STRIDE, tmp, 16 );
  567.         h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][4][2*y*h->mb.pic.i_stride[1]+2*x], h->mb.pic.i_stride[1],
  568.                           tmp, 16, mvx1, mvy1, 2*width, 2*height );
  569.         h->mc.avg[i_mode+3]( &h->mb.pic.p_fdec[1][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE, tmp, 16 );
  570.         h->mc.mc_chroma( &h->mb.pic.p_fref[1][i_ref1][5][2*y*h->mb.pic.i_stride[2]+2*x], h->mb.pic.i_stride[2],
  571.                           tmp, 16, mvx1, mvy1, 2*width, 2*height );
  572.         h->mc.avg[i_mode+3]( &h->mb.pic.p_fdec[2][2*y*FDEC_STRIDE+2*x], FDEC_STRIDE, tmp, 16 );
  573.     }
  574. }
  575. static void x264_mb_mc_direct8x8( x264_t *h, int x, int y )
  576. {
  577.     const int i8 = x264_scan8[0] + x + 8*y;
  578.     /* FIXME: optimize based on current block size, not global settings? */
  579.     if( h->sps->b_direct8x8_inference )
  580.     {
  581.         if( h->mb.cache.ref[0][i8] >= 0 )
  582.             if( h->mb.cache.ref[1][i8] >= 0 )
  583.                 x264_mb_mc_01xywh( h, x, y, 2, 2 );
  584.             else
  585.                 x264_mb_mc_0xywh( h, x, y, 2, 2 );
  586.         else
  587.             x264_mb_mc_1xywh( h, x, y, 2, 2 );
  588.     }
  589.     else
  590.     {
  591.         if( h->mb.cache.ref[0][i8] >= 0 )
  592.         {
  593.             if( h->mb.cache.ref[1][i8] >= 0 )
  594.             {
  595.                 x264_mb_mc_01xywh( h, x+0, y+0, 1, 1 );
  596.                 x264_mb_mc_01xywh( h, x+1, y+0, 1, 1 );
  597.                 x264_mb_mc_01xywh( h, x+0, y+1, 1, 1 );
  598.                 x264_mb_mc_01xywh( h, x+1, y+1, 1, 1 );
  599.             }
  600.             else
  601.             {
  602.                 x264_mb_mc_0xywh( h, x+0, y+0, 1, 1 );
  603.                 x264_mb_mc_0xywh( h, x+1, y+0, 1, 1 );
  604.                 x264_mb_mc_0xywh( h, x+0, y+1, 1, 1 );
  605.                 x264_mb_mc_0xywh( h, x+1, y+1, 1, 1 );
  606.             }
  607.         }
  608.         else
  609.         {
  610.             x264_mb_mc_1xywh( h, x+0, y+0, 1, 1 );
  611.             x264_mb_mc_1xywh( h, x+1, y+0, 1, 1 );
  612.             x264_mb_mc_1xywh( h, x+0, y+1, 1, 1 );
  613.             x264_mb_mc_1xywh( h, x+1, y+1, 1, 1 );
  614.         }
  615.     }
  616. }
  617. void x264_mb_mc( x264_t *h )
  618. {
  619.     if( h->mb.i_type == P_L0 )
  620.     {
  621.         if( h->mb.i_partition == D_16x16 )
  622.         {
  623.             x264_mb_mc_0xywh( h, 0, 0, 4, 4 );
  624.         }
  625.         else if( h->mb.i_partition == D_16x8 )
  626.         {
  627.             x264_mb_mc_0xywh( h, 0, 0, 4, 2 );
  628.             x264_mb_mc_0xywh( h, 0, 2, 4, 2 );
  629.         }
  630.         else if( h->mb.i_partition == D_8x16 )
  631.         {
  632.             x264_mb_mc_0xywh( h, 0, 0, 2, 4 );
  633.             x264_mb_mc_0xywh( h, 2, 0, 2, 4 );
  634.         }
  635.     }
  636.     else if( h->mb.i_type == P_8x8 || h->mb.i_type == B_8x8 )
  637.     {
  638.         int i;
  639.         for( i = 0; i < 4; i++ )
  640.         {
  641.             const int x = 2*(i%2);
  642.             const int y = 2*(i/2);
  643.             switch( h->mb.i_sub_partition[i] )
  644.             {
  645.                 case D_L0_8x8:
  646.                     x264_mb_mc_0xywh( h, x, y, 2, 2 );
  647.                     break;
  648.                 case D_L0_8x4:
  649.                     x264_mb_mc_0xywh( h, x, y+0, 2, 1 );
  650.                     x264_mb_mc_0xywh( h, x, y+1, 2, 1 );
  651.                     break;
  652.                 case D_L0_4x8:
  653.                     x264_mb_mc_0xywh( h, x+0, y, 1, 2 );
  654.                     x264_mb_mc_0xywh( h, x+1, y, 1, 2 );
  655.                     break;
  656.                 case D_L0_4x4:
  657.                     x264_mb_mc_0xywh( h, x+0, y+0, 1, 1 );
  658.                     x264_mb_mc_0xywh( h, x+1, y+0, 1, 1 );
  659.                     x264_mb_mc_0xywh( h, x+0, y+1, 1, 1 );
  660.                     x264_mb_mc_0xywh( h, x+1, y+1, 1, 1 );
  661.                     break;
  662.                 case D_L1_8x8:
  663.                     x264_mb_mc_1xywh( h, x, y, 2, 2 );
  664.                     break;
  665.                 case D_L1_8x4:
  666.                     x264_mb_mc_1xywh( h, x, y+0, 2, 1 );
  667.                     x264_mb_mc_1xywh( h, x, y+1, 2, 1 );
  668.                     break;
  669.                 case D_L1_4x8:
  670.                     x264_mb_mc_1xywh( h, x+0, y, 1, 2 );
  671.                     x264_mb_mc_1xywh( h, x+1, y, 1, 2 );
  672.                     break;
  673.                 case D_L1_4x4:
  674.                     x264_mb_mc_1xywh( h, x+0, y+0, 1, 1 );
  675.                     x264_mb_mc_1xywh( h, x+1, y+0, 1, 1 );
  676.                     x264_mb_mc_1xywh( h, x+0, y+1, 1, 1 );
  677.                     x264_mb_mc_1xywh( h, x+1, y+1, 1, 1 );
  678.                     break;
  679.                 case D_BI_8x8:
  680.                     x264_mb_mc_01xywh( h, x, y, 2, 2 );
  681.                     break;
  682.                 case D_BI_8x4:
  683.                     x264_mb_mc_01xywh( h, x, y+0, 2, 1 );
  684.                     x264_mb_mc_01xywh( h, x, y+1, 2, 1 );
  685.                     break;
  686.                 case D_BI_4x8:
  687.                     x264_mb_mc_01xywh( h, x+0, y, 1, 2 );
  688.                     x264_mb_mc_01xywh( h, x+1, y, 1, 2 );
  689.                     break;
  690.                 case D_BI_4x4:
  691.                     x264_mb_mc_01xywh( h, x+0, y+0, 1, 1 );
  692.                     x264_mb_mc_01xywh( h, x+1, y+0, 1, 1 );
  693.                     x264_mb_mc_01xywh( h, x+0, y+1, 1, 1 );
  694.                     x264_mb_mc_01xywh( h, x+1, y+1, 1, 1 );
  695.                     break;
  696.                 case D_DIRECT_8x8:
  697.                     x264_mb_mc_direct8x8( h, x, y );
  698.                     break;
  699.             }
  700.         }
  701.     }
  702.     else if( h->mb.i_type == B_SKIP || h->mb.i_type == B_DIRECT )
  703.     {
  704.         x264_mb_mc_direct8x8( h, 0, 0 );
  705.         x264_mb_mc_direct8x8( h, 2, 0 );
  706.         x264_mb_mc_direct8x8( h, 0, 2 );
  707.         x264_mb_mc_direct8x8( h, 2, 2 );
  708.     }
  709.     else    /* B_*x* */
  710.     {
  711.         int b_list0[2];
  712.         int b_list1[2];
  713.         int i;
  714.         /* init ref list utilisations */
  715.         for( i = 0; i < 2; i++ )
  716.         {
  717.             b_list0[i] = x264_mb_type_list0_table[h->mb.i_type][i];
  718.             b_list1[i] = x264_mb_type_list1_table[h->mb.i_type][i];
  719.         }
  720.         if( h->mb.i_partition == D_16x16 )
  721.         {
  722.             if( b_list0[0] && b_list1[0] ) x264_mb_mc_01xywh( h, 0, 0, 4, 4 );
  723.             else if( b_list0[0] )          x264_mb_mc_0xywh ( h, 0, 0, 4, 4 );
  724.             else if( b_list1[0] )          x264_mb_mc_1xywh ( h, 0, 0, 4, 4 );
  725.         }
  726.         else if( h->mb.i_partition == D_16x8 )
  727.         {
  728.             if( b_list0[0] && b_list1[0] ) x264_mb_mc_01xywh( h, 0, 0, 4, 2 );
  729.             else if( b_list0[0] )          x264_mb_mc_0xywh ( h, 0, 0, 4, 2 );
  730.             else if( b_list1[0] )          x264_mb_mc_1xywh ( h, 0, 0, 4, 2 );
  731.             if( b_list0[1] && b_list1[1] ) x264_mb_mc_01xywh( h, 0, 2, 4, 2 );
  732.             else if( b_list0[1] )          x264_mb_mc_0xywh ( h, 0, 2, 4, 2 );
  733.             else if( b_list1[1] )          x264_mb_mc_1xywh ( h, 0, 2, 4, 2 );
  734.         }
  735.         else if( h->mb.i_partition == D_8x16 )
  736.         {
  737.             if( b_list0[0] && b_list1[0] ) x264_mb_mc_01xywh( h, 0, 0, 2, 4 );
  738.             else if( b_list0[0] )          x264_mb_mc_0xywh ( h, 0, 0, 2, 4 );
  739.             else if( b_list1[0] )          x264_mb_mc_1xywh ( h, 0, 0, 2, 4 );
  740.             if( b_list0[1] && b_list1[1] ) x264_mb_mc_01xywh( h, 2, 0, 2, 4 );
  741.             else if( b_list0[1] )          x264_mb_mc_0xywh ( h, 2, 0, 2, 4 );
  742.             else if( b_list1[1] )          x264_mb_mc_1xywh ( h, 2, 0, 2, 4 );
  743.         }
  744.     }
  745. }
  746. void x264_macroblock_cache_init( x264_t *h )
  747. {
  748.     int i, j;
  749.     int i_mb_count = h->mb.i_mb_count;
  750.     h->mb.i_mb_stride = h->sps->i_mb_width;
  751.     h->mb.i_b8_stride = h->sps->i_mb_width * 2;
  752.     h->mb.i_b4_stride = h->sps->i_mb_width * 4;
  753.     h->mb.qp  = x264_malloc( i_mb_count * sizeof(int8_t) );
  754.     h->mb.cbp = x264_malloc( i_mb_count * sizeof(int16_t) );
  755.     h->mb.skipbp = x264_malloc( i_mb_count * sizeof(int8_t) );
  756.     h->mb.mb_transform_size = x264_malloc( i_mb_count * sizeof(int8_t) );
  757.     /* 0 -> 3 top(4), 4 -> 6 : left(3) */
  758.     h->mb.intra4x4_pred_mode = x264_malloc( i_mb_count * 7 * sizeof( int8_t ) );
  759.     /* all coeffs */
  760.     h->mb.non_zero_count = x264_malloc( i_mb_count * 24 * sizeof( uint8_t ) );
  761.     if( h->param.b_cabac )
  762.     {
  763.         h->mb.chroma_pred_mode = x264_malloc( i_mb_count * sizeof( int8_t) );
  764.         h->mb.mvd[0] = x264_malloc( 2*16 * i_mb_count * sizeof( int16_t ) );
  765.         h->mb.mvd[1] = x264_malloc( 2*16 * i_mb_count * sizeof( int16_t ) );
  766.     }
  767.     for( i=0; i<2; i++ )
  768.     {
  769.         int i_refs = (i ? 1 : h->param.i_frame_reference) + h->param.b_bframe_pyramid;
  770.         for( j=0; j < i_refs && j < 16; j++ )
  771.             h->mb.mvr[i][j] = x264_malloc( 2 * i_mb_count * sizeof( int16_t ) );
  772.     }
  773.     /* init with not avaiable (for top right idx=7,15) */
  774.     memset( h->mb.cache.ref[0], -2, X264_SCAN8_SIZE * sizeof( int8_t ) );
  775.     memset( h->mb.cache.ref[1], -2, X264_SCAN8_SIZE * sizeof( int8_t ) );
  776. }
  777. void x264_macroblock_cache_end( x264_t *h )
  778. {
  779.     int i, j;
  780.     for( i=0; i<2; i++ )
  781.     {
  782.         int i_refs = i ? 1 + h->param.b_bframe_pyramid : h->param.i_frame_reference;
  783.         for( j=0; j < i_refs; j++ )
  784.             x264_free( h->mb.mvr[i][j] );
  785.     }
  786.     if( h->param.b_cabac )
  787.     {
  788.         x264_free( h->mb.chroma_pred_mode );
  789.         x264_free( h->mb.mvd[0] );
  790.         x264_free( h->mb.mvd[1] );
  791.     }
  792.     x264_free( h->mb.intra4x4_pred_mode );
  793.     x264_free( h->mb.non_zero_count );
  794.     x264_free( h->mb.mb_transform_size );
  795.     x264_free( h->mb.skipbp );
  796.     x264_free( h->mb.cbp );
  797.     x264_free( h->mb.qp );
  798. }
  799. void x264_macroblock_slice_init( x264_t *h )
  800. {
  801.     int i, j;
  802.     h->mb.mv[0] = h->fdec->mv[0];
  803.     h->mb.mv[1] = h->fdec->mv[1];
  804.     h->mb.ref[0] = h->fdec->ref[0];
  805.     h->mb.ref[1] = h->fdec->ref[1];
  806.     h->mb.type = h->fdec->mb_type;
  807.     h->fdec->i_ref[0] = h->i_ref0;
  808.     h->fdec->i_ref[1] = h->i_ref1;
  809.     for( i = 0; i < h->i_ref0; i++ )
  810.         h->fdec->ref_poc[0][i] = h->fref0[i]->i_poc;
  811.     if( h->sh.i_type == SLICE_TYPE_B )
  812.     {
  813.         for( i = 0; i < h->i_ref1; i++ )
  814.             h->fdec->ref_poc[1][i] = h->fref1[i]->i_poc;
  815.         h->mb.map_col_to_list0[-1] = -1;
  816.         h->mb.map_col_to_list0[-2] = -2;
  817.         for( i = 0; i < h->fref1[0]->i_ref[0]; i++ )
  818.         {
  819.             int poc = h->fref1[0]->ref_poc[0][i];
  820.             h->mb.map_col_to_list0[i] = -2;
  821.             for( j = 0; j < h->i_ref0; j++ )
  822.                 if( h->fref0[j]->i_poc == poc )
  823.                 {
  824.                     h->mb.map_col_to_list0[i] = j;
  825.                     break;
  826.                 }
  827.         }
  828.     }
  829.     if( h->sh.i_type == SLICE_TYPE_P )
  830.         memset( h->mb.cache.skip, 0, X264_SCAN8_SIZE * sizeof( int8_t ) );
  831. }
  832. void x264_macroblock_cache_load( x264_t *h, int i_mb_x, int i_mb_y )
  833. {
  834.     const int i_mb_4x4 = 4*(i_mb_y * h->mb.i_b4_stride + i_mb_x);
  835.     const int i_mb_8x8 = 2*(i_mb_y * h->mb.i_b8_stride + i_mb_x);
  836.     int i_mb_xy = i_mb_y * h->mb.i_mb_stride + i_mb_x;
  837.     int i_top_xy = i_mb_xy - h->mb.i_mb_stride;
  838.     int i_left_xy = -1;
  839.     int i_top_type = -1;    /* gcc warn */
  840.     int i_left_type= -1;
  841.     int i;
  842.     /* init index */
  843.     h->mb.i_mb_x = i_mb_x;
  844.     h->mb.i_mb_y = i_mb_y;
  845.     h->mb.i_mb_xy = i_mb_xy;
  846.     h->mb.i_b8_xy = i_mb_8x8;
  847.     h->mb.i_b4_xy = i_mb_4x4;
  848.     h->mb.i_neighbour = 0;
  849.     /* fdec:      fenc:
  850.      * yyyyyyy
  851.      * yYYYY      YYYY
  852.      * yYYYY      YYYY
  853.      * yYYYY      YYYY
  854.      * yYYYY      YYYY
  855.      * uuu vvv    UUVV
  856.      * uUU vVV    UUVV
  857.      * uUU vVV
  858.      */
  859.     h->mb.pic.p_fenc[0] = h->mb.pic.fenc_buf;
  860.     h->mb.pic.p_fenc[1] = h->mb.pic.fenc_buf + 16*FENC_STRIDE;
  861.     h->mb.pic.p_fenc[2] = h->mb.pic.fenc_buf + 16*FENC_STRIDE + 8;
  862.     h->mb.pic.p_fdec[0] = h->mb.pic.fdec_buf + 2*FDEC_STRIDE;
  863.     h->mb.pic.p_fdec[1] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE;
  864.     h->mb.pic.p_fdec[2] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE + 16;
  865.     /* load picture pointers */
  866.     for( i = 0; i < 3; i++ )
  867.     {
  868.         const int w = (i == 0 ? 16 : 8);
  869.         const int i_stride = h->fdec->i_stride[i];
  870.         const uint8_t *plane_fdec = &h->fdec->plane[i][ w * (i_mb_x + i_mb_y * i_stride) ];
  871.         int   j;
  872.         h->mb.pic.i_stride[i] = i_stride;
  873.         h->mc.copy[i?PIXEL_8x8:PIXEL_16x16]( h->mb.pic.p_fenc[i], FENC_STRIDE,
  874.             &h->fenc->plane[i][ w * (i_mb_x + i_mb_y * i_stride) ], i_stride, w );
  875.         memcpy( &h->mb.pic.p_fdec[i][-1-FDEC_STRIDE], &plane_fdec[-1-i_stride], w*3/2+1 );
  876.         for( j = 0; j < w; j++ )
  877.             h->mb.pic.p_fdec[i][-1+j*FDEC_STRIDE] = plane_fdec[-1+j*i_stride];
  878.         for( j = 0; j < h->i_ref0; j++ )
  879.         {
  880.             h->mb.pic.p_fref[0][j][i==0 ? 0:i+3] = &h->fref0[j]->plane[i][ w * ( i_mb_x + i_mb_y * i_stride )];
  881.             h->mb.pic.p_fref[0][j][i+1] = &h->fref0[j]->filtered[i+1][ 16 * ( i_mb_x + i_mb_y * h->fdec->i_stride[0] )];
  882.         }
  883.         for( j = 0; j < h->i_ref1; j++ )
  884.         {
  885.             h->mb.pic.p_fref[1][j][i==0 ? 0:i+3] = &h->fref1[j]->plane[i][ w * ( i_mb_x + i_mb_y * i_stride )];
  886.             h->mb.pic.p_fref[1][j][i+1] = &h->fref1[j]->filtered[i+1][ 16 * ( i_mb_x + i_mb_y * h->fdec->i_stride[0] )];
  887.         }
  888.     }
  889.     if( h->fdec->integral )
  890.     {
  891.         for( i = 0; i < h->i_ref0; i++ )
  892.             h->mb.pic.p_integral[0][i] = &h->fref0[i]->integral[ 16 * ( i_mb_x + i_mb_y * h->fdec->i_stride[0] )];
  893.         for( i = 0; i < h->i_ref1; i++ )
  894.             h->mb.pic.p_integral[1][i] = &h->fref1[i]->integral[ 16 * ( i_mb_x + i_mb_y * h->fdec->i_stride[0] )];
  895.     }
  896.     /* load cache */
  897.     if( i_mb_xy >= h->sh.i_first_mb + h->mb.i_mb_stride )
  898.     {
  899.         h->mb.i_mb_type_top =
  900.         i_top_type= h->mb.type[i_top_xy];
  901.         h->mb.i_neighbour |= MB_TOP;
  902.         /* load intra4x4 */
  903.         h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][0];
  904.         h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][1];
  905.         h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][2];
  906.         h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][3];
  907.         /* load non_zero_count */
  908.         h->mb.cache.non_zero_count[x264_scan8[0] - 8] = h->mb.non_zero_count[i_top_xy][10];
  909.         h->mb.cache.non_zero_count[x264_scan8[1] - 8] = h->mb.non_zero_count[i_top_xy][11];
  910.         h->mb.cache.non_zero_count[x264_scan8[4] - 8] = h->mb.non_zero_count[i_top_xy][14];
  911.         h->mb.cache.non_zero_count[x264_scan8[5] - 8] = h->mb.non_zero_count[i_top_xy][15];
  912.         h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] = h->mb.non_zero_count[i_top_xy][16+2];
  913.         h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] = h->mb.non_zero_count[i_top_xy][16+3];
  914.         h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] = h->mb.non_zero_count[i_top_xy][16+4+2];
  915.         h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = h->mb.non_zero_count[i_top_xy][16+4+3];
  916.     }
  917.     else
  918.     {
  919.         h->mb.i_mb_type_top = -1;
  920.         
  921.         /* load intra4x4 */
  922.         h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] =
  923.         h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] =
  924.         h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] =
  925.         h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = -1;
  926.         /* load non_zero_count */
  927.         h->mb.cache.non_zero_count[x264_scan8[0] - 8] =
  928.         h->mb.cache.non_zero_count[x264_scan8[1] - 8] =
  929.         h->mb.cache.non_zero_count[x264_scan8[4] - 8] =
  930.         h->mb.cache.non_zero_count[x264_scan8[5] - 8] =
  931.         h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] =
  932.         h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] =
  933.         h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] =
  934.         h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = 0x80;
  935.     }
  936.     if( i_mb_x > 0 && i_mb_xy > h->sh.i_first_mb )
  937.     {
  938.         i_left_xy = i_mb_xy - 1;
  939.         h->mb.i_mb_type_left =
  940.         i_left_type = h->mb.type[i_left_xy];
  941.         h->mb.i_neighbour |= MB_LEFT;
  942.         /* load intra4x4 */
  943.         h->mb.cache.intra4x4_pred_mode[x264_scan8[0 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][4];
  944.         h->mb.cache.intra4x4_pred_mode[x264_scan8[2 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][5];
  945.         h->mb.cache.intra4x4_pred_mode[x264_scan8[8 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][6];
  946.         h->mb.cache.intra4x4_pred_mode[x264_scan8[10] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][3];
  947.         /* load non_zero_count */
  948.         h->mb.cache.non_zero_count[x264_scan8[0 ] - 1] = h->mb.non_zero_count[i_left_xy][5];
  949.         h->mb.cache.non_zero_count[x264_scan8[2 ] - 1] = h->mb.non_zero_count[i_left_xy][7];
  950.         h->mb.cache.non_zero_count[x264_scan8[8 ] - 1] = h->mb.non_zero_count[i_left_xy][13];
  951.         h->mb.cache.non_zero_count[x264_scan8[10] - 1] = h->mb.non_zero_count[i_left_xy][15];
  952.         h->mb.cache.non_zero_count[x264_scan8[16+0] - 1] = h->mb.non_zero_count[i_left_xy][16+1];
  953.         h->mb.cache.non_zero_count[x264_scan8[16+2] - 1] = h->mb.non_zero_count[i_left_xy][16+3];
  954.         h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 1] = h->mb.non_zero_count[i_left_xy][16+4+1];
  955.         h->mb.cache.non_zero_count[x264_scan8[16+4+2] - 1] = h->mb.non_zero_count[i_left_xy][16+4+3];
  956.     }
  957.     else
  958.     {
  959.         h->mb.i_mb_type_left = -1;
  960.         h->mb.cache.intra4x4_pred_mode[x264_scan8[0 ] - 1] =
  961.         h->mb.cache.intra4x4_pred_mode[x264_scan8[2 ] - 1] =
  962.         h->mb.cache.intra4x4_pred_mode[x264_scan8[8 ] - 1] =
  963.         h->mb.cache.intra4x4_pred_mode[x264_scan8[10] - 1] = -1;
  964.         /* load non_zero_count */
  965.         h->mb.cache.non_zero_count[x264_scan8[0 ] - 1] =
  966.         h->mb.cache.non_zero_count[x264_scan8[2 ] - 1] =
  967.         h->mb.cache.non_zero_count[x264_scan8[8 ] - 1] =
  968.         h->mb.cache.non_zero_count[x264_scan8[10] - 1] =
  969.         h->mb.cache.non_zero_count[x264_scan8[16+0] - 1] =
  970.         h->mb.cache.non_zero_count[x264_scan8[16+2] - 1] =
  971.         h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 1] =
  972.         h->mb.cache.non_zero_count[x264_scan8[16+4+2] - 1] = 0x80;
  973.     }
  974.     if( i_mb_x < h->sps->i_mb_width - 1 && i_top_xy + 1 >= h->sh.i_first_mb )
  975.     {
  976.         h->mb.i_neighbour |= MB_TOPRIGHT;
  977.         h->mb.i_mb_type_topright = h->mb.type[ i_top_xy + 1 ];
  978.     }
  979.     else
  980.         h->mb.i_mb_type_topright = -1;
  981.     if( i_mb_x > 0 && i_top_xy - 1 >= h->sh.i_first_mb )
  982.     {
  983.         h->mb.i_neighbour |= MB_TOPLEFT;
  984.         h->mb.i_mb_type_topleft = h->mb.type[ i_top_xy - 1 ];
  985.     }
  986.     else
  987.         h->mb.i_mb_type_topleft = -1;
  988.     if( h->param.analyse.b_transform_8x8 )
  989.     {
  990.         h->mb.cache.i_neighbour_transform_size =
  991.             ( i_left_type >= 0 && h->mb.mb_transform_size[i_left_xy] )
  992.           + ( i_top_type  >= 0 && h->mb.mb_transform_size[i_top_xy]  );
  993.     }
  994.     /* load ref/mv/mvd */
  995.     if( h->sh.i_type != SLICE_TYPE_I )
  996.     {
  997.         const int s8x8 = h->mb.i_b8_stride;
  998.         const int s4x4 = h->mb.i_b4_stride;
  999.         int i_list;
  1000.         for( i_list = 0; i_list < (h->sh.i_type == SLICE_TYPE_B ? 2  : 1 ); i_list++ )
  1001.         {
  1002.             /*
  1003.             h->mb.cache.ref[i_list][x264_scan8[5 ]+1] =
  1004.             h->mb.cache.ref[i_list][x264_scan8[7 ]+1] =
  1005.             h->mb.cache.ref[i_list][x264_scan8[13]+1] = -2;
  1006.             */
  1007.             if( h->mb.i_neighbour & MB_TOPLEFT )
  1008.             {
  1009.                 const int i8 = x264_scan8[0] - 1 - 1*8;
  1010.                 const int ir = i_mb_8x8 - s8x8 - 1;
  1011.                 const int iv = i_mb_4x4 - s4x4 - 1;
  1012.                 h->mb.cache.ref[i_list][i8]  = h->mb.ref[i_list][ir];
  1013.                 h->mb.cache.mv[i_list][i8][0] = h->mb.mv[i_list][iv][0];
  1014.                 h->mb.cache.mv[i_list][i8][1] = h->mb.mv[i_list][iv][1];
  1015.             }
  1016.             else
  1017.             {
  1018.                 const int i8 = x264_scan8[0] - 1 - 1*8;
  1019.                 h->mb.cache.ref[i_list][i8] = -2;
  1020.                 h->mb.cache.mv[i_list][i8][0] = 0;
  1021.                 h->mb.cache.mv[i_list][i8][1] = 0;
  1022.             }
  1023.             if( h->mb.i_neighbour & MB_TOP )
  1024.             {
  1025.                 const int i8 = x264_scan8[0] - 8;
  1026.                 const int ir = i_mb_8x8 - s8x8;
  1027.                 const int iv = i_mb_4x4 - s4x4;
  1028.                 h->mb.cache.ref[i_list][i8+0] =
  1029.                 h->mb.cache.ref[i_list][i8+1] = h->mb.ref[i_list][ir + 0];
  1030.                 h->mb.cache.ref[i_list][i8+2] =
  1031.                 h->mb.cache.ref[i_list][i8+3] = h->mb.ref[i_list][ir + 1];
  1032.                 for( i = 0; i < 4; i++ )
  1033.                 {
  1034.                     h->mb.cache.mv[i_list][i8+i][0] = h->mb.mv[i_list][iv + i][0];
  1035.                     h->mb.cache.mv[i_list][i8+i][1] = h->mb.mv[i_list][iv + i][1];
  1036.                 }
  1037.             }
  1038.             else
  1039.             {
  1040.                 const int i8 = x264_scan8[0] - 8;
  1041.                 for( i = 0; i < 4; i++ )
  1042.                 {
  1043.                     h->mb.cache.ref[i_list][i8+i] = -2;
  1044.                     h->mb.cache.mv[i_list][i8+i][0] =
  1045.                     h->mb.cache.mv[i_list][i8+i][1] = 0;
  1046.                 }
  1047.             }
  1048.             if( h->mb.i_neighbour & MB_TOPRIGHT )
  1049.             {
  1050.                 const int i8 = x264_scan8[0] + 4 - 1*8;
  1051.                 const int ir = i_mb_8x8 - s8x8 + 2;
  1052.                 const int iv = i_mb_4x4 - s4x4 + 4;
  1053.                 h->mb.cache.ref[i_list][i8]  = h->mb.ref[i_list][ir];
  1054.                 h->mb.cache.mv[i_list][i8][0] = h->mb.mv[i_list][iv][0];
  1055.                 h->mb.cache.mv[i_list][i8][1] = h->mb.mv[i_list][iv][1];
  1056.             }
  1057.             else
  1058.             {
  1059.                 const int i8 = x264_scan8[0] + 4 - 1*8;
  1060.                 h->mb.cache.ref[i_list][i8] = -2;
  1061.                 h->mb.cache.mv[i_list][i8][0] = 0;
  1062.                 h->mb.cache.mv[i_list][i8][1] = 0;
  1063.             }
  1064.             if( h->mb.i_neighbour & MB_LEFT )
  1065.             {
  1066.                 const int i8 = x264_scan8[0] - 1;
  1067.                 const int ir = i_mb_8x8 - 1;
  1068.                 const int iv = i_mb_4x4 - 1;
  1069.                 h->mb.cache.ref[i_list][i8+0*8] =
  1070.                 h->mb.cache.ref[i_list][i8+1*8] = h->mb.ref[i_list][ir + 0*s8x8];
  1071.                 h->mb.cache.ref[i_list][i8+2*8] =
  1072.                 h->mb.cache.ref[i_list][i8+3*8] = h->mb.ref[i_list][ir + 1*s8x8];
  1073.                 for( i = 0; i < 4; i++ )
  1074.                 {
  1075.                     h->mb.cache.mv[i_list][i8+i*8][0] = h->mb.mv[i_list][iv + i*s4x4][0];
  1076.                     h->mb.cache.mv[i_list][i8+i*8][1] = h->mb.mv[i_list][iv + i*s4x4][1];
  1077.                 }
  1078.             }
  1079.             else
  1080.             {
  1081.                 const int i8 = x264_scan8[0] - 1;
  1082.                 for( i = 0; i < 4; i++ )
  1083.                 {
  1084.                     h->mb.cache.ref[i_list][i8+i*8] = -2;
  1085.                     h->mb.cache.mv[i_list][i8+i*8][0] =
  1086.                     h->mb.cache.mv[i_list][i8+i*8][1] = 0;
  1087.                 }
  1088.             }
  1089.             if( h->param.b_cabac )
  1090.             {
  1091.                 if( i_top_type >= 0 )
  1092.                 {
  1093.                     const int i8 = x264_scan8[0] - 8;
  1094.                     const int iv = i_mb_4x4 - s4x4;
  1095.                     for( i = 0; i < 4; i++ )
  1096.                     {
  1097.                         h->mb.cache.mvd[i_list][i8+i][0] = h->mb.mvd[i_list][iv + i][0];
  1098.                         h->mb.cache.mvd[i_list][i8+i][1] = h->mb.mvd[i_list][iv + i][1];
  1099.                     }
  1100.                 }
  1101.                 else
  1102.                 {
  1103.                     const int i8 = x264_scan8[0] - 8;
  1104.                     for( i = 0; i < 4; i++ )
  1105.                     {
  1106.                         h->mb.cache.mvd[i_list][i8+i][0] =
  1107.                         h->mb.cache.mvd[i_list][i8+i][1] = 0;
  1108.                     }
  1109.                 }
  1110.                 if( i_left_type >= 0 )
  1111.                 {
  1112.                     const int i8 = x264_scan8[0] - 1;
  1113.                     const int iv = i_mb_4x4 - 1;
  1114.                     for( i = 0; i < 4; i++ )
  1115.                     {
  1116.                         h->mb.cache.mvd[i_list][i8+i*8][0] = h->mb.mvd[i_list][iv + i*s4x4][0];
  1117.                         h->mb.cache.mvd[i_list][i8+i*8][1] = h->mb.mvd[i_list][iv + i*s4x4][1];
  1118.                     }
  1119.                 }
  1120.                 else
  1121.                 {
  1122.                     const int i8 = x264_scan8[0] - 1;
  1123.                     for( i = 0; i < 4; i++ )
  1124.                     {
  1125.                         h->mb.cache.mvd[i_list][i8+i*8][0] =
  1126.                         h->mb.cache.mvd[i_list][i8+i*8][1] = 0;
  1127.                     }
  1128.                 }
  1129.             }
  1130.         }
  1131.         /* load skip */
  1132.         if( h->sh.i_type == SLICE_TYPE_B && h->param.b_cabac )
  1133.         {
  1134.             memset( h->mb.cache.skip, 0, X264_SCAN8_SIZE * sizeof( int8_t ) );
  1135.             if( i_left_type >= 0 )
  1136.             {
  1137.                 h->mb.cache.skip[x264_scan8[0] - 1] = h->mb.skipbp[i_left_xy] & 0x2;
  1138.                 h->mb.cache.skip[x264_scan8[8] - 1] = h->mb.skipbp[i_left_xy] & 0x8;
  1139.             }
  1140.             if( i_top_type >= 0 )
  1141.             {
  1142.                 h->mb.cache.skip[x264_scan8[0] - 8] = h->mb.skipbp[i_top_xy] & 0x4;
  1143.                 h->mb.cache.skip[x264_scan8[4] - 8] = h->mb.skipbp[i_top_xy] & 0x8;
  1144.             }
  1145.         }
  1146.     }
  1147.     h->mb.i_neighbour4[0] =
  1148.     h->mb.i_neighbour8[0] = (h->mb.i_neighbour & (MB_TOP|MB_LEFT|MB_TOPLEFT))
  1149.                             | ((h->mb.i_neighbour & MB_TOP) ? MB_TOPRIGHT : 0);
  1150.     h->mb.i_neighbour4[4] =
  1151.     h->mb.i_neighbour4[1] = MB_LEFT | ((h->mb.i_neighbour & MB_TOP) ? (MB_TOP|MB_TOPLEFT|MB_TOPRIGHT) : 0);
  1152.     h->mb.i_neighbour4[2] =
  1153.     h->mb.i_neighbour4[8] =
  1154.     h->mb.i_neighbour4[10] =
  1155.     h->mb.i_neighbour8[2] = MB_TOP|MB_TOPRIGHT | ((h->mb.i_neighbour & MB_LEFT) ? (MB_LEFT|MB_TOPLEFT) : 0);
  1156.     h->mb.i_neighbour4[3] =
  1157.     h->mb.i_neighbour4[7] =
  1158.     h->mb.i_neighbour4[11] =
  1159.     h->mb.i_neighbour4[13] =
  1160.     h->mb.i_neighbour4[15] =
  1161.     h->mb.i_neighbour8[3] = MB_LEFT|MB_TOP|MB_TOPLEFT;
  1162.     h->mb.i_neighbour4[5] =
  1163.     h->mb.i_neighbour8[1] = MB_LEFT | (h->mb.i_neighbour & MB_TOPRIGHT)
  1164.                             | ((h->mb.i_neighbour & MB_TOP) ? MB_TOP|MB_TOPLEFT : 0);
  1165.     h->mb.i_neighbour4[6] =
  1166.     h->mb.i_neighbour4[9] =
  1167.     h->mb.i_neighbour4[12] =
  1168.     h->mb.i_neighbour4[14] = MB_LEFT|MB_TOP|MB_TOPLEFT|MB_TOPRIGHT;
  1169. }
  1170. void x264_macroblock_cache_save( x264_t *h )
  1171. {
  1172.     const int i_mb_xy = h->mb.i_mb_xy;
  1173.     const int i_mb_type = x264_mb_type_fix[h->mb.i_type];
  1174.     const int s8x8 = h->mb.i_b8_stride;
  1175.     const int s4x4 = h->mb.i_b4_stride;
  1176.     const int i_mb_4x4 = h->mb.i_b4_xy;
  1177.     const int i_mb_8x8 = h->mb.i_b8_xy;
  1178.     int i;
  1179.     for( i = 0; i < 3; i++ )
  1180.     {
  1181.         int w = i ? 8 : 16;
  1182.         h->mc.copy[i?PIXEL_8x8:PIXEL_16x16](
  1183.             &h->fdec->plane[i][ w * (h->mb.i_mb_x + h->mb.i_mb_y * h->fdec->i_stride[i]) ],
  1184.             h->fdec->i_stride[i],
  1185.             h->mb.pic.p_fdec[i], FDEC_STRIDE, w );
  1186.     }
  1187.     h->mb.type[i_mb_xy] = i_mb_type;
  1188.     if( h->mb.i_type != I_16x16 && h->mb.i_cbp_luma == 0 && h->mb.i_cbp_chroma == 0 )
  1189.         h->mb.i_qp = h->mb.i_last_qp;
  1190.     h->mb.qp[i_mb_xy] = h->mb.i_qp;
  1191.     h->mb.i_last_dqp = h->mb.i_qp - h->mb.i_last_qp;
  1192.     h->mb.i_last_qp = h->mb.i_qp;
  1193.     /* save intra4x4 */
  1194.     if( i_mb_type == I_4x4 )
  1195.     {
  1196.         h->mb.intra4x4_pred_mode[i_mb_xy][0] = h->mb.cache.intra4x4_pred_mode[x264_scan8[10] ];
  1197.         h->mb.intra4x4_pred_mode[i_mb_xy][1] = h->mb.cache.intra4x4_pred_mode[x264_scan8[11] ];
  1198.         h->mb.intra4x4_pred_mode[i_mb_xy][2] = h->mb.cache.intra4x4_pred_mode[x264_scan8[14] ];
  1199.         h->mb.intra4x4_pred_mode[i_mb_xy][3] = h->mb.cache.intra4x4_pred_mode[x264_scan8[15] ];
  1200.         h->mb.intra4x4_pred_mode[i_mb_xy][4] = h->mb.cache.intra4x4_pred_mode[x264_scan8[5] ];
  1201.         h->mb.intra4x4_pred_mode[i_mb_xy][5] = h->mb.cache.intra4x4_pred_mode[x264_scan8[7] ];
  1202.         h->mb.intra4x4_pred_mode[i_mb_xy][6] = h->mb.cache.intra4x4_pred_mode[x264_scan8[13] ];
  1203.     }
  1204.     else
  1205.     {
  1206.         h->mb.intra4x4_pred_mode[i_mb_xy][0] =
  1207.         h->mb.intra4x4_pred_mode[i_mb_xy][1] =
  1208.         h->mb.intra4x4_pred_mode[i_mb_xy][2] =
  1209.         h->mb.intra4x4_pred_mode[i_mb_xy][3] =
  1210.         h->mb.intra4x4_pred_mode[i_mb_xy][4] =
  1211.         h->mb.intra4x4_pred_mode[i_mb_xy][5] =
  1212.         h->mb.intra4x4_pred_mode[i_mb_xy][6] = I_PRED_4x4_DC;
  1213.     }
  1214.     if( i_mb_type == I_PCM )
  1215.     {
  1216.         h->mb.cbp[i_mb_xy] = 0x72f;   /* all set */
  1217.         for( i = 0; i < 16 + 2*4; i++ )
  1218.         {
  1219.             h->mb.non_zero_count[i_mb_xy][i] = 16;
  1220.         }
  1221.     }
  1222.     else
  1223.     {
  1224.         /* save non zero count */
  1225.         for( i = 0; i < 16 + 2*4; i++ )
  1226.         {
  1227.             h->mb.non_zero_count[i_mb_xy][i] = h->mb.cache.non_zero_count[x264_scan8[i]];
  1228.         }
  1229.     }
  1230.     if( h->mb.i_cbp_luma == 0 && h->mb.i_type != I_8x8 )
  1231.         h->mb.b_transform_8x8 = 0;
  1232.     h->mb.mb_transform_size[i_mb_xy] = h->mb.b_transform_8x8;
  1233.     if( !IS_INTRA( i_mb_type ) )
  1234.     {
  1235.         int i_list;
  1236.         for( i_list = 0; i_list < (h->sh.i_type == SLICE_TYPE_B ? 2  : 1 ); i_list++ )
  1237.         {
  1238.             int y,x;
  1239.             h->mb.ref[i_list][i_mb_8x8+0+0*s8x8] = h->mb.cache.ref[i_list][x264_scan8[0]];
  1240.             h->mb.ref[i_list][i_mb_8x8+1+0*s8x8] = h->mb.cache.ref[i_list][x264_scan8[4]];
  1241.             h->mb.ref[i_list][i_mb_8x8+0+1*s8x8] = h->mb.cache.ref[i_list][x264_scan8[8]];
  1242.             h->mb.ref[i_list][i_mb_8x8+1+1*s8x8] = h->mb.cache.ref[i_list][x264_scan8[12]];
  1243.             for( y = 0; y < 4; y++ )
  1244.             {
  1245.                 for( x = 0; x < 4; x++ )
  1246.                 {
  1247.                     h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][0] = h->mb.cache.mv[i_list][x264_scan8[0]+x+8*y][0];
  1248.                     h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][1] = h->mb.cache.mv[i_list][x264_scan8[0]+x+8*y][1];
  1249.                 }
  1250.             }
  1251.         }
  1252.     }
  1253.     else
  1254.     {
  1255.         int i_list;
  1256.         for( i_list = 0; i_list < (h->sh.i_type == SLICE_TYPE_B ? 2  : 1 ); i_list++ )
  1257.         {
  1258.             int y,x;
  1259.             h->mb.ref[i_list][i_mb_8x8+0+0*s8x8] =
  1260.             h->mb.ref[i_list][i_mb_8x8+1+0*s8x8] =
  1261.             h->mb.ref[i_list][i_mb_8x8+0+1*s8x8] =
  1262.             h->mb.ref[i_list][i_mb_8x8+1+1*s8x8] = -1;
  1263.             for( y = 0; y < 4; y++ )
  1264.             {
  1265.                 for( x = 0; x < 4; x++ )
  1266.                 {
  1267.                     h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][0] = 0;
  1268.                     h->mb.mv[i_list][i_mb_4x4+x+y*s4x4][1] = 0;
  1269.                 }
  1270.             }
  1271.         }
  1272.     }
  1273.     if( h->param.b_cabac )
  1274.     {
  1275.         if( i_mb_type == I_4x4 || i_mb_type == I_16x16 )
  1276.             h->mb.chroma_pred_mode[i_mb_xy] = x264_mb_pred_mode8x8c_fix[ h->mb.i_chroma_pred_mode ];
  1277.         else
  1278.             h->mb.chroma_pred_mode[i_mb_xy] = I_PRED_CHROMA_DC;
  1279.         if( !IS_INTRA( i_mb_type ) && !IS_SKIP( i_mb_type ) && !IS_DIRECT( i_mb_type ) )
  1280.         {
  1281.             int i_list;
  1282.             for( i_list  = 0; i_list < 2; i_list++ )
  1283.             {
  1284.                 const int s4x4 = 4 * h->mb.i_mb_stride;
  1285.                 int y,x;
  1286.                 for( y = 0; y < 4; y++ )
  1287.                 {
  1288.                     for( x = 0; x < 4; x++ )
  1289.                     {
  1290.                         h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][0] = h->mb.cache.mvd[i_list][x264_scan8[0]+x+8*y][0];
  1291.                         h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][1] = h->mb.cache.mvd[i_list][x264_scan8[0]+x+8*y][1];
  1292.                     }
  1293.                 }
  1294.             }
  1295.         }
  1296.         else
  1297.         {
  1298.             int i_list;
  1299.             for( i_list  = 0; i_list < 2; i_list++ )
  1300.             {
  1301.                 const int s4x4 = 4 * h->mb.i_mb_stride;
  1302.                 int y,x;
  1303.                 for( y = 0; y < 4; y++ )
  1304.                 {
  1305.                     for( x = 0; x < 4; x++ )
  1306.                     {
  1307.                         h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][0] = 0;
  1308.                         h->mb.mvd[i_list][i_mb_4x4+x+y*s4x4][1] = 0;
  1309.                     }
  1310.                 }
  1311.             }
  1312.         }
  1313.         if( h->sh.i_type == SLICE_TYPE_B )
  1314.         {
  1315.             if( i_mb_type == B_SKIP || i_mb_type == B_DIRECT )
  1316.                 h->mb.skipbp[i_mb_xy] = 0xf;
  1317.             else if( i_mb_type == B_8x8 )
  1318.             {
  1319.                 int skipbp = 0;
  1320.                 for( i = 0; i < 4; i++ )
  1321.                     skipbp |= ( h->mb.i_sub_partition[i] == D_DIRECT_8x8 ) << i;
  1322.                 h->mb.skipbp[i_mb_xy] = skipbp;
  1323.             }
  1324.             else
  1325.                 h->mb.skipbp[i_mb_xy] = 0;
  1326.         }
  1327.     }
  1328. }
  1329. void x264_macroblock_bipred_init( x264_t *h )
  1330. {
  1331.     int i_ref0, i_ref1;
  1332.     for( i_ref0 = 0; i_ref0 < h->i_ref0; i_ref0++ )
  1333.     {
  1334.         int poc0 = h->fref0[i_ref0]->i_poc;
  1335.         for( i_ref1 = 0; i_ref1 < h->i_ref1; i_ref1++ )
  1336.         {
  1337.             int dist_scale_factor;
  1338.             int poc1 = h->fref1[i_ref1]->i_poc;
  1339.             int td = x264_clip3( poc1 - poc0, -128, 127 );
  1340.             if( td == 0 /* || pic0 is a long-term ref */ )
  1341.                 dist_scale_factor = 256;
  1342.             else
  1343.             {
  1344.                 int tb = x264_clip3( h->fdec->i_poc - poc0, -128, 127 );
  1345.                 int tx = (16384 + (abs(td) >> 1)) / td;
  1346.                 dist_scale_factor = x264_clip3( (tb * tx + 32) >> 6, -1024, 1023 );
  1347.             }
  1348.             h->mb.dist_scale_factor[i_ref0][i_ref1] = dist_scale_factor;
  1349.             dist_scale_factor >>= 2;
  1350.             if( h->param.analyse.b_weighted_bipred
  1351.                   && dist_scale_factor >= -64
  1352.                   && dist_scale_factor <= 128 )
  1353.                 h->mb.bipred_weight[i_ref0][i_ref1] = 64 - dist_scale_factor;
  1354.             else
  1355.                 h->mb.bipred_weight[i_ref0][i_ref1] = 32;
  1356.         }
  1357.     }
  1358. }