From 1eaa7b8c1f4873e87669c6a707d9f2722caa338e Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Wed, 19 Nov 2008 21:53:17 +0100 Subject: [PATCH] Fixed deinterlacing for i422. Initial report/patch by Marian Durkovic. --- modules/video_filter/deinterlace.c | 75 +++++++++--------------------- 1 file changed, 22 insertions(+), 53 deletions(-) diff --git a/modules/video_filter/deinterlace.c b/modules/video_filter/deinterlace.c index 4ec51a2d72..5280f85ada 100644 --- a/modules/video_filter/deinterlace.c +++ b/modules/video_filter/deinterlace.c @@ -308,13 +308,14 @@ static void SetFilterMethod( vout_thread_t *p_vout, char *psz_method ) } else { + 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 = true; + p_vout->p_sys->b_half_height = !b_i422; } msg_Dbg( p_vout, "using %s deinterlace method", psz_method ); @@ -384,22 +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'): - 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_real_vout = vout_Create( p_vout, &fmt ); break; case VLC_FOURCC('I','4','2','2'): - fmt.i_chroma = VLC_FOURCC('I','4','2','0'); + switch( p_vout->p_sys->i_mode ) + { + case DEINTERLACE_MEAN: + case DEINTERLACE_LINEAR: + case DEINTERLACE_X: + fmt.i_chroma = VLC_FOURCC('I','4','2','2'); + break; + default: + fmt.i_chroma = VLC_FOURCC('I','4','2','0'); + break; + } p_real_vout = vout_Create( p_vout, &fmt ); break; @@ -1998,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 ); @@ -2023,52 +2026,18 @@ 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 */ -- 2.20.1