[vlc-devel] [PATCH 2/3] filter_chain: remove harmful handling for video buffer

Alexandre Janniaux ajanni at videolabs.io
Thu Jun 18 10:50:34 CEST 2020


The previous new_buffer owner callback was creating picture with an
incorrect format in filter_chains, leading to assertion in case of
format change in a CVPX -> CVPX -> Software chroma chain, and in general
crash in the filter pipeline because of filter chroma not matching with
picture chroma.

This patch completely remove the special handling for that but keep the
callback function to add details about what is needed to implement this
function correctly. It would create new pictures unconditionnally
instead of forwarding the creation request to the filter owner.
---
 src/misc/filter_chain.c | 29 ++++-------------------------
 1 file changed, 4 insertions(+), 25 deletions(-)

diff --git a/src/misc/filter_chain.c b/src/misc/filter_chain.c
index 7b1a0ff63b..dc3ae9abbb 100644
--- a/src/misc/filter_chain.c
+++ b/src/misc/filter_chain.c
@@ -98,31 +98,10 @@ 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 )
 {
-    picture_t *pic;
-    chained_filter_t *chained = container_of(filter, chained_filter_t, filter);
-    if( chained->next != NULL )
-    {
-        // HACK as intermediate filters may not have the same video format as
-        // the last one handled by the owner
-        filter_owner_t saved_owner = filter->owner;
-        filter->owner = (filter_owner_t) {};
-        pic = filter_NewPicture( filter );
-        filter->owner = saved_owner;
-        if( pic == NULL )
-            msg_Err( filter, "Failed to allocate picture" );
-    }
-    else
-    {
-        filter_chain_t *chain = filter->owner.sys;
-
-        // the owner of the chain requires pictures from the last filter to be grabbed from its callback
-        /* XXX ugly */
-        filter_owner_t saved_owner = filter->owner;
-        filter->owner = chain->parent_video_owner;
-        pic = filter_NewPicture( filter );
-        filter->owner = saved_owner;
-    }
-    return pic;
+    /* TODO: We don't handle special case for chained filter yet.
+     *       It must be done while ensuring each filter gets the
+     *       correct format for new picture. */
+    return picture_NewFromFormat(&filter->fmt_out.video);
 }
 
 static vlc_decoder_device * filter_chain_HoldDecoderDevice(vlc_object_t *o, void *sys)
-- 
2.27.0



More information about the vlc-devel mailing list