/* search program
* TODO do not use mdate() but proper stream acquisition date */
input_clock_Update( p_pgrm->p_clock, VLC_OBJECT(p_sys->p_input),
- p_sys->p_input->b_can_pace_control, i_pcr, mdate() );
+ p_sys->p_input->b_can_pace_control || p_sys->b_buffering, i_pcr, mdate() );
/* Check buffering state on master clock update */
if( p_sys->b_buffering && p_pgrm == p_sys->p_pgrm )
EsOutDecodersStopBuffering( out, false );
* Copyright (C) 2008 Laurent Aimar
* $Id$
*
- * Authors: Laurent Aimar < fenrir _AT_ via _DOT_ ecp _DOT_ fr>
+ * Authors: Laurent Aimar < fenrir _AT_ videolan _DOT_ org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
mtime_t i_rate_date;
mtime_t i_rate_delay;
+ /* */
+ mtime_t i_buffering_delay;
+
/* */
int i_cmd;
ts_cmd_t **pp_cmd;
{
es_out_sys_t *p_sys = p_out->p_sys;
- if( !p_sys->b_delayed )
+ //if( !p_sys->b_delayed )
return es_out_SetFrameNext( p_sys->p_out );
/* TODO */
p_ts->i_rate = p_sys->i_input_rate;
p_ts->i_rate_date = -1;
p_ts->i_rate_delay = 0;
+ p_ts->i_buffering_delay = 0;
p_ts->i_cmd_delay = 0;
TAB_INIT( p_ts->i_cmd, p_ts->pp_cmd );
static void *TsRun( vlc_object_t *p_thread )
{
ts_thread_t *p_ts = (ts_thread_t*)p_thread;
+ mtime_t i_buffering_date = -1;
for( ;; )
{
ts_cmd_t cmd;
mtime_t i_deadline;
+ bool b_buffering;
/* Pop a command to execute */
vlc_mutex_lock( &p_ts->lock );
mutex_cleanup_push( &p_ts->lock );
- while( p_ts->b_paused || TsPopCmdLocked( p_ts, &cmd ) )
+ for( ;; )
+ {
+ const int canc = vlc_savecancel();
+ b_buffering = es_out_GetBuffering( p_ts->p_out );
+ vlc_restorecancel( canc );
+
+ if( ( !p_ts->b_paused || b_buffering ) && !TsPopCmdLocked( p_ts, &cmd ) )
+ break;
+
vlc_cond_wait( &p_ts->wait, &p_ts->lock );
+ }
+
+ if( b_buffering && i_buffering_date < 0 )
+ {
+ i_buffering_date = cmd.i_date;
+ }
+ else if( i_buffering_date > 0 )
+ {
+ p_ts->i_buffering_delay += i_buffering_date - cmd.i_date; /* It is < 0 */
+ if( b_buffering )
+ i_buffering_date = cmd.i_date;
+ else
+ i_buffering_date = -1;
+ }
if( p_ts->i_rate_date < 0 )
p_ts->i_rate_date = cmd.i_date;
const mtime_t i_duration = cmd.i_date - p_ts->i_rate_date;
p_ts->i_rate_delay = i_duration * p_ts->i_rate / p_ts->i_rate_source - i_duration;
}
- if( p_ts->i_cmd_delay + p_ts->i_rate_delay < 0 )
+ if( p_ts->i_cmd_delay + p_ts->i_rate_delay + p_ts->i_buffering_delay < 0 && p_ts->i_rate != p_ts->i_rate_source )
{
const int canc = vlc_savecancel();
msg_Warn( p_ts->p_input, "es out timeshift: auto reset rate to %d", p_ts->i_rate_source );
p_ts->i_cmd_delay = 0;
+ p_ts->i_buffering_delay = 0;
- p_ts->i_rate_date = -1;
p_ts->i_rate_delay = 0;
+ p_ts->i_rate_date = -1;
p_ts->i_rate = p_ts->i_rate_source;
if( !es_out_SetRate( p_ts->p_out, p_ts->i_rate_source, p_ts->i_rate ) )
vlc_restorecancel( canc );
}
- i_deadline = cmd.i_date + p_ts->i_cmd_delay + p_ts->i_rate_delay;
+ i_deadline = cmd.i_date + p_ts->i_cmd_delay + p_ts->i_rate_delay + p_ts->i_buffering_delay;
vlc_cleanup_run();