[vlc-devel] commit: Fixed deinterlacing for i422. (Laurent Aimar )
git version control
git at videolan.org
Wed Nov 19 21:54:55 CET 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed Nov 19 21:53:17 2008 +0100| [1eaa7b8c1f4873e87669c6a707d9f2722caa338e] | committer: Laurent Aimar
Fixed deinterlacing for i422.
Initial report/patch by Marian Durkovic.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1eaa7b8c1f4873e87669c6a707d9f2722caa338e
---
modules/video_filter/deinterlace.c | 75 ++++++++++-------------------------
1 files changed, 22 insertions(+), 53 deletions(-)
diff --git a/modules/video_filter/deinterlace.c b/modules/video_filter/deinterlace.c
index 4ec51a2..5280f85 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 */
More information about the vlc-devel
mailing list