X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Fblend.c;h=de071804d1ec363d869b3e62ba2c17fe9c012d83;hb=351139f592525158be8b6fe55c94ebb945568287;hp=06d5847d238e3f01a0a9d811a43ccec9a10994b9;hpb=fad6ff80c03e952847b23afdfa0c546cef801994;p=vlc diff --git a/modules/video_filter/blend.c b/modules/video_filter/blend.c index 06d5847d23..de071804d1 100644 --- a/modules/video_filter/blend.c +++ b/modules/video_filter/blend.c @@ -93,17 +93,63 @@ static void BlendRGBAR16( filter_t *, picture_t *, const picture_t *, static void BlendRGBAR24( filter_t *, picture_t *, const picture_t *, int, int, int, int, int ); +struct filter_sys_t +{ + int i_blendcfg; +}; + +typedef void (*BlendFunction)( filter_t *, + picture_t *, const picture_t *, + int , int , int , int , int ); + +#define VLC_CODEC_PLANAR_420 { VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_YV12, 0 } +#define VLC_CODEC_PACKED_422 { VLC_CODEC_YUYV, VLC_CODEC_UYVY, VLC_CODEC_YVYU, VLC_CODEC_VYUY, 0 } +#define VLC_CODEC_RGB_16 { VLC_CODEC_RGB15, VLC_CODEC_RGB16, 0 } +#define VLC_CODEC_RGB_24 { VLC_CODEC_RGB24, VLC_CODEC_RGB32, 0 } + +#define BLEND_CFG( fccSrc, fctPlanar, fctPacked, fctRgb16, fctRgb24 ) \ + { .src = fccSrc, .p_dst = VLC_CODEC_PLANAR_420, .pf_blend = fctPlanar }, \ + { .src = fccSrc, .p_dst = VLC_CODEC_PACKED_422, .pf_blend = fctPacked }, \ + { .src = fccSrc, .p_dst = VLC_CODEC_RGB_16, .pf_blend = fctRgb16 }, \ + { .src = fccSrc, .p_dst = VLC_CODEC_RGB_24, .pf_blend = fctRgb24 } + +static const struct +{ + vlc_fourcc_t src; + vlc_fourcc_t p_dst[16]; + BlendFunction pf_blend; +} p_blend_cfg[] = { + + BLEND_CFG( VLC_CODEC_YUVA, BlendYUVAI420, BlendYUVAYUVPacked, BlendYUVARV16, BlendYUVARV24 ), + + BLEND_CFG( VLC_CODEC_YUVP, BlendPalI420, BlendPalYUVPacked, BlendPalRV, BlendPalRV ), + + BLEND_CFG( VLC_CODEC_RGBA, BlendRGBAI420, BlendRGBAYUVPacked, BlendRGBAR16, BlendRGBAR24 ), + + BLEND_CFG( VLC_CODEC_I420, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ), + + BLEND_CFG( VLC_CODEC_YV12, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ), + + { 0, {0,}, NULL } +}; + /***************************************************************************** * OpenFilter: probe the filter and return score *****************************************************************************/ static int OpenFilter( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t*)p_this; + filter_sys_t *p_sys = (filter_sys_t *)malloc( sizeof( filter_sys_t ) ); + if( !p_sys ) + return VLC_ENOMEM; + p_filter->p_sys = p_sys; + p_filter->p_sys->i_blendcfg = -1; /* Check if we can handle that format. * We could try to use a chroma filter if we can't. */ int in_chroma = p_filter->fmt_in.video.i_chroma; int out_chroma = p_filter->fmt_out.video.i_chroma; + if( ( in_chroma != VLC_CODEC_YUVA && in_chroma != VLC_CODEC_I420 && in_chroma != VLC_CODEC_YV12 && in_chroma != VLC_CODEC_YUVP && in_chroma != VLC_CODEC_RGBA ) || @@ -118,6 +164,27 @@ static int OpenFilter( vlc_object_t *p_this ) { return VLC_EGENERIC; } + for( int i = 0; p_blend_cfg[i].src != 0; i++ ) + { + if( p_blend_cfg[i].src != p_filter->fmt_in.video.i_chroma ) + continue; + for( int j = 0; p_blend_cfg[i].p_dst[j] != 0; j++ ) + { + if( p_blend_cfg[i].p_dst[j] != p_filter->fmt_out.video.i_chroma ) + continue; + p_sys->i_blendcfg = i; + } + } + + if( p_sys->i_blendcfg == -1 ) + { + msg_Dbg( p_filter, "no matching alpha blending routine " + "(chroma: %4.4s -> %4.4s)", + (char *)&p_filter->fmt_in.video.i_chroma, + (char *)&p_filter->fmt_out.video.i_chroma ); + free( p_sys ); + return VLC_EGENERIC; + } /* Misc init */ p_filter->pf_video_blend = Blend; @@ -134,7 +201,8 @@ static int OpenFilter( vlc_object_t *p_this ) *****************************************************************************/ static void CloseFilter( vlc_object_t *p_this ) { - (void)p_this; + filter_t *p_filter = (filter_t*)p_this; + free( p_filter->p_sys ); } /**************************************************************************** @@ -142,40 +210,6 @@ static void CloseFilter( vlc_object_t *p_this ) **************************************************************************** * This function is called just after the thread is launched. ****************************************************************************/ -typedef void (*BlendFunction)( filter_t *, - picture_t *, const picture_t *, - int , int , int , int , int ); - -#define VLC_CODEC_PLANAR_420 { VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_YV12, 0 } -#define VLC_CODEC_PACKED_422 { VLC_CODEC_YUYV, VLC_CODEC_UYVY, VLC_CODEC_YVYU, VLC_CODEC_VYUY, 0 } -#define VLC_CODEC_RGB_16 { VLC_CODEC_RGB15, VLC_CODEC_RGB16, 0 } -#define VLC_CODEC_RGB_24 { VLC_CODEC_RGB24, VLC_CODEC_RGB32, 0 } - -#define BLEND_CFG( fccSrc, fctPlanar, fctPacked, fctRgb16, fctRgb24 ) \ - { .src = fccSrc, .p_dst = VLC_CODEC_PLANAR_420, .pf_blend = fctPlanar }, \ - { .src = fccSrc, .p_dst = VLC_CODEC_PACKED_422, .pf_blend = fctPacked }, \ - { .src = fccSrc, .p_dst = VLC_CODEC_RGB_16, .pf_blend = fctRgb16 }, \ - { .src = fccSrc, .p_dst = VLC_CODEC_RGB_24, .pf_blend = fctRgb24 } - -static const struct -{ - vlc_fourcc_t src; - vlc_fourcc_t p_dst[16]; - BlendFunction pf_blend; -} p_blend_cfg[] = { - - BLEND_CFG( VLC_CODEC_YUVA, BlendYUVAI420, BlendYUVAYUVPacked, BlendYUVARV16, BlendYUVARV24 ), - - BLEND_CFG( VLC_CODEC_YUVP, BlendPalI420, BlendPalYUVPacked, BlendPalRV, BlendPalRV ), - - BLEND_CFG( VLC_CODEC_RGBA, BlendRGBAI420, BlendRGBAYUVPacked, BlendRGBAR16, BlendRGBAR24 ), - - BLEND_CFG( VLC_CODEC_I420, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ), - - BLEND_CFG( VLC_CODEC_YV12, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ), - - { 0, {0,}, NULL } -}; static void Blend( filter_t *p_filter, picture_t *p_dst, const picture_t *p_src, @@ -204,26 +238,11 @@ static void Blend( filter_t *p_filter, (char *)&p_filter->fmt_out.video.i_chroma ); #endif - for( int i = 0; p_blend_cfg[i].src != 0; i++ ) - { - if( p_blend_cfg[i].src != p_filter->fmt_in.video.i_chroma ) - continue; - for( int j = 0; p_blend_cfg[i].p_dst[j] != 0; j++ ) - { - if( p_blend_cfg[i].p_dst[j] != p_filter->fmt_out.video.i_chroma ) - continue; - p_blend_cfg[i].pf_blend( p_filter, p_dst, p_src, - i_x_offset, i_y_offset, - i_width, i_height, i_alpha ); - return; - } - } + p_blend_cfg[p_filter->p_sys->i_blendcfg].pf_blend( p_filter, p_dst, p_src, + i_x_offset, i_y_offset, + i_width, i_height, i_alpha ); - msg_Dbg( p_filter, "no matching alpha blending routine " - "(chroma: %4.4s -> %4.4s)", - (char *)&p_filter->fmt_in.video.i_chroma, - (char *)&p_filter->fmt_out.video.i_chroma ); } /*********************************************************************** @@ -583,12 +602,6 @@ static void BlendYUVARV24( filter_t *p_filter, else { int i_rindex, i_gindex, i_bindex; - uint32_t i_rmask, i_gmask, i_bmask; - - i_rmask = p_filter->fmt_out.video.i_rmask; - i_gmask = p_filter->fmt_out.video.i_gmask; - i_bmask = p_filter->fmt_out.video.i_bmask; - vlc_rgb_index( &i_rindex, &i_gindex, &i_bindex, &p_filter->fmt_out.video ); /* Draw until we reach the bottom of the subtitle */