[vlc-devel] [PATCH] VLC unable to play HLS live stream
Ilkka Ollakka
ileoo at videolan.org
Wed Aug 14 15:09:01 CEST 2013
On Wed, Aug 14, 2013 at 09:04:13AM -0400, Avishay Spitzer wrote:
> Ilkka,
Hi,
> The problem in TS module, is that once HLS module (HTTPLive stream filter)
> has no data, TS will think that it has reached EOF and VLC will stop
> playing.
In what kinda conditions you can reproduce that issues that hls modules
has no data while it should have?
> I don't think that it can be solved from within the HLS module because HLS
> has no control over this. I think that TS module should treat these
> situations gracefully and retry (as I implemented).
> If you have another idea please let me know.
in git-tree some places in HLS module assume that segments are 10sec
length and that can cause some issues. I have changed those but haven't
yet pushed them as haven't got time to test them properly
> Regards,
> Avishay
> On Wed, Aug 14, 2013 at 8:37 AM, Ilkka Ollakka <ileoo at videolan.org> wrote:
> > I think this patch tries to fix issue in wrong place. If the problem is
> > in HLS slow start or short HLS playlists, issue should be handled in
> > httplive stream filter.
> > On Wed, Aug 14, 2013 at 04:13:46AM -0400, Avishay Spitzer wrote:
> > > From 15f5f247e783895e95020e4f0529bd112bf77b6d Mon Sep 17 00:00:00 2001
> > > From: Avishay Spitzer <savishay at gmail.com>
> > > Date: Wed, 14 Aug 2013 03:52:44 -0400
> > > Subject: [PATCH 1/3] In case of slow connections or short HLS playlists,
> > > packets may not arrive on time and TS module will
> > > declare EOF which will case VLC to stop playing the
> > > stream. Problem was solved by adding a retries
> > > mechanism with increasing backoff.
> > > ---
> > > modules/demux/ts.c | 37 ++++++++++++++++++++++++++++++++++++-
> > > 1 file changed, 36 insertions(+), 1 deletion(-)
> > > diff --git a/modules/demux/ts.c b/modules/demux/ts.c
> > > index 5c4a288..dd74e36 100644
> > > --- a/modules/demux/ts.c
> > > +++ b/modules/demux/ts.c
> > > @@ -334,6 +334,9 @@ struct demux_sys_t
> > > /* */
> > > bool b_start_record;
> > > +
> > > + /* Counts number of times ReadTSPacket returned NULL for
> > implemeting a retries mechanism */
> > > + uint64_t b_get_packet_retry;
> > > };
> > > static int Demux ( demux_t *p_demux );
> > > @@ -570,6 +573,9 @@ static int Open( vlc_object_t *p_this )
> > > p_sys->i_packet_size = i_packet_size;
> > > vlc_mutex_init( &p_sys->csa_lock );
> > > + // Initialize retries counter
> > > + p_sys->b_get_packet_retry = 0;
> > > +
> > > p_sys->buffer = NULL;
> > > p_demux->pf_demux = Demux;
> > > p_demux->pf_control = Control;
> > > @@ -949,9 +955,38 @@ static int Demux( demux_t *p_demux )
> > > block_t *p_pkt;
> > > if( !(p_pkt = ReadTSPacket( p_demux )) )
> > > {
> > > - return 0;
> > > + // Retries mechanism - start
> > > + // In case of live streams TS packets may delay due to
> > slow connections or short
> > > + // playlists (in case of HLS).
> > > + // We don't want to declare EOF (by returning 0 here)
> > right away so we add a retries
> > > + // mechanism with increasing backoff.
> > > + // Retries are limited to 100 retries per packet and since
> > backoff is based on an
> > > + // arithmetic progression the aggregate waiting time until
> > declaring EOF is
> > > + // 100*(100+1)/2=5050ms.
> > > + // In order to make the stream continuous after reaching
> > 100 retries each backoff
> > > + // will last 100ms and EOF will not be declared.
> > > +
> > > + // If 100 retries failed then kill this stream to avoid
> > VLC getting stuck
> > > + if (!(vlc_object_alive (p_demux)))
> > > + return 0;
> > > +
> > > + // Increase the retries count before sleeping (avoids 0ms
> > sleep)
> > > + p_sys->b_get_packet_retry++;
> > > +
> > > + // Sleep for 1ms times the retries counter before returning
> > > + msleep(((p_sys->b_get_packet_retry >= 100) ? 100 :
> > p_sys->b_get_packet_retry) * 1000);
> > > +
> > > + // If the vlc object is not alive after sleeping get out
> > > + if (!(vlc_object_alive (p_demux)))
> > > + return 0;
> > > + // Retries mechanism - end
> > > +
> > > + return 1;
> > > }
> > > + // If packet was received correctly zero retries counter
> > > + p_sys->b_get_packet_retry = 0;
> > > +
> > > if( p_sys->b_start_record )
> > > {
> > > /* Enable recording once synchronized */
> > --
> > Ilkka Ollakka
> > There's an old proverb that says just about whatever you want it to.
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
--
Ilkka Ollakka
I've been in more laps than a napkin.
-- Mae West
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20130814/4a2032b9/attachment.sig>
More information about the vlc-devel
mailing list