vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Wed Oct 29 11:33:07 2014 +0100| [95b15a98ed05c953e5b8c4274fb681fcb877e457] | committer: Francois Cartegnie
stream_filter: smooth: handle live max lookahead > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=95b15a98ed05c953e5b8c4274fb681fcb877e457 --- modules/stream_filter/smooth/downloader.c | 8 +++++++- modules/stream_filter/smooth/smooth.c | 2 ++ modules/stream_filter/smooth/smooth.h | 2 ++ modules/stream_filter/smooth/utils.c | 9 +++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/modules/stream_filter/smooth/downloader.c b/modules/stream_filter/smooth/downloader.c index ded6f38..12b1150 100644 --- a/modules/stream_filter/smooth/downloader.c +++ b/modules/stream_filter/smooth/downloader.c @@ -760,7 +760,13 @@ void* sms_Thread( void *p_this ) vlc_mutex_unlock( &p_sys->download.lock_wait ); sms = SMS_GET_SELECTED_ST( next_track( s ) ); - if ( vlc_array_count( sms->chunks ) ) + + vlc_mutex_lock( &p_sys->download.lock_wait ); + unsigned i_ahead = ahead_chunks_count( p_sys, sms ); + vlc_mutex_unlock( &p_sys->download.lock_wait ); + + if ( vlc_array_count( sms->chunks ) && + ( !p_sys->b_live || i_ahead < p_sys->lookahead_count ) ) { if( Download( s, sms ) != VLC_SUCCESS ) goto cancel; diff --git a/modules/stream_filter/smooth/smooth.c b/modules/stream_filter/smooth/smooth.c index 62fe468..876bb86 100644 --- a/modules/stream_filter/smooth/smooth.c +++ b/modules/stream_filter/smooth/smooth.c @@ -168,6 +168,8 @@ static int parse_Manifest( stream_t *s ) p_sys->vod_duration = strtoull( value, NULL, 10 ); else if( !strcmp( name, "TimeScale" ) ) p_sys->timescale = strtoull( value, NULL, 10 ); + else if ( !strcmp( name, "LookAheadFragmentCount" ) ) + p_sys->lookahead_count = strtoul( value, NULL, 10 ); } if( !p_sys->timescale ) p_sys->timescale = TIMESCALE; diff --git a/modules/stream_filter/smooth/smooth.h b/modules/stream_filter/smooth/smooth.h index c4121b1..568bda1 100644 --- a/modules/stream_filter/smooth/smooth.h +++ b/modules/stream_filter/smooth/smooth.h @@ -103,6 +103,7 @@ struct stream_sys_t unsigned i_tracks; /* Total number of tracks in the Manifest */ sms_queue_t *bws; /* Measured bandwidths of the N last chunks */ uint64_t vod_duration; /* total duration of the VOD media */ + unsigned lookahead_count;/* max number of fragments ahead on server on live streaming */ uint64_t time_pos; unsigned timescale; @@ -188,6 +189,7 @@ void sms_Free( sms_stream_t *); uint8_t *decode_string_hex_to_binary( const char * ); sms_stream_t * sms_get_stream_by_cat( vlc_array_t *, int ); bool no_more_chunks( unsigned[], vlc_array_t *); +unsigned int ahead_chunks_count( stream_sys_t *, sms_stream_t * ); int index_to_es_cat( int ); int es_cat_to_index( int ); diff --git a/modules/stream_filter/smooth/utils.c b/modules/stream_filter/smooth/utils.c index e51bc22..89095c7 100644 --- a/modules/stream_filter/smooth/utils.c +++ b/modules/stream_filter/smooth/utils.c @@ -293,3 +293,12 @@ bool no_more_chunks( unsigned *indexes, vlc_array_t *streams ) } return true; } + +unsigned int ahead_chunks_count( stream_sys_t *p_sys, sms_stream_t *sms ) +{ + int ind = es_cat_to_index( sms->type ); + if ( p_sys->download.ck_index[ind] > vlc_array_count( p_sys->download.chunks ) ) + return p_sys->download.ck_index[ind] - vlc_array_count( p_sys->download.chunks ); + else + return 0; +} _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits