Index: encoder/encoder.c =================================================================== --- encoder/encoder.c (revision 735) +++ encoder/encoder.c (working copy) @@ -1061,7 +1061,7 @@ x264_fdec_filter_row( h, i_mb_y ); /* load cache */ - x264_macroblock_cache_load( h, i_mb_x, i_mb_y ); + x264_macroblock_cache_load_first( h, i_mb_x, i_mb_y ); /* analyse parameters * Slice I: choose I_4x4 or I_16x16 mode @@ -1194,7 +1194,6 @@ // copy everything except the per-thread pointers and the constants. memcpy( &dst->i_frame, &src->i_frame, offsetof(x264_t, mb.type) - offsetof(x264_t, i_frame) ); - memcpy( &dst->mb.i_type, &src->mb.i_type, offsetof(x264_t, rc) - offsetof(x264_t, mb.i_type) ); dst->stat = src->stat; } Index: encoder/analyse.c =================================================================== --- encoder/analyse.c (revision 735) +++ encoder/analyse.c (working copy) @@ -1004,6 +1004,7 @@ x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.me16x16.i_ref ); assert( a->l0.me16x16.mv[1] <= h->mb.mv_max_spel[1] || h->param.i_threads == 1 ); + x264_macroblock_cache_load_rest( h ); h->mb.i_type = P_L0; if( a->b_mbrd && a->l0.i_ref == 0 && a->l0.me16x16.mv[0] == h->mb.cache.pskip_mv[0] @@ -2053,6 +2054,7 @@ /*--------------------------- Do the analysis ---------------------------*/ if( h->sh.i_type == SLICE_TYPE_I ) { + x264_macroblock_cache_load_rest( h ); x264_mb_analyse_intra( h, &analysis, COST_MAX ); if( analysis.b_mbrd ) x264_intra_rd( h, &analysis, COST_MAX ); @@ -2365,14 +2367,8 @@ else if( analysis.b_mbrd ) { i_bskip_cost = ssd_mb( h ); - /* 6 = minimum cavlc cost of a non-skipped MB */ - if( i_bskip_cost <= 6 * analysis.i_lambda2 ) - { - h->mb.i_type = B_SKIP; - x264_analyse_update_cache( h, &analysis ); - return; - } + b_skip = i_bskip_cost <= 6 * analysis.i_lambda2; } else if( !h->mb.b_direct_auto_write ) { @@ -2388,6 +2384,7 @@ int i_type; int i_partition; + x264_macroblock_cache_load_rest( h ); x264_mb_analyse_load_costs( h, &analysis ); /* select best inter mode */ Index: common/macroblock.c =================================================================== --- common/macroblock.c (revision 735) +++ common/macroblock.c (working copy) @@ -929,6 +929,23 @@ memset( h->mb.cache.ref[0], -2, X264_SCAN8_SIZE * sizeof( int8_t ) ); memset( h->mb.cache.ref[1], -2, X264_SCAN8_SIZE * sizeof( int8_t ) ); + /* fdec: fenc: + * yyyyyyy + * yYYYY YYYY + * yYYYY YYYY + * yYYYY YYYY + * yYYYY YYYY + * uuu vvv UUVV + * uUU vVV UUVV + * uUU vVV + */ + h->mb.pic.p_fenc[0] = h->mb.pic.fenc_buf; + h->mb.pic.p_fenc[1] = h->mb.pic.fenc_buf + 16*FENC_STRIDE; + h->mb.pic.p_fenc[2] = h->mb.pic.fenc_buf + 16*FENC_STRIDE + 8; + h->mb.pic.p_fdec[0] = h->mb.pic.fdec_buf + 2*FDEC_STRIDE; + h->mb.pic.p_fdec[1] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE; + h->mb.pic.p_fdec[2] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE + 16; + return 0; fail: return -1; } @@ -1004,7 +1021,7 @@ fenc->plane[1+(i_mb_x&1)]+off_uv, stride_uv, i_mb_x ); } -void x264_macroblock_cache_load( x264_t *h, int i_mb_x, int i_mb_y ) +void x264_macroblock_cache_load_first( x264_t *h, int i_mb_x, int i_mb_y ) { int i_mb_xy = i_mb_y * h->mb.i_mb_stride + i_mb_x; int i_mb_4x4 = 4*(i_mb_y * h->mb.i_b4_stride + i_mb_x); @@ -1036,47 +1053,11 @@ { h->mb.i_mb_type_top = i_top_type= h->mb.type[i_top_xy]; - h->mb.i_neighbour |= MB_TOP; - - /* load intra4x4 */ - h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][0]; - h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][1]; - h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][2]; - h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][3]; - - /* load non_zero_count */ - h->mb.cache.non_zero_count[x264_scan8[0] - 8] = h->mb.non_zero_count[i_top_xy][10]; - h->mb.cache.non_zero_count[x264_scan8[1] - 8] = h->mb.non_zero_count[i_top_xy][11]; - h->mb.cache.non_zero_count[x264_scan8[4] - 8] = h->mb.non_zero_count[i_top_xy][14]; - h->mb.cache.non_zero_count[x264_scan8[5] - 8] = h->mb.non_zero_count[i_top_xy][15]; - - h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] = h->mb.non_zero_count[i_top_xy][16+2]; - h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] = h->mb.non_zero_count[i_top_xy][16+3]; - - h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] = h->mb.non_zero_count[i_top_xy][16+4+2]; - h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = h->mb.non_zero_count[i_top_xy][16+4+3]; } else { h->mb.i_mb_type_top = -1; - - /* load intra4x4 */ - h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] = - h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] = - h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] = - h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = -1; - - /* load non_zero_count */ - h->mb.cache.non_zero_count[x264_scan8[0] - 8] = - h->mb.cache.non_zero_count[x264_scan8[1] - 8] = - h->mb.cache.non_zero_count[x264_scan8[4] - 8] = - h->mb.cache.non_zero_count[x264_scan8[5] - 8] = - h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] = - h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] = - h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] = - h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = 0x80; - } if( i_mb_x > 0 && i_mb_xy > h->sh.i_first_mb ) @@ -1084,45 +1065,11 @@ i_left_xy = i_mb_xy - 1; h->mb.i_mb_type_left = i_left_type = h->mb.type[i_left_xy]; - h->mb.i_neighbour |= MB_LEFT; - - /* load intra4x4 */ - h->mb.cache.intra4x4_pred_mode[x264_scan8[0 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][4]; - h->mb.cache.intra4x4_pred_mode[x264_scan8[2 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][5]; - h->mb.cache.intra4x4_pred_mode[x264_scan8[8 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][6]; - h->mb.cache.intra4x4_pred_mode[x264_scan8[10] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][3]; - - /* load non_zero_count */ - h->mb.cache.non_zero_count[x264_scan8[0 ] - 1] = h->mb.non_zero_count[i_left_xy][5]; - h->mb.cache.non_zero_count[x264_scan8[2 ] - 1] = h->mb.non_zero_count[i_left_xy][7]; - h->mb.cache.non_zero_count[x264_scan8[8 ] - 1] = h->mb.non_zero_count[i_left_xy][13]; - h->mb.cache.non_zero_count[x264_scan8[10] - 1] = h->mb.non_zero_count[i_left_xy][15]; - - h->mb.cache.non_zero_count[x264_scan8[16+0] - 1] = h->mb.non_zero_count[i_left_xy][16+1]; - h->mb.cache.non_zero_count[x264_scan8[16+2] - 1] = h->mb.non_zero_count[i_left_xy][16+3]; - - h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 1] = h->mb.non_zero_count[i_left_xy][16+4+1]; - h->mb.cache.non_zero_count[x264_scan8[16+4+2] - 1] = h->mb.non_zero_count[i_left_xy][16+4+3]; } else { h->mb.i_mb_type_left = -1; - - h->mb.cache.intra4x4_pred_mode[x264_scan8[0 ] - 1] = - h->mb.cache.intra4x4_pred_mode[x264_scan8[2 ] - 1] = - h->mb.cache.intra4x4_pred_mode[x264_scan8[8 ] - 1] = - h->mb.cache.intra4x4_pred_mode[x264_scan8[10] - 1] = -1; - - /* load non_zero_count */ - h->mb.cache.non_zero_count[x264_scan8[0 ] - 1] = - h->mb.cache.non_zero_count[x264_scan8[2 ] - 1] = - h->mb.cache.non_zero_count[x264_scan8[8 ] - 1] = - h->mb.cache.non_zero_count[x264_scan8[10] - 1] = - h->mb.cache.non_zero_count[x264_scan8[16+0] - 1] = - h->mb.cache.non_zero_count[x264_scan8[16+2] - 1] = - h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 1] = - h->mb.cache.non_zero_count[x264_scan8[16+4+2] - 1] = 0x80; } if( i_mb_x < h->sps->i_mb_width - 1 && i_top_xy + 1 >= h->sh.i_first_mb ) @@ -1140,13 +1087,6 @@ else h->mb.i_mb_type_topleft = -1; - if( h->pps->b_transform_8x8_mode ) - { - h->mb.cache.i_neighbour_transform_size = - ( i_left_type >= 0 && h->mb.mb_transform_size[i_left_xy] ) - + ( i_top_type >= 0 && h->mb.mb_transform_size[i_top_xy] ); - } - if( h->sh.b_mbaff ) { h->mb.pic.i_fref[0] = h->i_ref0 << h->mb.b_interlaced; @@ -1156,22 +1096,6 @@ + !!(h->mb.i_neighbour & MB_TOP); } - /* fdec: fenc: - * yyyyyyy - * yYYYY YYYY - * yYYYY YYYY - * yYYYY YYYY - * yYYYY YYYY - * uuu vvv UUVV - * uUU vVV UUVV - * uUU vVV - */ - h->mb.pic.p_fenc[0] = h->mb.pic.fenc_buf; - h->mb.pic.p_fenc[1] = h->mb.pic.fenc_buf + 16*FENC_STRIDE; - h->mb.pic.p_fenc[2] = h->mb.pic.fenc_buf + 16*FENC_STRIDE + 8; - h->mb.pic.p_fdec[0] = h->mb.pic.fdec_buf + 2*FDEC_STRIDE; - h->mb.pic.p_fdec[1] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE; - h->mb.pic.p_fdec[2] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE + 16; /* load picture pointers */ for( i = 0; i < 3; i++ ) @@ -1325,93 +1249,189 @@ h->mb.cache.mv[i_list][i8+i*8][1] = 0; } } + } - if( h->param.b_cabac ) + if( h->sh.i_type == SLICE_TYPE_P ) + x264_mb_predict_mv_pskip( h, h->mb.cache.pskip_mv ); + } +} + +void x264_macroblock_cache_load_rest( x264_t *h ) +{ + int i_mb_x = h->mb.i_mb_x; + int i_mb_y = h->mb.i_mb_y; + int i_mb_xy = h->mb.i_mb_xy; + int i_mb_4x4 = h->mb.i_b4_xy; + int i_top_xy = h->mb.i_mb_top_xy; + int i_left_xy = i_mb_xy - 1; + int i_neighbour = h->mb.i_neighbour; + + if( i_neighbour & MB_TOP ) + { + h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][0]; + h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][1]; + h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][2]; + h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][3]; + + h->mb.cache.non_zero_count[x264_scan8[0] - 8] = h->mb.non_zero_count[i_top_xy][10]; + h->mb.cache.non_zero_count[x264_scan8[1] - 8] = h->mb.non_zero_count[i_top_xy][11]; + h->mb.cache.non_zero_count[x264_scan8[4] - 8] = h->mb.non_zero_count[i_top_xy][14]; + h->mb.cache.non_zero_count[x264_scan8[5] - 8] = h->mb.non_zero_count[i_top_xy][15]; + + h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] = h->mb.non_zero_count[i_top_xy][16+2]; + h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] = h->mb.non_zero_count[i_top_xy][16+3]; + + h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] = h->mb.non_zero_count[i_top_xy][16+4+2]; + h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = h->mb.non_zero_count[i_top_xy][16+4+3]; + } + else + { + h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] = + h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] = + h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] = + h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = -1; + + h->mb.cache.non_zero_count[x264_scan8[0] - 8] = + h->mb.cache.non_zero_count[x264_scan8[1] - 8] = + h->mb.cache.non_zero_count[x264_scan8[4] - 8] = + h->mb.cache.non_zero_count[x264_scan8[5] - 8] = + h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] = + h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] = + h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] = + h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = 0x80; + + } + + if( i_neighbour & MB_LEFT ) + { + h->mb.cache.intra4x4_pred_mode[x264_scan8[0 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][4]; + h->mb.cache.intra4x4_pred_mode[x264_scan8[2 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][5]; + h->mb.cache.intra4x4_pred_mode[x264_scan8[8 ] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][6]; + h->mb.cache.intra4x4_pred_mode[x264_scan8[10] - 1] = h->mb.intra4x4_pred_mode[i_left_xy][3]; + + h->mb.cache.non_zero_count[x264_scan8[0 ] - 1] = h->mb.non_zero_count[i_left_xy][5]; + h->mb.cache.non_zero_count[x264_scan8[2 ] - 1] = h->mb.non_zero_count[i_left_xy][7]; + h->mb.cache.non_zero_count[x264_scan8[8 ] - 1] = h->mb.non_zero_count[i_left_xy][13]; + h->mb.cache.non_zero_count[x264_scan8[10] - 1] = h->mb.non_zero_count[i_left_xy][15]; + + h->mb.cache.non_zero_count[x264_scan8[16+0] - 1] = h->mb.non_zero_count[i_left_xy][16+1]; + h->mb.cache.non_zero_count[x264_scan8[16+2] - 1] = h->mb.non_zero_count[i_left_xy][16+3]; + + h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 1] = h->mb.non_zero_count[i_left_xy][16+4+1]; + h->mb.cache.non_zero_count[x264_scan8[16+4+2] - 1] = h->mb.non_zero_count[i_left_xy][16+4+3]; + } + else + { + h->mb.cache.intra4x4_pred_mode[x264_scan8[0 ] - 1] = + h->mb.cache.intra4x4_pred_mode[x264_scan8[2 ] - 1] = + h->mb.cache.intra4x4_pred_mode[x264_scan8[8 ] - 1] = + h->mb.cache.intra4x4_pred_mode[x264_scan8[10] - 1] = -1; + + h->mb.cache.non_zero_count[x264_scan8[0 ] - 1] = + h->mb.cache.non_zero_count[x264_scan8[2 ] - 1] = + h->mb.cache.non_zero_count[x264_scan8[8 ] - 1] = + h->mb.cache.non_zero_count[x264_scan8[10] - 1] = + h->mb.cache.non_zero_count[x264_scan8[16+0] - 1] = + h->mb.cache.non_zero_count[x264_scan8[16+2] - 1] = + h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 1] = + h->mb.cache.non_zero_count[x264_scan8[16+4+2] - 1] = 0x80; + } + + if( h->pps->b_transform_8x8_mode ) + { + h->mb.cache.i_neighbour_transform_size = + ( i_mb_x > 0 && h->mb.mb_transform_size[i_left_xy] ) + + ( i_top_xy >= 0 && h->mb.mb_transform_size[i_top_xy] ); + } + + h->mb.i_neighbour4[0] = + h->mb.i_neighbour8[0] = (i_neighbour & (MB_TOP|MB_LEFT|MB_TOPLEFT)) + | ((i_neighbour & MB_TOP) ? MB_TOPRIGHT : 0); + h->mb.i_neighbour4[4] = + h->mb.i_neighbour4[1] = MB_LEFT | ((i_neighbour & MB_TOP) ? (MB_TOP|MB_TOPLEFT|MB_TOPRIGHT) : 0); + h->mb.i_neighbour4[2] = + h->mb.i_neighbour4[8] = + h->mb.i_neighbour4[10] = + h->mb.i_neighbour8[2] = MB_TOP|MB_TOPRIGHT | ((i_neighbour & MB_LEFT) ? (MB_LEFT|MB_TOPLEFT) : 0); + h->mb.i_neighbour4[3] = + h->mb.i_neighbour4[7] = + h->mb.i_neighbour4[11] = + h->mb.i_neighbour4[13] = + h->mb.i_neighbour4[15] = + h->mb.i_neighbour8[3] = MB_LEFT|MB_TOP|MB_TOPLEFT; + h->mb.i_neighbour4[5] = + h->mb.i_neighbour8[1] = MB_LEFT | (i_neighbour & MB_TOPRIGHT) + | ((i_neighbour & MB_TOP) ? MB_TOP|MB_TOPLEFT : 0); + h->mb.i_neighbour4[6] = + h->mb.i_neighbour4[9] = + h->mb.i_neighbour4[12] = + h->mb.i_neighbour4[14] = MB_LEFT|MB_TOP|MB_TOPLEFT|MB_TOPRIGHT; + + if( h->param.b_cabac && h->sh.i_type != SLICE_TYPE_I ) + { + int s4x4 = h->mb.i_b4_stride; + int i_top_y = i_mb_y - (1 << h->mb.b_interlaced); + int i_top_4x4 = (4*i_top_y+3) * s4x4 + 4*i_mb_x; + int i_list, i; + + for( i_list = 0; i_list < (h->sh.i_type == SLICE_TYPE_B ? 2 : 1 ); i_list++ ) + { + if( i_neighbour & MB_TOP ) { - if( i_top_type >= 0 ) + const int i8 = x264_scan8[0] - 8; + const int iv = i_top_4x4; + for( i = 0; i < 4; i++ ) { - const int i8 = x264_scan8[0] - 8; - const int iv = i_top_4x4; - for( i = 0; i < 4; i++ ) - { - h->mb.cache.mvd[i_list][i8+i][0] = h->mb.mvd[i_list][iv + i][0]; - h->mb.cache.mvd[i_list][i8+i][1] = h->mb.mvd[i_list][iv + i][1]; - } + h->mb.cache.mvd[i_list][i8+i][0] = h->mb.mvd[i_list][iv + i][0]; + h->mb.cache.mvd[i_list][i8+i][1] = h->mb.mvd[i_list][iv + i][1]; } - else + } + else + { + const int i8 = x264_scan8[0] - 8; + for( i = 0; i < 4; i++ ) { - const int i8 = x264_scan8[0] - 8; - for( i = 0; i < 4; i++ ) - { - h->mb.cache.mvd[i_list][i8+i][0] = - h->mb.cache.mvd[i_list][i8+i][1] = 0; - } + h->mb.cache.mvd[i_list][i8+i][0] = + h->mb.cache.mvd[i_list][i8+i][1] = 0; } + } - if( i_left_type >= 0 ) + if( i_neighbour & MB_LEFT ) + { + const int i8 = x264_scan8[0] - 1; + const int iv = i_mb_4x4 - 1; + for( i = 0; i < 4; i++ ) { - const int i8 = x264_scan8[0] - 1; - const int iv = i_mb_4x4 - 1; - for( i = 0; i < 4; i++ ) - { - h->mb.cache.mvd[i_list][i8+i*8][0] = h->mb.mvd[i_list][iv + i*s4x4][0]; - h->mb.cache.mvd[i_list][i8+i*8][1] = h->mb.mvd[i_list][iv + i*s4x4][1]; - } + h->mb.cache.mvd[i_list][i8+i*8][0] = h->mb.mvd[i_list][iv + i*s4x4][0]; + h->mb.cache.mvd[i_list][i8+i*8][1] = h->mb.mvd[i_list][iv + i*s4x4][1]; } - else + } + else + { + const int i8 = x264_scan8[0] - 1; + for( i = 0; i < 4; i++ ) { - const int i8 = x264_scan8[0] - 1; - for( i = 0; i < 4; i++ ) - { - h->mb.cache.mvd[i_list][i8+i*8][0] = - h->mb.cache.mvd[i_list][i8+i*8][1] = 0; - } + h->mb.cache.mvd[i_list][i8+i*8][0] = + h->mb.cache.mvd[i_list][i8+i*8][1] = 0; } } } - /* load skip */ - if( h->sh.i_type == SLICE_TYPE_B && h->param.b_cabac ) + if( h->sh.i_type == SLICE_TYPE_B ) { memset( h->mb.cache.skip, 0, X264_SCAN8_SIZE * sizeof( int8_t ) ); - if( i_left_type >= 0 ) + if( i_neighbour & MB_TOP ) { + h->mb.cache.skip[x264_scan8[0] - 8] = h->mb.skipbp[i_top_xy] & 0x4; + h->mb.cache.skip[x264_scan8[4] - 8] = h->mb.skipbp[i_top_xy] & 0x8; + } + if( i_neighbour & MB_LEFT ) + { h->mb.cache.skip[x264_scan8[0] - 1] = h->mb.skipbp[i_left_xy] & 0x2; h->mb.cache.skip[x264_scan8[8] - 1] = h->mb.skipbp[i_left_xy] & 0x8; } - if( i_top_type >= 0 ) - { - h->mb.cache.skip[x264_scan8[0] - 8] = h->mb.skipbp[i_top_xy] & 0x4; - h->mb.cache.skip[x264_scan8[4] - 8] = h->mb.skipbp[i_top_xy] & 0x8; - } } - - if( h->sh.i_type == SLICE_TYPE_P ) - x264_mb_predict_mv_pskip( h, h->mb.cache.pskip_mv ); } - - h->mb.i_neighbour4[0] = - h->mb.i_neighbour8[0] = (h->mb.i_neighbour & (MB_TOP|MB_LEFT|MB_TOPLEFT)) - | ((h->mb.i_neighbour & MB_TOP) ? MB_TOPRIGHT : 0); - h->mb.i_neighbour4[4] = - h->mb.i_neighbour4[1] = MB_LEFT | ((h->mb.i_neighbour & MB_TOP) ? (MB_TOP|MB_TOPLEFT|MB_TOPRIGHT) : 0); - h->mb.i_neighbour4[2] = - h->mb.i_neighbour4[8] = - h->mb.i_neighbour4[10] = - h->mb.i_neighbour8[2] = MB_TOP|MB_TOPRIGHT | ((h->mb.i_neighbour & MB_LEFT) ? (MB_LEFT|MB_TOPLEFT) : 0); - h->mb.i_neighbour4[3] = - h->mb.i_neighbour4[7] = - h->mb.i_neighbour4[11] = - h->mb.i_neighbour4[13] = - h->mb.i_neighbour4[15] = - h->mb.i_neighbour8[3] = MB_LEFT|MB_TOP|MB_TOPLEFT; - h->mb.i_neighbour4[5] = - h->mb.i_neighbour8[1] = MB_LEFT | (h->mb.i_neighbour & MB_TOPRIGHT) - | ((h->mb.i_neighbour & MB_TOP) ? MB_TOP|MB_TOPLEFT : 0); - h->mb.i_neighbour4[6] = - h->mb.i_neighbour4[9] = - h->mb.i_neighbour4[12] = - h->mb.i_neighbour4[14] = MB_LEFT|MB_TOP|MB_TOPLEFT|MB_TOPRIGHT; } void x264_macroblock_cache_save( x264_t *h ) Index: common/macroblock.h =================================================================== --- common/macroblock.h (revision 735) +++ common/macroblock.h (working copy) @@ -242,7 +242,8 @@ int x264_macroblock_cache_init( x264_t *h ); void x264_macroblock_slice_init( x264_t *h ); -void x264_macroblock_cache_load( x264_t *h, int i_mb_x, int i_mb_y ); +void x264_macroblock_cache_load_first( x264_t *h, int i_mb_x, int i_mb_y ); +void x264_macroblock_cache_load_rest( x264_t *h ); void x264_macroblock_cache_save( x264_t *h ); void x264_macroblock_cache_end( x264_t *h );