void MediaSource::EndOfStreamInternal(const Optional<MediaSourceEndOfStreamError>& aError, ErrorResult& aRv) { SetReadyState(MediaSourceReadyState::Ended); if (!aError.WasPassed()) { // TODO: // Run duration change algorithm. // DurationChange(highestDurationOfSourceBuffers, aRv); // if (aRv.Failed()) { // return; // } // Notify media element that all data is now available. return; } switch (aError.Value()) { case MediaSourceEndOfStreamError::Network: // TODO: If media element has a readyState of: // HAVE_NOTHING -> run resource fetch algorithm // > HAVE_NOTHING -> run "interrupted" steps of resource fetch break; case MediaSourceEndOfStreamError::Decode: // TODO: If media element has a readyState of: // HAVE_NOTHING -> run "unsupported" steps of resource fetch // > HAVE_NOTHING -> run "corrupted" steps of resource fetch break; default: aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); } }
void TextTrack::SetReadyState(uint32_t aReadyState) { if (aReadyState <= TextTrackReadyState::FailedToLoad) { SetReadyState(static_cast<TextTrackReadyState>(aReadyState)); } }
void MediaSource::EndOfStream(const Optional<MediaSourceEndOfStreamError>& aError, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread()); MSE_API("EndOfStream(aError=%d)", aError.WasPassed() ? uint32_t(aError.Value()) : 0); if (mReadyState != MediaSourceReadyState::Open || mSourceBuffers->AnyUpdating()) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return; } SetReadyState(MediaSourceReadyState::Ended); mSourceBuffers->Ended(); if (!aError.WasPassed()) { mDecoder->SetMediaSourceDuration(mSourceBuffers->GetHighestBufferedEndTime(), MSRangeRemovalAction::SKIP); if (aRv.Failed()) { return; } // Notify reader that all data is now available. mDecoder->Ended(true); return; } switch (aError.Value()) { case MediaSourceEndOfStreamError::Network: mDecoder->NetworkError(); break; case MediaSourceEndOfStreamError::Decode: mDecoder->DecodeError(); break; default: aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); } }
void MediaSource::EndOfStream(const Optional<MediaSourceEndOfStreamError>& aError, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread()); MSE_API("EndOfStream(aError=%d)", aError.WasPassed() ? uint32_t(aError.Value()) : 0); if (mReadyState != MediaSourceReadyState::Open || mSourceBuffers->AnyUpdating()) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return; } SetReadyState(MediaSourceReadyState::Ended); mSourceBuffers->Ended(); if (!aError.WasPassed()) { DurationChange(mSourceBuffers->GetHighestBufferedEndTime(), aRv); // Notify reader that all data is now available. mDecoder->Ended(true); return; } switch (aError.Value()) { case MediaSourceEndOfStreamError::Network: mDecoder->NetworkError(MediaResult(NS_ERROR_FAILURE, "MSE network")); break; case MediaSourceEndOfStreamError::Decode: mDecoder->DecodeError(NS_ERROR_DOM_MEDIA_FATAL_ERR); break; default: aRv.Throw(NS_ERROR_DOM_TYPE_ERR); } }
void MediaSource::EndOfStream(const MediaResult& aError) { MOZ_ASSERT(NS_IsMainThread()); MSE_API("EndOfStream(aError=%s)", aError.ErrorName().get()); SetReadyState(MediaSourceReadyState::Ended); mSourceBuffers->Ended(); mDecoder->DecodeError(aError); }
bool MediaSource::AttachElement(HTMLMediaElement* aElement) { LOG(PR_LOG_DEBUG, ("%p Attaching element %p", this, aElement)); MOZ_ASSERT(aElement); mElement = aElement; if (mReadyState != MediaSourceReadyState::Closed) { return false; } SetReadyState(MediaSourceReadyState::Open); return true; }
void MediaSource::Detach() { MSE_DEBUG("%p Detaching decoder %p owner %p", this, mDecoder.get(), mDecoder->GetOwner()); MOZ_ASSERT(mDecoder); mDecoder->DetachMediaSource(); mDecoder = nullptr; mDuration = UnspecifiedNaN<double>(); mActiveSourceBuffers->Clear(); mSourceBuffers->Clear(); SetReadyState(MediaSourceReadyState::Closed); }
bool MediaSource::Attach(MediaSourceDecoder* aDecoder) { MSE_DEBUG("%p Attaching decoder %p owner %p", this, aDecoder, aDecoder->GetOwner()); MOZ_ASSERT(aDecoder); if (mReadyState != MediaSourceReadyState::Closed) { return false; } mDecoder = aDecoder; mDecoder->AttachMediaSource(this); SetReadyState(MediaSourceReadyState::Open); return true; }
bool MediaSource::Attach(MediaSourceDecoder* aDecoder) { MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("MediaSource(%p)::Attach(aDecoder=%p) owner=%p", this, aDecoder, aDecoder->GetOwner()); MOZ_ASSERT(aDecoder); if (mReadyState != MediaSourceReadyState::Closed) { return false; } mDecoder = aDecoder; mDecoder->AttachMediaSource(this); SetReadyState(MediaSourceReadyState::Open); return true; }
void MediaSource::DetachElement() { LOG(PR_LOG_DEBUG, ("%p Detaching element %p", this, mElement.get())); MOZ_ASSERT(mElement); mElement = nullptr; mDuration = UnspecifiedNaN(); mActiveSourceBuffers->Clear(); mSourceBuffers->DetachAndClear(); SetReadyState(MediaSourceReadyState::Closed); for (uint32_t i = 0; i < mAdapters.Length(); ++i) { mAdapters[i]->Close(); } mAdapters.Clear(); }
void MediaSource::EndOfStream(const Optional<MediaSourceEndOfStreamError>& aError, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread()); MSE_API("MediaSource(%p)::EndOfStream(aError=%d)", this, aError.WasPassed() ? uint32_t(aError.Value()) : 0); if (mReadyState != MediaSourceReadyState::Open || mSourceBuffers->AnyUpdating()) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return; } SetReadyState(MediaSourceReadyState::Ended); mSourceBuffers->Ended(); mDecoder->Ended(); if (!aError.WasPassed()) { DurationChange(mSourceBuffers->GetHighestBufferedEndTime(), aRv); if (aRv.Failed()) { return; } // TODO: // Notify media element that all data is now available. return; } switch (aError.Value()) { case MediaSourceEndOfStreamError::Network: // TODO: If media element has a readyState of: // HAVE_NOTHING -> run resource fetch algorithm // > HAVE_NOTHING -> run "interrupted" steps of resource fetch break; case MediaSourceEndOfStreamError::Decode: // TODO: If media element has a readyState of: // HAVE_NOTHING -> run "unsupported" steps of resource fetch // > HAVE_NOTHING -> run "corrupted" steps of resource fetch break; default: aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); } }
void MediaSource::Detach() { MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("MediaSource(%p)::Detach() mDecoder=%p owner=%p", this, mDecoder.get(), mDecoder ? mDecoder->GetOwner() : nullptr); if (!mDecoder) { MOZ_ASSERT(mReadyState == MediaSourceReadyState::Closed); MOZ_ASSERT(mActiveSourceBuffers->IsEmpty() && mSourceBuffers->IsEmpty()); return; } mDecoder->DetachMediaSource(); mDecoder = nullptr; mFirstSourceBufferInitialized = false; SetReadyState(MediaSourceReadyState::Closed); if (mActiveSourceBuffers) { mActiveSourceBuffers->Clear(); } if (mSourceBuffers) { mSourceBuffers->Clear(); } }
void MediaSource::Detach() { MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("mDecoder=%p owner=%p", mDecoder.get(), mDecoder ? mDecoder->GetOwner() : nullptr); if (!mDecoder) { MOZ_ASSERT(mReadyState == MediaSourceReadyState::Closed); MOZ_ASSERT(mActiveSourceBuffers->IsEmpty() && mSourceBuffers->IsEmpty()); return; } mMediaElement = nullptr; SetReadyState(MediaSourceReadyState::Closed); if (mActiveSourceBuffers) { mActiveSourceBuffers->Clear(); } if (mSourceBuffers) { mSourceBuffers->Clear(); } mDecoder->DetachMediaSource(); mDecoder = nullptr; }
void HTMLTrackElement::SetSrc(const nsAString& aSrc, ErrorResult& aError) { SetHTMLAttr(nsGkAtoms::src, aSrc, aError); uint16_t oldReadyState = ReadyState(); SetReadyState(TextTrackReadyState::NotLoaded); if (!mMediaParent) { return; } if (mTrack && (oldReadyState != TextTrackReadyState::NotLoaded)) { // Remove all the cues in MediaElement. mMediaParent->RemoveTextTrack(mTrack); // Recreate mTrack. CreateTextTrack(); } // Stop WebVTTListener. mListener = nullptr; if (mChannel) { mChannel->Cancel(NS_BINDING_ABORTED); mChannel = nullptr; } DispatchLoadResource(); }