vlc | branch: master | Jean-Paul Saman <jean-paul.sa...@m2x.nl> | Fri Nov  5 
10:23:37 2010 +0100| [8251271854672f05c1bc6f2b765228dee3a4a17e] | committer: 
Jean-Paul Saman 

stream_filter/httplive.c: start playback with first HLS stream (usuall lower 
bandwidth).

Start playback right after successfull downloading of the first segment. Switch 
to a higher bandwidth
later on. By the time peeking and first segment have been played the next 
segment is available.

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

 modules/stream_filter/httplive.c |   50 ++++++++++++++++++++-----------------
 1 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/modules/stream_filter/httplive.c b/modules/stream_filter/httplive.c
index 051127c..9162b26 100644
--- a/modules/stream_filter/httplive.c
+++ b/modules/stream_filter/httplive.c
@@ -854,7 +854,7 @@ static int Download(stream_t *s, hls_stream_t *hls, 
segment_t *segment, int *cur
         int newstream = BandwidthAdaptation(s, hls->id, &bw);
         if ((newstream >= 0) && (newstream != *cur_stream))
         {
-            msg_Info(s, "switching to %s bandwidth (%"PRIu64") stream",
+            msg_Info(s, "detected %s bandwidth (%"PRIu64") stream",
                      (hls->bandwidth <= bw) ? "faster" : "lower", bw);
             *cur_stream = newstream;
         }
@@ -920,13 +920,9 @@ static void* hls_Thread(vlc_object_t *p_this)
     return NULL;
 }
 
-static int Prefetch(stream_t *s)
+static int Prefetch(stream_t *s, int *current)
 {
     stream_sys_t *p_sys = s->p_sys;
-    int current;
-
-again:
-    current = p_sys->current;
 
     hls_stream_t *hls = hls_Get(p_sys->hls_stream, p_sys->current);
     if (hls == NULL)
@@ -936,13 +932,9 @@ again:
     if (segment == NULL )
         return VLC_EGENERIC;
 
-    if (Download(s, hls, segment, &p_sys->current) != VLC_SUCCESS)
+    if (Download(s, hls, segment, current) != VLC_SUCCESS)
         return VLC_EGENERIC;
 
-    /* Bandwidth changed? */
-    if (current != p_sys->current)
-        goto again;
-
     return VLC_SUCCESS;
 }
 
@@ -1147,10 +1139,10 @@ static int Open(vlc_object_t *p_this)
     }
 
     /* */
+    int current = p_sys->current = 0;
     p_sys->segment = 0;
-    p_sys->current = 0;
 
-    if (Prefetch(s) != VLC_SUCCESS)
+    if (Prefetch(s, &current) != VLC_SUCCESS)
     {
         msg_Err(s, "fetching first segment.");
         goto fail;
@@ -1164,7 +1156,7 @@ static int Open(vlc_object_t *p_this)
     }
 
     p_sys->thread->hls_stream = p_sys->hls_stream;
-    p_sys->thread->current = p_sys->current;
+    p_sys->thread->current = current;
     p_sys->thread->s = s;
 
     if (vlc_thread_create(p_sys->thread, "HTTP Live Streaming client",
@@ -1240,6 +1232,8 @@ static segment_t *NextSegment(stream_t *s)
         if (p_sys->current != p_sys->thread->current)
         {
             /* YES it was */
+            msg_Info(s, "playback is switching from stream %d to %d",
+                     p_sys->current, p_sys->thread->current);
             p_sys->current = p_sys->thread->current;
         }
         else
@@ -1335,18 +1329,22 @@ static int Peek(stream_t *s, const uint8_t **pp_peek, 
unsigned int i_peek)
 {
     stream_sys_t *p_sys = s->p_sys;
     size_t curlen = 0;
+    segment_t *segment;
 
-    hls_stream_t *hls = hls_Get(p_sys->hls_stream, p_sys->current);
-    if (hls == NULL)
-        return 0;
+again:
+    segment = NextSegment(s);
+    if (segment == NULL)
+    {
+        msg_Err(s, "segment should have been availabe");
+        return 0; /* eof? */
+    }
 
+    vlc_mutex_lock(&segment->lock);
+
+    /* remember segment to peek */
     int peek_segment = p_sys->segment;
     do
     {
-        segment_t *segment = segment_GetSegment(hls, peek_segment);
-        if (segment == NULL) return 0;
-
-        vlc_mutex_lock(&segment->lock);
         if (i_peek < segment->data->i_buffer)
         {
             *pp_peek = segment->data->p_buffer;
@@ -1354,11 +1352,17 @@ static int Peek(stream_t *s, const uint8_t **pp_peek, 
unsigned int i_peek)
         }
         else
         {
-             peek_segment++;
+            p_sys->segment++;
+            vlc_mutex_unlock(&segment->lock);
+            goto again;
         }
-        vlc_mutex_unlock(&segment->lock);
     } while ((curlen < i_peek) && vlc_object_alive(s));
 
+    /* restore segment to read */
+    p_sys->segment = peek_segment;
+
+    vlc_mutex_unlock(&segment->lock);
+
     return curlen;
 }
 

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

Reply via email to