[vlc-devel] [PATCH] decoder_helpers: fix clean order
Thomas Guillem
thomas at gllm.fr
Wed Feb 20 10:27:34 CET 2019
On Wed, Feb 20, 2019, at 10:09, Steve Lhomme wrote:
> On 19/02/2019 13:24, Thomas Guillem wrote:
> > The module need to be unloaded before the dec struct is cleaned.
> >
> > This fixes an undefined behavior with threaded decoders like avcodec when they
> > called decoder_UpdateVideoFormat()/dec_NewPicture() from an other thread just
> > before they were unloaded.
>
> Are there cases where the decoder is still calling
> decoder_UpdateVideoFormat() and decoder_NewPicture() while being about
> to be unloaded ?
It is the case with avcodec with multi thread or every asynchronous decoders (MediaCodec/VideoToolBox).
> I don't see how this can work if one thread of the
> decoder is calling decoder_UpdateVideoFormat() while another thread is
> unloading the decoder DLLs. If that can happen I think the undefined
> behavior is the least of our problem.
This won't happen since decoder implementations use mutex or semaphores to prevent that.
>
> AFAIK lavc always call decoder_UpdateVideoFormat()/decoder_NewPicture()
> from the same (decoder?) thread.
>
> This is an important thing because the decoder pool will be released
> there as well as the video context reference count.
>
> > ---
> > src/input/decoder_helpers.c | 11 ++++++-----
> > 1 file changed, 6 insertions(+), 5 deletions(-)
> >
> > diff --git a/src/input/decoder_helpers.c b/src/input/decoder_helpers.c
> > index 3cc02de8d6..b0a7c1890a 100644
> > --- a/src/input/decoder_helpers.c
> > +++ b/src/input/decoder_helpers.c
> > @@ -48,6 +48,12 @@ void decoder_Init( decoder_t *p_dec, const es_format_t *restrict p_fmt )
> >
> > void decoder_Clean( decoder_t *p_dec )
> > {
> > + if ( p_dec->p_module != NULL )
> > + {
> > + module_unneed(p_dec, p_dec->p_module);
> > + p_dec->p_module = NULL;
> > + }
> > +
> > es_format_Clean( &p_dec->fmt_in );
> > es_format_Clean( &p_dec->fmt_out );
> >
> > @@ -56,11 +62,6 @@ void decoder_Clean( decoder_t *p_dec )
> > vlc_meta_Delete(p_dec->p_description);
> > p_dec->p_description = NULL;
> > }
> > - if ( p_dec->p_module != NULL )
> > - {
> > - module_unneed(p_dec, p_dec->p_module);
> > - p_dec->p_module = NULL;
> > - }
> > }
> >
> > void decoder_Destroy( decoder_t *p_dec )
> > --
> > 2.20.1
> >
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list