+ if( i_y%2 == 1 )
+ {
+ p_src2_u += i_src2_pitch/2;
+ p_src2_v += i_src2_pitch/2;
+ }
+ }
+}
+static void BlendI420I420_no_alpha( filter_t *p_filter, picture_t *p_dst,
+ picture_t *p_dst_orig, picture_t *p_src,
+ int i_x_offset, int i_y_offset,
+ int i_width, int i_height )
+{
+ int i_src2_pitch, i_dst_pitch;
+ uint8_t *p_src2_y, *p_dst_y;
+ uint8_t *p_src2_u, *p_dst_u;
+ uint8_t *p_src2_v, *p_dst_v;
+ int i_y;
+ bool b_even_scanline = i_y_offset % 2;
+
+ i_dst_pitch = p_dst->p[Y_PLANE].i_pitch;
+ p_dst_y = p_dst->p[Y_PLANE].p_pixels + i_x_offset +
+ p_filter->fmt_out.video.i_x_offset +
+ p_dst->p[Y_PLANE].i_pitch *
+ ( i_y_offset + p_filter->fmt_out.video.i_y_offset );
+ p_dst_u = p_dst->p[U_PLANE].p_pixels + i_x_offset/2 +
+ p_filter->fmt_out.video.i_x_offset/2 +
+ ( i_y_offset + p_filter->fmt_out.video.i_y_offset ) / 2 *
+ p_dst->p[U_PLANE].i_pitch;
+ p_dst_v = p_dst->p[V_PLANE].p_pixels + i_x_offset/2 +
+ p_filter->fmt_out.video.i_x_offset/2 +
+ ( i_y_offset + p_filter->fmt_out.video.i_y_offset ) / 2 *
+ p_dst->p[V_PLANE].i_pitch;
+
+ p_src2_y = vlc_plane_start( &i_src2_pitch, p_src, Y_PLANE,
+ 0, 0, &p_filter->fmt_in.video, 1 );
+ p_src2_u = vlc_plane_start( NULL, p_src, U_PLANE,
+ 0, 0, &p_filter->fmt_in.video, 2 );
+ p_src2_v = vlc_plane_start( NULL, p_src, V_PLANE,
+ 0, 0, &p_filter->fmt_in.video, 2 );
+
+ i_width &= ~1;
+
+ /* Draw until we reach the bottom of the subtitle */
+ for( i_y = 0; i_y < i_height;
+ i_y++, p_dst_y += i_dst_pitch, p_src2_y += i_src2_pitch )
+ {
+ /* Completely opaque. Completely overwrite underlying pixel */
+ vlc_memcpy( p_dst_y, p_src2_y, i_width );
+ if( b_even_scanline )
+ {
+ p_dst_u += i_dst_pitch/2;
+ p_dst_v += i_dst_pitch/2;
+ }
+ else
+ {
+ vlc_memcpy( p_dst_u, p_src2_u, i_width/2 );
+ vlc_memcpy( p_dst_v, p_src2_v, i_width/2 );
+ }
+ b_even_scanline = !b_even_scanline;
+ if( i_y%2 == 1 )
+ {
+ p_src2_u += i_src2_pitch/2;
+ p_src2_v += i_src2_pitch/2;
+ }
+ }
+}
+
+static void BlendI420R16( filter_t *p_filter, picture_t *p_dst_pic,
+ picture_t *p_dst_orig, picture_t *p_src,
+ int i_x_offset, int i_y_offset,
+ int i_width, int i_height, int i_alpha )
+{
+ int i_src1_pitch, i_src2_pitch, i_dst_pitch;
+ uint8_t *p_dst, *p_src1, *p_src2_y;
+ uint8_t *p_src2_u, *p_src2_v;
+ int i_x, i_y, i_pix_pitch;
+ int r, g, b;
+
+ i_pix_pitch = p_dst_pic->p->i_pixel_pitch;
+ i_dst_pitch = p_dst_pic->p->i_pitch;
+ p_dst = p_dst_pic->p->p_pixels + i_x_offset * i_pix_pitch +
+ p_filter->fmt_out.video.i_x_offset * i_pix_pitch +
+ p_dst_pic->p->i_pitch *
+ ( i_y_offset + p_filter->fmt_out.video.i_y_offset );
+
+ i_src1_pitch = p_dst_orig->p[Y_PLANE].i_pitch;
+ p_src1 = p_dst_orig->p->p_pixels + i_x_offset * i_pix_pitch +
+ p_filter->fmt_out.video.i_x_offset * i_pix_pitch +
+ p_dst_orig->p->i_pitch *
+ ( i_y_offset + p_filter->fmt_out.video.i_y_offset );
+
+ p_src2_y = vlc_plane_start( &i_src2_pitch, p_src, Y_PLANE,
+ 0, 0, &p_filter->fmt_in.video, 1 );
+ p_src2_u = vlc_plane_start( NULL, p_src, U_PLANE,
+ 0, 0, &p_filter->fmt_in.video, 2 );
+ p_src2_v = vlc_plane_start( NULL, p_src, V_PLANE,
+ 0, 0, &p_filter->fmt_in.video, 2 );
+
+ /* Draw until we reach the bottom of the subtitle */
+ for( i_y = 0; i_y < i_height; i_y++,
+ p_dst += i_dst_pitch, p_src1 += i_src1_pitch,
+ p_src2_y += i_src2_pitch )
+ {
+ /* Draw until we reach the end of the line */
+ for( i_x = 0; i_x < i_width; i_x++ )
+ {
+ /* Blending */
+ yuv_to_rgb( &r, &g, &b,
+ p_src2_y[i_x], p_src2_u[i_x/2], p_src2_v[i_x/2] );
+
+ vlc_blend_rgb16( (uint16_t*)&p_dst[i_x * i_pix_pitch],
+ (const uint16_t*)&p_src1[i_x * i_pix_pitch],
+ r, g, b, 0xff, &p_filter->fmt_out.video );
+ }
+ if( i_y%2 == 1 )
+ {
+ p_src2_u += i_src2_pitch/2;
+ p_src2_v += i_src2_pitch/2;
+ }