[vlc-devel] [PATCH 14/19] filter_chain: separate the picture filtering from filter draining

Steve Lhomme robux4 at ycbcr.xyz
Tue Oct 13 15:51:57 CEST 2020


The draining is done after the picture filtering. This is equivalent to how
a picture was returned with all the chained pictures.

filter_chain_VideoFilter does the same part as filter_chain_VideoFilter() when
called with a NULL picture.

For now filter_chain_VideoFilter() still handles the case where a NULL picture
is used.
---
 include/vlc_filter.h            | 11 ++++++++++-
 src/libvlccore.sym              |  1 +
 src/misc/filter_chain.c         |  6 ++++++
 src/video_output/video_output.c |  2 +-
 4 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/include/vlc_filter.h b/include/vlc_filter.h
index e625d44dc62..8465375da7c 100644
--- a/include/vlc_filter.h
+++ b/include/vlc_filter.h
@@ -606,7 +606,16 @@ VLC_API vlc_video_context *filter_chain_GetVideoCtxOut(const filter_chain_t *cha
  * \return modified picture after applying all video filters
  */
 VLC_API picture_t *filter_chain_VideoFilter(filter_chain_t *chain,
-                                            picture_t *pic);
+                                            picture_t *pic) VLC_USED;
+
+/**
+ * Drain the filter chain of remaining processed pictures.
+ *
+ * \param chain pointer to filter chain
+ * \return modified picture after applying all video filters or NULL if there is
+ * nothing left to drain
+ */
+VLC_API picture_t *filter_chain_VideoDrain(filter_chain_t *chain) VLC_USED;
 
 /**
  * Flush a video filter chain.
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index cd47af0a2e3..fcf2d41fe9a 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -121,6 +121,7 @@ filter_chain_Reset
 filter_chain_Clear
 filter_chain_SubFilter
 filter_chain_VideoFilter
+filter_chain_VideoDrain
 filter_chain_VideoFlush
 filter_chain_ForEach
 filter_ConfigureBlend
diff --git a/src/misc/filter_chain.c b/src/misc/filter_chain.c
index 4eafffd4d87..d20bfff302a 100644
--- a/src/misc/filter_chain.c
+++ b/src/misc/filter_chain.c
@@ -452,6 +452,12 @@ picture_t *filter_chain_VideoFilter( filter_chain_t *p_chain, picture_t *p_pic )
         if( p_pic )
             return p_pic;
     }
+    return filter_chain_VideoDrain( p_chain );
+}
+
+picture_t *filter_chain_VideoDrain(filter_chain_t *p_chain)
+{
+    picture_t *p_pic;
     for( chained_filter_t *b = p_chain->last; b != NULL; b = b->prev )
     {
         if( vlc_picture_chain_IsEmpty( &b->pending ) )
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 0233e214d9e..3ab17de9161 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1068,7 +1068,7 @@ static int ThreadDisplayPreparePicture(vout_thread_sys_t *vout, bool reuse,
 
     vlc_mutex_lock(&sys->filter.lock);
 
-    picture_t *picture = filter_chain_VideoFilter(sys->filter.chain_static, NULL);
+    picture_t *picture = filter_chain_VideoDrain(sys->filter.chain_static);
     assert(!reuse || !picture);
 
     while (!picture) {
-- 
2.26.2



More information about the vlc-devel mailing list