summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2012-06-14 09:51:49 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-06-14 09:51:49 -0700
commit82233b4b5bee06f11618a558ae465abbfdedfd6e (patch)
tree3288c514f9b026c748b3f5ecf72fbe7281d55172 /media/libstagefright
parente6adde403480333b613452ae0df442df9da4a5b2 (diff)
parent5fd7d3a23316ec0d2320fece85201859b52c2aef (diff)
downloadframeworks_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.cpp8
-rw-r--r--media/libstagefright/XINGSeeker.cpp15
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