[vlc-commits] es_out: fix ES_OUT_SET_ES_FMT
Thomas Guillem
git at videolan.org
Fri Jul 20 09:37:30 CEST 2018
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Jul 18 11:13:57 2018 +0200| [369444cff257f2d6c6567ad996497d6f16d186b5] | committer: Thomas Guillem
es_out: fix ES_OUT_SET_ES_FMT
Drain the decoder before destroying it, and check if the cat is the same.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=369444cff257f2d6c6567ad996497d6f16d186b5
---
src/input/es_out.c | 41 +++++++++++++++++++++++++----------------
1 file changed, 25 insertions(+), 16 deletions(-)
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 74a176bf97..9e44210de3 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -2151,6 +2151,27 @@ static int EsOutSend( es_out_t *out, es_out_id_t *es, block_t *p_block )
return VLC_SUCCESS;
}
+static void
+EsDrainDecoder( es_out_t *out, es_out_id_t *es )
+{
+ es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
+ assert( es->p_dec );
+
+ /* FIXME: This might hold the ES output caller (i.e. the demux), and
+ * the corresponding thread (typically the input thread), for a little
+ * bit too long if the ES is deleted in the middle of a stream. */
+ input_DecoderDrain( es->p_dec );
+ while( !input_Stopped(p_sys->p_input) && !p_sys->b_buffering )
+ {
+ if( input_DecoderIsEmpty( es->p_dec ) &&
+ ( !es->p_dec_record || input_DecoderIsEmpty( es->p_dec_record ) ))
+ break;
+ /* FIXME there should be a way to have auto deleted es, but there will be
+ * a problem when another codec of the same type is created (mainly video) */
+ vlc_tick_sleep(VLC_TICK_FROM_MS(20));
+ }
+}
+
/*****************************************************************************
* EsOutDelLocked:
*****************************************************************************/
@@ -2163,19 +2184,8 @@ static void EsOutDelLocked( es_out_t *out, es_out_id_t *es )
/* We don't try to reselect */
if( es->p_dec )
- { /* FIXME: This might hold the ES output caller (i.e. the demux), and
- * the corresponding thread (typically the input thread), for a little
- * bit too long if the ES is deleted in the middle of a stream. */
- input_DecoderDrain( es->p_dec );
- while( !input_Stopped(p_sys->p_input) && !p_sys->b_buffering )
- {
- if( input_DecoderIsEmpty( es->p_dec ) &&
- ( !es->p_dec_record || input_DecoderIsEmpty( es->p_dec_record ) ))
- break;
- /* FIXME there should be a way to have auto deleted es, but there will be
- * a problem when another codec of the same type is created (mainly video) */
- vlc_tick_sleep(VLC_TICK_FROM_MS(20));
- }
+ {
+ EsDrainDecoder( out, es );
EsUnselect( out, es, es->p_pgrm == p_sys->p_pgrm );
}
@@ -2618,11 +2628,9 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
case ES_OUT_SET_ES_FMT:
{
- /* This ain't pretty but is need by some demuxers (eg. Ogg )
- * to update the p_extra data */
es_out_id_t *es = va_arg( args, es_out_id_t * );
es_format_t *p_fmt = va_arg( args, es_format_t * );
- if( es == NULL )
+ if( es == NULL || es->fmt.i_cat != p_fmt->i_cat )
return VLC_EGENERIC;
es_format_Clean( &es->fmt );
@@ -2630,6 +2638,7 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
if( es->p_dec )
{
+ EsDrainDecoder( out, es );
EsDestroyDecoder( out, es );
EsCreateDecoder( out, es );
}
More information about the vlc-commits
mailing list