From: Yoann Peronneau Date: Sat, 6 Nov 2004 12:25:09 +0000 (+0000) Subject: * modules/video_filter/blend.c: added an i_alpha parameter for blending X-Git-Tag: 0.8.2~1779 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d36e5c7321adb6e620757673cf0a7af1fdead83b;p=vlc * modules/video_filter/blend.c: added an i_alpha parameter for blending --- diff --git a/include/vlc_filter.h b/include/vlc_filter.h index b6e2251ede..5d5829b5ac 100644 --- a/include/vlc_filter.h +++ b/include/vlc_filter.h @@ -55,7 +55,7 @@ struct filter_t block_t * ( * pf_audio_filter ) ( filter_t *, block_t * ); void ( * pf_video_blend ) ( filter_t *, picture_t *, picture_t *, picture_t *, - int, int ); + int, int, int ); subpicture_t * ( *pf_sub_filter ) ( filter_t *, mtime_t ); subpicture_t * ( *pf_render_string ) ( filter_t *, block_t * ); diff --git a/modules/video_filter/blend.c b/modules/video_filter/blend.c index 3116d153e3..bbf50dd782 100644 --- a/modules/video_filter/blend.c +++ b/modules/video_filter/blend.c @@ -42,22 +42,23 @@ struct filter_sys_t static int OpenFilter ( vlc_object_t * ); static void CloseFilter( vlc_object_t * ); +/* TODO i_alpha support for BlendR16 */ static void Blend( filter_t *, picture_t *, picture_t *, picture_t *, - int, int ); + int, int, int ); static void BlendI420( filter_t *, picture_t *, picture_t *, picture_t *, - int, int, int, int ); + int, int, int, int, int ); static void BlendR16( filter_t *, picture_t *, picture_t *, picture_t *, - int, int, int, int ); + int, int, int, int, int ); static void BlendR24( filter_t *, picture_t *, picture_t *, picture_t *, - int, int, int, int ); + int, int, int, int, int ); static void BlendYUY2( filter_t *, picture_t *, picture_t *, picture_t *, - int, int, int, int ); + int, int, int, int, int ); static void BlendPalI420( filter_t *, picture_t *, picture_t *, picture_t *, - int, int, int, int ); + int, int, int, int, int ); static void BlendPalYUY2( filter_t *, picture_t *, picture_t *, picture_t *, - int, int, int, int ); + int, int, int, int, int ); static void BlendPalRV( filter_t *, picture_t *, picture_t *, picture_t *, - int, int, int, int ); + int, int, int, int, int ); /***************************************************************************** * Module descriptor @@ -116,7 +117,7 @@ static int OpenFilter( vlc_object_t *p_this ) ****************************************************************************/ static void Blend( 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_x_offset, int i_y_offset, int i_alpha ) { int i_width, i_height; @@ -133,21 +134,21 @@ static void Blend( filter_t *p_filter, picture_t *p_dst, p_filter->fmt_out.video.i_chroma == VLC_FOURCC('Y','V','1','2') ) ) { BlendI420( p_filter, p_dst, p_dst_orig, p_src, - i_x_offset, i_y_offset, i_width, i_height ); + i_x_offset, i_y_offset, i_width, i_height, i_alpha ); return; } if( p_filter->fmt_in.video.i_chroma == VLC_FOURCC('Y','U','V','A') && p_filter->fmt_out.video.i_chroma == VLC_FOURCC('Y','U','Y','2') ) { BlendYUY2( p_filter, p_dst, p_dst_orig, p_src, - i_x_offset, i_y_offset, i_width, i_height ); + i_x_offset, i_y_offset, i_width, i_height, i_alpha ); return; } if( p_filter->fmt_in.video.i_chroma == VLC_FOURCC('Y','U','V','A') && p_filter->fmt_out.video.i_chroma == VLC_FOURCC('R','V','1','6') ) { BlendR16( p_filter, p_dst, p_dst_orig, p_src, - i_x_offset, i_y_offset, i_width, i_height ); + i_x_offset, i_y_offset, i_width, i_height, i_alpha ); return; } if( p_filter->fmt_in.video.i_chroma == VLC_FOURCC('Y','U','V','A') && @@ -155,7 +156,7 @@ static void Blend( filter_t *p_filter, picture_t *p_dst, p_filter->fmt_out.video.i_chroma == VLC_FOURCC('R','V','3','2') ) ) { BlendR24( p_filter, p_dst, p_dst_orig, p_src, - i_x_offset, i_y_offset, i_width, i_height ); + i_x_offset, i_y_offset, i_width, i_height, i_alpha ); return; } if( p_filter->fmt_in.video.i_chroma == VLC_FOURCC('Y','U','V','P') && @@ -163,14 +164,14 @@ static void Blend( filter_t *p_filter, picture_t *p_dst, p_filter->fmt_out.video.i_chroma == VLC_FOURCC('Y','V','1','2') ) ) { BlendPalI420( p_filter, p_dst, p_dst_orig, p_src, - i_x_offset, i_y_offset, i_width, i_height ); + i_x_offset, i_y_offset, i_width, i_height, i_alpha ); return; } if( p_filter->fmt_in.video.i_chroma == VLC_FOURCC('Y','U','V','P') && p_filter->fmt_out.video.i_chroma == VLC_FOURCC('Y','U','Y','2') ) { BlendPalYUY2( p_filter, p_dst, p_dst_orig, p_src, - i_x_offset, i_y_offset, i_width, i_height ); + i_x_offset, i_y_offset, i_width, i_height, i_alpha ); return; } if( p_filter->fmt_in.video.i_chroma == VLC_FOURCC('Y','U','V','P') && @@ -179,7 +180,7 @@ static void Blend( filter_t *p_filter, picture_t *p_dst, p_filter->fmt_out.video.i_chroma == VLC_FOURCC('R','V','3','2') ) ) { BlendPalRV( p_filter, p_dst, p_dst_orig, p_src, - i_x_offset, i_y_offset, i_width, i_height ); + i_x_offset, i_y_offset, i_width, i_height, i_alpha ); return; } @@ -189,14 +190,14 @@ static void Blend( filter_t *p_filter, picture_t *p_dst, static void BlendI420( 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_width, int i_height, int i_alpha ) { int i_src1_pitch, i_src2_pitch, i_dst_pitch; uint8_t *p_src1_y, *p_src2_y, *p_dst_y; uint8_t *p_src1_u, *p_src2_u, *p_dst_u; uint8_t *p_src1_v, *p_src2_v, *p_dst_v; uint8_t *p_trans; - int i_x, i_y; + int i_x, i_y, i_trans; vlc_bool_t b_even_scanline = i_y_offset % 2; i_dst_pitch = p_dst->p[Y_PLANE].i_pitch; @@ -261,12 +262,13 @@ static void BlendI420( filter_t *p_filter, picture_t *p_dst, /* Draw until we reach the end of the line */ for( i_x = 0; i_x < i_width; i_x++ ) { - if( !p_trans[i_x] ) + i_trans = ( p_trans[i_x] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ continue; } - else if( p_trans[i_x] == MAX_TRANS ) + else if( i_trans == MAX_TRANS ) { /* Completely opaque. Completely overwrite underlying pixel */ p_dst_y[i_x] = p_src2_y[i_x]; @@ -280,17 +282,17 @@ static void BlendI420( filter_t *p_filter, picture_t *p_dst, } /* Blending */ - p_dst_y[i_x] = ( (uint16_t)p_src2_y[i_x] * p_trans[i_x] + - (uint16_t)p_src1_y[i_x] * (MAX_TRANS - p_trans[i_x]) ) + p_dst_y[i_x] = ( (uint16_t)p_src2_y[i_x] * i_trans + + (uint16_t)p_src1_y[i_x] * (MAX_TRANS - i_trans) ) >> TRANS_BITS; if( b_even_scanline && i_x % 2 == 0 ) { - p_dst_u[i_x/2] = ( (uint16_t)p_src2_u[i_x] * p_trans[i_x] + - (uint16_t)p_src1_u[i_x/2] * (MAX_TRANS - p_trans[i_x]) ) + p_dst_u[i_x/2] = ( (uint16_t)p_src2_u[i_x] * i_trans + + (uint16_t)p_src1_u[i_x/2] * (MAX_TRANS - i_trans) ) >> TRANS_BITS; - p_dst_v[i_x/2] = ( (uint16_t)p_src2_v[i_x] * p_trans[i_x] + - (uint16_t)p_src1_v[i_x/2] * (MAX_TRANS - p_trans[i_x]) ) + p_dst_v[i_x/2] = ( (uint16_t)p_src2_v[i_x] * i_trans + + (uint16_t)p_src1_v[i_x/2] * (MAX_TRANS - i_trans) ) >> TRANS_BITS; } } @@ -328,7 +330,7 @@ static inline void yuv_to_rgb( int *r, int *g, int *b, static void BlendR16( 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_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; @@ -409,13 +411,13 @@ static void BlendR16( filter_t *p_filter, picture_t *p_dst_pic, static void BlendR24( 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_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; uint8_t *p_trans; - int i_x, i_y, i_pix_pitch; + int i_x, i_y, i_pix_pitch, i_trans; int r, g, b; i_pix_pitch = p_dst_pic->p->i_pixel_pitch; @@ -458,12 +460,13 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic, /* Draw until we reach the end of the line */ for( i_x = 0; i_x < i_width; i_x++ ) { - if( !p_trans[i_x] ) + i_trans = ( p_trans[i_x] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ continue; } - else if( p_trans[i_x] == MAX_TRANS ) + else if( i_trans == MAX_TRANS ) { /* Completely opaque. Completely overwrite underlying pixel */ yuv_to_rgb( &r, &g, &b, @@ -479,15 +482,15 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic, yuv_to_rgb( &r, &g, &b, p_src2_y[i_x], p_src2_u[i_x], p_src2_v[i_x] ); - p_dst[i_x * i_pix_pitch] = ( r * p_trans[i_x] + + p_dst[i_x * i_pix_pitch] = ( r * i_trans + (uint16_t)p_src1[i_x * i_pix_pitch] * - (MAX_TRANS - p_trans[i_x]) ) >> TRANS_BITS; - p_dst[i_x * i_pix_pitch + 1] = ( g * p_trans[i_x] + + (MAX_TRANS - i_trans) ) >> TRANS_BITS; + p_dst[i_x * i_pix_pitch + 1] = ( g * i_trans + (uint16_t)p_src1[i_x * i_pix_pitch + 1] * - (MAX_TRANS - p_trans[i_x]) ) >> TRANS_BITS; - p_dst[i_x * i_pix_pitch + 2] = ( b * p_trans[i_x] + + (MAX_TRANS - i_trans) ) >> TRANS_BITS; + p_dst[i_x * i_pix_pitch + 2] = ( b * i_trans + (uint16_t)p_src1[i_x * i_pix_pitch + 2] * - (MAX_TRANS - p_trans[i_x]) ) >> TRANS_BITS; + (MAX_TRANS - i_trans) ) >> TRANS_BITS; } } @@ -500,13 +503,13 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic, static void BlendYUY2( 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_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; uint8_t *p_trans; - int i_x, i_y, i_pix_pitch; + int i_x, i_y, i_pix_pitch, i_trans; i_pix_pitch = 2; i_dst_pitch = p_dst_pic->p->i_pitch; @@ -548,11 +551,12 @@ static void BlendYUY2( filter_t *p_filter, picture_t *p_dst_pic, /* Draw until we reach the end of the line */ for( i_x = 0; i_x < i_width; i_x += 2 ) { - if( !p_trans[i_x] ) + i_trans = ( p_trans[i_x] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ } - else if( p_trans[i_x] == MAX_TRANS ) + else if( i_trans == MAX_TRANS ) { /* Completely opaque. Completely overwrite underlying pixel */ p_dst[i_x * 2] = p_src2_y[i_x]; @@ -562,22 +566,23 @@ static void BlendYUY2( filter_t *p_filter, picture_t *p_dst_pic, else { /* Blending */ - p_dst[i_x * 2] = ( (uint16_t)p_src2_y[i_x] * p_trans[i_x] + - (uint16_t)p_src1[i_x * 2] * - (MAX_TRANS - p_trans[i_x]) ) >> TRANS_BITS; - p_dst[i_x * 2 + 1] = ( (uint16_t)p_src2_u[i_x] * p_trans[i_x] + - (uint16_t)p_src1[i_x * 2 + 1] * - (MAX_TRANS - p_trans[i_x]) ) >> TRANS_BITS; - p_dst[i_x * 2 + 3] = ( (uint16_t)p_src2_v[i_x] * p_trans[i_x] + - (uint16_t)p_src1[i_x * 2 + 3] * - (MAX_TRANS - p_trans[i_x]) ) >> TRANS_BITS; + p_dst[i_x * 2] = ( (uint16_t)p_src2_y[i_x] * i_trans + + (uint16_t)p_src1[i_x * 2] * (MAX_TRANS - i_trans) ) + >> TRANS_BITS; + p_dst[i_x * 2 + 1] = ( (uint16_t)p_src2_u[i_x] * i_trans + + (uint16_t)p_src1[i_x * 2 + 1] * (MAX_TRANS - i_trans) ) + >> TRANS_BITS; + p_dst[i_x * 2 + 3] = ( (uint16_t)p_src2_v[i_x] * i_trans + + (uint16_t)p_src1[i_x * 2 + 3] * (MAX_TRANS - i_trans) ) + >> TRANS_BITS; } - if( !p_trans[i_x+1] ) + i_trans = ( p_trans[i_x+1] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ } - else if( p_trans[i_x+1] == MAX_TRANS ) + else if( i_trans == MAX_TRANS ) { /* Completely opaque. Completely overwrite underlying pixel */ p_dst[i_x * 2 + 2] = p_src2_y[i_x + 1]; @@ -585,9 +590,9 @@ static void BlendYUY2( filter_t *p_filter, picture_t *p_dst_pic, else { /* Blending */ - p_dst[i_x * 2 + 2] = ( (uint16_t)p_src2_y[i_x+1] * - p_trans[i_x+1] + (uint16_t)p_src1[i_x * 2 + 2] * - (MAX_TRANS - p_trans[i_x+1]) ) >> TRANS_BITS; + p_dst[i_x * 2 + 2] = ( (uint16_t)p_src2_y[i_x+1] * i_trans + + (uint16_t)p_src1[i_x * 2 + 2] * (MAX_TRANS - i_trans) ) + >> TRANS_BITS; } } } @@ -601,13 +606,13 @@ static void BlendYUY2( filter_t *p_filter, picture_t *p_dst_pic, static void BlendPalI420( 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_width, int i_height, int i_alpha ) { int i_src1_pitch, i_src2_pitch, i_dst_pitch; uint8_t *p_src1_y, *p_src2, *p_dst_y; uint8_t *p_src1_u, *p_dst_u; uint8_t *p_src1_v, *p_dst_v; - int i_x, i_y; + int i_x, i_y, i_trans; vlc_bool_t b_even_scanline = i_y_offset % 2; i_dst_pitch = p_dst->p[Y_PLANE].i_pitch; @@ -661,12 +666,13 @@ static void BlendPalI420( filter_t *p_filter, picture_t *p_dst, /* Draw until we reach the end of the line */ for( i_x = 0; i_x < i_width; i_x++ ) { - if( !p_pal[p_trans[i_x]][3] ) + i_trans = ( p_pal[p_trans[i_x]][3] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ continue; } - else if( p_pal[p_trans[i_x]][3] == MAX_TRANS ) + else if( i_trans == MAX_TRANS ) { /* Completely opaque. Completely overwrite underlying pixel */ p_dst_y[i_x] = p_pal[p_src2[i_x]][0]; @@ -680,18 +686,18 @@ static void BlendPalI420( filter_t *p_filter, picture_t *p_dst, } /* Blending */ - p_dst_y[i_x] = ( (uint16_t)p_pal[p_src2[i_x]][0] * - p_pal[p_trans[i_x]][3] + (uint16_t)p_src1_y[i_x] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + p_dst_y[i_x] = ( (uint16_t)p_pal[p_src2[i_x]][0] * i_trans + + (uint16_t)p_src1_y[i_x] * (MAX_TRANS - i_trans) ) + >> TRANS_BITS; if( b_even_scanline && i_x % 2 == 0 ) { - p_dst_u[i_x/2] = ( (uint16_t)p_pal[p_src2[i_x]][1] * - p_pal[p_trans[i_x]][3] + (uint16_t)p_src1_u[i_x/2] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; - p_dst_v[i_x/2] = ( (uint16_t)p_pal[p_src2[i_x]][2] * - p_pal[p_trans[i_x]][3] + (uint16_t)p_src1_v[i_x/2] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + p_dst_u[i_x/2] = ( (uint16_t)p_pal[p_src2[i_x]][1] * i_trans + + (uint16_t)p_src1_u[i_x/2] * (MAX_TRANS - i_trans) ) + >> TRANS_BITS; + p_dst_v[i_x/2] = ( (uint16_t)p_pal[p_src2[i_x]][2] * i_trans + + (uint16_t)p_src1_v[i_x/2] * (MAX_TRANS - i_trans) ) + >> TRANS_BITS; } } } @@ -707,11 +713,11 @@ static void BlendPalI420( filter_t *p_filter, picture_t *p_dst, static void BlendPalYUY2( 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_width, int i_height, int i_alpha ) { int i_src1_pitch, i_src2_pitch, i_dst_pitch; uint8_t *p_src1, *p_src2, *p_dst; - int i_x, i_y, i_pix_pitch; + int i_x, i_y, i_pix_pitch, i_trans; i_pix_pitch = 2; i_dst_pitch = p_dst_pic->p->i_pitch; @@ -740,11 +746,12 @@ static void BlendPalYUY2( filter_t *p_filter, picture_t *p_dst_pic, /* Draw until we reach the end of the line */ for( i_x = 0; i_x < i_width; i_x += 2 ) { - if( !p_pal[p_trans[i_x]][3] ) + i_trans = ( p_pal[p_trans[i_x]][3] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ } - else if( p_pal[p_trans[i_x]][3] == MAX_TRANS ) + else if( i_trans == MAX_TRANS ) { /* Completely opaque. Completely overwrite underlying pixel */ p_dst[i_x * 2] = p_pal[p_src2[i_x]][0]; @@ -755,21 +762,22 @@ static void BlendPalYUY2( filter_t *p_filter, picture_t *p_dst_pic, { /* Blending */ p_dst[i_x * 2] = ( (uint16_t)p_pal[p_src2[i_x]][0] * - p_pal[p_trans[i_x]][3] + (uint16_t)p_src1[i_x * 2] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + i_trans + (uint16_t)p_src1[i_x * 2] * + (MAX_TRANS - i_trans) ) >> TRANS_BITS; p_dst[i_x * 2 + 1] = ( (uint16_t)p_pal[p_src2[i_x]][1] * - p_pal[p_trans[i_x]][3] + (uint16_t)p_src1[i_x * 2 + 1] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + i_trans + (uint16_t)p_src1[i_x * 2 + 1] * + (MAX_TRANS - i_trans) ) >> TRANS_BITS; p_dst[i_x * 2 + 3] = ( (uint16_t)p_pal[p_src2[i_x]][2] * - p_pal[p_trans[i_x]][3] + (uint16_t)p_src1[i_x * 2 + 3] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + i_trans + (uint16_t)p_src1[i_x * 2 + 3] * + (MAX_TRANS - i_trans) ) >> TRANS_BITS; } - if( !p_pal[p_trans[i_x+1]][3] ) + i_trans = ( p_pal[p_trans[i_x+1]][3] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ } - else if( p_pal[p_trans[i_x+1]][3] == MAX_TRANS ) + else if( i_trans == MAX_TRANS ) { /* Completely opaque. Completely overwrite underlying pixel */ p_dst[i_x * 2 + 2] = p_pal[p_src2[i_x + 1]][0]; @@ -778,8 +786,8 @@ static void BlendPalYUY2( filter_t *p_filter, picture_t *p_dst_pic, { /* Blending */ p_dst[i_x * 2 + 2] = ( (uint16_t)p_pal[p_src2[i_x+1]][0] * - p_pal[p_trans[i_x+1]][3] + (uint16_t)p_src1[i_x * 2 + 2] * - (MAX_TRANS - p_pal[p_trans[i_x+1]][3]) ) >> TRANS_BITS; + i_trans + (uint16_t)p_src1[i_x * 2 + 2] * + (MAX_TRANS - i_trans) ) >> TRANS_BITS; } } } @@ -795,11 +803,11 @@ static void BlendPalYUY2( filter_t *p_filter, picture_t *p_dst_pic, static void BlendPalRV( 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_width, int i_height, int i_alpha ) { int i_src1_pitch, i_src2_pitch, i_dst_pitch; uint8_t *p_src1, *p_src2, *p_dst; - int i_x, i_y, i_pix_pitch; + int i_x, i_y, i_pix_pitch, i_trans; int r, g, b; video_palette_t rgbpalette; @@ -848,12 +856,13 @@ static void BlendPalRV( filter_t *p_filter, picture_t *p_dst_pic, /* Draw until we reach the end of the line */ for( i_x = 0; i_x < i_width; i_x++ ) { - if( !p_pal[p_trans[i_x]][3] ) + i_trans = ( p_pal[p_trans[i_x]][3] * i_alpha ) / 255; + if( !i_trans ) { /* Completely transparent. Don't change pixel */ continue; } - else if( p_pal[p_trans[i_x]][3] == MAX_TRANS || + else if( i_trans == MAX_TRANS || p_filter->fmt_out.video.i_chroma == VLC_FOURCC('R','V','1','6') ) { @@ -868,17 +877,14 @@ static void BlendPalRV( filter_t *p_filter, picture_t *p_dst_pic, /* Blending */ p_dst[i_x * i_pix_pitch] = ( (uint16_t)rgbpal[p_src2[i_x]][0] * - p_pal[p_trans[i_x]][3] + - (uint16_t)p_src1[i_x * i_pix_pitch] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + i_trans + (uint16_t)p_src1[i_x * i_pix_pitch] * + (MAX_TRANS - i_trans) ) >> TRANS_BITS; p_dst[i_x * i_pix_pitch + 1] = ( (uint16_t)rgbpal[p_src2[i_x]][1] * - p_pal[p_trans[i_x]][3] + - (uint16_t)p_src1[i_x * i_pix_pitch + 1] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + i_trans + (uint16_t)p_src1[i_x * i_pix_pitch + 1] * + (MAX_TRANS - i_trans) ) >> TRANS_BITS; p_dst[i_x * i_pix_pitch + 2] = ( (uint16_t)rgbpal[p_src2[i_x]][2] * - p_pal[p_trans[i_x]][3] + - (uint16_t)p_src1[i_x * i_pix_pitch + 2] * - (MAX_TRANS - p_pal[p_trans[i_x]][3]) ) >> TRANS_BITS; + i_trans + (uint16_t)p_src1[i_x * i_pix_pitch + 2] * + (MAX_TRANS - i_trans) ) >> TRANS_BITS; } } diff --git a/modules/video_filter/logo.c b/modules/video_filter/logo.c index e3ddb24a2e..c1851cbb3e 100644 --- a/modules/video_filter/logo.c +++ b/modules/video_filter/logo.c @@ -441,7 +441,8 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) vout_DatePicture( p_sys->p_vout, p_outpic, p_pic->date ); p_sys->p_blend->pf_video_blend( p_sys->p_blend, p_outpic, p_outpic, - p_sys->p_pic, p_sys->posx, p_sys->posy ); + p_sys->p_pic, p_sys->posx, p_sys->posy, + 255 ); vout_DisplayPicture( p_sys->p_vout, p_outpic ); } diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index a539d2bcd1..202349517c 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -725,7 +725,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, p_fmt->i_height; p_spu->p_blend->pf_video_blend( p_spu->p_blend, p_pic_dst, - p_pic_src, &p_region->picture, i_x_offset, i_y_offset ); + p_pic_src, &p_region->picture, i_x_offset, i_y_offset, 255 ); p_region = p_region->p_next; }