+static ALWAYS_INLINE int x264_analyse_bi_chroma( x264_t *h, x264_mb_analysis_t *a, int idx, int i_pixel )
+{
+ ALIGNED_ARRAY_N( pixel, pix, [4],[16*16] );
+ ALIGNED_ARRAY_N( pixel, bi, [2],[16*16] );
+ int i_chroma_cost = 0;
+ int chromapix = h->luma2chroma_pixel[i_pixel];
+
+#define COST_BI_CHROMA( m0, m1, width, height ) \
+{ \
+ if( CHROMA444 ) \
+ { \
+ h->mc.mc_luma( pix[0], 16, &m0.p_fref[4], m0.i_stride[1], \
+ m0.mv[0], m0.mv[1], width, height, x264_weight_none ); \
+ h->mc.mc_luma( pix[1], 16, &m0.p_fref[8], m0.i_stride[2], \
+ m0.mv[0], m0.mv[1], width, height, x264_weight_none ); \
+ h->mc.mc_luma( pix[2], 16, &m1.p_fref[4], m1.i_stride[1], \
+ m1.mv[0], m1.mv[1], width, height, x264_weight_none ); \
+ h->mc.mc_luma( pix[3], 16, &m1.p_fref[8], m1.i_stride[2], \
+ m1.mv[0], m1.mv[1], width, height, x264_weight_none ); \
+ } \
+ else \
+ { \
+ int v_shift = CHROMA_V_SHIFT; \
+ int l0_mvy_offset = v_shift & MB_INTERLACED & m0.i_ref ? (h->mb.i_mb_y & 1)*4 - 2 : 0; \
+ int l1_mvy_offset = v_shift & MB_INTERLACED & m1.i_ref ? (h->mb.i_mb_y & 1)*4 - 2 : 0; \
+ h->mc.mc_chroma( pix[0], pix[1], 16, m0.p_fref[4], m0.i_stride[1], \
+ m0.mv[0], 2*(m0.mv[1]+l0_mvy_offset)>>v_shift, width>>1, height>>v_shift ); \
+ h->mc.mc_chroma( pix[2], pix[3], 16, m1.p_fref[4], m1.i_stride[1], \
+ m1.mv[0], 2*(m1.mv[1]+l1_mvy_offset)>>v_shift, width>>1, height>>v_shift ); \
+ } \
+ h->mc.avg[chromapix]( bi[0], 16, pix[0], 16, pix[2], 16, h->mb.bipred_weight[m0.i_ref][m1.i_ref] ); \
+ h->mc.avg[chromapix]( bi[1], 16, pix[1], 16, pix[3], 16, h->mb.bipred_weight[m0.i_ref][m1.i_ref] ); \
+ i_chroma_cost = h->pixf.mbcmp[chromapix]( m0.p_fenc[1], FENC_STRIDE, bi[0], 16 ) \
+ + h->pixf.mbcmp[chromapix]( m0.p_fenc[2], FENC_STRIDE, bi[1], 16 ); \
+}
+
+ if( i_pixel == PIXEL_16x16 )
+ COST_BI_CHROMA( a->l0.bi16x16, a->l1.bi16x16, 16, 16 )
+ else if( i_pixel == PIXEL_16x8 )
+ COST_BI_CHROMA( a->l0.me16x8[idx], a->l1.me16x8[idx], 16, 8 )
+ else if( i_pixel == PIXEL_8x16 )
+ COST_BI_CHROMA( a->l0.me8x16[idx], a->l1.me8x16[idx], 8, 16 )
+ else
+ COST_BI_CHROMA( a->l0.me8x8[idx], a->l1.me8x8[idx], 8, 8 )
+
+ return i_chroma_cost;
+}
+