[vlc-devel] [PATCH v2 01/26] filters: add a typed Close callback to the operations structure

Steve Lhomme robux4 at ycbcr.xyz
Fri Oct 9 15:03:57 CEST 2020


The close callback is now typed instead of a vlc_object_t.

Co-authored-by: Alexandre Janniaux <ajanni at videolabs.io>
---
 include/vlc_filter.h                  | 8 ++++++++
 modules/access/screen/screen.c        | 1 +
 modules/audio_filter/scaletempo.c     | 1 +
 modules/hw/d3d11/d3d11_surface.c      | 3 +++
 modules/hw/d3d9/dxa9.c                | 3 +++
 modules/video_filter/blendbench.c     | 1 +
 modules/video_filter/ci_filters.m     | 2 ++
 modules/video_filter/opencv_wrapper.c | 1 +
 src/audio_output/filters.c            | 2 ++
 src/audio_output/meter.c              | 2 ++
 src/misc/filter.c                     | 4 ++++
 src/misc/filter_chain.c               | 1 +
 src/misc/image.c                      | 6 +++++-
 src/video_output/vout_subpictures.c   | 3 +++
 14 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/include/vlc_filter.h b/include/vlc_filter.h
index 772f58dee9b..fa1caf770b5 100644
--- a/include/vlc_filter.h
+++ b/include/vlc_filter.h
@@ -136,6 +136,8 @@ struct vlc_filter_operations
     int (*video_mouse)(filter_t *, struct vlc_mouse_t *,
                        const struct vlc_mouse_t *p_old);
 
+    /** Close the filter and release its resources. */
+    void (*close)(filter_t *);
 };
 
 /** Structure describing a filter
@@ -172,6 +174,12 @@ struct filter_t
     filter_owner_t      owner;
 };
 
+static inline void filter_Close( filter_t *p_filter )
+{
+    if ( p_filter->ops->close )
+        p_filter->ops->close( p_filter );
+}
+
 /**
  * This function will return a new picture usable by p_filter as an output
  * buffer. You have to release it using picture_Release or by returning
diff --git a/modules/access/screen/screen.c b/modules/access/screen/screen.c
index 518697f7008..06ef075f62d 100644
--- a/modules/access/screen/screen.c
+++ b/modules/access/screen/screen.c
@@ -263,6 +263,7 @@ static void Close( vlc_object_t *p_this )
         picture_Release( p_sys->p_mouse );
     if( p_sys->p_blend )
     {
+        filter_Close( p_sys->p_blend );
         module_unneed( p_sys->p_blend, p_sys->p_blend->p_module );
         vlc_object_delete(p_sys->p_blend);
     }
diff --git a/modules/audio_filter/scaletempo.c b/modules/audio_filter/scaletempo.c
index 1616ce59d37..59e2fc05fef 100644
--- a/modules/audio_filter/scaletempo.c
+++ b/modules/audio_filter/scaletempo.c
@@ -545,6 +545,7 @@ static void ClosePitch( vlc_object_t *p_this )
     vlc_object_t *p_aout = vlc_object_parent(p_filter);
     var_DelCallback( p_aout, "pitch-shift", PitchCallback, p_sys );
     var_Destroy( p_aout, "pitch-shift" );
+    filter_Close( p_sys->resampler );
     module_unneed( p_sys->resampler, p_sys->resampler->p_module );
     vlc_object_delete(p_sys->resampler);
     Close( p_this );
diff --git a/modules/hw/d3d11/d3d11_surface.c b/modules/hw/d3d11/d3d11_surface.c
index 07d3b715224..44a3c87ac6c 100644
--- a/modules/hw/d3d11/d3d11_surface.c
+++ b/modules/hw/d3d11/d3d11_surface.c
@@ -462,7 +462,10 @@ static void D3D11_RGBA(filter_t *p_filter, picture_t *src, picture_t *dst)
 static void DeleteFilter( filter_t * p_filter )
 {
     if( p_filter->p_module )
+    {
+        filter_Close( p_filter );
         module_unneed( p_filter, p_filter->p_module );
+    }
 
     es_format_Clean( &p_filter->fmt_in );
     es_format_Clean( &p_filter->fmt_out );
diff --git a/modules/hw/d3d9/dxa9.c b/modules/hw/d3d9/dxa9.c
index 621d4af6708..66f617e404e 100644
--- a/modules/hw/d3d9/dxa9.c
+++ b/modules/hw/d3d9/dxa9.c
@@ -170,7 +170,10 @@ static void DXA9_NV12(filter_t *p_filter, picture_t *src, picture_t *dst)
 static void DeleteFilter( filter_t * p_filter )
 {
     if( p_filter->p_module )
+    {
+        filter_Close( p_filter );
         module_unneed( p_filter, p_filter->p_module );
+    }
 
     es_format_Clean( &p_filter->fmt_in );
     es_format_Clean( &p_filter->fmt_out );
diff --git a/modules/video_filter/blendbench.c b/modules/video_filter/blendbench.c
index 105d0c035cc..17876204479 100644
--- a/modules/video_filter/blendbench.c
+++ b/modules/video_filter/blendbench.c
@@ -271,6 +271,7 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
                   p_sys->p_blend_image->p[Y_PLANE].i_visible_pitch *
                   p_sys->p_blend_image->p[Y_PLANE].i_visible_lines );
 
+    filter_Close( p_blend );
     module_unneed( p_blend, p_blend->p_module );
 
     vlc_object_delete(p_blend);
diff --git a/modules/video_filter/ci_filters.m b/modules/video_filter/ci_filters.m
index 7374393c25b..1b0d0f41b3d 100644
--- a/modules/video_filter/ci_filters.m
+++ b/modules/video_filter/ci_filters.m
@@ -525,11 +525,13 @@ cvpx_video_context_Destroy(void *priv)
 
     if (ctx->src_converter)
     {
+        filter_Close( ctx->src_converter );
         module_unneed(ctx->src_converter, ctx->src_converter->p_module);
         vlc_object_delete(ctx->src_converter);
     }
     if (ctx->dst_converter)
     {
+        filter_Close( ctx->dst_converter );
         module_unneed(ctx->dst_converter, ctx->dst_converter->p_module);
         vlc_object_delete(ctx->dst_converter);
     }
diff --git a/modules/video_filter/opencv_wrapper.c b/modules/video_filter/opencv_wrapper.c
index 6e92e8b143e..f4c8d770dd1 100644
--- a/modules/video_filter/opencv_wrapper.c
+++ b/modules/video_filter/opencv_wrapper.c
@@ -271,6 +271,7 @@ static void Destroy( vlc_object_t *p_this )
     ReleaseImages( p_filter );
 
     // Release the internal OpenCV filter.
+    filter_Close( p_sys->p_opencv );
     module_unneed( p_sys->p_opencv, p_sys->p_opencv->p_module );
     vlc_object_delete(p_sys->p_opencv);
 
diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c
index d2d2b3225a6..4578051a41d 100644
--- a/src/audio_output/filters.c
+++ b/src/audio_output/filters.c
@@ -118,6 +118,7 @@ static void aout_FiltersPipelineDestroy(filter_t *const *filters, unsigned n)
     {
         filter_t *p_filter = filters[i];
 
+        filter_Close( p_filter );
         module_unneed( p_filter, p_filter->p_module );
         vlc_object_delete(p_filter);
     }
@@ -432,6 +433,7 @@ static int AppendFilter(vlc_object_t *obj, const char *type, const char *name,
                                     max - 1, infmt, &filter->fmt_in.audio, false))
     {
         msg_Err (filter, "cannot add user %s \"%s\" (skipped)", type, name);
+        filter_Close( filter );
         module_unneed (filter, filter->p_module);
         vlc_object_delete(filter);
         return -1;
diff --git a/src/audio_output/meter.c b/src/audio_output/meter.c
index 8fd570d0b10..9c8f7365122 100644
--- a/src/audio_output/meter.c
+++ b/src/audio_output/meter.c
@@ -133,6 +133,7 @@ vlc_audio_meter_RemovePlugin(struct vlc_audio_meter *meter, vlc_audio_meter_plug
 
     if (plugin->filter != NULL)
     {
+        filter_Close(plugin->filter);
         module_unneed(plugin->filter, plugin->filter->p_module);
         vlc_object_delete(plugin->filter);
     }
@@ -162,6 +163,7 @@ vlc_audio_meter_Reset(struct vlc_audio_meter *meter, const audio_sample_format_t
     {
         if (plugin->filter != NULL)
         {
+            filter_Close(plugin->filter);
             module_unneed(plugin->filter, plugin->filter->p_module);
             vlc_object_delete(plugin->filter);
             plugin->filter = NULL;
diff --git a/src/misc/filter.c b/src/misc/filter.c
index ace08e2329f..131fc63787f 100644
--- a/src/misc/filter.c
+++ b/src/misc/filter.c
@@ -134,6 +134,7 @@ int filter_ConfigureBlend( vlc_blender_t *p_blend,
         p_blend->fmt_in.video.i_chroma != p_src->i_chroma )
     {
         /* The chroma is not the same, we need to reload the blend module */
+        filter_Close( p_blend );
         module_unneed( p_blend, p_blend->p_module );
         p_blend->p_module = NULL;
     }
@@ -172,7 +173,10 @@ int filter_Blend( vlc_blender_t *p_blend,
 void filter_DeleteBlend( vlc_blender_t *p_blend )
 {
     if( p_blend->p_module )
+    {
+        filter_Close( p_blend );
         module_unneed( p_blend, p_blend->p_module );
+    }
 
     vlc_object_delete(p_blend);
 }
diff --git a/src/misc/filter_chain.c b/src/misc/filter_chain.c
index a71b6a3c9a8..4eafffd4d87 100644
--- a/src/misc/filter_chain.c
+++ b/src/misc/filter_chain.c
@@ -331,6 +331,7 @@ void filter_chain_DeleteFilter( filter_chain_t *chain, filter_t *filter )
         chain->last = chained->prev;
     }
 
+    filter_Close( filter );
     module_unneed( filter, filter->p_module );
 
     msg_Dbg( chain->obj, "Filter %p removed from chain", (void *)filter );
diff --git a/src/misc/image.c b/src/misc/image.c
index c340d0d9aa0..5ba958fd406 100644
--- a/src/misc/image.c
+++ b/src/misc/image.c
@@ -815,7 +815,11 @@ static filter_t *CreateConverter( vlc_object_t *p_this,
 
 static void DeleteConverter( filter_t * p_filter )
 {
-    if( p_filter->p_module ) module_unneed( p_filter, p_filter->p_module );
+    if( p_filter->p_module )
+    {
+        filter_Close( p_filter );
+        module_unneed( p_filter, p_filter->p_module );
+    }
 
     es_format_Clean( &p_filter->fmt_in );
     es_format_Clean( &p_filter->fmt_out );
diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index 8c7af5e3874..1afa7bd093e 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -225,7 +225,10 @@ static ssize_t spu_GetFreeChannelId(spu_t *spu, enum vlc_vout_order *order)
 static void FilterRelease(filter_t *filter)
 {
     if (filter->p_module)
+    {
+        filter_Close(filter);
         module_unneed(filter, filter->p_module);
+    }
     vlc_object_delete(filter);
 }
 
-- 
2.26.2



More information about the vlc-devel mailing list