Bug 1242845 - Make the computation of MediaDecoderStateMachine::HasLowUndecodedData() more accurate and consistent. r=jya. draft
authorJW Wang <jwwang@mozilla.com>
Tue, 26 Jan 2016 12:00:20 +0800
changeset 325630 e10d611ba89ac2c0e6a5c4b14287ccb5c5d8795f
parent 325629 b6575b2adaa19725ae8b5f3e937c73f9c3f72b80
child 513482 4f58798f7a2b41f10616a332a32af4bf13f8e9b7
push id10017
push userjwwang@mozilla.com
push dateTue, 26 Jan 2016 04:01:06 +0000
reviewersjya
bugs1242845
milestone47.0a1
Bug 1242845 - Make the computation of MediaDecoderStateMachine::HasLowUndecodedData() more accurate and consistent. r=jya.
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1870,24 +1870,25 @@ bool MediaDecoderStateMachine::HasLowUnd
   if (Duration().IsInfinite()) {
     return false;
   }
 
   if (mBuffered.Ref().IsInvalid()) {
     return false;
   }
 
-  int64_t endOfDecodedVideoData = INT64_MAX;
-  if (HasVideo() && !VideoQueue().AtEndOfStream()) {
-    endOfDecodedVideoData = VideoQueue().Peek() ? VideoQueue().Peek()->GetEndTime() : VideoEndTime();
-  }
-  int64_t endOfDecodedAudioData = INT64_MAX;
-  if (HasAudio() && !AudioQueue().AtEndOfStream()) {
-    endOfDecodedAudioData = mDecodedAudioEndTime;
-  }
+  // We are never low in decoded data when we don't have audio/video or have
+  // decoded all audio/video samples.
+  int64_t endOfDecodedVideoData = HasVideo() && !VideoQueue().IsFinished() ?
+                                  mDecodedVideoEndTime :
+                                  INT64_MAX;
+  int64_t endOfDecodedAudioData = HasAudio() && !AudioQueue().IsFinished() ?
+                                  mDecodedAudioEndTime :
+                                  INT64_MAX;
+
   int64_t endOfDecodedData = std::min(endOfDecodedVideoData, endOfDecodedAudioData);
   if (Duration().ToMicroseconds() < endOfDecodedData) {
     // Our duration is not up to date. No point buffering.
     return false;
   }
   media::TimeInterval interval(media::TimeUnit::FromMicroseconds(endOfDecodedData),
                                media::TimeUnit::FromMicroseconds(std::min(endOfDecodedData + aUsecs, Duration().ToMicroseconds())));
   return endOfDecodedData != INT64_MAX && !mBuffered.Ref().Contains(interval);