vlc | branch: master | Jean-Paul Saman <jean-paul.sa...@m2x.nl> | Fri Dec 31 
15:31:49 2010 +0100| [c407725c0a6dd217458cb59bad342c4c02e20420] | committer: 
Jean-Paul Saman 

stream_filter/httplive.c: reloading playlist check before download segments

Rearrange hls_Thread logic with live playback in mind. In case all segments 
have been
downloaded, then make sure that reloading the playlist file happens before 
downloading
the next segment. This is also true when it is time to reload the playlist.

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

 modules/stream_filter/httplive.c |   57 ++++++++++++++++++++-----------------
 1 files changed, 31 insertions(+), 26 deletions(-)

diff --git a/modules/stream_filter/httplive.c b/modules/stream_filter/httplive.c
index ba2c87c..237eed4 100644
--- a/modules/stream_filter/httplive.c
+++ b/modules/stream_filter/httplive.c
@@ -1206,14 +1206,15 @@ static void* hls_Thread(vlc_object_t *p_this)
         vlc_mutex_unlock(&hls->lock);
 
         /* Is there a new segment to process? */
-        if ((p_sys->playback.segment < (count - 6)) ||
+        if ((!p_sys->b_live && (p_sys->playback.segment < (count - 6))) ||
             (client->segment >= count))
         {
             /* wait */
             vlc_mutex_lock(&client->lock_wait);
             while (((client->segment - p_sys->playback.segment > 6) ||
                     (client->segment >= count)) &&
-                   (client->seek == -1))
+                   (client->seek == -1) &&
+                   (mdate() < p_sys->playlist.wakeup))
             {
                 vlc_cond_wait(&client->wait, &client->lock_wait);
                 if (!vlc_object_alive(p_this)) break;
@@ -1229,6 +1230,32 @@ static void* hls_Thread(vlc_object_t *p_this)
 
         if (!vlc_object_alive(p_this)) break;
 
+        /* reload the m3u8 index file */
+        if (p_sys->b_live)
+        {
+            double wait = 1;
+            mtime_t now = mdate();
+            if (now >= p_sys->playlist.wakeup)
+            {
+                if (hls_ReloadPlaylist(client->s) != VLC_SUCCESS)
+                {
+                    /* No change in playlist, then backoff */
+                    p_sys->playlist.tries++;
+                    if (p_sys->playlist.tries == 1) wait = 0.5;
+                    else if (p_sys->playlist.tries == 2) wait = 1;
+                    else if (p_sys->playlist.tries >= 3) wait = 3;
+                }
+                else p_sys->playlist.tries = 0;
+
+                /* determine next time to update playlist */
+                p_sys->playlist.last = now;
+                p_sys->playlist.wakeup = now + ((mtime_t)(hls->duration * wait)
+                                                * (mtime_t)1000000);
+            }
+
+            if (!vlc_object_alive(p_this)) break;
+        }
+
         vlc_mutex_lock(&hls->lock);
         segment_t *segment = segment_GetSegment(hls, client->segment);
         assert(segment);
@@ -1236,6 +1263,8 @@ static void* hls_Thread(vlc_object_t *p_this)
 
         if (Download(client->s, hls, segment, &client->current) != VLC_SUCCESS)
         {
+            if (!vlc_object_alive(p_this)) break;
+
             if (!p_sys->b_live)
             {
                 p_sys->b_error = true;
@@ -1255,30 +1284,6 @@ static void* hls_Thread(vlc_object_t *p_this)
             client->segment++;
         vlc_cond_signal(&client->wait);
         vlc_mutex_unlock(&client->lock_wait);
-
-        /* reload the m3u8 index file */
-        if (p_sys->b_live)
-        {
-            double wait = 1;
-            mtime_t now = mdate();
-            if (now >= p_sys->playlist.wakeup)
-            {
-                if (hls_ReloadPlaylist(client->s) != VLC_SUCCESS)
-                {
-                    /* No change in playlist, then backoff */
-                    p_sys->playlist.tries++;
-                    if (p_sys->playlist.tries == 1) wait = 0.5;
-                    else if (p_sys->playlist.tries == 2) wait = 1;
-                    else if (p_sys->playlist.tries >= 3) wait = 3;
-                }
-                else p_sys->playlist.tries = 0;
-
-                /* determine next time to update playlist */
-                p_sys->playlist.last = now;
-                p_sys->playlist.wakeup = now + ((mtime_t)(hls->duration * wait)
-                                                * (mtime_t)1000000);
-            }
-        }
     }
 
     vlc_restorecancel(canc);

_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
http://mailman.videolan.org/listinfo/vlc-commits

Reply via email to