[vlc-devel] [PATCH 01/36] filters: provide the decoder device to filter so they can create a video context

Steve Lhomme robux4 at ycbcr.xyz
Thu Nov 21 15:13:52 CET 2019


Typically used when a CPU to GPU converter is used. It cannot deduce the decoder
device or the video context from the input. Since we are pushing the video
context we don't want to get it from the output/environment either.

When the callback is not provided, a NULL decoder device is returned.
---
 include/vlc_filter.h                 |  9 +++++++++
 modules/hw/d3d11/d3d11_surface.c     |  2 +-
 modules/hw/d3d9/dxa9.c               |  2 +-
 modules/stream_out/mosaic_bridge.c   |  2 +-
 modules/stream_out/sdi/SDIStream.cpp |  2 +-
 modules/stream_out/transcode/video.c |  2 +-
 modules/video_chroma/chain.c         |  9 ++++++++-
 modules/video_filter/canvas.c        |  2 +-
 modules/video_filter/edgedetection.c |  2 +-
 src/misc/filter_chain.c              | 11 ++++++++++-
 src/video_output/display.c           |  1 +
 src/video_output/video_output.c      |  4 ++--
 12 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/include/vlc_filter.h b/include/vlc_filter.h
index 6cc923e9d04..2979224527d 100644
--- a/include/vlc_filter.h
+++ b/include/vlc_filter.h
@@ -40,6 +40,7 @@
 struct filter_video_callbacks
 {
     picture_t *(*buffer_new)(filter_t *);
+    vlc_decoder_device * (*hold_device)(vlc_object_t *, void *sys);
 };
 
 struct filter_subpicture_callbacks
@@ -192,6 +193,14 @@ static inline void filter_ChangeViewpoint( filter_t *p_filter,
         p_filter->pf_change_viewpoint( p_filter, vp );
 }
 
+static inline vlc_decoder_device * filter_HoldDecoderDevice( filter_t *p_filter )
+{
+    if ( !p_filter->owner.video || !p_filter->owner.video->hold_device )
+        return NULL;
+
+    return p_filter->owner.video->hold_device( VLC_OBJECT(p_filter), p_filter->owner.sys );
+}
+
 /**
  * This function will drain, then flush an audio filter.
  */
diff --git a/modules/hw/d3d11/d3d11_surface.c b/modules/hw/d3d11/d3d11_surface.c
index 3989a0a37bf..649f8a2a482 100644
--- a/modules/hw/d3d11/d3d11_surface.c
+++ b/modules/hw/d3d11/d3d11_surface.c
@@ -511,7 +511,7 @@ static filter_t *CreateCPUtoGPUFilter( vlc_object_t *p_this, const es_format_t *
     if (unlikely(p_filter == NULL))
         return NULL;
 
-    static const struct filter_video_callbacks cbs = { NewBuffer };
+    static const struct filter_video_callbacks cbs = { NewBuffer, NULL /*TODO*/ };
     p_filter->b_allow_fmt_out_change = false;
     p_filter->owner.video = &cbs;
     p_filter->owner.sys = p_this;
diff --git a/modules/hw/d3d9/dxa9.c b/modules/hw/d3d9/dxa9.c
index 0f5700b9e87..9c9c07a6609 100644
--- a/modules/hw/d3d9/dxa9.c
+++ b/modules/hw/d3d9/dxa9.c
@@ -203,7 +203,7 @@ static filter_t *CreateFilter( vlc_object_t *p_this, const es_format_t *p_fmt_in
     if (unlikely(p_filter == NULL))
         return NULL;
 
-    static const struct filter_video_callbacks cbs = { NewBuffer };
+    static const struct filter_video_callbacks cbs = { NewBuffer, NULL/*TODO*/ };
     p_filter->b_allow_fmt_out_change = false;
     p_filter->owner.video = &cbs;
     p_filter->owner.sys = p_this;
diff --git a/modules/stream_out/mosaic_bridge.c b/modules/stream_out/mosaic_bridge.c
index 6b1f8c0a0c1..f378d447f8b 100644
--- a/modules/stream_out/mosaic_bridge.c
+++ b/modules/stream_out/mosaic_bridge.c
@@ -298,7 +298,7 @@ static void *Add( sout_stream_t *p_stream, const es_format_t *p_fmt )
     /* Create user specified video filters */
     static const struct filter_video_callbacks cbs =
     {
-        video_new_buffer_filter,
+        video_new_buffer_filter, NULL/*TODO*/,
     };
 
     psz_chain = var_GetNonEmptyString( p_stream, CFG_PREFIX "vfilter" );
diff --git a/modules/stream_out/sdi/SDIStream.cpp b/modules/stream_out/sdi/SDIStream.cpp
index 2798b510614..2b736f976ff 100644
--- a/modules/stream_out/sdi/SDIStream.cpp
+++ b/modules/stream_out/sdi/SDIStream.cpp
@@ -500,7 +500,7 @@ static picture_t *transcode_video_filter_buffer_new(filter_t *p_filter)
 
 static const struct filter_video_callbacks transcode_filter_video_cbs =
 {
-    transcode_video_filter_buffer_new,
+    transcode_video_filter_buffer_new, NULL,
 };
 
 filter_chain_t * VideoDecodedStream::VideoFilterCreate(const es_format_t *p_srcfmt)
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index 1853fc6c52d..f58652725f5 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -234,7 +234,7 @@ int transcode_video_init( sout_stream_t *p_stream, const es_format_t *p_fmt,
 
 static const struct filter_video_callbacks transcode_filter_video_cbs =
 {
-    transcode_video_filter_buffer_new,
+    transcode_video_filter_buffer_new, NULL/*TODO*/,
 };
 
 /* Take care of the scaling and chroma conversions. */
diff --git a/modules/video_chroma/chain.c b/modules/video_chroma/chain.c
index ab523397a2e..f812729cac3 100644
--- a/modules/video_chroma/chain.c
+++ b/modules/video_chroma/chain.c
@@ -140,9 +140,16 @@ static picture_t *BufferChainNew( filter_t *p_filter )
 
 #define CHAIN_LEVEL_MAX 2
 
+static vlc_decoder_device * HoldChainDecoderDevice(vlc_object_t *o, void *sys)
+{
+    VLC_UNUSED(o);
+    filter_t *p_chain_parent = sys;
+    return filter_HoldDecoderDevice( p_chain_parent );
+}
+
 static const struct filter_video_callbacks filter_video_chain_cbs =
 {
-    BufferChainNew,
+    BufferChainNew, HoldChainDecoderDevice,
 };
 
 /*****************************************************************************
diff --git a/modules/video_filter/canvas.c b/modules/video_filter/canvas.c
index 5fcf9b43b2d..5ae294d672d 100644
--- a/modules/video_filter/canvas.c
+++ b/modules/video_filter/canvas.c
@@ -141,7 +141,7 @@ static picture_t *video_chain_new( filter_t *p_filter )
 
 static const struct filter_video_callbacks canvas_cbs =
 {
-    video_chain_new,
+    video_chain_new, NULL,
 };
 
 /*****************************************************************************
diff --git a/modules/video_filter/edgedetection.c b/modules/video_filter/edgedetection.c
index e9ed9c7380c..2f158dac0e2 100644
--- a/modules/video_filter/edgedetection.c
+++ b/modules/video_filter/edgedetection.c
@@ -79,7 +79,7 @@ vlc_module_end ()
 
 static const struct filter_video_callbacks filter_video_edge_cbs =
 {
-    new_frame,
+    new_frame, NULL,
 };
 
 /*****************************************************************************
diff --git a/src/misc/filter_chain.c b/src/misc/filter_chain.c
index bbf1c19f388..153e02b4d8a 100644
--- a/src/misc/filter_chain.c
+++ b/src/misc/filter_chain.c
@@ -123,9 +123,18 @@ static picture_t *filter_chain_VideoBufferNew( filter_t *filter )
     return pic;
 }
 
+static vlc_decoder_device * filter_chain_HoldDecoderDevice(vlc_object_t *o, void *sys)
+{
+    filter_chain_t *chain = sys;
+    if (!chain->parent_video_owner.video->hold_device)
+        return NULL;
+
+    return chain->parent_video_owner.video->hold_device(o, chain->parent_video_owner.sys);
+}
+
 static const struct filter_video_callbacks filter_chain_video_cbs =
 {
-    filter_chain_VideoBufferNew,
+    filter_chain_VideoBufferNew, filter_chain_HoldDecoderDevice,
 };
 
 #undef filter_chain_NewVideo
diff --git a/src/video_output/display.c b/src/video_output/display.c
index eaaa4c3246c..ce0fffc13f1 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -289,6 +289,7 @@ typedef struct {
 
 static const struct filter_video_callbacks vout_display_filter_cbs = {
     VideoBufferNew,
+    NULL, // no need as we convert from GPU to CPU or CPU to CPU
 };
 
 static int VoutDisplayCreateRender(vout_display_t *vd)
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 0bbf45a7658..9f4df44c401 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1522,10 +1522,10 @@ static int vout_Start(vout_thread_t *vout, vlc_video_context *vctx, const vout_c
     video_format_Copy(&sys->filter.src_fmt, &sys->original);
 
     static const struct filter_video_callbacks static_cbs = {
-        VoutVideoFilterStaticNewPicture,
+        VoutVideoFilterStaticNewPicture, NULL/*TODO*/,
     };
     static const struct filter_video_callbacks interactive_cbs = {
-        VoutVideoFilterInteractiveNewPicture,
+        VoutVideoFilterInteractiveNewPicture, NULL/*TODO*/,
     };
     filter_owner_t owner = {
         .video = &static_cbs,
-- 
2.17.1



More information about the vlc-devel mailing list