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

Audio

开发平台:

Visual C++

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