Merge "oggextractor: fix duration calculation" into qt-dev
am: 6f471f0c0a
Change-Id: I49aa2b9b97e48d10d9812a6ff8c6641855db8330
diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp
index b63ae6b..72b94bb 100644
--- a/media/extractors/ogg/OggExtractor.cpp
+++ b/media/extractors/ogg/OggExtractor.cpp
@@ -323,6 +323,7 @@
mFirstDataOffset(-1),
mHapticChannelCount(0) {
mCurrentPage.mNumSegments = 0;
+ mCurrentPage.mFlags = 0;
vorbis_info_init(&mVi);
vorbis_comment_init(&mVc);
@@ -414,19 +415,18 @@
ALOGV("prevPageOffset at %lld, pageOffset at %lld",
(long long)prevPageOffset, (long long)pageOffset);
-
+ uint8_t flag = 0;
for (;;) {
Page prevPage;
ssize_t n = readPage(prevPageOffset, &prevPage);
if (n <= 0) {
- return (status_t)n;
+ return (flag & 0x4) ? OK : (status_t)n;
}
-
+ flag = prevPage.mFlags;
prevPageOffset += n;
-
+ *granulePos = prevPage.mGranulePosition;
if (prevPageOffset == pageOffset) {
- *granulePos = prevPage.mGranulePosition;
return OK;
}
}
@@ -688,7 +688,7 @@
TRESPASS();
}
- uint32_t numSamples = frameSizeUs * numFrames * kOpusSampleRate / 1000000;
+ uint32_t numSamples = (uint32_t)((uint64_t)frameSizeUs * numFrames * kOpusSampleRate) / 1000000;
return numSamples;
}
@@ -868,6 +868,7 @@
CHECK_EQ(mNextLaceIndex, mCurrentPage.mNumSegments);
mOffset += mCurrentPageSize;
+ uint8_t flag = mCurrentPage.mFlags;
ssize_t n = readPage(mOffset, &mCurrentPage);
if (n <= 0) {
@@ -878,6 +879,7 @@
ALOGV("readPage returned %zd", n);
+ if (flag & 0x04) return AMEDIA_ERROR_END_OF_STREAM;
return (media_status_t) n;
}