[vlc-devel] [PATCH 02/15] filters: pass the owner sys to the buffer_new callback

Steve Lhomme robux4 at ycbcr.xyz
Fri Jul 19 15:32:06 CEST 2019


This way we don't have to modify the the owner for each call in the
filter chain.
---
 include/vlc_filter.h                 |  4 ++--
 modules/hw/d3d11/d3d11_surface.c     |  7 ++++---
 modules/hw/d3d9/dxa9.c               |  7 ++++---
 modules/stream_out/mosaic_bridge.c   |  6 +++---
 modules/stream_out/sdi/SDIStream.cpp |  3 ++-
 modules/stream_out/transcode/video.c |  3 ++-
 modules/video_chroma/chain.c         |  5 +++--
 modules/video_filter/canvas.c        |  7 +++++--
 modules/video_filter/ci_filters.m    |  3 ++-
 modules/video_filter/edgedetection.c |  9 ++++++---
 src/misc/filter_chain.c              | 10 +++-------
 src/misc/image.c                     |  3 ++-
 src/video_output/display.c           |  4 ++--
 src/video_output/video_output.c      | 13 +++++++------
 src/video_output/vout_subpictures.c  |  6 +++---
 15 files changed, 50 insertions(+), 40 deletions(-)

diff --git a/include/vlc_filter.h b/include/vlc_filter.h
index 0c756ce10e..5c2a82ed1d 100644
--- a/include/vlc_filter.h
+++ b/include/vlc_filter.h
@@ -38,7 +38,7 @@
 
 struct filter_video_callbacks
 {
-    picture_t *(*buffer_new)(filter_t *);
+    picture_t *(*buffer_new)(filter_t *, void *);
 };
 
 struct filter_subpicture_callbacks
@@ -160,7 +160,7 @@ struct filter_t
  */
 static inline picture_t *filter_NewPicture( filter_t *p_filter )
 {
-    picture_t *pic = p_filter->owner.video->buffer_new( p_filter );
+    picture_t *pic = p_filter->owner.video->buffer_new( p_filter, p_filter->owner.sys );
     if( pic == NULL )
         msg_Warn( p_filter, "can't get output picture" );
     return pic;
diff --git a/modules/hw/d3d11/d3d11_surface.c b/modules/hw/d3d11/d3d11_surface.c
index afae5b58df..471de4163a 100644
--- a/modules/hw/d3d11/d3d11_surface.c
+++ b/modules/hw/d3d11/d3d11_surface.c
@@ -515,10 +515,11 @@ static void DeleteFilter( filter_t * p_filter )
     vlc_object_delete(p_filter);
 }
 
-static picture_t *NewBuffer(filter_t *p_filter)
+static picture_t *NewBuffer(filter_t *p_filter, void *opaque)
 {
-    filter_t *p_parent = p_filter->owner.sys;
-    filter_sys_t *p_sys = p_parent->p_sys;
+    (void) p_filter;
+    filter_t *p_this = opaque;
+    filter_sys_t *p_sys = p_this->p_sys;
     return p_sys->staging_pic;
 }
 
diff --git a/modules/hw/d3d9/dxa9.c b/modules/hw/d3d9/dxa9.c
index 6cc7748daf..027bc8b780 100644
--- a/modules/hw/d3d9/dxa9.c
+++ b/modules/hw/d3d9/dxa9.c
@@ -190,10 +190,11 @@ static void DeleteFilter( filter_t * p_filter )
     vlc_object_delete(p_filter);
 }
 
-static picture_t *NewBuffer(filter_t *p_filter)
+static picture_t *NewBuffer(filter_t *p_filter, void *opaque)
 {
-    filter_t *p_parent = p_filter->owner.sys;
-    filter_sys_t *p_sys = p_parent->p_sys;
+    (void) p_filter;
+    filter_t *p_this = opaque;
+    filter_sys_t *p_sys = p_this->p_sys;
     return p_sys->staging;
 }
 
diff --git a/modules/stream_out/mosaic_bridge.c b/modules/stream_out/mosaic_bridge.c
index d7eab648d2..92274f6936 100644
--- a/modules/stream_out/mosaic_bridge.c
+++ b/modules/stream_out/mosaic_bridge.c
@@ -85,7 +85,7 @@ static int   Send( sout_stream_t *, void *, block_t * );
 
 static void decoder_queue_video( decoder_t *p_dec, picture_t *p_pic );
 inline static int video_update_format_decoder( decoder_t *p_dec );
-inline static picture_t *video_new_buffer_filter( filter_t * );
+inline static picture_t *video_new_buffer_filter( filter_t *, void * );
 static void video_update_format( video_format_t *, es_format_t * );
 
 static int HeightCallback( vlc_object_t *, char const *,
@@ -577,9 +577,9 @@ inline static int video_update_format_decoder( decoder_t *p_dec )
     return 0;
 }
 
-inline static picture_t *video_new_buffer_filter( filter_t *p_filter )
+inline static picture_t *video_new_buffer_filter( filter_t *p_filter, void *opaque )
 {
-    struct decoder_owner *p_owner = p_filter->owner.sys;
+    struct decoder_owner *p_owner = opaque;
     video_update_format( &p_owner->video, &p_filter->fmt_out );
     return picture_NewFromFormat( &p_filter->fmt_out.video );
 }
diff --git a/modules/stream_out/sdi/SDIStream.cpp b/modules/stream_out/sdi/SDIStream.cpp
index 4845466a1a..1fc72ced8c 100644
--- a/modules/stream_out/sdi/SDIStream.cpp
+++ b/modules/stream_out/sdi/SDIStream.cpp
@@ -494,8 +494,9 @@ int VideoDecodedStream::VideoDecCallback_update_format(decoder_t *p_dec)
     return VLC_SUCCESS;
 }
 
-static picture_t *transcode_video_filter_buffer_new(filter_t *p_filter)
+static picture_t *transcode_video_filter_buffer_new(filter_t *p_filter, void *opaque)
 {
+    (void) opaque;
     p_filter->fmt_out.video.i_chroma = p_filter->fmt_out.i_codec;
     return picture_NewFromFormat(&p_filter->fmt_out.video);
 }
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index 108eabada9..d1c7bf303f 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -100,8 +100,9 @@ static picture_t *video_new_buffer_encoder( transcode_encoder_t *p_enc )
     return picture_NewFromFormat( &transcode_encoder_format_in( p_enc )->video );
 }
 
-static picture_t *transcode_video_filter_buffer_new( filter_t *p_filter )
+static picture_t *transcode_video_filter_buffer_new( filter_t *p_filter, void *opaque )
 {
+    (void) opaque;
     p_filter->fmt_out.video.i_chroma = p_filter->fmt_out.i_codec;
     return picture_NewFromFormat( &p_filter->fmt_out.video );
 }
diff --git a/modules/video_chroma/chain.c b/modules/video_chroma/chain.c
index 964c51b8ae..84336f0f3d 100644
--- a/modules/video_chroma/chain.c
+++ b/modules/video_chroma/chain.c
@@ -130,9 +130,10 @@ static int RestartFilterCallback( vlc_object_t *obj, char const *psz_name,
 /*****************************************************************************
  * Buffer management
  *****************************************************************************/
-static picture_t *BufferNew( filter_t *p_filter )
+static picture_t *BufferNew( filter_t *p_filter, void *opaque )
 {
-    filter_t *p_parent = p_filter->owner.sys;
+    (void) p_filter;
+    filter_t *p_parent = opaque;
 
     return filter_NewPicture( p_parent );
 }
diff --git a/modules/video_filter/canvas.c b/modules/video_filter/canvas.c
index b8e15eaef1..8597ce8ef5 100644
--- a/modules/video_filter/canvas.c
+++ b/modules/video_filter/canvas.c
@@ -131,9 +131,12 @@ typedef struct
     filter_chain_t *p_chain;
 } filter_sys_t;
 
-static picture_t *video_new( filter_t *p_filter )
+static picture_t *video_new( filter_t *p_filter, void *opaque )
 {
-    return filter_NewPicture( p_filter->owner.sys );
+    (void) p_filter;
+    filter_t *p_parent = opaque;
+
+    return filter_NewPicture( p_parent );
 }
 
 static const struct filter_video_callbacks canvas_cbs =
diff --git a/modules/video_filter/ci_filters.m b/modules/video_filter/ci_filters.m
index 8511858aec..4ad40bb1a0 100644
--- a/modules/video_filter/ci_filters.m
+++ b/modules/video_filter/ci_filters.m
@@ -540,8 +540,9 @@ Close_RemoveConverters(filter_t *filter, struct ci_filters_ctx *ctx)
     }
 }
 
-static picture_t *CVPX_to_CVPX_converter_BufferNew(filter_t *p_filter)
+static picture_t *CVPX_to_CVPX_converter_BufferNew(filter_t *p_filter, void *opaque)
 {
+    (void) opaque;
     return picture_NewFromFormat(&p_filter->fmt_out.video);
 }
 
diff --git a/modules/video_filter/edgedetection.c b/modules/video_filter/edgedetection.c
index a8da06d78f..aa4e75d3d8 100644
--- a/modules/video_filter/edgedetection.c
+++ b/modules/video_filter/edgedetection.c
@@ -47,7 +47,7 @@
  *****************************************************************************/
 static int Open( vlc_object_t * );
 static int Close( vlc_object_t * );
-static picture_t *new_frame( filter_t * );
+static picture_t *new_frame( filter_t *, void * );
 static picture_t *Filter( filter_t *, picture_t * );
 static uint8_t sobel( const uint8_t *, const int, const int, int, int);
 
@@ -141,9 +141,12 @@ static int Close( vlc_object_t *p_this )
 /* *****************************************************************************
  * Allocates a new buffer for the filter chain.
  ******************************************************************************/
-static picture_t *new_frame( filter_t *p_filter)
+static picture_t *new_frame( filter_t *p_filter, void *opaque )
 {
-    return filter_NewPicture( p_filter->owner.sys );
+    (void) p_filter;
+    filter_t *p_this = opaque;
+
+    return filter_NewPicture( p_this );
 }
 
 /******************************************************************************
diff --git a/src/misc/filter_chain.c b/src/misc/filter_chain.c
index 89b499d26a..7070ce9f8c 100644
--- a/src/misc/filter_chain.c
+++ b/src/misc/filter_chain.c
@@ -108,7 +108,7 @@ filter_chain_t *filter_chain_NewSPU( vlc_object_t *obj, const char *cap )
 }
 
 /** Chained filter picture allocator function */
-static picture_t *filter_chain_VideoBufferNew( filter_t *filter )
+static picture_t *filter_chain_VideoBufferNew( filter_t *filter, void *sys )
 {
     if( chained(filter)->next != NULL )
     {
@@ -119,13 +119,9 @@ static picture_t *filter_chain_VideoBufferNew( filter_t *filter )
     }
     else
     {
-        filter_chain_t *chain = filter->owner.sys;
+        filter_chain_t *chain = sys;
 
-        /* XXX ugly */
-        filter->owner.sys = chain->owner.sys;
-        picture_t *pic = chain->owner.video->buffer_new( filter );
-        filter->owner.sys = chain;
-        return pic;
+        return chain->owner.video->buffer_new( filter, chain->owner.sys );
     }
 }
 
diff --git a/src/misc/image.c b/src/misc/image.c
index 976e30dde0..0cd67711e0 100644
--- a/src/misc/image.c
+++ b/src/misc/image.c
@@ -779,8 +779,9 @@ static void DeleteEncoder( encoder_t * p_enc )
     vlc_object_delete(p_enc);
 }
 
-static picture_t *filter_new_picture( filter_t *p_filter )
+static picture_t *filter_new_picture( filter_t *p_filter, void *opaque )
 {
+    (void) opaque;
     return picture_NewFromFormat( &p_filter->fmt_out.video );
 }
 
diff --git a/src/video_output/display.c b/src/video_output/display.c
index 1b84060d5e..ad744892f1 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -46,9 +46,9 @@
 /*****************************************************************************
  * FIXME/TODO see how to have direct rendering here (interact with vout.c)
  *****************************************************************************/
-static picture_t *VideoBufferNew(filter_t *filter)
+static picture_t *VideoBufferNew(filter_t *filter, void *opaque)
 {
-    vout_display_t *vd = filter->owner.sys;
+    vout_display_t *vd = opaque;
     const video_format_t *fmt = &filter->fmt_out.video;
 
     assert(vd->fmt.i_chroma == fmt->i_chroma &&
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 490d1fa97e..8dffb00080 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -689,9 +689,9 @@ static void ThreadDelAllFilterCallbacks(vout_thread_t *vout)
                          ThreadDelFilterCallbacks, vout);
 }
 
-static picture_t *VoutVideoFilterInteractiveNewPicture(filter_t *filter)
+static picture_t *VoutVideoFilterInteractiveNewPicture(filter_t *filter, void *opaque)
 {
-    vout_thread_t *vout = filter->owner.sys;
+    vout_thread_t *vout = opaque;
 
     picture_t *picture = picture_pool_Get(vout->p->private_pool);
     if (picture) {
@@ -701,13 +701,13 @@ static picture_t *VoutVideoFilterInteractiveNewPicture(filter_t *filter)
     return picture;
 }
 
-static picture_t *VoutVideoFilterStaticNewPicture(filter_t *filter)
+static picture_t *VoutVideoFilterStaticNewPicture(filter_t *filter, void *opaque)
 {
-    vout_thread_t *vout = filter->owner.sys;
+    vout_thread_t *vout = opaque;
 
     vlc_mutex_assert(&vout->p->filter.lock);
     if (filter_chain_IsEmpty(vout->p->filter.chain_interactive))
-        return VoutVideoFilterInteractiveNewPicture(filter);
+        return VoutVideoFilterInteractiveNewPicture(filter, vout);
 
     return picture_NewFromFormat(&filter->fmt_out.video);
 }
@@ -928,8 +928,9 @@ static int ThreadDisplayPreparePicture(vout_thread_t *vout, bool reuse, bool fra
     return VLC_SUCCESS;
 }
 
-static picture_t *ConvertRGB32AndBlendBufferNew(filter_t *filter)
+static picture_t *ConvertRGB32AndBlendBufferNew(filter_t *filter, void *opaque)
 {
+    (void) opaque;
     return picture_NewFromFormat(&filter->fmt_out.video);
 }
 
diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index 2709d3e8a5..182dd0ddbe 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -198,11 +198,11 @@ static void FilterRelease(filter_t *filter)
     vlc_object_delete(filter);
 }
 
-static picture_t *spu_new_video_buffer(filter_t *filter)
+static picture_t *spu_new_video_buffer(filter_t *filter, void *opaque)
 {
-    const video_format_t *fmt = &filter->fmt_out.video;
+    (void) opaque;
 
-    return picture_NewFromFormat(fmt);
+    return picture_NewFromFormat(&filter->fmt_out.video);
 }
 
 static int spu_get_attachments(filter_t *filter,
-- 
2.17.1



More information about the vlc-devel mailing list