X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Fdeinterlace.c;h=5280f85ada764d7ff35b064a19db6af0f50223c9;hb=b481254cc8ecc3464270101a2a16fb7e4f37fe3f;hp=c7992980295945da926638222e4967f73d5561da;hpb=449fd28aaf007c6411251dae9d0dbfdc65b135d1;p=vlc diff --git a/modules/video_filter/deinterlace.c b/modules/video_filter/deinterlace.c index c799298029..5280f85ada 100644 --- a/modules/video_filter/deinterlace.c +++ b/modules/video_filter/deinterlace.c @@ -24,21 +24,23 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include -#include -#include -#include "vlc_filter.h" +#include #ifdef HAVE_ALTIVEC_H # include #endif +#include +#include +#include +#include +#include "vlc_filter.h" + #ifdef CAN_COMPILE_MMXEXT # include "mmx.h" #endif @@ -115,35 +117,36 @@ static int FilterCallback ( vlc_object_t *, char const *, #define FILTER_CFG_PREFIX "sout-deinterlace-" -static const char *mode_list[] = { "discard", "blend", "mean", "bob", "linear", "x" }; -static const char *mode_list_text[] = { N_("Discard"), N_("Blend"), N_("Mean"), - N_("Bob"), N_("Linear"), "X" }; +static const char *const mode_list[] = { + "discard", "blend", "mean", "bob", "linear", "x" }; +static const char *const mode_list_text[] = { + N_("Discard"), N_("Blend"), N_("Mean"), N_("Bob"), N_("Linear"), "X" }; -vlc_module_begin(); - set_description( _("Deinterlacing video filter") ); - set_shortname( _("Deinterlace" )); - set_capability( "video filter", 0 ); - set_category( CAT_VIDEO ); - set_subcategory( SUBCAT_VIDEO_VFILTER ); +vlc_module_begin () + set_description( N_("Deinterlacing video filter") ) + set_shortname( N_("Deinterlace" )) + set_capability( "video filter", 0 ) + set_category( CAT_VIDEO ) + set_subcategory( SUBCAT_VIDEO_VFILTER ) - set_section( N_("Display"),NULL); + set_section( N_("Display"),NULL) add_string( "deinterlace-mode", "discard", NULL, MODE_TEXT, MODE_LONGTEXT, false ); change_string_list( mode_list, mode_list_text, 0 ); - add_shortcut( "deinterlace" ); - set_callbacks( Create, Destroy ); + add_shortcut( "deinterlace" ) + set_callbacks( Create, Destroy ) - add_submodule(); - set_capability( "video filter2", 0 ); - set_section( N_("Streaming"),NULL); + add_submodule () + set_capability( "video filter2", 0 ) + set_section( N_("Streaming"),NULL) add_string( FILTER_CFG_PREFIX "mode", "blend", NULL, SOUT_MODE_TEXT, SOUT_MODE_LONGTEXT, false ); change_string_list( mode_list, mode_list_text, 0 ); - set_callbacks( OpenFilter, CloseFilter ); -vlc_module_end(); + set_callbacks( OpenFilter, CloseFilter ) +vlc_module_end () -static const char *ppsz_filter_options[] = { +static const char *const ppsz_filter_options[] = { "mode", NULL }; @@ -157,6 +160,7 @@ struct vout_sys_t { int i_mode; /* Deinterlace mode */ bool b_double_rate; /* Shall we double the framerate? */ + bool b_half_height; /* Shall be devide the height by 2 */ mtime_t last_date; mtime_t next_date; @@ -190,10 +194,7 @@ static int Create( vlc_object_t *p_this ) /* Allocate structure */ p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); if( p_vout->p_sys == NULL ) - { - msg_Err( p_vout, "out of memory" ); return VLC_ENOMEM; - } p_vout->pf_init = Init; p_vout->pf_end = End; @@ -204,9 +205,10 @@ static int Create( vlc_object_t *p_this ) p_vout->p_sys->i_mode = DEINTERLACE_DISCARD; p_vout->p_sys->b_double_rate = false; + p_vout->p_sys->b_half_height = true; p_vout->p_sys->last_date = 0; p_vout->p_sys->p_vout = 0; - vlc_mutex_init( p_vout, &p_vout->p_sys->filter_lock ); + vlc_mutex_init( &p_vout->p_sys->filter_lock ); #if defined(CAN_COMPILE_C_ALTIVEC) if( vlc_CPU() & CPU_CAPABILITY_ALTIVEC ) @@ -271,15 +273,11 @@ static int Create( vlc_object_t *p_this ) *****************************************************************************/ static void SetFilterMethod( vout_thread_t *p_vout, char *psz_method ) { - if( !strcmp( psz_method, "discard" ) ) - { - p_vout->p_sys->i_mode = DEINTERLACE_DISCARD; - p_vout->p_sys->b_double_rate = false; - } - else if( !strcmp( psz_method, "mean" ) ) + if( !strcmp( psz_method, "mean" ) ) { p_vout->p_sys->i_mode = DEINTERLACE_MEAN; p_vout->p_sys->b_double_rate = false; + p_vout->p_sys->b_half_height = true; } else if( !strcmp( psz_method, "blend" ) || !strcmp( psz_method, "average" ) @@ -287,27 +285,37 @@ static void SetFilterMethod( vout_thread_t *p_vout, char *psz_method ) { p_vout->p_sys->i_mode = DEINTERLACE_BLEND; p_vout->p_sys->b_double_rate = false; + p_vout->p_sys->b_half_height = false; } else if( !strcmp( psz_method, "bob" ) || !strcmp( psz_method, "progressive-scan" ) ) { p_vout->p_sys->i_mode = DEINTERLACE_BOB; p_vout->p_sys->b_double_rate = true; + p_vout->p_sys->b_half_height = false; } else if( !strcmp( psz_method, "linear" ) ) { p_vout->p_sys->i_mode = DEINTERLACE_LINEAR; p_vout->p_sys->b_double_rate = true; + p_vout->p_sys->b_half_height = false; } else if( !strcmp( psz_method, "x" ) ) { p_vout->p_sys->i_mode = DEINTERLACE_X; p_vout->p_sys->b_double_rate = false; + p_vout->p_sys->b_half_height = false; } else { - msg_Err( p_vout, "no valid deinterlace mode provided, " - "using \"discard\"" ); + const bool b_i422 = p_vout->render.i_chroma == VLC_FOURCC('I','4','2','2'); + if( strcmp( psz_method, "discard" ) ) + msg_Err( p_vout, "no valid deinterlace mode provided, " + "using \"discard\"" ); + + p_vout->p_sys->i_mode = DEINTERLACE_DISCARD; + p_vout->p_sys->b_double_rate = false; + p_vout->p_sys->b_half_height = !b_i422; } msg_Dbg( p_vout, "using %s deinterlace method", psz_method ); @@ -377,32 +385,32 @@ static vout_thread_t *SpawnRealVout( vout_thread_t *p_vout ) msg_Dbg( p_vout, "spawning the real video output" ); fmt = p_vout->fmt_out; + if( p_vout->p_sys->b_half_height ) + { + fmt.i_height /= 2; fmt.i_visible_height /= 2; fmt.i_y_offset /= 2; + fmt.i_sar_den *= 2; + } switch( p_vout->render.i_chroma ) { case VLC_FOURCC('I','4','2','0'): case VLC_FOURCC('I','Y','U','V'): case VLC_FOURCC('Y','V','1','2'): + p_real_vout = vout_Create( p_vout, &fmt ); + break; + + case VLC_FOURCC('I','4','2','2'): switch( p_vout->p_sys->i_mode ) { case DEINTERLACE_MEAN: - case DEINTERLACE_DISCARD: - fmt.i_height /= 2; fmt.i_visible_height /= 2; fmt.i_y_offset /= 2; - fmt.i_sar_den *= 2; - p_real_vout = vout_Create( p_vout, &fmt ); - break; - - case DEINTERLACE_BOB: - case DEINTERLACE_BLEND: case DEINTERLACE_LINEAR: case DEINTERLACE_X: - p_real_vout = vout_Create( p_vout, &fmt ); + fmt.i_chroma = VLC_FOURCC('I','4','2','2'); + break; + default: + fmt.i_chroma = VLC_FOURCC('I','4','2','0'); break; } - break; - - case VLC_FOURCC('I','4','2','2'): - fmt.i_chroma = VLC_FOURCC('I','4','2','0'); p_real_vout = vout_Create( p_vout, &fmt ); break; @@ -420,6 +428,11 @@ static void End( vout_thread_t *p_vout ) { int i_index; + DEL_PARENT_CALLBACKS( SendEventsToChild ); + + if( p_vout->p_sys->p_vout ) + DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + /* Free the fake output buffers we allocated */ for( i_index = I_OUTPUTPICTURES ; i_index ; ) { @@ -428,13 +441,7 @@ static void End( vout_thread_t *p_vout ) } if( p_vout->p_sys->p_vout ) - { - DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); - vlc_object_detach( p_vout->p_sys->p_vout ); - vout_Destroy( p_vout->p_sys->p_vout ); - } - - DEL_PARENT_CALLBACKS( SendEventsToChild ); + vout_CloseAndRelease( p_vout->p_sys->p_vout ); } /***************************************************************************** @@ -461,22 +468,43 @@ static void Render ( vout_thread_t *p_vout, picture_t *p_pic ) vout_sys_t *p_sys = p_vout->p_sys; picture_t *pp_outpic[2]; - p_vout->fmt_out.i_x_offset = p_sys->p_vout->fmt_in.i_x_offset = - p_vout->fmt_in.i_x_offset; - p_vout->fmt_out.i_y_offset = p_sys->p_vout->fmt_in.i_y_offset = - p_vout->fmt_in.i_y_offset; - p_vout->fmt_out.i_visible_width = p_sys->p_vout->fmt_in.i_visible_width = - p_vout->fmt_in.i_visible_width; - p_vout->fmt_out.i_visible_height = p_sys->p_vout->fmt_in.i_visible_height = - p_vout->fmt_in.i_visible_height; - if( p_vout->p_sys->i_mode == DEINTERLACE_MEAN || - p_vout->p_sys->i_mode == DEINTERLACE_DISCARD ) - { - p_vout->fmt_out.i_y_offset /= 2; p_sys->p_vout->fmt_in.i_y_offset /= 2; - p_vout->fmt_out.i_visible_height /= 2; + /* FIXME are they needed ? */ + p_vout->fmt_out.i_x_offset = p_vout->fmt_in.i_x_offset; + p_vout->fmt_out.i_y_offset = p_vout->fmt_in.i_y_offset; + p_vout->fmt_out.i_visible_width = p_vout->fmt_in.i_visible_width; + p_vout->fmt_out.i_visible_height = p_vout->fmt_in.i_visible_height; + + /* FIXME p_sys->p_vout->* should NOT be changed FIXME */ + p_sys->p_vout->fmt_in.i_x_offset = p_vout->fmt_out.i_x_offset; + p_sys->p_vout->fmt_in.i_y_offset = p_vout->fmt_out.i_y_offset; + p_sys->p_vout->fmt_in.i_visible_width = p_vout->fmt_out.i_visible_width; + p_sys->p_vout->fmt_in.i_visible_height = p_vout->fmt_in.i_visible_height; + if( p_vout->p_sys->b_half_height ) + { + p_sys->p_vout->fmt_in.i_y_offset /= 2; p_sys->p_vout->fmt_in.i_visible_height /= 2; } - + + if( p_vout->i_changes & VOUT_ASPECT_CHANGE ) + { + p_vout->i_changes &= ~VOUT_ASPECT_CHANGE; + + p_vout->fmt_out.i_aspect = p_vout->fmt_in.i_aspect; + p_vout->fmt_out.i_sar_num = p_vout->fmt_in.i_sar_num; + p_vout->fmt_out.i_sar_den = p_vout->fmt_in.i_sar_den; + + video_format_t fmt = p_vout->fmt_out; + if( p_vout->p_sys->b_half_height ) + { + fmt.i_height /= 2; fmt.i_visible_height /= 2; fmt.i_y_offset /= 2; + fmt.i_sar_den *= 2; + } + + p_sys->p_vout = vout_Request( p_vout, p_sys->p_vout, &fmt ); + } + if( !p_sys->p_vout ) + return; + pp_outpic[0] = pp_outpic[1] = NULL; vlc_mutex_lock( &p_vout->p_sys->filter_lock ); @@ -486,7 +514,7 @@ static void Render ( vout_thread_t *p_vout, picture_t *p_pic ) 0, 0, 0 ) ) == NULL ) { - if( p_vout->b_die || p_vout->b_error ) + if( !vlc_object_alive( p_vout ) || p_vout->b_error ) { vlc_mutex_unlock( &p_vout->p_sys->filter_lock ); return; @@ -494,7 +522,7 @@ static void Render ( vout_thread_t *p_vout, picture_t *p_pic ) msleep( VOUT_OUTMEM_SLEEP ); } - vout_DatePicture( p_vout->p_sys->p_vout, pp_outpic[0], p_pic->date ); + pp_outpic[0]->date = p_pic->date; /* If we are using double rate, get an additional new picture */ if( p_vout->p_sys->b_double_rate ) @@ -503,7 +531,7 @@ static void Render ( vout_thread_t *p_vout, picture_t *p_pic ) 0, 0, 0 ) ) == NULL ) { - if( p_vout->b_die || p_vout->b_error ) + if( !vlc_object_alive( p_vout ) || p_vout->b_error ) { vout_DestroyPicture( p_vout->p_sys->p_vout, pp_outpic[0] ); vlc_mutex_unlock( &p_vout->p_sys->filter_lock ); @@ -514,15 +542,9 @@ static void Render ( vout_thread_t *p_vout, picture_t *p_pic ) /* 20ms is a bit arbitrary, but it's only for the first image we get */ if( !p_vout->p_sys->last_date ) - { - vout_DatePicture( p_vout->p_sys->p_vout, pp_outpic[1], - p_pic->date + 20000 ); - } + pp_outpic[1]->date = p_pic->date + 20000; else - { - vout_DatePicture( p_vout->p_sys->p_vout, pp_outpic[1], - (3 * p_pic->date - p_vout->p_sys->last_date) / 2 ); - } + pp_outpic[1]->date = (3 * p_pic->date - p_vout->p_sys->last_date) / 2; p_vout->p_sys->last_date = p_pic->date; } @@ -594,8 +616,7 @@ static void RenderDiscard( vout_thread_t *p_vout, for( ; p_out < p_out_end ; ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; p_in += 2 * p_pic->p[i_plane].i_pitch; @@ -610,11 +631,9 @@ static void RenderDiscard( vout_thread_t *p_vout, { for( ; p_out < p_out_end ; ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; p_in += i_increment; } @@ -623,8 +642,7 @@ static void RenderDiscard( vout_thread_t *p_vout, { for( ; p_out < p_out_end ; ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; p_in += i_increment; } @@ -663,8 +681,7 @@ static void RenderBob( vout_thread_t *p_vout, /* For BOTTOM field we need to add the first line */ if( i_field == 1 ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_in += p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; } @@ -673,28 +690,24 @@ static void RenderBob( vout_thread_t *p_vout, for( ; p_out < p_out_end ; ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_in += 2 * p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; } - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); /* For TOP field we need to add the last line */ if( i_field == 0 ) { p_in += p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); } break; @@ -702,8 +715,7 @@ static void RenderBob( vout_thread_t *p_vout, /* For BOTTOM field we need to add the first line */ if( i_field == 1 ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_in += p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; } @@ -714,13 +726,11 @@ static void RenderBob( vout_thread_t *p_vout, { for( ; p_out < p_out_end ; ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_in += 2 * p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; @@ -730,24 +740,21 @@ static void RenderBob( vout_thread_t *p_vout, { for( ; p_out < p_out_end ; ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; p_in += 2 * p_pic->p[i_plane].i_pitch; } } - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); /* For TOP field we need to add the last line */ if( i_field == 0 ) { p_in += p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); } break; } @@ -778,8 +785,7 @@ static void RenderLinear( vout_thread_t *p_vout, /* For BOTTOM field we need to add the first line */ if( i_field == 1 ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_in += p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; } @@ -788,8 +794,7 @@ static void RenderLinear( vout_thread_t *p_vout, for( ; p_out < p_out_end ; ) { - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; @@ -800,16 +805,14 @@ static void RenderLinear( vout_thread_t *p_vout, p_out += p_outpic->p[i_plane].i_pitch; } - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); /* For TOP field we need to add the last line */ if( i_field == 0 ) { p_in += p_pic->p[i_plane].i_pitch; p_out += p_outpic->p[i_plane].i_pitch; - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); } } EndMerge(); @@ -866,8 +869,7 @@ static void RenderBlend( vout_thread_t *p_vout, case VLC_FOURCC('I','Y','U','V'): case VLC_FOURCC('Y','V','1','2'): /* First line: simple copy */ - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; /* Remaining lines: mean value */ @@ -883,8 +885,7 @@ static void RenderBlend( vout_thread_t *p_vout, case VLC_FOURCC('I','4','2','2'): /* First line: simple copy */ - p_vout->p_libvlc->pf_memcpy( p_out, p_in, - p_pic->p[i_plane].i_pitch ); + vlc_memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch ); p_out += p_outpic->p[i_plane].i_pitch; /* Remaining lines: mean value */ @@ -1285,7 +1286,7 @@ static inline void XDeint8x8MergeMMXEXT( uint8_t *dst, int i_dst, uint8_t *src1, int i_src1, uint8_t *src2, int i_src2 ) { - static const uint64_t m_4 = I64C(0x0004000400040004); + static const uint64_t m_4 = INT64_C(0x0004000400040004); int y, x; /* Progressive */ @@ -2008,16 +2009,8 @@ static int SendEvents( vlc_object_t *p_this, char const *psz_var, vout_thread_t *p_vout = (vout_thread_t *)_p_vout; vlc_value_t sentval = newval; - if( !strcmp( psz_var, "mouse-y" ) ) - { - switch( p_vout->p_sys->i_mode ) - { - case DEINTERLACE_MEAN: - case DEINTERLACE_DISCARD: - sentval.i_int *= 2; - break; - } - } + if( !strcmp( psz_var, "mouse-y" ) && p_vout->p_sys->b_half_height ) + sentval.i_int *= 2; var_Set( p_vout, psz_var, sentval ); @@ -2033,60 +2026,26 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd, { VLC_UNUSED(psz_cmd); VLC_UNUSED(p_data); VLC_UNUSED(oldval); vout_thread_t * p_vout = (vout_thread_t *)p_this; - int i_old_mode = p_vout->p_sys->i_mode; msg_Dbg( p_vout, "using %s deinterlace mode", newval.psz_string ); vlc_mutex_lock( &p_vout->p_sys->filter_lock ); + const bool b_old_half_height = p_vout->p_sys->b_half_height; SetFilterMethod( p_vout, newval.psz_string ); - switch( p_vout->render.i_chroma ) + if( !b_old_half_height == !p_vout->p_sys->b_half_height ) { - case VLC_FOURCC('I','4','2','2'): vlc_mutex_unlock( &p_vout->p_sys->filter_lock ); return VLC_SUCCESS; - break; - - case VLC_FOURCC('I','4','2','0'): - case VLC_FOURCC('I','Y','U','V'): - case VLC_FOURCC('Y','V','1','2'): - switch( p_vout->p_sys->i_mode ) - { - case DEINTERLACE_MEAN: - case DEINTERLACE_DISCARD: - if( ( i_old_mode == DEINTERLACE_MEAN ) - || ( i_old_mode == DEINTERLACE_DISCARD ) ) - { - vlc_mutex_unlock( &p_vout->p_sys->filter_lock ); - return VLC_SUCCESS; - } - break; - - case DEINTERLACE_BOB: - case DEINTERLACE_BLEND: - case DEINTERLACE_LINEAR: - if( ( i_old_mode == DEINTERLACE_BOB ) - || ( i_old_mode == DEINTERLACE_BLEND ) - || ( i_old_mode == DEINTERLACE_LINEAR ) ) - { - vlc_mutex_unlock( &p_vout->p_sys->filter_lock ); - return VLC_SUCCESS; - } - break; - } - break; - - default: - break; } /* We need to kill the old vout */ - - DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); - - vlc_object_detach( p_vout->p_sys->p_vout ); - vout_Destroy( p_vout->p_sys->p_vout ); + if( p_vout->p_sys->p_vout ) + { + DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vout_CloseAndRelease( p_vout->p_sys->p_vout ); + } /* Try to open a new video output */ p_vout->p_sys->p_vout = SpawnRealVout( p_vout ); @@ -2128,12 +2087,9 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic ) picture_t *p_pic_dst; /* Request output picture */ - p_pic_dst = p_filter->pf_vout_buffer_new( p_filter ); + p_pic_dst = filter_NewPicture( p_filter ); if( p_pic_dst == NULL ) - { - msg_Warn( p_filter, "can't get output picture" ); - return NULL; - } + return p_pic; switch( p_vout->p_sys->i_mode ) { @@ -2142,7 +2098,7 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic ) RenderDiscard( p_vout, p_pic_dst, p_pic, 0 ); #endif msg_Err( p_vout, "discarding lines is not supported yet" ); - p_pic_dst->pf_release( p_pic_dst ); + picture_Release( p_pic_dst ); return p_pic; break; @@ -2159,7 +2115,7 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic ) RenderLinear( p_vout, pp_outpic[1], p_pic, 1 ); #endif msg_Err( p_vout, "doubling the frame rate is not supported yet" ); - p_pic_dst->pf_release( p_pic_dst ); + picture_Release( p_pic_dst ); return p_pic; break; @@ -2176,13 +2132,10 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic ) break; } - p_pic_dst->date = p_pic->date; - p_pic_dst->b_force = p_pic->b_force; - p_pic_dst->i_nb_fields = p_pic->i_nb_fields; + picture_CopyProperties( p_pic_dst, p_pic ); p_pic_dst->b_progressive = true; - p_pic_dst->b_top_field_first = p_pic->b_top_field_first; - p_pic->pf_release( p_pic ); + picture_Release( p_pic ); return p_pic_dst; } @@ -2215,6 +2168,7 @@ static int OpenFilter( vlc_object_t *p_this ) var_Get( p_filter, FILTER_CFG_PREFIX "mode", &val ); var_Create( p_filter, "deinterlace-mode", VLC_VAR_STRING ); var_Set( p_filter, "deinterlace-mode", val ); + free( val.psz_string ); if ( Create( VLC_OBJECT(p_vout) ) != VLC_SUCCESS ) {