From b522668d6b34f052afb9cc0a5d7d5f307abe0e5f Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Wed, 12 May 2010 14:15:19 +0300 Subject: [PATCH] blend: find correct blender on opening not inside Blend() I assume that chromas don't change while running on same filter. --- modules/video_filter/blend.c | 125 ++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/modules/video_filter/blend.c b/modules/video_filter/blend.c index 06d5847d23..530be44c88 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 ); } /*********************************************************************** -- 2.39.5