Bug 1296531 - Don't notify of ended tracks when adding a direct listener. r?jesup draft
authorAndreas Pehrson <pehrsons@gmail.com>
Tue, 23 May 2017 16:00:42 +0200
changeset 670322 e6f49f5fc579e0e28f6b820eba51511e234049b3
parent 670321 9892de62719ee044ba78a800382f59bf5dc8a4b7
child 670323 5a122dc13fa034fa13a3b22183d604141be838e8
push id81598
push userbmo:apehrson@mozilla.com
push dateTue, 26 Sep 2017 09:13:19 +0000
reviewersjesup
bugs1296531
milestone58.0a1
Bug 1296531 - Don't notify of ended tracks when adding a direct listener. r?jesup There were some cases where these tracks were detected as ended when they were in fact not. That result in problems in the MediaRecorder. MozReview-Commit-ID: 4CNUYRvzOgK
dom/media/MediaStreamGraph.cpp
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -2427,16 +2427,20 @@ MediaStream::AddTrackListenerImpl(alread
 
   StreamTracks::Track* track = FindTrack(aTrackID);
   if (!track) {
     return;
   }
   PrincipalHandle lastPrincipalHandle =
     track->GetSegment()->GetLastPrincipalHandle();
   l->mListener->NotifyPrincipalHandleChanged(Graph(), lastPrincipalHandle);
+  if (track->IsEnded() &&
+      track->GetEnd() <= GraphTimeToStreamTime(GraphImpl()->mStateComputedTime)) {
+    l->mListener->NotifyEnded();
+  }
 }
 
 void
 MediaStream::AddTrackListener(MediaStreamTrackListener* aListener,
                               TrackID aTrackID)
 {
   class Message : public ControlMessage {
   public:
@@ -3030,31 +3034,23 @@ SourceMediaStream::AddDirectTrackListene
   if (!isAudio && !isVideo) {
     LOG(
       LogLevel::Warning,
       ("Source track for direct track listener %p is unknown", listener.get()));
     // It is not a video or audio track.
     MOZ_ASSERT(false);
     return;
   }
-  LOG(
-    LogLevel::Debug,
-    ("Added direct track listener %p. ended=%d", listener.get(), !updateData));
+  LOG(LogLevel::Debug, ("Added direct track listener %p", listener.get()));
   listener->NotifyDirectListenerInstalled(
     DirectMediaStreamTrackListener::InstallationResult::SUCCESS);
 
   if (bufferedData.GetDuration() != 0) {
     listener->NotifyRealtimeTrackData(Graph(), 0, bufferedData);
   }
-
-  if (!updateData) {
-    // The track exists but the mUpdateTracks entry was removed.
-    // This means that the track has ended.
-    listener->NotifyEnded();
-  }
 }
 
 void
 SourceMediaStream::RemoveDirectTrackListenerImpl(DirectMediaStreamTrackListener* aListener,
                                                  TrackID aTrackID)
 {
   MutexAutoLock lock(mMutex);
   for (int32_t i = mDirectTrackListeners.Length() - 1; i >= 0; --i) {