aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnssi Hannula <anssi.hannula@iki.fi>2014-01-03 10:51:55 +0200
committerAnssi Hannula <anssi.hannula@iki.fi>2014-04-06 17:55:04 +0300
commitad701326b43078b907a054c585d7f3308b7f6143 (patch)
tree7d663bb2121adb54b0b41c5337eb79b9783fe81a
parent05ce529a596c75276b7cd873614529c9c6407fbc (diff)
downloadffmpeg-ad701326b43078b907a054c585d7f3308b7f6143.tar.gz
avformat/hls: open playlists immediately when AVDISCARD_ALL is dropped
Do not try to delay opening newly required playlists until a segment switch. Applications expect that newly selected undiscarded streams are available immediately, especially with alternative rendition streams (selectable audio/subtitle tracks). One might think that delaying variant stream switch until a segment switch would allow a "seamless" switch without us having to download a specific segment from two different variant playlists. However, that is not the case, since the application would have to keep the previous stream available (undiscarded) until the first packet of the newly selected stream arrives, but by that time the demuxer would have already downloaded the next segment of both variants. Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
-rw-r--r--libavformat/hls.c14
1 files changed, 2 insertions, 12 deletions
diff --git a/libavformat/hls.c b/libavformat/hls.c
index 9a36ab2f00..94ed64d670 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -164,7 +164,6 @@ typedef struct HLSContext {
struct rendition **renditions;
int cur_seq_no;
- int end_of_segment;
int first_packet;
int64_t first_timestamp;
int64_t cur_timestamp;
@@ -1053,7 +1052,6 @@ reload:
v->input = NULL;
v->cur_seq_no++;
- c->end_of_segment = 1;
c->cur_seq_no = v->cur_seq_no;
goto restart;
@@ -1480,13 +1478,8 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
HLSContext *c = s->priv_data;
int ret, i, minplaylist = -1;
- if (c->first_packet) {
- recheck_discard_flags(s, 1);
- c->first_packet = 0;
- }
+ recheck_discard_flags(s, c->first_packet);
-start:
- c->end_of_segment = 0;
for (i = 0; i < c->n_playlists; i++) {
struct playlist *pls = c->playlists[i];
/* Make sure we've got one buffered packet from each open playlist
@@ -1551,10 +1544,7 @@ start:
}
}
}
- if (c->end_of_segment) {
- if (recheck_discard_flags(s, 0))
- goto start;
- }
+
/* If we got a packet, return it */
if (minplaylist >= 0) {
struct playlist *pls = c->playlists[minplaylist];