[vlc-devel] [PATCH 1/7] filters: use macro to set the typed Open callback for deinterlacers

Steve Lhomme robux4 at ycbcr.xyz
Mon Oct 12 15:59:09 CEST 2020


All deinterlacers have a priority of 0 since they are each specific to an input
chroma/video context.
---
 include/vlc_filter.h                           | 12 ++++++++++++
 modules/hw/d3d11/d3d11_deinterlace.c           |  3 +--
 modules/hw/d3d11/d3d11_filters.c               |  3 +--
 modules/hw/d3d11/d3d11_filters.h               |  2 +-
 modules/hw/d3d9/d3d9_filters.c                 |  3 +--
 modules/hw/d3d9/d3d9_filters.h                 |  2 +-
 modules/hw/d3d9/dxva2_deinterlace.c            |  3 +--
 modules/hw/mmal/deinterlace.c                  |  9 +++------
 modules/hw/vaapi/filters.c                     |  6 ++----
 modules/hw/vdpau/deinterlace.c                 |  8 ++------
 modules/video_filter/deinterlace/deinterlace.c | 11 ++++-------
 11 files changed, 29 insertions(+), 33 deletions(-)

diff --git a/include/vlc_filter.h b/include/vlc_filter.h
index 1f130bcb7a1..4497435420d 100644
--- a/include/vlc_filter.h
+++ b/include/vlc_filter.h
@@ -140,6 +140,18 @@ struct vlc_filter_operations
     void (*close)(filter_t *);
 };
 
+typedef int (*vlc_open_deinterlace)(filter_t *);
+
+
+#define set_deinterlace_callback( activate )     \
+    {                                            \
+        vlc_open_deinterlace open__ = activate;  \
+        (void) open__;                           \
+        set_callback(activate)                   \
+    }                                            \
+    set_capability( "video filter", 0 )          \
+    add_shortcut( "deinterlace" )
+
 /** Structure describing a filter
  * @warning BIG FAT WARNING : the code relies on the first 4 members of
  * filter_t and decoder_t to be the same, so if you have anything to add,
diff --git a/modules/hw/d3d11/d3d11_deinterlace.c b/modules/hw/d3d11/d3d11_deinterlace.c
index feaea04507a..d37b3c8e058 100644
--- a/modules/hw/d3d11/d3d11_deinterlace.c
+++ b/modules/hw/d3d11/d3d11_deinterlace.c
@@ -245,9 +245,8 @@ static const struct vlc_filter_operations filter_ops = {
     .filter_video = Deinterlace, .flush = Flush, .close = D3D11CloseDeinterlace,
 };
 
-int D3D11OpenDeinterlace(vlc_object_t *obj)
+int D3D11OpenDeinterlace(filter_t *filter)
 {
-    filter_t *filter = (filter_t *)obj;
     HRESULT hr;
 
     if (!is_d3d11_opaque(filter->fmt_in.video.i_chroma))
diff --git a/modules/hw/d3d11/d3d11_filters.c b/modules/hw/d3d11/d3d11_filters.c
index a887fc131ac..53070a76bc4 100644
--- a/modules/hw/d3d11/d3d11_filters.c
+++ b/modules/hw/d3d11/d3d11_filters.c
@@ -593,8 +593,7 @@ vlc_module_begin()
 
     add_submodule()
     set_description(N_("Direct3D11 deinterlace filter"))
-    set_callback( D3D11OpenDeinterlace )
-    add_shortcut ("deinterlace")
+    set_deinterlace_callback( D3D11OpenDeinterlace )
 
     add_submodule()
     set_capability( "video converter", 10 )
diff --git a/modules/hw/d3d11/d3d11_filters.h b/modules/hw/d3d11/d3d11_filters.h
index fbc1e2fd6af..411afda4b9d 100644
--- a/modules/hw/d3d11/d3d11_filters.h
+++ b/modules/hw/d3d11/d3d11_filters.h
@@ -28,7 +28,7 @@
 
 #include "../../video_chroma/d3d11_fmt.h"
 
-int  D3D11OpenDeinterlace(vlc_object_t *);
+int  D3D11OpenDeinterlace(filter_t *);
 int  D3D11OpenConverter(vlc_object_t *);
 int  D3D11OpenCPUConverter(vlc_object_t *);
 
diff --git a/modules/hw/d3d9/d3d9_filters.c b/modules/hw/d3d9/d3d9_filters.c
index 8f211a3e2ca..deb6b067441 100644
--- a/modules/hw/d3d9/d3d9_filters.c
+++ b/modules/hw/d3d9/d3d9_filters.c
@@ -513,8 +513,7 @@ vlc_module_begin()
 
     add_submodule()
     set_description(N_("Direct3D9 deinterlace filter"))
-    set_callback( D3D9OpenDeinterlace )
-    add_shortcut ("deinterlace")
+    set_deinterlace_callback( D3D9OpenDeinterlace )
 
     add_submodule()
     set_capability( "video converter", 10 )
diff --git a/modules/hw/d3d9/d3d9_filters.h b/modules/hw/d3d9/d3d9_filters.h
index c098e07a1b1..219b079bbcf 100644
--- a/modules/hw/d3d9/d3d9_filters.h
+++ b/modules/hw/d3d9/d3d9_filters.h
@@ -28,7 +28,7 @@
 
 #include "../../video_chroma/d3d9_fmt.h"
 
-int  D3D9OpenDeinterlace(vlc_object_t *);
+int  D3D9OpenDeinterlace(filter_t *);
 int  D3D9OpenConverter(vlc_object_t *);
 int  D3D9OpenCPUConverter(vlc_object_t *);
 
diff --git a/modules/hw/d3d9/dxva2_deinterlace.c b/modules/hw/d3d9/dxva2_deinterlace.c
index a520fb3bbcf..4e28f52c81a 100644
--- a/modules/hw/d3d9/dxva2_deinterlace.c
+++ b/modules/hw/d3d9/dxva2_deinterlace.c
@@ -338,9 +338,8 @@ static const struct vlc_filter_operations filter_ops = {
     .filter_video = Deinterlace, .flush = Flush, .close = D3D9CloseDeinterlace,
 };
 
-int D3D9OpenDeinterlace(vlc_object_t *obj)
+int D3D9OpenDeinterlace(filter_t *filter)
 {
-    filter_t *filter = (filter_t *)obj;
     filter_sys_t *sys;
     HINSTANCE hdecoder_dll = NULL;
     HRESULT hr;
diff --git a/modules/hw/mmal/deinterlace.c b/modules/hw/mmal/deinterlace.c
index 45df307ee6b..e70def780b6 100644
--- a/modules/hw/mmal/deinterlace.c
+++ b/modules/hw/mmal/deinterlace.c
@@ -60,16 +60,14 @@
 #define MMAL_DEINTERLACE_FULL_RATE_TEXT N_("Full output framerate")
 #define MMAL_DEINTERLACE_FULL_RATE_LONGTEXT N_("Full output framerate. 1 output frame for each interlaced field input")
 
-static int OpenMmalDeinterlace(vlc_object_t *);
+static int OpenMmalDeinterlace(filter_t *);
 
 vlc_module_begin()
     set_shortname(N_("MMAL deinterlace"))
     set_description(N_("MMAL-based deinterlace filter plugin"))
-    set_capability("video filter", 900)
     set_category(CAT_VIDEO)
     set_subcategory(SUBCAT_VIDEO_VFILTER)
-    set_callback(OpenMmalDeinterlace)
-    add_shortcut("deinterlace")
+    set_deinterlace_callback(OpenMmalDeinterlace)
     add_bool(MMAL_DEINTERLACE_NO_QPU, false, MMAL_DEINTERLACE_NO_QPU_TEXT,
                     MMAL_DEINTERLACE_NO_QPU_LONGTEXT, true);
     add_bool(MMAL_DEINTERLACE_ADV, false, MMAL_DEINTERLACE_ADV_TEXT,
@@ -418,9 +416,8 @@ static const struct vlc_filter_operations filter_pass_ops = {
     .filter_video = pass_deinterlace, .close = CloseMmalDeinterlace,
 };
 
-static int OpenMmalDeinterlace(vlc_object_t *p_this)
+static int OpenMmalDeinterlace(filter_t *filter)
 {
-    filter_t *filter = (filter_t*)p_this;
     int32_t frame_duration = filter->fmt_in.video.i_frame_rate != 0 ?
             CLOCK_FREQ * filter->fmt_in.video.i_frame_rate_base /
             filter->fmt_in.video.i_frame_rate : 0;
diff --git a/modules/hw/vaapi/filters.c b/modules/hw/vaapi/filters.c
index f75ca6d3309..ce1c413567c 100644
--- a/modules/hw/vaapi/filters.c
+++ b/modules/hw/vaapi/filters.c
@@ -1096,10 +1096,9 @@ static const struct vlc_filter_operations Deinterlace_ops = {
 };
 
 static int
-OpenDeinterlace(vlc_object_t * obj)
+OpenDeinterlace(filter_t *filter)
 {
     VAProcPipelineCaps          pipeline_caps;
-    filter_t *const             filter = (filter_t *)obj;
     struct deint_data *const    p_data = calloc(1, sizeof(*p_data));
     if (!p_data)
         return VLC_ENOMEM;
@@ -1146,8 +1145,7 @@ vlc_module_begin()
     add_shortcut("adjust")
 
     add_submodule()
-    set_callback(OpenDeinterlace)
-    add_shortcut("deinterlace")
+    set_deinterlace_callback(OpenDeinterlace)
 
     add_submodule()
     set_callback(OpenDenoiseFilter)
diff --git a/modules/hw/vdpau/deinterlace.c b/modules/hw/vdpau/deinterlace.c
index f14ed515a05..c2c4f850833 100644
--- a/modules/hw/vdpau/deinterlace.c
+++ b/modules/hw/vdpau/deinterlace.c
@@ -106,10 +106,8 @@ static const struct vlc_filter_operations filter_ops = {
     .filter_video = Deinterlace, .close = Close,
 };
 
-static int Open(vlc_object_t *obj)
+static int Open(filter_t *filter)
 {
-    filter_t *filter = (filter_t *)obj;
-
     if ( filter->vctx_in == NULL ||
          vlc_video_context_GetType(filter->vctx_in) != VLC_VIDEO_CONTEXT_VDPAU )
         return VLC_EGENERIC;
@@ -138,9 +136,7 @@ static int Open(vlc_object_t *obj)
 
 vlc_module_begin()
     set_description(N_("VDPAU deinterlacing filter"))
-    set_capability("video filter", 0)
     set_category(CAT_VIDEO)
     set_subcategory(SUBCAT_VIDEO_VFILTER)
-    set_callback(Open)
-    add_shortcut ("deinterlace")
+    set_deinterlace_callback(Open)
 vlc_module_end()
diff --git a/modules/video_filter/deinterlace/deinterlace.c b/modules/video_filter/deinterlace/deinterlace.c
index 4822377e2cb..62bd077c0a2 100644
--- a/modules/video_filter/deinterlace/deinterlace.c
+++ b/modules/video_filter/deinterlace/deinterlace.c
@@ -106,7 +106,7 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic );
  * Open() is atomic: if an error occurs, the state of p_this
  * is left as it was before the call to this function.
  *
- * @param p_this The filter instance as vlc_object_t.
+ * @param p_filter The filter instance.
  * @return VLC error code
  * @retval VLC_SUCCESS All ok, filter set up and started.
  * @retval VLC_ENOMEM Memory allocation error, initialization aborted.
@@ -114,7 +114,7 @@ static picture_t *Deinterlace( filter_t *p_filter, picture_t *p_pic );
  * @see IsChromaSupported()
  * @see SetFilterMethod()
  */
-static int Open( vlc_object_t *p_this );
+static int Open( filter_t *p_filter );
 
 /**
  * Resets the filter state, including resetting all algorithm-specific state
@@ -290,7 +290,6 @@ static int Mouse( filter_t *p_filter,
 vlc_module_begin ()
     set_description( N_("Deinterlacing video filter") )
     set_shortname( N_("Deinterlace" ))
-    set_capability( "video filter", 0 )
     set_category( CAT_VIDEO )
     set_subcategory( SUBCAT_VIDEO_VFILTER )
 
@@ -306,8 +305,7 @@ vlc_module_begin ()
                 PHOSPHOR_DIMMER_LONGTEXT, true )
         change_integer_list( phosphor_dimmer_list, phosphor_dimmer_list_text )
         change_safe ()
-    add_shortcut( "deinterlace" )
-    set_callback( Open )
+    set_deinterlace_callback( Open )
 vlc_module_end ()
 
 /*****************************************************************************
@@ -497,9 +495,8 @@ static const struct vlc_filter_operations filter_ops = {
  * Open
  *****************************************************************************/
 
-int Open( vlc_object_t *p_this )
+int Open( filter_t *p_filter )
 {
-    filter_t *p_filter = (filter_t*)p_this;
     filter_sys_t *p_sys;
 
     const vlc_fourcc_t fourcc = p_filter->fmt_in.video.i_chroma;
-- 
2.26.2



More information about the vlc-devel mailing list