Commit d781f87d authored by Chris Smowton's avatar Chris Smowton Committed by Jean-Baptiste Kempf

HLS: Housekeeping

Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 59e5b9a5
...@@ -1271,8 +1271,9 @@ static int get_HTTPLiveMetaPlaylist(stream_t *s, vlc_array_t **streams) ...@@ -1271,8 +1271,9 @@ static int get_HTTPLiveMetaPlaylist(stream_t *s, vlc_array_t **streams)
return err; return err;
} }
/* Reload playlist */ /* Update hls_old (an existing member of p_sys->hls_stream) to match hls_new
static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t **hls) (which represents a downloaded, perhaps newer version of the same playlist) */
static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *hls_old)
{ {
int count = vlc_array_count(hls_new->segments); int count = vlc_array_count(hls_new->segments);
...@@ -1284,8 +1285,7 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t * ...@@ -1284,8 +1285,7 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
segment_t *p = segment_GetSegment(hls_new, n); segment_t *p = segment_GetSegment(hls_new, n);
if (p == NULL) return VLC_EGENERIC; if (p == NULL) return VLC_EGENERIC;
vlc_mutex_lock(&(*hls)->lock); segment_t *segment = segment_Find(hls_old, p->sequence);
segment_t *segment = segment_Find(*hls, p->sequence);
if (segment) if (segment)
{ {
vlc_mutex_lock(&segment->lock); vlc_mutex_lock(&segment->lock);
...@@ -1331,32 +1331,29 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t * ...@@ -1331,32 +1331,29 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
} }
else else
{ {
int last = vlc_array_count((*hls)->segments) - 1; int last = vlc_array_count(hls_old->segments) - 1;
segment_t *l = segment_GetSegment(*hls, last); segment_t *l = segment_GetSegment(hls_old, last);
if (l == NULL) goto fail_and_unlock; if (l == NULL) assert(0);
if ((l->sequence + 1) != p->sequence) if ((l->sequence + 1) != p->sequence)
{ {
msg_Err(s, "gap in sequence numbers found: new=%d expected %d", msg_Err(s, "gap in sequence numbers found: new=%d expected %d",
p->sequence, l->sequence+1); p->sequence, l->sequence+1);
} }
vlc_array_append((*hls)->segments, p); vlc_array_append(hls_old->segments, p);
msg_Info(s, "- segment %d appended", p->sequence); msg_Info(s, "- segment %d appended", p->sequence);
} }
vlc_mutex_unlock(&(*hls)->lock);
} }
/* update meta information */ /* update meta information */
vlc_mutex_lock(&(*hls)->lock); hls_old->sequence = hls_new->sequence;
(*hls)->sequence = hls_new->sequence; hls_old->duration = (hls_new->duration == -1) ? hls_old->duration : hls_new->duration;
(*hls)->duration = (hls_new->duration == -1) ? (*hls)->duration : hls_new->duration; hls_old->b_cache = hls_new->b_cache;
(*hls)->b_cache = hls_new->b_cache; vlc_mutex_unlock(&hls_old->lock);
vlc_mutex_unlock(&(*hls)->lock);
return VLC_SUCCESS; return VLC_SUCCESS;
fail_and_unlock: fail_and_unlock:
assert(0); vlc_mutex_unlock(&hls_old->lock);
vlc_mutex_unlock(&(*hls)->lock);
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -1400,7 +1397,7 @@ static int hls_ReloadPlaylist(stream_t *s) ...@@ -1400,7 +1397,7 @@ static int hls_ReloadPlaylist(stream_t *s)
msg_Info(s, "new HLS stream appended (id=%d, bandwidth=%"PRIu64")", msg_Info(s, "new HLS stream appended (id=%d, bandwidth=%"PRIu64")",
hls_new->id, hls_new->bandwidth); hls_new->id, hls_new->bandwidth);
} }
else if (hls_UpdatePlaylist(s, hls_new, &hls_old) != VLC_SUCCESS) else if (hls_UpdatePlaylist(s, hls_new, hls_old) != VLC_SUCCESS)
msg_Info(s, "failed updating HLS stream (id=%d, bandwidth=%"PRIu64")", msg_Info(s, "failed updating HLS stream (id=%d, bandwidth=%"PRIu64")",
hls_new->id, hls_new->bandwidth); hls_new->id, hls_new->bandwidth);
} }
...@@ -1463,7 +1460,7 @@ static int hls_DownloadSegmentData(stream_t *s, hls_stream_t *hls, segment_t *se ...@@ -1463,7 +1460,7 @@ static int hls_DownloadSegmentData(stream_t *s, hls_stream_t *hls, segment_t *se
int estimated = (int)(size / p_sys->bandwidth); int estimated = (int)(size / p_sys->bandwidth);
if (estimated > segment->duration) if (estimated > segment->duration)
{ {
msg_Warn(s,"downloading of segment %d takes %ds, which is longer than its playback (%ds)", msg_Warn(s,"downloading segment %d predicted to take %ds, which exceeds its length (%ds)",
segment->sequence, estimated, segment->duration); segment->sequence, estimated, segment->duration);
} }
} }
...@@ -1471,7 +1468,7 @@ static int hls_DownloadSegmentData(stream_t *s, hls_stream_t *hls, segment_t *se ...@@ -1471,7 +1468,7 @@ static int hls_DownloadSegmentData(stream_t *s, hls_stream_t *hls, segment_t *se
mtime_t start = mdate(); mtime_t start = mdate();
if (hls_Download(s, segment) != VLC_SUCCESS) if (hls_Download(s, segment) != VLC_SUCCESS)
{ {
msg_Err(s, "downloaded segment %d from stream %d failed", msg_Err(s, "downloading segment %d from stream %d failed",
segment->sequence, *cur_stream); segment->sequence, *cur_stream);
vlc_mutex_unlock(&segment->lock); vlc_mutex_unlock(&segment->lock);
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -1924,11 +1921,6 @@ static int Open(vlc_object_t *p_this) ...@@ -1924,11 +1921,6 @@ static int Open(vlc_object_t *p_this)
/* manage encryption key if needed */ /* manage encryption key if needed */
hls_ManageSegmentKeys(s, hls_Get(p_sys->hls_stream, current)); hls_ManageSegmentKeys(s, hls_Get(p_sys->hls_stream, current));
if (p_sys->b_live && (p_sys->playback.segment < 0))
{
msg_Warn(s, "less data than 3 times 'target duration' available for live playback, playback may stall");
}
if (Prefetch(s, &current) != VLC_SUCCESS) if (Prefetch(s, &current) != VLC_SUCCESS)
{ {
msg_Err(s, "fetching first segment failed."); msg_Err(s, "fetching first segment failed.");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment