[vlc-commits] commit: Enabled back yadif mode in the deinterlace video filter module. ( Laurent Aimar )

git at videolan.org git at videolan.org
Sun Jul 11 19:57:20 CEST 2010


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sun Jul 11 18:59:11 2010 +0200| [4e57bfa7f0ad081f216f4f99b7a3f84d40c493ca] | committer: Laurent Aimar 

Enabled back yadif mode in the deinterlace video filter module.

Becareful that it adds a delay of one frame, so it needs to be
flushed on discontinuity and it will return NULL one time.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4e57bfa7f0ad081f216f4f99b7a3f84d40c493ca
---

 modules/video_filter/deinterlace.c |   45 +++++++++++++++++++++++++++--------
 1 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/modules/video_filter/deinterlace.c b/modules/video_filter/deinterlace.c
index 6ea9917..11a0c49 100644
--- a/modules/video_filter/deinterlace.c
+++ b/modules/video_filter/deinterlace.c
@@ -98,7 +98,7 @@ static void RenderMean   ( filter_t *, picture_t *, picture_t * );
 static void RenderBlend  ( filter_t *, picture_t *, picture_t * );
 static void RenderLinear ( filter_t *, picture_t *, picture_t *, int );
 static void RenderX      ( picture_t *, picture_t * );
-static void RenderYadif  ( filter_t *, picture_t *, picture_t *, int, int );
+static int  RenderYadif  ( filter_t *, picture_t *, picture_t *, int, int );
 
 static void MergeGeneric ( void *, const void *, const void *, size_t );
 #if defined(CAN_COMPILE_C_ALTIVEC)
@@ -1434,7 +1434,7 @@ typedef intptr_t x86_reg;
 /* yadif.h comes from vf_yadif.c of mplayer project */
 #include "yadif.h"
 
-static void RenderYadif( filter_t *p_filter, picture_t *p_dst, picture_t *p_src, int i_order, int i_field )
+static int RenderYadif( filter_t *p_filter, picture_t *p_dst, picture_t *p_src, int i_order, int i_field )
 {
     filter_sys_t *p_sys = p_filter->p_sys;
 
@@ -1517,12 +1517,16 @@ static void RenderYadif( filter_t *p_filter, picture_t *p_dst, picture_t *p_src,
 
         /* */
         p_dst->date = (p_next->date - p_cur->date) * i_order / 2 + p_cur->date;
+        return VLC_SUCCESS;
+    }
+    else if( !p_prev && !p_cur && p_next )
+    {
+        RenderX( p_dst, p_next );
+        return VLC_SUCCESS;
     }
     else
     {
-        /* Fallback to something simple
-         * XXX it is wrong when we have 2 pictures, we should not output a picture */
-        RenderX( p_dst, p_src );
+        return VLC_EGENERIC;
     }
 }
 
@@ -1542,6 +1546,8 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic )
         return NULL;
     }
 
+    picture_CopyProperties( p_pic_dst, p_pic );
+
     switch( p_sys->i_mode )
     {
         case DEINTERLACE_DISCARD:
@@ -1578,11 +1584,13 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic )
             break;
 
         case DEINTERLACE_YADIF:
-            msg_Err( p_filter, "delaying frames is not supported yet" );
-            //RenderYadif( p_vout, pp_outpic[0], p_pic, 0, 0 );
-            picture_Release( p_pic_dst );
-            picture_Release( p_pic );
-            return NULL;
+            if( RenderYadif( p_filter, p_pic_dst, p_pic, 0, 0 ) )
+            {
+                picture_Release( p_pic_dst );
+                picture_Release( p_pic );
+                return NULL;
+            }
+            break;
 
         case DEINTERLACE_YADIF2X:
             msg_Err( p_filter, "doubling the frame rate is not supported yet" );
@@ -1593,13 +1601,24 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic )
             return NULL;
     }
 
-    picture_CopyProperties( p_pic_dst, p_pic );
     p_pic_dst->b_progressive = true;
 
     picture_Release( p_pic );
     return p_pic_dst;
 }
 
+static void Flush( filter_t *p_filter )
+{
+    filter_sys_t *p_sys = p_filter->p_sys;
+
+    for( int i = 0; i < HISTORY_SIZE; i++ )
+    {
+        if( p_sys->pp_history[i] )
+            picture_Release( p_sys->pp_history[i] );
+        p_sys->pp_history[i] = NULL;
+    }
+}
+
 static int Mouse( filter_t *p_filter,
                   vlc_mouse_t *p_mouse, const vlc_mouse_t *p_old, const vlc_mouse_t *p_new )
 {
@@ -1629,6 +1648,8 @@ static int Open( vlc_object_t *p_this )
     p_sys->i_mode = DEINTERLACE_BLEND;
     p_sys->b_double_rate = false;
     p_sys->b_half_height = true;
+    for( int i = 0; i < HISTORY_SIZE; i++ )
+        p_sys->pp_history[i] = NULL;
 
 #if defined(CAN_COMPILE_C_ALTIVEC)
     if( vlc_CPU() & CPU_CAPABILITY_ALTIVEC )
@@ -1696,6 +1717,7 @@ static int Open( vlc_object_t *p_this )
     p_filter->fmt_out.video = fmt;
     p_filter->fmt_out.i_codec = fmt.i_chroma;
     p_filter->pf_video_filter = Deinterlace;
+    p_filter->pf_video_flush  = Flush;
     p_filter->pf_video_mouse  = Mouse;
 
     msg_Dbg( p_filter, "deinterlacing" );
@@ -1710,6 +1732,7 @@ static void Close( vlc_object_t *p_this )
 {
     filter_t *p_filter = (filter_t*)p_this;
 
+    Flush( p_filter );
     free( p_filter->p_sys );
 }
 



More information about the vlc-commits mailing list