Bug 1259788 - Raise "addtrack" in separate tasks. r?jesup draft
authorAndreas Pehrson <pehrsons@gmail.com>
Mon, 22 Aug 2016 12:23:37 +0200
changeset 404931 d39aa548af21a9a6a8b25bf579f039a128f94de2
parent 404930 4de8f6c6f7531b2a9692d02fc06a33ed25de89d7
child 404932 6edf56f7cc330b37b6877e9fb94d7f0b9f85805d
push id27359
push userpehrsons@gmail.com
push dateWed, 24 Aug 2016 14:53:56 +0000
reviewersjesup
bugs1259788
milestone51.0a1
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
dom/media/DOMMediaStream.cpp
--- 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,