<div dir="ltr">Ilkka,<br><br>> In what kinda conditions you can reproduce that issues that hls modules has no data while it should have?<br>
<br>Try the following stream: <a href=" http://www.nasa.gov/multimedia/nasatv/NTV-Public-IPS.m3u8"> http://www.nasa.gov/multimedia/nasatv/NTV-Public-IPS.m3u8</a>.<br><br><div class="gmail_extra">It's a live stream unencrypted (each playlist contains 8 segments) so it will not work with official VLC version due to the download issue I fixed.<br>
<br>Without the TS patch, at least with my network connection, the stream stops after a while because of delays. With the fix in TS module I was able to play this stream continuously for more than 2 hours with no problem.<br>
</div><div class="gmail_extra"><br></div><div class="gmail_extra">I agree that it would be better to fix this problem within the HLS module, but I didn't find a way to achieve that and I honestly doubt that it's possible (however, I'm new to VLC so of-course I might be wrong).<br>
</div><div class="gmail_extra"><br></div><div class="gmail_extra">Regards,<br></div><div class="gmail_extra">Avishay<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Aug 14, 2013 at 9:09 AM, Ilkka Ollakka <span dir="ltr"><<a href="mailto:ileoo@videolan.org" target="_blank">ileoo@videolan.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Wed, Aug 14, 2013 at 09:04:13AM -0400, Avishay Spitzer wrote:<br>
> Ilkka,<br>
<br>
Hi,<br>
<div class="im"><br>
> The problem in TS module, is that once HLS module (HTTPLive stream filter)<br>
> has no data, TS will think that it has reached EOF and VLC will stop<br>
> playing.<br>
<br>
</div>In what kinda conditions you can reproduce that issues that hls modules<br>
has no data while it should have?<br>
<div class="im"><br>
> I don't think that it can be solved from within the HLS module because HLS<br>
> has no control over this. I think that TS module should treat these<br>
> situations gracefully and retry (as I implemented).<br>
<br>
> If you have another idea please let me know.<br>
<br>
</div>in git-tree some places in HLS module assume that segments are 10sec<br>
length and that can cause some issues. I have changed those but haven't<br>
yet pushed them as haven't got time to test them properly<br>
<div class=""><div class="h5"><br>
> Regards,<br>
> Avishay<br>
<br>
<br>
<br>
> On Wed, Aug 14, 2013 at 8:37 AM, Ilkka Ollakka <<a href="mailto:ileoo@videolan.org">ileoo@videolan.org</a>> wrote:<br>
<br>
<br>
> > I think this patch tries to fix issue in wrong place. If the problem is<br>
> > in HLS slow start or short HLS playlists, issue should be handled in<br>
> > httplive stream filter.<br>
<br>
> > On Wed, Aug 14, 2013 at 04:13:46AM -0400, Avishay Spitzer wrote:<br>
> > > From 15f5f247e783895e95020e4f0529bd112bf77b6d Mon Sep 17 00:00:00 2001<br>
> > > From: Avishay Spitzer <<a href="mailto:savishay@gmail.com">savishay@gmail.com</a>><br>
> > > Date: Wed, 14 Aug 2013 03:52:44 -0400<br>
> > > Subject: [PATCH 1/3] In case of slow connections or short HLS playlists,<br>
> > >  packets may not arrive on time and TS module will<br>
> > >  declare EOF which will case VLC to stop playing the<br>
> > >  stream. Problem was solved by adding a retries<br>
> > >  mechanism with increasing backoff.<br>
<br>
> > > ---<br>
> > >  modules/demux/ts.c |   37 ++++++++++++++++++++++++++++++++++++-<br>
> > >  1 file changed, 36 insertions(+), 1 deletion(-)<br>
<br>
> > > diff --git a/modules/demux/ts.c b/modules/demux/ts.c<br>
> > > index 5c4a288..dd74e36 100644<br>
> > > --- a/modules/demux/ts.c<br>
> > > +++ b/modules/demux/ts.c<br>
> > > @@ -334,6 +334,9 @@ struct demux_sys_t<br>
<br>
> > >      /* */<br>
> > >      bool        b_start_record;<br>
> > > +<br>
> > > +    /* Counts number of times ReadTSPacket returned NULL for<br>
> > implemeting a retries mechanism */<br>
> > > +    uint64_t         b_get_packet_retry;<br>
> > >  };<br>
<br>
> > >  static int Demux    ( demux_t *p_demux );<br>
> > > @@ -570,6 +573,9 @@ static int Open( vlc_object_t *p_this )<br>
> > >      p_sys->i_packet_size = i_packet_size;<br>
> > >      vlc_mutex_init( &p_sys->csa_lock );<br>
<br>
> > > +    // Initialize retries counter<br>
> > > +    p_sys->b_get_packet_retry = 0;<br>
> > > +<br>
> > >      p_sys->buffer = NULL;<br>
> > >      p_demux->pf_demux = Demux;<br>
> > >      p_demux->pf_control = Control;<br>
> > > @@ -949,9 +955,38 @@ static int Demux( demux_t *p_demux )<br>
> > >          block_t     *p_pkt;<br>
> > >          if( !(p_pkt = ReadTSPacket( p_demux )) )<br>
> > >          {<br>
> > > -            return 0;<br>
> > > +             // Retries mechanism - start<br>
> > > +             // In case of live streams TS packets may delay due to<br>
> > slow connections or short<br>
> > > +             // playlists (in case of HLS).<br>
> > > +             // We don't want to declare EOF (by returning 0 here)<br>
> > right away so we add a retries<br>
> > > +             // mechanism with increasing backoff.<br>
> > > +             // Retries are limited to 100 retries per packet and since<br>
> > backoff is based on an<br>
> > > +             // arithmetic progression the aggregate waiting time until<br>
> > declaring EOF is<br>
> > > +             // 100*(100+1)/2=5050ms.<br>
> > > +             // In order to make the stream continuous after reaching<br>
> > 100 retries each backoff<br>
> > > +             // will last 100ms and EOF will not be declared.<br>
> > > +<br>
> > > +             // If 100 retries failed then kill this stream to avoid<br>
> > VLC getting stuck<br>
> > > +             if (!(vlc_object_alive (p_demux)))<br>
> > > +                     return 0;<br>
> > > +<br>
> > > +             // Increase the retries count before sleeping (avoids 0ms<br>
> > sleep)<br>
> > > +             p_sys->b_get_packet_retry++;<br>
> > > +<br>
> > > +             // Sleep for 1ms times the retries counter before returning<br>
> > > +             msleep(((p_sys->b_get_packet_retry >= 100) ? 100 :<br>
> > p_sys->b_get_packet_retry) * 1000);<br>
> > > +<br>
> > > +             // If the vlc object is not alive after sleeping get out<br>
> > > +             if (!(vlc_object_alive (p_demux)))<br>
> > > +                     return 0;<br>
> > > +             // Retries mechanism - end<br>
> > > +<br>
> > > +             return 1;<br>
> > >          }<br>
<br>
> > > +     // If packet was received correctly zero retries counter<br>
> > > +     p_sys->b_get_packet_retry = 0;<br>
> > > +<br>
> > >          if( p_sys->b_start_record )<br>
> > >          {<br>
> > >              /* Enable recording once synchronized */<br>
> > --<br>
> > Ilkka Ollakka<br>
> > There's an old proverb that says just about whatever you want it to.<br>
<br>
> > _______________________________________________<br>
> > vlc-devel mailing list<br>
> > To unsubscribe or modify your subscription options:<br>
> > <a href="https://mailman.videolan.org/listinfo/vlc-devel" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a><br>
<br>
<br>
<br>
</div></div><span class=""><font color="#888888">--<br>
Ilkka Ollakka<br>
I've been in more laps than a napkin.<br>
                -- Mae West<br>
</font></span><br>_______________________________________________<br>
vlc-devel mailing list<br>
To unsubscribe or modify your subscription options:<br>
<a href="https://mailman.videolan.org/listinfo/vlc-devel" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a><br>
<br></blockquote></div><br></div></div>