[vlc-devel] [PATCH 03/12] chromecast: wait until we know all the ES is use before using sending data downstream
Steve Lhomme
robux4 at videolabs.io
Mon Apr 25 17:46:07 CEST 2016
---
modules/stream_out/chromecast/cast.cpp | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/modules/stream_out/chromecast/cast.cpp b/modules/stream_out/chromecast/cast.cpp
index ef7f428..1581695 100644
--- a/modules/stream_out/chromecast/cast.cpp
+++ b/modules/stream_out/chromecast/cast.cpp
@@ -42,14 +42,17 @@ struct sout_stream_sys_t
: p_out(sout)
, p_intf(intf)
, b_has_video(has_video)
+ , last_added_ts( VLC_TS_INVALID )
{
assert(p_intf != NULL);
vlc_mutex_init( &es_lock );
+ vlc_cond_init( &es_changed_cond );
}
~sout_stream_sys_t()
{
sout_StreamChainDelete(p_out, p_out);
+ vlc_cond_destroy( &es_changed_cond );
vlc_mutex_destroy( &es_lock );
}
@@ -60,10 +63,16 @@ struct sout_stream_sys_t
sout_stream_id_sys_t *GetSubId( sout_stream_t*, sout_stream_id_sys_t* );
vlc_mutex_t es_lock;
+ vlc_cond_t es_changed_cond;
+ mtime_t last_added_ts;
std::vector<sout_stream_id_sys_t*> streams;
+
+private:
+ int WaitEsReady( sout_stream_t * );
};
#define SOUT_CFG_PREFIX "sout-chromecast-"
+const static mtime_t MAX_WAIT_BETWEEN_ADD = (CLOCK_FREQ / 3);
/*****************************************************************************
* Local prototypes
@@ -134,6 +143,8 @@ static sout_stream_id_sys_t *Add(sout_stream_t *p_stream, const es_format_t *p_f
vlc_mutex_locker locker( &p_sys->es_lock );
p_sys->streams.push_back( p_sys_id );
+ p_sys->last_added_ts = mdate();
+ vlc_cond_signal( &p_sys->es_changed_cond );
}
return p_sys_id;
}
@@ -159,6 +170,25 @@ static void Del(sout_stream_t *p_stream, sout_stream_id_sys_t *id)
}
}
+int sout_stream_sys_t::WaitEsReady( sout_stream_t *p_stream )
+{
+ assert( p_stream->p_sys == this );
+
+ if ( last_added_ts != VLC_TS_INVALID )
+ {
+ while ( last_added_ts + MAX_WAIT_BETWEEN_ADD < mdate() )
+ {
+ // wait for adding/removing ES expired
+ mutex_cleanup_push( &es_lock );
+ vlc_cond_timedwait( &es_changed_cond, &es_lock, last_added_ts + MAX_WAIT_BETWEEN_ADD );
+ vlc_cleanup_pop();
+ }
+ last_added_ts = VLC_TS_INVALID;
+ }
+
+ return VLC_SUCCESS;
+}
+
sout_stream_id_sys_t *sout_stream_sys_t::GetSubId( sout_stream_t *p_stream,
sout_stream_id_sys_t *id )
{
@@ -167,6 +197,9 @@ sout_stream_id_sys_t *sout_stream_sys_t::GetSubId( sout_stream_t *p_stream,
assert( p_stream->p_sys == this );
vlc_mutex_locker locker( &es_lock );
+ if ( WaitEsReady( p_stream ) != VLC_SUCCESS )
+ return NULL;
+
for (i = 0; i < streams.size(); ++i)
{
if ( id == (sout_stream_id_sys_t*) streams[i] )
--
2.7.0
More information about the vlc-devel
mailing list