diff options
-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 |