summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2014-02-19 17:28:05 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-02-19 17:28:05 +0000
commita283192f91726f2443a776b3c0ac81cf3e1b4cce (patch)
tree732f6b4b38cb2850de7d82edd2c24f0eddff7bd3 /media
parente9841c60ab2b954b97628801bd3bb2f84a69a35e (diff)
parentebfd32300605d67e4c45a97f4972d4b6ea268a37 (diff)
downloadframeworks_av-a283192f91726f2443a776b3c0ac81cf3e1b4cce.zip
frameworks_av-a283192f91726f2443a776b3c0ac81cf3e1b4cce.tar.gz
frameworks_av-a283192f91726f2443a776b3c0ac81cf3e1b4cce.tar.bz2
Merge "Fix crash when seeking fragmented mp4 files"
Diffstat (limited to 'media')
-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];