am c3c044ab: am 82233b4b: Merge "Better handle invalid duration in Xing/VBRI tags" into jb-dev

* commit 'c3c044ab1b2b5f9bebcff610795b6a1a9b60d01b':
  Better handle invalid duration in Xing/VBRI tags
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> 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 @@
     : mDurationUs(-1),
       mSizeBytes(0),
       mEncoderDelay(0),
-      mEncoderPadding(0) {
+      mEncoderPadding(0),
+      mTOCValid(false) {
 }
 
 bool XINGSeeker::getDuration(int64_t *durationUs) {
@@ -81,10 +82,6 @@
 
     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 @@
              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