static void Destroy( es_out_t * );
static int TsStart( es_out_t * );
+static void TsAutoStop( es_out_t * );
+
static void TsStop( ts_thread_t * );
static void TsPushCmd( ts_thread_t *, const ts_cmd_t * );
static int TsPopCmdLocked( ts_thread_t *, ts_cmd_t * );
static bool TsHasCmd( ts_thread_t * );
+static bool TsIsUnused( ts_thread_t * );
static int TsChangePause( ts_thread_t *, bool b_source_paused, bool b_paused, mtime_t i_date );
static int TsChangeRate( ts_thread_t *, int i_src_rate, int i_rate );
vlc_mutex_lock( &p_sys->lock );
+ TsAutoStop( p_out );
+
if( CmdInitAdd( &cmd, p_es, p_fmt, p_sys->b_delayed ) )
{
vlc_mutex_unlock( &p_sys->lock );
vlc_mutex_lock( &p_sys->lock );
+ TsAutoStop( p_out );
+
CmdInitSend( &cmd, p_es, p_block );
if( p_sys->b_delayed )
TsPushCmd( p_sys->p_thread, &cmd );
vlc_mutex_lock( &p_sys->lock );
+ TsAutoStop( p_out );
+
CmdInitDel( &cmd, p_es );
if( p_sys->b_delayed )
TsPushCmd( p_sys->p_thread, &cmd );
int i_ret;
vlc_mutex_lock( &p_sys->lock );
+
+ TsAutoStop( p_out );
+
i_ret = ControlLocked( p_out, i_query, args );
+
vlc_mutex_unlock( &p_sys->lock );
return i_ret;
return VLC_SUCCESS;
}
+static void TsAutoStop( es_out_t *p_out )
+{
+ es_out_sys_t *p_sys = p_out->p_sys;
+
+ if( !p_sys->b_delayed || !TsIsUnused( p_sys->p_thread ) )
+ return;
+
+ msg_Warn( p_sys->p_input, "es out timeshift: auto stop" );
+ TsStop( p_sys->p_thread );
+
+ p_sys->b_delayed = false;
+}
static void TsStop( ts_thread_t *p_ts )
{
vlc_object_kill( p_ts );
return b_cmd;
}
+static bool TsIsUnused( ts_thread_t *p_ts )
+{
+ bool b_unused;
+
+ vlc_mutex_lock( &p_ts->lock );
+ b_unused = !p_ts->b_paused &&
+ p_ts->i_rate == p_ts->i_rate_source &&
+ p_ts->i_cmd <= 0;
+ vlc_mutex_unlock( &p_ts->lock );
+
+ return b_unused;
+}
static int TsChangePause( ts_thread_t *p_ts, bool b_source_paused, bool b_paused, mtime_t i_date )
{
vlc_mutex_lock( &p_ts->lock );