diff options
author | Marco Nelissen <marcone@google.com> | 2012-06-13 08:51:00 -0700 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2012-06-13 16:29:52 -0700 |
commit | 5fd7d3a23316ec0d2320fece85201859b52c2aef (patch) | |
tree | eb812fe337a080a3f3709e2fbbd992813bc5583c /media/libstagefright/XINGSeeker.cpp | |
parent | b4ea1ab821d652cb080910d4081f5f1318597a90 (diff) | |
download | frameworks_av-5fd7d3a23316ec0d2320fece85201859b52c2aef.zip frameworks_av-5fd7d3a23316ec0d2320fece85201859b52c2aef.tar.gz frameworks_av-5fd7d3a23316ec0d2320fece85201859b52c2aef.tar.bz2 |
Better handle invalid duration in Xing/VBRI tags
b/6654637
Change-Id: Ie92eddd84ef5914b77dbadaacd80b4de6cd66e1c
Diffstat (limited to 'media/libstagefright/XINGSeeker.cpp')
-rw-r--r-- | media/libstagefright/XINGSeeker.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
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 |