Bug 1421505 - Return the correct duration while seamless looping is on; r?jwwang draft
authorChun-Min Chang <chun.m.chang@gmail.com>
Thu, 11 Jan 2018 12:05:07 +0800
changeset 718949 a798ad503c5ae15065d462e4176b5b22876fee0b
parent 718845 4db166f0442dddc5b9011c722d7499501fedf283
child 745647 c155b3b844859bba17986409f8ca65e73c700b42
push id95099
push userbmo:cchang@mozilla.com
push dateThu, 11 Jan 2018 06:21:54 +0000
reviewersjwwang
bugs1421505
milestone59.0a1
Bug 1421505 - Return the correct duration while seamless looping is on; r?jwwang
dom/media/MediaDecoderStateMachine.cpp
dom/media/ReaderProxy.h
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -3683,16 +3683,19 @@ MediaDecoderStateMachine::LoopingChanged
     mReader->SetSeamlessLoopingEnabled(mLooping);
   }
 }
 
 TimeUnit
 MediaDecoderStateMachine::AudioEndTime() const
 {
   MOZ_ASSERT(OnTaskQueue());
+  if (mReader->GetDuration().IsValid()) {
+    return mReader->GetDuration();
+  }
   if (mMediaSink->IsStarted()) {
     return mMediaSink->GetEndTime(TrackInfo::kAudioTrack);
   }
   return GetMediaTime();
 }
 
 TimeUnit
 MediaDecoderStateMachine::VideoEndTime() const
--- a/dom/media/ReaderProxy.h
+++ b/dom/media/ReaderProxy.h
@@ -83,16 +83,20 @@ public:
 
   void SetCanonicalDuration(
     AbstractCanonical<media::NullableTimeUnit>* aCanonical);
 
   void SetSeamlessLoopingEnabled(bool aEnabled);
 
   void AdjustByLooping(media::TimeUnit& aTime);
 
+  // Return the duration of the media track. The returned value is valid only
+  // when the whole media has been decoded.
+  media::TimeUnit GetDuration() { return mAudioDuration; };
+
 private:
   ~ReaderProxy();
   RefPtr<MetadataPromise> OnMetadataRead(MetadataHolder&& aMetadata);
   RefPtr<MetadataPromise> OnMetadataNotRead(const MediaResult& aError);
   void UpdateDuration();
   RefPtr<SeekPromise> SeekInternal(const SeekTarget& aTarget);
 
   RefPtr<ReaderProxy::AudioDataPromise> OnAudioDataRequestCompleted(