[vlc-commits] Refactored deinterlacer frame history mechanism

Juha Jeronen git at videolan.org
Sun Feb 20 18:28:51 CET 2011


vlc | branch: master | Juha Jeronen <juha.jeronen at jyu.fi> | Sat Feb 19 18:31:51 2011 +0200| [7295684e5c1566e5a585bfa1dc3dde8a4ddb2bc8] | committer: Laurent Aimar

Refactored deinterlacer frame history mechanism

Signed-off-by: Laurent Aimar <fenrir at videolan.org>

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

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

diff --git a/modules/video_filter/deinterlace.c b/modules/video_filter/deinterlace.c
index 64cf7f1..a3a439b 100644
--- a/modules/video_filter/deinterlace.c
+++ b/modules/video_filter/deinterlace.c
@@ -138,9 +138,10 @@ typedef struct {
 #define CUSTOM_PTS -1
 struct filter_sys_t
 {
-    int  i_mode;        /* Deinterlace mode */
-    bool b_double_rate; /* Shall we double the framerate? */
-    bool b_half_height; /* Shall be divide the height by 2 */
+    int  i_mode;              /* Deinterlace mode */
+    bool b_double_rate;       /* Shall we double the framerate? */
+    bool b_half_height;       /* Shall be divide the height by 2 */
+    bool b_use_frame_history; /* Does the algorithm need the input frame history buffer? */
 
     void (*pf_merge) ( void *, const void *, const void *, size_t );
     void (*pf_end_merge) ( void );
@@ -151,7 +152,7 @@ struct filter_sys_t
     /* Output frame timing / framerate doubler control (see below) */
     int i_frame_offset;
 
-    /* Yadif */
+    /* Input frame history buffer for algorithms that perform temporal filtering. */
     picture_t *pp_history[HISTORY_SIZE];
 };
 
@@ -232,6 +233,7 @@ static void SetFilterMethod( filter_t *p_filter, const char *psz_method, vlc_fou
         p_sys->i_mode = DEINTERLACE_MEAN;
         p_sys->b_double_rate = false;
         p_sys->b_half_height = true;
+        p_sys->b_use_frame_history = false;
     }
     else if( !strcmp( psz_method, "bob" )
              || !strcmp( psz_method, "progressive-scan" ) )
@@ -239,30 +241,35 @@ static void SetFilterMethod( filter_t *p_filter, const char *psz_method, vlc_fou
         p_sys->i_mode = DEINTERLACE_BOB;
         p_sys->b_double_rate = true;
         p_sys->b_half_height = false;
+        p_sys->b_use_frame_history = false;
     }
     else if( !strcmp( psz_method, "linear" ) )
     {
         p_sys->i_mode = DEINTERLACE_LINEAR;
         p_sys->b_double_rate = true;
         p_sys->b_half_height = false;
+        p_sys->b_use_frame_history = false;
     }
     else if( !strcmp( psz_method, "x" ) )
     {
         p_sys->i_mode = DEINTERLACE_X;
         p_sys->b_double_rate = false;
         p_sys->b_half_height = false;
+        p_sys->b_use_frame_history = false;
     }
     else if( !strcmp( psz_method, "yadif" ) )
     {
         p_sys->i_mode = DEINTERLACE_YADIF;
         p_sys->b_double_rate = false;
         p_sys->b_half_height = false;
+        p_sys->b_use_frame_history = true;
     }
     else if( !strcmp( psz_method, "yadif2x" ) )
     {
         p_sys->i_mode = DEINTERLACE_YADIF2X;
         p_sys->b_double_rate = true;
         p_sys->b_half_height = false;
+        p_sys->b_use_frame_history = true;
     }
     else if( !strcmp( psz_method, "discard" ) )
     {
@@ -272,6 +279,7 @@ static void SetFilterMethod( filter_t *p_filter, const char *psz_method, vlc_fou
         p_sys->i_mode = DEINTERLACE_DISCARD;
         p_sys->b_double_rate = false;
         p_sys->b_half_height = !b_i422;
+        p_sys->b_use_frame_history = false;
     }
     else
     {
@@ -282,6 +290,7 @@ static void SetFilterMethod( filter_t *p_filter, const char *psz_method, vlc_fou
         p_sys->i_mode = DEINTERLACE_BLEND;
         p_sys->b_double_rate = false;
         p_sys->b_half_height = false;
+        p_sys->b_use_frame_history = false;
     }
 
     p_sys->i_frame_offset = 0; /* reset to default when method changes */
@@ -1514,29 +1523,14 @@ typedef intptr_t x86_reg;
 
 static int RenderYadif( filter_t *p_filter, picture_t *p_dst, picture_t *p_src, int i_order, int i_field )
 {
+    VLC_UNUSED(p_src);
+
     filter_sys_t *p_sys = p_filter->p_sys;
 
     /* */
     assert( i_order >= 0 && i_order <= 2 ); /* 2 = soft field repeat */
     assert( i_field == 0 || i_field == 1 );
 
-    if( i_order == 0 )
-    {
-        /* Duplicate the picture
-         * TODO when the vout rework is finished, picture_Hold() might be enough
-         * but becarefull, the pitches must match */
-        picture_t *p_dup = picture_NewFromFormat( &p_src->format );
-        if( p_dup )
-            picture_Copy( p_dup, p_src );
-
-        /* Slide the history */
-        if( p_sys->pp_history[0] )
-            picture_Release( p_sys->pp_history[0]  );
-        for( int i = 1; i < HISTORY_SIZE; i++ )
-            p_sys->pp_history[i-1] = p_sys->pp_history[i];
-        p_sys->pp_history[HISTORY_SIZE-1] = p_dup;
-    }
-
     /* As the pitches must match, use ONLY pictures coming from picture_New()! */
     picture_t *p_prev = p_sys->pp_history[0];
     picture_t *p_cur  = p_sys->pp_history[1];
@@ -1671,6 +1665,24 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic )
     for( int i = 1; i < DEINTERLACE_DST_SIZE; ++i )
         p_dst[i] = NULL;
 
+    /* Update the input frame history, if the currently active algorithm needs it. */
+    if( p_sys->b_use_frame_history )
+    {
+        /* Duplicate the picture
+         * TODO when the vout rework is finished, picture_Hold() might be enough
+         * but becarefull, the pitches must match */
+        picture_t *p_dup = picture_NewFromFormat( &p_pic->format );
+        if( p_dup )
+            picture_Copy( p_dup, p_pic );
+
+        /* Slide the history */
+        if( p_sys->pp_history[0] )
+            picture_Release( p_sys->pp_history[0] );
+        for( int i = 1; i < HISTORY_SIZE; i++ )
+            p_sys->pp_history[i-1] = p_sys->pp_history[i];
+        p_sys->pp_history[HISTORY_SIZE-1] = p_dup;
+    }
+
     /* Slide the metadata history. */
     for( int i = 1; i < METADATA_SIZE; i++ )
     {
@@ -1925,6 +1937,7 @@ 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;
+    p_sys->b_use_frame_history = false;
     for( int i = 0; i < METADATA_SIZE; i++ )
     {
         p_sys->meta.pi_date[i] = VLC_TS_INVALID;



More information about the vlc-commits mailing list