summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MPEG4Extractor.cpp
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2014-02-18 10:27:04 -0800
committerMarco Nelissen <marcone@google.com>2014-02-18 10:30:15 -0800
commitebfd32300605d67e4c45a97f4972d4b6ea268a37 (patch)
tree5eb9f03b3777159df00fb8d0a251ac26f63ba10d /media/libstagefright/MPEG4Extractor.cpp
parent1ebd04b5f4ffe774c37054aac305cd9e6c73d2b2 (diff)
downloadframeworks_av-ebfd32300605d67e4c45a97f4972d4b6ea268a37.zip
frameworks_av-ebfd32300605d67e4c45a97f4972d4b6ea268a37.tar.gz
frameworks_av-ebfd32300605d67e4c45a97f4972d4b6ea268a37.tar.bz2
Fix crash when seeking fragmented mp4 files
Rewinding a fragmented mp4 file without a segment index (sidx) after playing it to the end would crash. b/13028840 Change-Id: I280e74364589f0acefd432a59f85a6594c009a21
Diffstat (limited to 'media/libstagefright/MPEG4Extractor.cpp')
-rw-r--r--media/libstagefright/MPEG4Extractor.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 4756b3e..81ed6f7 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -3719,11 +3719,19 @@ status_t MPEG4Source::fragmentedRead(
totalTime += se->mDurationUs;
totalOffset += se->mSize;
}
- mCurrentMoofOffset = totalOffset;
- mCurrentSamples.clear();
- mCurrentSampleIndex = 0;
- parseChunk(&totalOffset);
- mCurrentTime = totalTime * mTimescale / 1000000ll;
+ mCurrentMoofOffset = totalOffset;
+ mCurrentSamples.clear();
+ mCurrentSampleIndex = 0;
+ parseChunk(&totalOffset);
+ mCurrentTime = totalTime * mTimescale / 1000000ll;
+ } else {
+ // without sidx boxes, we can only seek to 0
+ mCurrentMoofOffset = mFirstMoofOffset;
+ mCurrentSamples.clear();
+ mCurrentSampleIndex = 0;
+ off64_t tmp = mCurrentMoofOffset;
+ parseChunk(&tmp);
+ mCurrentTime = 0;
}
if (mBuffer != NULL) {
@@ -3744,15 +3752,14 @@ status_t MPEG4Source::fragmentedRead(
if (mCurrentSampleIndex >= mCurrentSamples.size()) {
// move to next fragment
- Sample lastSample = mCurrentSamples[mCurrentSamples.size() - 1];
- off64_t nextMoof = mNextMoofOffset; // lastSample.offset + lastSample.size;
+ off64_t nextMoof = mNextMoofOffset;
mCurrentMoofOffset = nextMoof;
mCurrentSamples.clear();
mCurrentSampleIndex = 0;
parseChunk(&nextMoof);
- if (mCurrentSampleIndex >= mCurrentSamples.size()) {
- return ERROR_END_OF_STREAM;
- }
+ if (mCurrentSampleIndex >= mCurrentSamples.size()) {
+ return ERROR_END_OF_STREAM;
+ }
}
const Sample *smpl = &mCurrentSamples[mCurrentSampleIndex];