[vlc-commits] httplive: use longest segment to calculate reload wait instead of given max duration tag

Ilkka Ollakka git at videolan.org
Sun Feb 2 14:59:13 CET 2014


vlc | branch: master | Ilkka Ollakka <ileoo at videolan.org> | Sat Feb  1 14:01:38 2014 +0200| [4021ce949b4ae20720e15709757344c5ec3be62d] | committer: Ilkka Ollakka

httplive: use longest segment to calculate reload wait instead of given max duration tag

This way if playlist contains way shorter segments than max-duration,
we have better estimate on how ofter we should reload playlist.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4021ce949b4ae20720e15709757344c5ec3be62d
---

 modules/stream_filter/httplive.c |    9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/modules/stream_filter/httplive.c b/modules/stream_filter/httplive.c
index 12304d3..725a538 100644
--- a/modules/stream_filter/httplive.c
+++ b/modules/stream_filter/httplive.c
@@ -83,6 +83,7 @@ typedef struct hls_stream_s
     int         version;    /* protocol version should be 1 */
     int         sequence;   /* media sequence number */
     int         duration;   /* maximum duration per segment (s) */
+    int         max_segment_length;   /* maximum duration segments */
     uint64_t    bandwidth;  /* bandwidth usage of segments (bits per second)*/
     uint64_t    size;       /* stream length is calculated by taking the sum
                                foreach segment of (segment->duration * hls->bandwidth/8) */
@@ -240,6 +241,7 @@ static hls_stream_t *hls_New(vlc_array_t *hls_stream, const int id, const uint64
     hls->id = id;
     hls->bandwidth = bw;
     hls->duration = -1;/* unknown */
+    hls->max_segment_length = -1;/* unknown */
     hls->size = 0;
     hls->sequence = 0; /* default is 0 */
     hls->version = 1;  /* default protocol version */
@@ -652,6 +654,8 @@ static int parse_SegmentInformation(hls_stream_t *hls, char *p_read, int *durati
             value = ((int)d);
         *duration = value;
     }
+    if( *duration > hls->max_segment_length)
+        hls->max_segment_length = *duration;
 
     /* Ignore the rest of the line */
     return VLC_SUCCESS;
@@ -1369,6 +1373,7 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
              hls_new->id, hls_new->bandwidth, count);
 
     vlc_mutex_lock(&hls_old->lock);
+    hls_old->max_segment_length=-1;
     for (int n = 0; n < count; n++)
     {
         segment_t *p = segment_GetSegment(hls_new, n);
@@ -1438,6 +1443,8 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
             }
             vlc_array_append(hls_old->segments, p);
             msg_Dbg(s, "- segment %d appended", p->sequence);
+            hls_old->max_segment_length = __MAX(hls_old->max_segment_length, l->duration);
+            msg_Dbg(s, " playlists new max duration %d", hls_old->max_segment_length);
 
             // Signal download thread otherwise the segment will not get downloaded
             *stream_appended = true;
@@ -1746,7 +1753,7 @@ static void* hls_Reload(void *p_this)
 
             /* determine next time to update playlist */
             p_sys->playlist.last = now;
-            p_sys->playlist.wakeup = now + ((mtime_t)(hls->duration * wait)
+            p_sys->playlist.wakeup = now + ((mtime_t)(hls->max_segment_length * wait)
                                                    * (mtime_t)1000000);
         }
 



More information about the vlc-commits mailing list