summaryrefslogtreecommitdiffstats
path: root/dom/media/mediasource/MediaSourceDecoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/mediasource/MediaSourceDecoder.cpp')
-rw-r--r--dom/media/mediasource/MediaSourceDecoder.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/dom/media/mediasource/MediaSourceDecoder.cpp b/dom/media/mediasource/MediaSourceDecoder.cpp
index 24a74e261b..3a1308a9ca 100644
--- a/dom/media/mediasource/MediaSourceDecoder.cpp
+++ b/dom/media/mediasource/MediaSourceDecoder.cpp
@@ -57,8 +57,13 @@ MediaDecoderStateMachineBase* MediaSourceDecoder::CreateStateMachine(
TrackingId::TrackAcrossProcesses::Yes);
mReader = new MediaFormatReader(init, mDemuxer);
#ifdef MOZ_WMF_MEDIA_ENGINE
- // TODO : Only for testing development for now. In the future this should be
- // used for encrypted content only.
+ // Our main purpose is to only using this state machine for encrypted playback
+ // (unless explicitly set the pref to allow non-encrypted playback), but we
+ // can't determine if playback is encrypted or not at the moment. Therefore,
+ // we will handle that in ExternalEngineStateMachine, and report special
+ // errors, such as NS_ERROR_DOM_MEDIA_EXTERNAL_ENGINE_NOT_SUPPORTED_ERR or
+ // NS_ERROR_DOM_MEDIA_CDM_PROXY_NOT_SUPPORTED_ERR, to switch the state
+ // machine if necessary.
if (StaticPrefs::media_wmf_media_engine_enabled() &&
!aDisableExternalEngine) {
return new ExternalEngineStateMachine(this, mReader);
@@ -319,12 +324,13 @@ bool MediaSourceDecoder::CanPlayThroughImpl() {
}
// If we have data up to the mediasource's duration or 3s ahead, we can
// assume that we can play without interruption.
- dom::SourceBufferList* sourceBuffers = mMediaSource->ActiveSourceBuffers();
- TimeUnit bufferedEnd = sourceBuffers->GetHighestBufferedEndTime();
+ TimeIntervals buffered = GetBuffered();
+ buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
TimeUnit timeAhead =
std::min(duration, currentPosition + TimeUnit::FromSeconds(3));
TimeInterval interval(currentPosition, timeAhead);
- return bufferedEnd >= timeAhead;
+ return buffered.ToMicrosecondResolution().ContainsWithStrictEnd(
+ ClampIntervalToEnd(interval));
}
TimeInterval MediaSourceDecoder::ClampIntervalToEnd(
@@ -366,6 +372,23 @@ bool MediaSourceDecoder::HadCrossOriginRedirects() {
return false;
}
+#ifdef MOZ_WMF_MEDIA_ENGINE
+void MediaSourceDecoder::MetadataLoaded(
+ UniquePtr<MediaInfo> aInfo, UniquePtr<MetadataTags> aTags,
+ MediaDecoderEventVisibility aEventVisibility) {
+ // If the previous state machine has loaded the metadata, then we don't need
+ // to load it again. This can happen when the media format or key system is
+ // not supported by previous state machine.
+ if (mFiredMetadataLoaded && mStateMachineRecreated) {
+ MSE_DEBUG(
+ "Metadata already loaded and being informed by previous state machine");
+ return;
+ }
+ MediaDecoder::MetadataLoaded(std::move(aInfo), std::move(aTags),
+ aEventVisibility);
+}
+#endif
+
#undef MSE_DEBUG
#undef MSE_DEBUGV