diff options
| author | Marco Nelissen <marcone@google.com> | 2012-06-14 09:51:49 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-06-14 09:51:49 -0700 |
| commit | 82233b4b5bee06f11618a558ae465abbfdedfd6e (patch) | |
| tree | 3288c514f9b026c748b3f5ecf72fbe7281d55172 /media/libstagefright | |
| parent | e6adde403480333b613452ae0df442df9da4a5b2 (diff) | |
| parent | 5fd7d3a23316ec0d2320fece85201859b52c2aef (diff) | |
| download | frameworks_av-82233b4b5bee06f11618a558ae465abbfdedfd6e.zip frameworks_av-82233b4b5bee06f11618a558ae465abbfdedfd6e.tar.gz frameworks_av-82233b4b5bee06f11618a558ae465abbfdedfd6e.tar.bz2 | |
Merge "Better handle invalid duration in Xing/VBRI tags" into jb-dev
Diffstat (limited to 'media/libstagefright')
| -rw-r--r-- | media/libstagefright/VBRISeeker.cpp | 8 | ||||
| -rw-r--r-- | media/libstagefright/XINGSeeker.cpp | 15 |
2 files changed, 16 insertions, 7 deletions
diff --git a/media/libstagefright/VBRISeeker.cpp b/media/libstagefright/VBRISeeker.cpp index bcba874..a245f2c 100644 --- a/media/libstagefright/VBRISeeker.cpp +++ b/media/libstagefright/VBRISeeker.cpp @@ -93,7 +93,13 @@ sp<VBRISeeker> VBRISeeker::CreateFromSource( sp<VBRISeeker> seeker = new VBRISeeker; seeker->mBasePos = post_id3_pos + frameSize; - seeker->mDurationUs = durationUs; + // only update mDurationUs if the calculated duration is valid (non zero) + // otherwise, leave duration at -1 so that getDuration() and getOffsetForTime() + // return false when called, to indicate that this vbri tag does not have the + // requested information + if (durationUs) { + seeker->mDurationUs = durationUs; + } off64_t offset = post_id3_pos; for (size_t i = 0; i < numEntries; ++i) { diff --git a/media/libstagefright/XINGSeeker.cpp b/media/libstagefright/XINGSeeker.cpp index 9c91134..81ed9c6 100644 --- a/media/libstagefright/XINGSeeker.cpp +++ b/media/libstagefright/XINGSeeker.cpp @@ -29,7 +29,8 @@ XINGSeeker::XINGSeeker() : mDurationUs(-1), mSizeBytes(0), mEncoderDelay(0), - mEncoderPadding(0) { + mEncoderPadding(0), + mTOCValid(false) { } bool XINGSeeker::getDuration(int64_t *durationUs) { @@ -81,10 +82,6 @@ sp<XINGSeeker> XINGSeeker::CreateFromSource( seeker->mFirstFramePos = first_frame_pos; - seeker->mSizeBytes = 0; - seeker->mTOCValid = false; - seeker->mDurationUs = 0; - uint8_t buffer[4]; int offset = first_frame_pos; if (source->readAt(offset, &buffer, 4) < 4) { // get header @@ -140,7 +137,13 @@ sp<XINGSeeker> XINGSeeker::CreateFromSource( return NULL; } int32_t frames = U32_AT(buffer); - seeker->mDurationUs = (int64_t)frames * samples_per_frame * 1000000LL / sampling_rate; + // only update mDurationUs if the calculated duration is valid (non zero) + // otherwise, leave duration at -1 so that getDuration() and getOffsetForTime() + // return false when called, to indicate that this xing tag does not have the + // requested information + if (frames) { + seeker->mDurationUs = (int64_t)frames * samples_per_frame * 1000000LL / sampling_rate; + } offset += 4; } if (flags & 0x0002) { // Bytes field is present |
