diff options
author | Marco Nelissen <marcone@google.com> | 2014-02-18 10:27:04 -0800 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2014-02-18 10:30:15 -0800 |
commit | ebfd32300605d67e4c45a97f4972d4b6ea268a37 (patch) | |
tree | 5eb9f03b3777159df00fb8d0a251ac26f63ba10d /media/libstagefright/MPEG4Extractor.cpp | |
parent | 1ebd04b5f4ffe774c37054aac305cd9e6c73d2b2 (diff) | |
download | frameworks_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.cpp | 27 |
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]; |