[vlc-commits] commit: stream_filter/httplive.c: Try guessing best quality stream for this connection. (Jean-Paul Saman )
git at videolan.org
git at videolan.org
Tue Dec 14 13:23:05 CET 2010
vlc | branch: master | Jean-Paul Saman <jean-paul.saman at m2x.nl> | Tue Dec 7 16:11:07 2010 +0100| [35b0af9b86745e865cadd4c4592fc59645466fc7] | committer: Jean-Paul Saman
stream_filter/httplive.c: Try guessing best quality stream for this connection.
Try picking the best quality stream possible. Then start downloading first
3 segments to ensure a smooth playback start.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=35b0af9b86745e865cadd4c4592fc59645466fc7
---
modules/stream_filter/httplive.c | 82 ++++++++++++++++++++++++-------------
1 files changed, 53 insertions(+), 29 deletions(-)
diff --git a/modules/stream_filter/httplive.c b/modules/stream_filter/httplive.c
index 16b8480..89ed7d0 100644
--- a/modules/stream_filter/httplive.c
+++ b/modules/stream_filter/httplive.c
@@ -856,8 +856,6 @@ static int BandwidthAdaptation(stream_t *s, int progid, uint64_t *bandwidth)
static int Download(stream_t *s, hls_stream_t *hls, segment_t *segment, int *cur_stream)
{
- stream_sys_t *p_sys = s->p_sys;
-
assert(hls);
assert(segment);
@@ -879,23 +877,8 @@ static int Download(stream_t *s, hls_stream_t *hls, segment_t *segment, int *cur
vlc_mutex_unlock(&segment->lock);
- /* thread is not started yet */
- if (p_sys->thread == NULL)
- {
- msg_Info(s, "downloaded segment %d from stream %d",
- p_sys->segment, p_sys->current);
- return VLC_SUCCESS;
- }
- else
- {
- /* Do bandwidth calculations when there are at least 3 segments
- downloaded */
- msg_Info(s, "downloaded segment %d from stream %d",
- p_sys->thread->segment, p_sys->thread->current);
-
- if (p_sys->thread->segment - p_sys->segment < 3)
- return VLC_SUCCESS;
- }
+ msg_Info(s, "downloaded segment %d from stream %d",
+ segment->sequence, *cur_stream);
/* check for division by zero */
double ms = (double)duration / 1000.0; /* ms */
@@ -982,18 +965,46 @@ static void* hls_Thread(vlc_object_t *p_this)
static int Prefetch(stream_t *s, int *current)
{
stream_sys_t *p_sys = s->p_sys;
+ int i_segment = p_sys->segment;
- hls_stream_t *hls = hls_Get(p_sys->hls_stream, p_sys->current);
- if (hls == NULL)
- return VLC_EGENERIC;
+ /* Try to pick best matching stream */
+ int count = vlc_array_count(p_sys->hls_stream);
+ for (int stream = 0; stream < count; stream++)
+ {
+ hls_stream_t *hls = hls_Get(p_sys->hls_stream, stream);
+ if (hls == NULL)
+ return VLC_EGENERIC;
+
+ segment_t *segment = segment_GetSegment(hls,i_segment);
+ if (segment == NULL )
+ return VLC_EGENERIC;
+
+ if (Download(s, hls, segment, &stream) != VLC_SUCCESS)
+ return VLC_EGENERIC;
+
+ i_segment++;
+
+ /* */
+ *current = stream;
+ }
/* Download first 3 segments of this HLS stream */
+ hls_stream_t *hls = hls_Get(p_sys->hls_stream, *current);
+ if (hls == NULL)
+ return VLC_EGENERIC; /* FIXME: */
+
for (int i = 0; i < 3; i++)
{
segment_t *segment = segment_GetSegment(hls, p_sys->segment);
if (segment == NULL )
return VLC_EGENERIC;
+ if (segment->data)
+ {
+ p_sys->segment++;
+ continue;
+ }
+
if (Download(s, hls, segment, current) != VLC_SUCCESS)
return VLC_EGENERIC;
@@ -1218,6 +1229,7 @@ static int Open(vlc_object_t *p_this)
p_sys->thread->hls_stream = p_sys->hls_stream;
p_sys->thread->current = current;
+ p_sys->current = current;
p_sys->thread->segment = p_sys->segment;
p_sys->segment = 0; /* reset to first segment */
p_sys->thread->s = s;
@@ -1275,8 +1287,23 @@ static segment_t *NextSegment(stream_t *s)
{
stream_sys_t *p_sys = s->p_sys;
segment_t *segment = NULL;
- int i_stream = 0;
+ /* Is the next segment of the current HLS stream ready? */
+ hls_stream_t *hls = hls_Get(p_sys->hls_stream, p_sys->current);
+ if (hls != NULL)
+ {
+ segment = segment_GetSegment(hls, p_sys->segment);
+ if (segment != NULL)
+ {
+ /* This segment is ready? */
+ if (segment->data != NULL)
+ return segment;
+ }
+ }
+
+ /* Was the HLS stream changed to another bitrate? */
+ int i_stream = 0;
+ segment = NULL;
while(vlc_object_alive(s))
{
/* Is the next segment ready */
@@ -1288,7 +1315,7 @@ static segment_t *NextSegment(stream_t *s)
/* This segment is ready? */
if (segment->data != NULL)
- return segment;
+ goto segment_ok;
if (!p_sys->b_meta) return NULL;
@@ -1296,13 +1323,10 @@ static segment_t *NextSegment(stream_t *s)
i_stream++;
if (i_stream >= vlc_array_count(p_sys->hls_stream))
return NULL;
-#if 0
- msg_Info(s, "playback is switching from stream %d to %d",
- p_sys->current, i_stream);
-#endif
- p_sys->current = i_stream;
}
+segment_ok:
+ p_sys->current = i_stream;
return segment;
}
More information about the vlc-commits
mailing list