diff options
author | Chong Zhang <chz@google.com> | 2015-03-27 15:53:45 -0700 |
---|---|---|
committer | Chong Zhang <chz@google.com> | 2015-04-02 16:31:09 -0700 |
commit | d47dfcb5a2e5901c96fc92662cec7aa30f7f8843 (patch) | |
tree | ac077cfad563e38bf91e4b2c95e7e28056bf7439 /media/libstagefright/httplive/M3UParser.cpp | |
parent | ac41a6f253a69671f6e018fcc84daf0030615ca9 (diff) | |
download | frameworks_av-d47dfcb5a2e5901c96fc92662cec7aa30f7f8843.zip frameworks_av-d47dfcb5a2e5901c96fc92662cec7aa30f7f8843.tar.gz frameworks_av-d47dfcb5a2e5901c96fc92662cec7aa30f7f8843.tar.bz2 |
HLS: misc bug fixes
- fix no target-duration case
- fix for audio-only <=> audio/video switching
- disable audio-only variants if there is at least
one variant with video
- fix mpeg2ts PTS wraparound when bandwidth adapting
- tweak up/down switch marks
bug: 19567254
Change-Id: Ib46144203c56dfc96eccd6ddaa3867e8a4f2c6a9
Diffstat (limited to 'media/libstagefright/httplive/M3UParser.cpp')
-rw-r--r-- | media/libstagefright/httplive/M3UParser.cpp | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp index 3c5d7cf..7bb7f2c 100644 --- a/media/libstagefright/httplive/M3UParser.cpp +++ b/media/libstagefright/httplive/M3UParser.cpp @@ -395,7 +395,9 @@ ssize_t M3UParser::getSelectedTrack(media_track_type type) const { bool M3UParser::getTypeURI(size_t index, const char *key, AString *uri) const { if (!mIsVariantPlaylist) { - *uri = mBaseURI; + if (uri != NULL) { + *uri = mBaseURI; + } // Assume media without any more specific attribute contains // audio and video, but no subtitles. @@ -408,7 +410,9 @@ bool M3UParser::getTypeURI(size_t index, const char *key, AString *uri) const { AString groupID; if (!meta->findString(key, &groupID)) { - *uri = mItems.itemAt(index).mURI; + if (uri != NULL) { + *uri = mItems.itemAt(index).mURI; + } AString codecs; if (!meta->findString("codecs", &codecs)) { @@ -434,18 +438,26 @@ bool M3UParser::getTypeURI(size_t index, const char *key, AString *uri) const { } } - sp<MediaGroup> group = mMediaGroups.valueFor(groupID); - if (!group->getActiveURI(uri)) { - return false; - } + // if uri == NULL, we're only checking if the type is present, + // don't care about the active URI (or if there is an active one) + if (uri != NULL) { + sp<MediaGroup> group = mMediaGroups.valueFor(groupID); + if (!group->getActiveURI(uri)) { + return false; + } - if ((*uri).empty()) { - *uri = mItems.itemAt(index).mURI; + if ((*uri).empty()) { + *uri = mItems.itemAt(index).mURI; + } } return true; } +bool M3UParser::hasType(size_t index, const char *key) const { + return getTypeURI(index, key, NULL /* uri */); +} + static bool MakeURL(const char *baseURL, const char *url, AString *out) { out->clear(); @@ -633,7 +645,8 @@ status_t M3UParser::parse(const void *_data, size_t size) { || !itemMeta->findInt64("durationUs", &durationUs)) { return ERROR_MALFORMED; } - itemMeta->setInt32("discontinuity-sequence", mDiscontinuitySeq + mDiscontinuityCount); + itemMeta->setInt32("discontinuity-sequence", + mDiscontinuitySeq + mDiscontinuityCount); } mItems.push(); @@ -650,6 +663,14 @@ status_t M3UParser::parse(const void *_data, size_t size) { ++lineNo; } + // error checking of all fields that's required to appear once + // (currently only checking "target-duration") + int32_t targetDurationSecs; + if (!mIsVariantPlaylist && (mMeta == NULL || !mMeta->findInt32( + "target-duration", &targetDurationSecs))) { + return ERROR_MALFORMED; + } + return OK; } |