diff options
author | Chong Zhang <chz@google.com> | 2015-03-06 14:00:54 -0800 |
---|---|---|
committer | Chong Zhang <chz@google.com> | 2015-03-17 09:53:35 -0700 |
commit | c4547ba77f78632172db3647a09659d9863d3b5c (patch) | |
tree | a1d76a900d2bafdb64414ccea16cacdcffead747 /media/libstagefright/httplive/M3UParser.cpp | |
parent | c84eb736fd051c37e1d7e8585d14612713388a58 (diff) | |
download | frameworks_av-c4547ba77f78632172db3647a09659d9863d3b5c.zip frameworks_av-c4547ba77f78632172db3647a09659d9863d3b5c.tar.gz frameworks_av-c4547ba77f78632172db3647a09659d9863d3b5c.tar.bz2 |
HLS: some fixes for seek with discontinuity.
- keep old fetcher when seeking, unless the URI is changing.
- when restarting after a seek, check discontinuity seq, and
queue format change if it's changed.
- add a simple kill switch to abort when stop (or pause for seek).
- when seeking, if searching for start time goes into 2nd segment,
do not signal time discontinuity or reset first PTS.
- use setFormat() to set format in AnotherPacketSource, otherwise
video/audio flags are not updated and format are not cleared on
discontinuities.
- do not start queueing video access unit until first IDR after start
bug: 19656539
Change-Id: I79108d26964f59ea00d2eeac8f5f9318747f8541
Diffstat (limited to 'media/libstagefright/httplive/M3UParser.cpp')
-rw-r--r-- | media/libstagefright/httplive/M3UParser.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp index 997b694..3c5d7cf 100644 --- a/media/libstagefright/httplive/M3UParser.cpp +++ b/media/libstagefright/httplive/M3UParser.cpp @@ -251,6 +251,7 @@ M3UParser::M3UParser( mIsComplete(false), mIsEvent(false), mDiscontinuitySeq(0), + mDiscontinuityCount(0), mSelectedIndex(-1) { mInitCheck = parse(data, size); } @@ -582,6 +583,7 @@ status_t M3UParser::parse(const void *_data, size_t size) { itemMeta = new AMessage; } itemMeta->setInt32("discontinuity", true); + ++mDiscontinuityCount; } else if (line.startsWith("#EXT-X-STREAM-INF")) { if (mMeta != NULL) { return ERROR_MALFORMED; @@ -609,6 +611,9 @@ status_t M3UParser::parse(const void *_data, size_t size) { } else if (line.startsWith("#EXT-X-MEDIA")) { err = parseMedia(line); } else if (line.startsWith("#EXT-X-DISCONTINUITY-SEQUENCE")) { + if (mIsVariantPlaylist) { + return ERROR_MALFORMED; + } size_t seq; err = parseDiscontinuitySequence(line, &seq); if (err == OK) { @@ -628,6 +633,7 @@ status_t M3UParser::parse(const void *_data, size_t size) { || !itemMeta->findInt64("durationUs", &durationUs)) { return ERROR_MALFORMED; } + itemMeta->setInt32("discontinuity-sequence", mDiscontinuitySeq + mDiscontinuityCount); } mItems.push(); |