Bug 1259788 - Raise "addtrack" in separate tasks. r?jesup
Turns out runnables added through
MediaStreamGraph::DispatchToMainThreadAfterStreamStateUpdate on the same
iteration are all run in the same task. Creating them in the owning dom stream
in one task solves the timing issues and lets us add them
(and raise "addtrack") in individual tasks.
MozReview-Commit-ID: 9Q3NoFrmnQs
--- a/dom/media/DOMMediaStream.cpp
+++ b/dom/media/DOMMediaStream.cpp
@@ -167,17 +167,18 @@ public:
nsPIDOMWindowInner* window = mStream->GetParentObject();
nsIDocument* doc = window ? window->GetExtantDoc() : nullptr;
nsIPrincipal* principal = doc ? doc->NodePrincipal() : nullptr;
source = new BasicUnstoppableTrackSource(principal);
}
RefPtr<MediaStreamTrack> newTrack =
mStream->CreateDOMTrack(aTrackID, aType, source);
- mStream->AddTrackInternal(newTrack);
+ NS_DispatchToMainThread(NewRunnableMethod<RefPtr<MediaStreamTrack>>(
+ mStream, &DOMMediaStream::AddTrackInternal, newTrack));
}
void DoNotifyTrackEnded(MediaStream* aInputStream, TrackID aInputTrackID,
TrackID aTrackID)
{
MOZ_ASSERT(NS_IsMainThread());
if (!mStream) {
@@ -274,17 +275,21 @@ public:
void DoNotifyFinishedTrackCreation()
{
MOZ_ASSERT(NS_IsMainThread());
if (!mStream) {
return;
}
- mStream->NotifyTracksCreated();
+ // The owned stream listener adds its tracks after another main thread
+ // dispatch. We have to do the same to notify of created tracks to stay
+ // in sync. (Or NotifyTracksCreated is called before tracks are added).
+ NS_DispatchToMainThread(
+ NewRunnableMethod(mStream, &DOMMediaStream::NotifyTracksCreated));
}
// The methods below are called on the MediaStreamGraph thread.
void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
StreamTime aTrackOffset, TrackEventCommand aTrackEvents,
const MediaSegment& aQueuedMedia,
MediaStream* aInputStream,