Bug 1421505 - Return the correct duration while seamless looping is on; r?jwwang
--- 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(