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

Rémi Denis-Courmont remi at remlab.net
Thu Jun 18 16:43:34 CEST 2020


Le torstaina 18. kesäkuuta 2020, 11.50.34 EEST Alexandre Janniaux a écrit :
> 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.

I'm all for remove hacks, but the commit message should explain why and since 
when the special handling is no longer necessary.

> ---
>  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)


-- 
雷米‧德尼-库尔蒙
http://www.remlab.net/





More information about the vlc-devel mailing list