[vlc-devel] [PATCH] decoder: flush the vout before flushing the decoder
Thomas Guillem
thomas at gllm.fr
Mon Nov 30 18:53:56 CET 2015
On Mon, Nov 30, 2015, at 17:41, Rémi Denis-Courmont wrote:
> On Monday 30 November 2015 11:41:25 Thomas Guillem wrote:
> > > > + /* see vout_Flush comment in input_DecoderDelete() */
> > >
> > > Uh? How? If the decoder gets stuck decoding as in that comment, then
> > > this code cannot be reached until the decoder gets unstuck. So that
> > > seems like a catch-22. AFAIK, if the decoder locks up, then the only
> > > avenue of recovery is to stop.
> >
> > Oh, yes this patch works only if decoder module wait for a new picture
> > from an other thread.
>
> pf_flush() will be invoked and the decoder module can implement it
> however
> appropriate. And after that, vout_Flush() will be called in short order
> anyway. So I don´t really see the point, is there?
>
> > As a better fix, I could put the following at the end of
> > input_DecoderFlush
> >
> > vlc_mutex_lock( &p_owner->lock );
> > /* see vout_Flush comment in input_DecoderDelete() */
> > if( p_owner->p_vout )
> > vout_Flush( p_owner->p_vout, VLC_TS_INVALID+1 );
> > vlc_mutex_unlock( &p_owner->lock );
> >
> > > If alternatively the decoder gets stuck flushing, then either the
> > > decoder plug-in:
> > > - has a bug,
> > > - needs to cancel pending picture allocations *within* pf_flush, or
> >
> > Or add decoder_abortPicture called from pf_flush to cancel thread
> > waiting for a picture as I said in a previous mail.
>
> This approach is not viable because it is racy and worker threads could
> get
> stuck again between step 1 and 2 retrying to allocate:
> 1) force all already pending picture allocations to fail,
> 2) flush.
> (An opportunistic vout_Flush() has essentially the same supposedly fatal
> limitation.)
>
> This other approach is also dangerous because it can cause a live loop in
> worker threads:
> 1) force all picture allocations to fail until further notice,
> 2) flush,
> 3) undo step 1.
That's the idea I had in mind. (do we agree, that this approach use
decoder_abortPicture(true/false) ?)
A live loop ? But it will be ended when 2/flush is completed, no ?
>
> decoder_abortPicture() could be useful for a specific class of threaded
> decoder, that would support this pattern where cancellation and flushing
> is
> atomic:
> 1) start flushing in non-blocking manner,
> 2) cancel pending picture allocation on worker threads,
> 3) finish flushing.
>
> Yet even then, a threaded decoder implementation could flush while some
> or all
> worker threads are blocked in allocation step. This is really
> implementation-
> dependent.
>
> So overall I believe that decoder_abortPicture() would only be sufficient
> *and* necessary under constrained assumptions. Notably, I believe that it
> would not apply well to avcodec-MT, and I don´t know any other threaded
> decoder - maybe Android MediaCodec and/or OMX-IL?
Why would it not apply to avcodec-MT ?
get_buffer2 callbacks can fail. This can be problematic when playing,
but if you flush right after, you don't really care, no ?
For MediaCodec/OMX, there was an hack that forced 31 pictures allocation
when using direct rendering, they generally need less pictures (between
2 and 26).
I tried to remove this hacks, but you can't get the number of output
buffer using android ndk (and it's deprecated in Java since Android L)
>
> --
> Rémi Denis-Courmont
> http://www.remlab.net/
>
> _______________________________________________
> 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