Bug 1208316 - End a media element when its MediaStream source goes inactive. r?jib
MozReview-Commit-ID: 89LMDSsJLJP
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -3868,32 +3868,16 @@ public:
mBlocked(false),
mFinished(false),
mMutex(aName),
mPendingNotifyOutput(false)
{}
void Forget() { mElement = nullptr; }
// Main thread
- void DoNotifyFinished()
- {
- mFinished = true;
- if (mElement) {
- RefPtr<HTMLMediaElement> deathGrip = mElement;
-
- // Update NextFrameStatus() to move to NEXT_FRAME_UNAVAILABLE and
- // HAVE_CURRENT_DATA.
- mElement = nullptr;
- // NotifyWatchers before calling PlaybackEnded since PlaybackEnded
- // can remove watchers.
- NotifyWatchers();
-
- deathGrip->PlaybackEnded();
- }
- }
MediaDecoderOwner::NextFrameStatus NextFrameStatus()
{
if (!mElement || !mHaveCurrentData || mFinished) {
return MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
}
return mBlocked
? MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING
@@ -3939,25 +3923,16 @@ public:
nsCOMPtr<nsIRunnable> event;
if (aBlocked == BLOCKED) {
event = NewRunnableMethod(this, &StreamListener::DoNotifyBlocked);
} else {
event = NewRunnableMethod(this, &StreamListener::DoNotifyUnblocked);
}
aGraph->DispatchToMainThreadAfterStreamStateUpdate(event.forget());
}
- virtual void NotifyEvent(MediaStreamGraph* aGraph,
- MediaStreamGraphEvent event) override
- {
- if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
- nsCOMPtr<nsIRunnable> event =
- NewRunnableMethod(this, &StreamListener::DoNotifyFinished);
- aGraph->DispatchToMainThreadAfterStreamStateUpdate(event.forget());
- }
- }
virtual void NotifyHasCurrentData(MediaStreamGraph* aGraph) override
{
MutexAutoLock lock(mMutex);
nsCOMPtr<nsIRunnable> event =
NewRunnableMethod(this, &StreamListener::DoNotifyHaveCurrentData);
aGraph->DispatchToMainThreadAfterStreamStateUpdate(event.forget());
}
virtual void NotifyOutput(MediaStreamGraph* aGraph,
@@ -4014,16 +3989,27 @@ public:
mElement->NotifyMediaStreamTrackAdded(aTrack);
}
void NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack) override
{
mElement->NotifyMediaStreamTrackRemoved(aTrack);
}
+ void NotifyInactive() override
+ {
+ LOG(LogLevel::Debug, ("%p, mSrcStream %p became inactive",
+ mElement, mElement->mSrcStream.get()));
+ MOZ_ASSERT(!mElement->mSrcStream->Active());
+ if (mElement->mMediaStreamListener) {
+ mElement->mMediaStreamListener->Forget();
+ }
+ mElement->PlaybackEnded();
+ }
+
protected:
HTMLMediaElement* const mElement;
};
void HTMLMediaElement::UpdateSrcMediaStreamPlaying(uint32_t aFlags)
{
if (!mSrcStream) {
return;