- get_plane_ptr( h, src, &pix[1], &stride[1], i_csp==X264_CSP_I420 ? 1 : 2, 1, 1 );
- get_plane_ptr( h, src, &pix[2], &stride[2], i_csp==X264_CSP_I420 ? 2 : 1, 1, 1 );
- h->mc.plane_copy_interleave( dst->plane[1], dst->i_stride[1],
- (pixel*)pix[1], stride[1]/sizeof(pixel),
- (pixel*)pix[2], stride[2]/sizeof(pixel),
- h->param.i_width>>1, h->param.i_height>>1 );
+ int v_shift = CHROMA_V_SHIFT;
+ get_plane_ptr( h, src, &pix[0], &stride[0], 0, 0, 0 );
+ h->mc.plane_copy( dst->plane[0], dst->i_stride[0], (pixel*)pix[0],
+ stride[0]/sizeof(pixel), h->param.i_width, h->param.i_height );
+ if( i_csp == X264_CSP_NV12 || i_csp == X264_CSP_NV16 )
+ {
+ get_plane_ptr( h, src, &pix[1], &stride[1], 1, 0, v_shift );
+ h->mc.plane_copy( dst->plane[1], dst->i_stride[1], (pixel*)pix[1],
+ stride[1]/sizeof(pixel), h->param.i_width, h->param.i_height>>v_shift );
+ }
+ else if( i_csp == X264_CSP_NV21 )
+ {
+ get_plane_ptr( h, src, &pix[1], &stride[1], 1, 0, v_shift );
+ h->mc.plane_copy_swap( dst->plane[1], dst->i_stride[1], (pixel*)pix[1],
+ stride[1]/sizeof(pixel), h->param.i_width>>1, h->param.i_height>>v_shift );
+ }
+ else if( i_csp == X264_CSP_I420 || i_csp == X264_CSP_I422 || i_csp == X264_CSP_YV12 || i_csp == X264_CSP_YV16 )
+ {
+ int uv_swap = i_csp == X264_CSP_YV12 || i_csp == X264_CSP_YV16;
+ get_plane_ptr( h, src, &pix[1], &stride[1], uv_swap ? 2 : 1, 1, v_shift );
+ get_plane_ptr( h, src, &pix[2], &stride[2], uv_swap ? 1 : 2, 1, v_shift );
+ h->mc.plane_copy_interleave( dst->plane[1], dst->i_stride[1],
+ (pixel*)pix[1], stride[1]/sizeof(pixel),
+ (pixel*)pix[2], stride[2]/sizeof(pixel),
+ h->param.i_width>>1, h->param.i_height>>v_shift );
+ }
+ else //if( i_csp == X264_CSP_I444 || i_csp == X264_CSP_YV24 )
+ {
+ get_plane_ptr( h, src, &pix[1], &stride[1], i_csp==X264_CSP_I444 ? 1 : 2, 0, 0 );
+ get_plane_ptr( h, src, &pix[2], &stride[2], i_csp==X264_CSP_I444 ? 2 : 1, 0, 0 );
+ h->mc.plane_copy( dst->plane[1], dst->i_stride[1], (pixel*)pix[1],
+ stride[1]/sizeof(pixel), h->param.i_width, h->param.i_height );
+ h->mc.plane_copy( dst->plane[2], dst->i_stride[2], (pixel*)pix[2],
+ stride[2]/sizeof(pixel), h->param.i_width, h->param.i_height );
+ }