It is cleaner but break the ABI.
/* 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) */
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;
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
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 );
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
{
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
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 )
{
{
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 );
}
}
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;
}
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;
}
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;
/* Rate used for clock */
int i_rate;
+ /* Current preroll */
+ int64_t i_preroll_end;
+
/* Used for buffering */
bool b_buffering;
p_sys->i_rate = i_rate;
p_sys->b_buffering = true;
+ p_sys->i_preroll_end = -1;
p_sys->p_sout_record = NULL;
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 )
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 )
{
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 );
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 )
{
}
}
- es->i_preroll_end = -1;
EsCreateDecoder( out, es );
if( es->p_dec == NULL || es->p_pgrm != p_sys->p_pgrm )
}
/* 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;
}
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;
}