<html><head></head><body><br><br><div style='font-size:10.0pt;font-family:"Tahoma","sans-serif";padding:3.0pt 0in 0in 0in'>
<hr style='border:none;border-top:solid #E1E1E1 1.0pt'>
<b>De :</b> "Rémi Denis-Courmont" <remi@remlab.net><br>
<b>Envoyé :</b> 27 juin 2017 12:35:08 GMT+03:00<br>
<b>À :</b> Mailing list for VLC media player developers <vlc-devel@videolan.org><br>
<b>Objet :</b> Re: [vlc-devel] [PATCH 07/11] video_filter:deinterlace: use the same        signature for all render methods<br>
</div>
<br>
<div class="gmail_quote">Le 27 juin 2017 10:21:43 GMT+02:00, Steve Lhomme <robux4@videolabs.io> a écrit :<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">This way we can use a generic callback.<br />---<br /> modules/video_filter/deinterlace/algo_basic.c    | 38 +++++++++++++++++-------<br /> modules/video_filter/deinterlace/algo_basic.h    | 18 ++++++-----<br /> modules/video_filter/deinterlace/algo_ivtc.c     |  6 +++-<br /> modules/video_filter/deinterlace/algo_ivtc.h     |  3 +-<br /> modules/video_filter/deinterlace/algo_phosphor.c |  3 +-<br /> modules/video_filter/deinterlace/algo_phosphor.h |  2 +-<br /> modules/video_filter/deinterlace/algo_x.c        |  7 ++++-<br /> modules/video_filter/deinterlace/algo_x.h        |  3 +-<br /> modules/video_filter/deinterlace/algo_yadif.c    |  2 +-<br /> modules/video_filter/deinterlace/deinterlace.c   | 34 ++++++++++++---------<br /> 10 files changed, 76 insertions(+), 40 deletions(-)<br /><br />diff --git a/modules/video_filter/deinterlace/algo_basic.c b/modules/video_filter/deinterlace/algo_basic.c<br />index e2cfdf63fc..c77847083a 100644<br />--- a/modules/video_filter/deinterlace/algo_basic.c<br />+++ b/modules/video_filter/deinterlace/algo_basic.c<br />@@ -43,11 +43,13 @@<br />  * RenderDiscard: only keep TOP or BOTTOM field, discard the other.<br />  *****************************************************************************/<br /> <br />-void RenderDiscard( picture_t *p_outpic, picture_t *p_pic, int i_field )<br />+int RenderDiscard( filter_t *p_filter, picture_t *p_outpic, picture_t *p_pic,<br />+                   int order, int i_field )<br /> {<br />+    VLC_UNUSED(p_filter);<br />+    VLC_UNUSED(order);<br />     assert(i_field == 0);<br />     int i_plane;<br />-<br />     /* Copy image and skip lines */<br />     for( i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ )<br />     {<br />@@ -67,14 +69,18 @@ void RenderDiscard( picture_t *p_outpic, picture_t *p_pic, int i_field )<br />             p_in += 2 * p_pic->p[i_plane].i_pitch;<br />         }<br />     }<br />+    return VLC_SUCCESS;<br /> }<br /> <br /> /*****************************************************************************<br />  * RenderBob: renders a BOB picture - simple copy<br />  *****************************************************************************/<br /> <br />-void RenderBob( picture_t *p_outpic, picture_t *p_pic, int i_field )<br />+int RenderBob( filter_t *p_filter, picture_t *p_outpic, picture_t *p_pic,<br />+               int order, int i_field )<br /> {<br />+    VLC_UNUSED(p_filter);<br />+    VLC_UNUSED(order);<br />     int i_plane;<br /> <br />     /* Copy image and skip lines */<br />@@ -119,15 +125,18 @@ void RenderBob( picture_t *p_outpic, picture_t *p_pic, int i_field )<br />             memcpy( p_out, p_in, p_pic->p[i_plane].i_pitch );<br />         }<br />     }<br />+    return VLC_SUCCESS;<br /> }<br /> <br /> /*****************************************************************************<br />  * RenderLinear: BOB with linear interpolation<br />  *****************************************************************************/<br /> <br />-void RenderLinear( filter_t *p_filter,<br />-                   picture_t *p_outpic, picture_t *p_pic, int i_field )<br />+int RenderLinear( filter_t *p_filter,<br />+                  picture_t *p_outpic, picture_t *p_pic, int order, int i_field )<br /> {<br />+    VLC_UNUSED(p_filter);<br />+    VLC_UNUSED(order);<br />     int i_plane;<br /> <br />     /* Copy image and skip lines */<br />@@ -174,17 +183,20 @@ void RenderLinear( filter_t *p_filter,<br />         }<br />     }<br />     EndMerge();<br />+    return VLC_SUCCESS;<br /> }<br /> <br /> /*****************************************************************************<br />  * RenderMean: Half-resolution blender<br />  *****************************************************************************/<br /> <br />-void RenderMean( filter_t *p_filter,<br />-                 picture_t *p_outpic, picture_t *p_pic )<br />+int RenderMean( filter_t *p_filter,<br />+                 picture_t *p_outpic, picture_t *p_pic, int order, int i_field )<br /> {<br />+    VLC_UNUSED(p_filter);<br />+    VLC_UNUSED(order);<br />+    VLC_UNUSED(i_field);<br />     int i_plane;<br />-<br />     /* Copy image and skip lines */<br />     for( i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ )<br />     {<br />@@ -207,17 +219,20 @@ void RenderMean( filter_t *p_filter,<br />         }<br />     }<br />     EndMerge();<br />+    return VLC_SUCCESS;<br /> }<br /> <br /> /*****************************************************************************<br />  * RenderBlend: Full-resolution blender<br />  *****************************************************************************/<br /> <br />-void RenderBlend( filter_t *p_filter,<br />-                  picture_t *p_outpic, picture_t *p_pic )<br />+int RenderBlend( filter_t *p_filter,<br />+                 picture_t *p_outpic, picture_t *p_pic, int order, int i_field )<br /> {<br />+    VLC_UNUSED(p_filter);<br />+    VLC_UNUSED(order);<br />+    VLC_UNUSED(i_field);<br />     int i_plane;<br />-<br />     /* Copy image and skip lines */<br />     for( i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ )<br />     {<br />@@ -244,4 +259,5 @@ void RenderBlend( filter_t *p_filter,<br />         }<br />     }<br />     EndMerge();<br />+    return VLC_SUCCESS;<br /> }<br />diff --git a/modules/video_filter/deinterlace/algo_basic.h b/modules/video_filter/deinterlace/algo_basic.h<br />index 2b1d9e3c81..aaeec3d4c5 100644<br />--- a/modules/video_filter/deinterlace/algo_basic.h<br />+++ b/modules/video_filter/deinterlace/algo_basic.h<br />@@ -50,7 +50,8 @@ struct picture_t;<br />  * @see RenderBob()<br />  * @see Deinterlace()<br />  */<br />-void RenderDiscard( picture_t *p_outpic, picture_t *p_pic, int i_field );<br />+int RenderDiscard( filter_t *p_filter,<br />+                   picture_t *p_outpic, picture_t *p_pic, int order, int i_field );<br /> <br /> /**<br />  * RenderBob: basic framerate doubler.<br />@@ -65,7 +66,8 @@ void RenderDiscard( picture_t *p_outpic, picture_t *p_pic, int i_field );<br />  * @see RenderLinear()<br />  * @see Deinterlace()<br />  */<br />-void RenderBob( picture_t *p_outpic, picture_t *p_pic, int i_field );<br />+int RenderBob( filter_t *p_filter,<br />+               picture_t *p_outpic, picture_t *p_pic, int order, int i_field );<br /> <br /> /**<br />  * RenderLinear: Bob with linear interpolation.<br />@@ -79,8 +81,8 @@ void RenderBob( picture_t *p_outpic, picture_t *p_pic, int i_field );<br />  * @see RenderBob()<br />  * @see Deinterlace()<br />  */<br />-void RenderLinear( filter_t *p_filter,<br />-                   picture_t *p_outpic, picture_t *p_pic, int i_field );<br />+int RenderLinear( filter_t *p_filter,<br />+                  picture_t *p_outpic, picture_t *p_pic, int order, int i_field );<br /> <br /> /**<br />  * RenderMean: half-resolution blender.<br />@@ -94,8 +96,8 @@ void RenderLinear( filter_t *p_filter,<br />  * @param p_pic Input frame. Must exist.<br />  * @see Deinterlace()<br />  */<br />-void RenderMean( filter_t *p_filter,<br />-                 picture_t *p_outpic, picture_t *p_pic );<br />+int RenderMean( filter_t *p_filter,<br />+                picture_t *p_outpic, picture_t *p_pic, int order, int i_field );<br /> <br /> /**<br />  * RenderBlend: full-resolution blender.<br />@@ -110,7 +112,7 @@ void RenderMean( filter_t *p_filter,<br />  * @param p_pic Input frame. Must exist.<br />  * @see Deinterlace()<br />  */<br />-void RenderBlend( filter_t *p_filter,<br />-                  picture_t *p_outpic, picture_t *p_pic );<br />+int RenderBlend( filter_t *p_filter,<br />+                 picture_t *p_outpic, picture_t *p_pic, int order, int i_field );<br /> <br /> #endif<br />diff --git a/modules/video_filter/deinterlace/algo_ivtc.c b/modules/video_filter/deinterlace/algo_ivtc.c<br />index 35f920beeb..5603828f0e 100644<br />--- a/modules/video_filter/deinterlace/algo_ivtc.c<br />+++ b/modules/video_filter/deinterlace/algo_ivtc.c<br />@@ -1467,8 +1467,12 @@ static bool IVTCOutputOrDropFrame( filter_t *p_filter, picture_t *p_dst )<br />  *****************************************************************************/<br /> <br /> /* See function doc in header. */<br />-int RenderIVTC( filter_t *p_filter, picture_t *p_dst )<br />+int RenderIVTC( filter_t *p_filter, picture_t *p_dst, picture_t *p_pic,<br />+                int order, int i_field )<br /> {<br />+    VLC_UNUSED(p_pic);<br />+    VLC_UNUSED(order);<br />+    VLC_UNUSED(i_field);<br />     assert( p_filter != NULL );<br />     assert( p_dst != NULL );<br /> <br />diff --git a/modules/video_filter/deinterlace/algo_ivtc.h b/modules/video_filter/deinterlace/algo_ivtc.h<br />index 3bc4ff3f0a..69334ae0ee 100644<br />--- a/modules/video_filter/deinterlace/algo_ivtc.h<br />+++ b/modules/video_filter/deinterlace/algo_ivtc.h<br />@@ -141,7 +141,8 @@ typedef struct<br />  * @see CalculateInterlaceScore()<br />  * @see EstimateNumBlocksWithMotion()<br />  */<br />-int RenderIVTC( filter_t *p_filter, picture_t *p_dst );<br />+int RenderIVTC( filter_t *p_filter, picture_t *p_dst, picture_t *p_pic,<br />+                     int i_field, int order);<br /> <br /> /**<br />  * Clears the inverse telecine subsystem state.<br />diff --git a/modules/video_filter/deinterlace/algo_phosphor.c b/modules/video_filter/deinterlace/algo_phosphor.c<br />index 0240e0bce5..cc90ec13a6 100644<br />--- a/modules/video_filter/deinterlace/algo_phosphor.c<br />+++ b/modules/video_filter/deinterlace/algo_phosphor.c<br />@@ -278,9 +278,10 @@ static void DarkenFieldMMX( picture_t *p_dst,<br /> <br /> /* See header for function doc. */<br /> int RenderPhosphor( filter_t *p_filter,<br />-                    picture_t *p_dst,<br />+                    picture_t *p_dst, picture_t *p_pic,<br />                     int i_order, int i_field )<br /> {<br />+    VLC_UNUSED(p_pic);<br />     assert( p_filter != NULL );<br />     assert( p_dst != NULL );<br />     assert( i_order >= 0 && i_order <= 2 ); /* 2 = soft field repeat */<br />diff --git a/modules/video_filter/deinterlace/algo_phosphor.h b/modules/video_filter/deinterlace/algo_phosphor.h<br />index 8159adb374..14aa252502 100644<br />--- a/modules/video_filter/deinterlace/algo_phosphor.h<br />+++ b/modules/video_filter/deinterlace/algo_phosphor.h<br />@@ -101,7 +101,7 @@ typedef struct<br />  * @see Deinterlace()<br />  */<br /> int RenderPhosphor( filter_t *p_filter,<br />-                    picture_t *p_dst,<br />+                    picture_t *p_dst, picture_t *p_pic,<br />                     int i_order, int i_field );<br /> <br /> /*****************************************************************************<br />diff --git a/modules/video_filter/deinterlace/algo_x.c b/modules/video_filter/deinterlace/algo_x.c<br />index 70633a6fc0..4e6dee782c 100644<br />--- a/modules/video_filter/deinterlace/algo_x.c<br />+++ b/modules/video_filter/deinterlace/algo_x.c<br />@@ -512,8 +512,12 @@ static inline void XDeintBand8x8MMXEXT( uint8_t *dst, int i_dst,<br />  * Public functions<br />  *****************************************************************************/<br /> <br />-void RenderX( picture_t *p_outpic, picture_t *p_pic )<br />+int RenderX( filter_t *p_filter, picture_t *p_outpic, picture_t *p_pic,<br />+             int order, int i_field )<br /> {<br />+    VLC_UNUSED(p_filter);<br />+    VLC_UNUSED(order);<br />+    VLC_UNUSED(i_field);<br />     int i_plane;<br /> #if defined (CAN_COMPILE_MMXEXT)<br />     const bool mmxext = vlc_CPU_MMXEXT();<br />@@ -569,4 +573,5 @@ void RenderX( picture_t *p_outpic, picture_t *p_pic )<br />     if( mmxext )<br />         emms();<br /> #endif<br />+    return VLC_SUCCESS;<br /> }<br />diff --git a/modules/video_filter/deinterlace/algo_x.h b/modules/video_filter/deinterlace/algo_x.h<br />index 16b7cd1bde..99aadf99dc 100644<br />--- a/modules/video_filter/deinterlace/algo_x.h<br />+++ b/modules/video_filter/deinterlace/algo_x.h<br />@@ -50,6 +50,7 @@ struct picture_t;<br />  * @param[out] p_outpic Output frame. Must be allocated by caller.<br />  * @see Deinterlace()<br />  */<br />-void RenderX( picture_t *p_outpic, picture_t *p_pic );<br />+int RenderX( filter_t *p_filter, picture_t *p_outpic, picture_t *p_pic,<br />+             int order, int i_field );<br /> <br /> #endif<br />diff --git a/modules/video_filter/deinterlace/algo_yadif.c b/modules/video_filter/deinterlace/algo_yadif.c<br />index da3470dde6..b326a17736 100644<br />--- a/modules/video_filter/deinterlace/algo_yadif.c<br />+++ b/modules/video_filter/deinterlace/algo_yadif.c<br />@@ -182,7 +182,7 @@ int RenderYadif( filter_t *p_filter, picture_t *p_dst, picture_t *p_src,<br />                  as set by Open() or SetFilterMethod(). It is always 0. */<br /> <br />         /* FIXME not good as it does not use i_order/i_field */<br />-        RenderX( p_dst, p_next );<br />+        RenderX( p_filter, p_dst, p_next, i_order, i_field );<br />         return VLC_SUCCESS;<br />     }<br />     else<br />diff --git a/modules/video_filter/deinterlace/deinterlace.c b/modules/video_filter/deinterlace/deinterlace.c<br />index 2df1e278bd..17ab199c50 100644<br />--- a/modules/video_filter/deinterlace/deinterlace.c<br />+++ b/modules/video_filter/deinterlace/deinterlace.c<br />@@ -435,35 +435,41 @@ picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic )<br />     switch( p_sys->i_mode )<br />     {<br />         case DEINTERLACE_DISCARD:<br />-            RenderDiscard( p_dst[0], p_pic, 0 );<br />+            RenderDiscard( p_filter, p_dst[0], p_pic, 0, 0 );<br />             break;<br /> <br />         case DEINTERLACE_BOB:<br />-            RenderBob( p_dst[0], p_pic, !b_top_field_first );<br />+            RenderBob( p_filter, p_dst[0], p_pic, 0,<br />+                       !b_top_field_first );<br />             if( p_dst[1] )<br />-                RenderBob( p_dst[1], p_pic, b_top_field_first );<br />+                RenderBob( p_filter, p_dst[1], p_pic, 1,<br />+                           b_top_field_first );<br />             if( p_dst[2] )<br />-                RenderBob( p_dst[2], p_pic, !b_top_field_first );<br />+                RenderBob( p_filter, p_dst[2], p_pic, 2,<br />+                           !b_top_field_first );<br />             break;;<br /> <br />         case DEINTERLACE_LINEAR:<br />-            RenderLinear( p_filter, p_dst[0], p_pic, !b_top_field_first );<br />+            RenderLinear( p_filter, p_dst[0], p_pic, 0,<br />+                          !b_top_field_first );<br />             if( p_dst[1] )<br />-                RenderLinear( p_filter, p_dst[1], p_pic, b_top_field_first );<br />+                RenderLinear( p_filter, p_dst[1], p_pic, 1,<br />+                              b_top_field_first );<br />             if( p_dst[2] )<br />-                RenderLinear( p_filter, p_dst[2], p_pic, !b_top_field_first );<br />+                RenderLinear( p_filter, p_dst[2], p_pic, 2,<br />+                              !b_top_field_first );<br />             break;<br /> <br />         case DEINTERLACE_MEAN:<br />-            RenderMean( p_filter, p_dst[0], p_pic );<br />+            RenderMean( p_filter, p_dst[0], p_pic, 0, 0 );<br />             break;<br /> <br />         case DEINTERLACE_BLEND:<br />-            RenderBlend( p_filter, p_dst[0], p_pic );<br />+            RenderBlend( p_filter, p_dst[0], p_pic, 0, 0 );<br />             break;<br /> <br />         case DEINTERLACE_X:<br />-            RenderX( p_dst[0], p_pic );<br />+            RenderX( p_filter, p_dst[0], p_pic, 0, 0 );<br />             break;<br /> <br />         case DEINTERLACE_YADIF:<br />@@ -481,21 +487,21 @@ picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic )<br />             break;<br /> <br />         case DEINTERLACE_PHOSPHOR:<br />-            if( RenderPhosphor( p_filter, p_dst[0], 0,<br />+            if( RenderPhosphor( p_filter, p_dst[0], p_pic, 0,<br />                                 !b_top_field_first ) )<br />                 goto drop;<br />             if( p_dst[1] )<br />-                RenderPhosphor( p_filter, p_dst[1], 1,<br />+                RenderPhosphor( p_filter, p_dst[1], p_pic, 1,<br />                                 b_top_field_first );<br />             if( p_dst[2] )<br />-                RenderPhosphor( p_filter, p_dst[2], 2,<br />+                RenderPhosphor( p_filter, p_dst[2], p_pic, 2,<br />                                 !b_top_field_first );<br />             break;<br /> <br />         case DEINTERLACE_IVTC:<br />             /* Note: RenderIVTC will automatically drop the duplicate frames<br />                      produced by IVTC. This is part of normal operation. */<br />-            if( RenderIVTC( p_filter, p_dst[0] ) )<br />+            if( RenderIVTC( p_filter, p_dst[0], p_pic, 0, 0 ) )<br />                 goto drop;<br />             break;<br />     }</pre></blockquote></div><br clear="all">This is questionable, as the later patch still has two distinct ways to invoke the callbacks.<br>
<br>
You could just as well have two signatures, one for each cases, and a union to store the callback pointer. *Or* you could actually factor everything as a single callback, with a little bit of duplication in the dual-fields algorithms.<br>
-- <br>
Rémi Denis-Courmont<br>
Typed on an inconvenient virtual keyboard<br>
-- <br>
Rémi Denis-Courmont<br>
Typed on an inconvenient virtual keyboard</body></html>