From 426932330da5ef5182008c6331fe504870c57ce8 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Fri, 10 Oct 2008 21:05:38 +0200 Subject: [PATCH] Change ES_OUT_SET_NEXT_DISPLAY_TIME parameters. It is cleaner but break the ABI. --- include/vlc_es_out.h | 4 +-- modules/demux/avi/avi.c | 3 +- modules/demux/flac.c | 7 ++--- modules/demux/mkv/matroska_segment.cpp | 3 +- modules/demux/mkv/mkv.cpp | 5 ++-- modules/demux/mp4/mp4.c | 11 +++----- src/input/es_out.c | 38 +++++++++----------------- 7 files changed, 25 insertions(+), 46 deletions(-) diff --git a/include/vlc_es_out.h b/include/vlc_es_out.h index 0227131ffa..0ef457b07f 100644 --- a/include/vlc_es_out.h +++ b/include/vlc_es_out.h @@ -86,8 +86,8 @@ enum es_out_query_e /* Try not to use this one as it is a bit hacky */ ES_OUT_SET_FMT, /* arg1= es_out_id_t* arg2=es_format_t* */ - /* Allow preroll of data (data with dts/pts < i_pts for one ES will be decoded but not displayed */ - ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=es_out_id_t* arg2=int64_t i_pts(microsecond) */ + /* Allow preroll of data (data with dts/pts < i_pts for all ES will be decoded but not displayed */ + ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=int64_t i_pts(microsecond) */ /* Set meta data for group (dynamic) */ ES_OUT_SET_GROUP_META, /* arg1=int i_group arg2=vlc_meta_t */ /* Set epg for group (dynamic) */ diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c index bc84ec8a37..eb7cbfbb86 100644 --- a/modules/demux/avi/avi.c +++ b/modules/demux/avi/avi.c @@ -1381,6 +1381,7 @@ static int Seek( demux_t *p_demux, mtime_t i_date, int i_percent ) AVI_TrackSeek( p_demux, i_stream, i_date ); } + es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date ); p_sys->i_time = i_date; msg_Dbg( p_demux, "seek: %"PRId64" seconds", p_sys->i_time /1000000 ); return VLC_SUCCESS; @@ -1811,8 +1812,6 @@ static int AVI_TrackSeek( demux_t *p_demux, return VLC_EGENERIC; } } - if( p_stream->p_es ) - es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, p_stream->p_es, i_date ); } #if 0 else diff --git a/modules/demux/flac.c b/modules/demux/flac.c index d82efc7702..81db480d94 100644 --- a/modules/demux/flac.c +++ b/modules/demux/flac.c @@ -229,10 +229,7 @@ static int Demux( demux_t *p_demux ) p_block_out->i_dts += p_sys->i_time_offset; /* set PCR */ - if( p_block_out->i_dts >= p_sys->i_pts_start + p_sys->i_time_offset ) - es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block_out->i_dts ); - else - es_out_Control( p_demux->out, ES_OUT_RESET_PCR ); + es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block_out->i_dts ); es_out_Send( p_demux->out, p_sys->p_es, p_block_out ); @@ -306,7 +303,7 @@ static int ControlSetTime( demux_t *p_demux, int64_t i_time ) p_sys->i_time_offset = p_sys->seekpoint[i]->i_time_offset - p_sys->i_pts; p_sys->i_pts_start = p_sys->i_pts+i_delta_time; - es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, p_sys->p_es, p_sys->i_pts_start + p_sys->i_time_offset ); + es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, p_sys->i_pts_start + p_sys->i_time_offset ); } else { diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp index e1131c86b0..26ed799502 100644 --- a/modules/demux/mkv/matroska_segment.cpp +++ b/modules/demux/mkv/matroska_segment.cpp @@ -1097,9 +1097,8 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) ES_OUT_SET_DEFAULT, tracks[i_track]->p_es ); } - - es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, tracks[i_track]->p_es, i_start_time ); } + es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_start_time ); sys.i_start_pts = i_start_time; // reset the stream reading to the first cluster of the segment used diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp index d0af0350a2..338732ff5b 100644 --- a/modules/demux/mkv/mkv.cpp +++ b/modules/demux/mkv/mkv.cpp @@ -701,8 +701,8 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_ tracks[i_track]->b_search_keyframe = true; i_track_skipping++; } - es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, tracks[i_track]->p_es, i_date ); } + es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date ); while( i_track_skipping > 0 ) { @@ -759,8 +759,7 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_ { sys.i_start_pts = sys.i_pts; - for( i_track = 0; i_track < tracks.size(); i_track++ ) - es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, tracks[i_track]->p_es, sys.i_start_pts ); + es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, sys.i_start_pts ); } } diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c index 5ad73492e5..0a099175b3 100644 --- a/modules/demux/mp4/mp4.c +++ b/modules/demux/mp4/mp4.c @@ -759,6 +759,9 @@ static int Seek( demux_t *p_demux, mtime_t i_date ) MP4_TrackSeek( p_demux, tk, i_date ); } MP4_UpdateSeekpoint( p_demux ); + + es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date ); + return VLC_SUCCESS; } @@ -2321,15 +2324,9 @@ static int MP4_TrackSeek( demux_t *p_demux, mp4_track_t *p_track, p_track->b_selected = true; - if( TrackGotoChunkSample( p_demux, p_track, i_chunk, i_sample ) == - VLC_SUCCESS ) - { + if( !TrackGotoChunkSample( p_demux, p_track, i_chunk, i_sample ) ) p_track->b_selected = true; - es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, - p_track->p_es, i_start ); - } - return p_track->b_selected ? VLC_SUCCESS : VLC_EGENERIC; } diff --git a/src/input/es_out.c b/src/input/es_out.c index 909661f95d..8940e046c6 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -77,9 +77,6 @@ struct es_out_id_t int i_id; es_out_pgrm_t *p_pgrm; - /* Misc. */ - int64_t i_preroll_end; - /* Channel in the track type */ int i_channel; es_format_t fmt; @@ -140,6 +137,9 @@ struct es_out_sys_t /* Rate used for clock */ int i_rate; + /* Current preroll */ + int64_t i_preroll_end; + /* Used for buffering */ bool b_buffering; @@ -282,6 +282,7 @@ es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate ) p_sys->i_rate = i_rate; p_sys->b_buffering = true; + p_sys->i_preroll_end = -1; p_sys->p_sout_record = NULL; @@ -511,6 +512,7 @@ void input_EsOutChangePosition( es_out_t *out ) input_clock_Reset( p_sys->pgrm[i]->p_clock ); p_sys->b_buffering = true; + p_sys->i_preroll_end = -1; } bool input_EsOutDecodersIsEmpty( es_out_t *out ) @@ -562,16 +564,8 @@ static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced ) return; mtime_t i_preroll_duration = 0; - mtime_t i_preroll_end = 0; - for( int i = 0; i < p_sys->i_es; i++ ) - { - es_out_id_t *p_es = p_sys->es[i]; - - if( p_es->p_dec && p_es->i_preroll_end > 0 ) - i_preroll_end = __MAX( i_preroll_end, p_es->i_preroll_end ); - } - if( i_preroll_end > 0 ) - i_preroll_duration = __MAX( i_preroll_end - i_stream_start, 0 ); + if( p_sys->i_preroll_end >= 0 ) + i_preroll_duration = __MAX( p_sys->i_preroll_end - i_stream_start, 0 ); if( i_stream_duration <= p_sys->p_input->i_pts_delay + i_preroll_duration && !b_forced ) { @@ -582,14 +576,13 @@ static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced ) msg_Dbg( p_sys->p_input, "Stream buffering done (%d ms in %d ms)", (int)(i_stream_duration/1000), (int)(i_system_duration/1000) ); p_sys->b_buffering = false; + p_sys->i_preroll_end = -1; const mtime_t i_decoder_buffering_start = mdate(); for( int i = 0; i < p_sys->i_es; i++ ) { es_out_id_t *p_es = p_sys->es[i]; - p_es->i_preroll_end = -1; - if( !p_es->p_dec ) continue; input_DecoderWaitBuffering( p_es->p_dec ); @@ -1196,7 +1189,6 @@ static es_out_id_t *EsOutAdd( es_out_t *out, es_format_t *fmt ) es->i_id = fmt->i_id; es->p_pgrm = p_pgrm; es_format_Copy( &es->fmt, fmt ); - es->i_preroll_end = -1; switch( fmt->i_cat ) { @@ -1390,7 +1382,6 @@ static void EsSelect( es_out_t *out, es_out_id_t *es ) } } - es->i_preroll_end = -1; EsCreateDecoder( out, es ); if( es->p_dec == NULL || es->p_pgrm != p_sys->p_pgrm ) @@ -1677,13 +1668,13 @@ static int EsOutSend( es_out_t *out, es_out_id_t *es, block_t *p_block ) } /* Mark preroll blocks */ - if( es->i_preroll_end >= 0 ) + if( p_sys->i_preroll_end >= 0 ) { int64_t i_date = p_block->i_pts; if( i_date <= 0 ) i_date = p_block->i_dts; - if( i_date < es->i_preroll_end ) + if( i_date < p_sys->i_preroll_end ) p_block->i_flags |= BLOCK_FLAG_PREROLL; } @@ -2106,15 +2097,12 @@ static int EsOutControl( es_out_t *out, int i_query, va_list args ) case ES_OUT_SET_NEXT_DISPLAY_TIME: { - int64_t i_date; - - es = (es_out_id_t*) va_arg( args, es_out_id_t * ); - i_date = (int64_t)va_arg( args, int64_t ); + const int64_t i_date = (int64_t)va_arg( args, int64_t ); - if( !es || !es->p_dec ) + if( i_date < 0 ) return VLC_EGENERIC; - es->i_preroll_end = i_date; + p_sys->i_preroll_end = i_date; return VLC_SUCCESS; } -- 2.39.2