diff options
author | Andreas Huber <andih@google.com> | 2011-06-30 16:52:33 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-06-30 16:52:33 -0700 |
commit | 0f30bd90272c818aa37c0bb22d22eaa7d3689879 (patch) | |
tree | 0a843f5b297b088988bc1d153ec3ae6548b9cf93 | |
parent | 69c2b29eb72396068b9d116c2a54f283025c7d6b (diff) | |
download | frameworks_av-0f30bd90272c818aa37c0bb22d22eaa7d3689879.zip frameworks_av-0f30bd90272c818aa37c0bb22d22eaa7d3689879.tar.gz frameworks_av-0f30bd90272c818aa37c0bb22d22eaa7d3689879.tar.bz2 |
Seeking/duration in HLS content is based on the individual segments' duration
not target-duration.
Change-Id: I294097daa84c25e4084a6fc4ea80e39a543f3d10
related-to-bug: 4983285
-rw-r--r-- | media/libstagefright/httplive/LiveSession.cpp | 45 | ||||
-rw-r--r-- | media/libstagefright/httplive/M3UParser.cpp | 13 |
2 files changed, 42 insertions, 16 deletions
diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp index 165683e..f1a2a60 100644 --- a/media/libstagefright/httplive/LiveSession.cpp +++ b/media/libstagefright/httplive/LiveSession.cpp @@ -408,13 +408,20 @@ rinse_repeat: if (firstTime) { Mutex::Autolock autoLock(mLock); - int32_t targetDuration; - if (!mPlaylist->isComplete() - || !mPlaylist->meta()->findInt32( - "target-duration", &targetDuration)) { + if (!mPlaylist->isComplete()) { mDurationUs = -1; } else { - mDurationUs = 1000000ll * targetDuration * mPlaylist->size(); + mDurationUs = 0; + for (size_t i = 0; i < mPlaylist->size(); ++i) { + sp<AMessage> itemMeta; + CHECK(mPlaylist->itemAt( + i, NULL /* uri */, &itemMeta)); + + int64_t itemDurationUs; + CHECK(itemMeta->findInt64("durationUs", &itemDurationUs)); + + mDurationUs += itemDurationUs; + } } } @@ -431,14 +438,26 @@ rinse_repeat: bool bandwidthChanged = false; if (mSeekTimeUs >= 0) { - int32_t targetDuration; - if (mPlaylist->isComplete() && - mPlaylist->meta()->findInt32( - "target-duration", &targetDuration)) { - int64_t seekTimeSecs = (mSeekTimeUs + 500000ll) / 1000000ll; - int64_t index = seekTimeSecs / targetDuration; - - if (index >= 0 && index < mPlaylist->size()) { + if (mPlaylist->isComplete()) { + size_t index = 0; + int64_t segmentStartUs = 0; + while (index < mPlaylist->size()) { + sp<AMessage> itemMeta; + CHECK(mPlaylist->itemAt( + index, NULL /* uri */, &itemMeta)); + + int64_t itemDurationUs; + CHECK(itemMeta->findInt64("durationUs", &itemDurationUs)); + + if (mSeekTimeUs < segmentStartUs + itemDurationUs) { + break; + } + + segmentStartUs += itemDurationUs; + ++index; + } + + if (index < mPlaylist->size()) { int32_t newSeqNumber = firstSeqNumberInPlaylist + index; if (newSeqNumber != mSeqNumber) { diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp index 765f795..123fbf8 100644 --- a/media/libstagefright/httplive/M3UParser.cpp +++ b/media/libstagefright/httplive/M3UParser.cpp @@ -64,14 +64,21 @@ size_t M3UParser::size() { } bool M3UParser::itemAt(size_t index, AString *uri, sp<AMessage> *meta) { - uri->clear(); - if (meta) { *meta = NULL; } + if (uri) { + uri->clear(); + } + + if (meta) { + *meta = NULL; + } if (index >= mItems.size()) { return false; } - *uri = mItems.itemAt(index).mURI; + if (uri) { + *uri = mItems.itemAt(index).mURI; + } if (meta) { *meta = mItems.itemAt(index).mMeta; |