Bug 1296531 - Notify of realtime data after NotifyDirectListenerInstalled. r?jesup draft
authorAndreas Pehrson <pehrsons@gmail.com>
Thu, 17 Nov 2016 09:59:49 +0100
changeset 670290 8dd9e34540328e01b279a7eb42c7e2528ce54416
parent 670289 7b57295633aeb2a36a4843d48c48d0af2d321cde
child 670291 9abe52bf8588fdd3c420664c7963474740f31461
push id81598
push userbmo:apehrson@mozilla.com
push dateTue, 26 Sep 2017 09:13:19 +0000
reviewersjesup
bugs1296531
milestone58.0a1
Bug 1296531 - Notify of realtime data after NotifyDirectListenerInstalled. r?jesup MozReview-Commit-ID: Byw5PZTHdLC
dom/media/MediaStreamGraph.cpp
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -2953,16 +2953,17 @@ SourceMediaStream::RemoveDirectListener(
 
 void
 SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStreamTrackListener> aListener,
                                               TrackID aTrackID)
 {
   MOZ_ASSERT(IsTrackIDExplicit(aTrackID));
   TrackData* updateData = nullptr;
   StreamTracks::Track* track = nullptr;
+  VideoSegment bufferedData;
   bool isAudio = false;
   bool isVideo = false;
   RefPtr<DirectMediaStreamTrackListener> listener = aListener;
   LOG(LogLevel::Debug,
       ("Adding direct track listener %p bound to track %d to source stream %p",
        listener.get(),
        aTrackID,
        this));
@@ -2974,26 +2975,24 @@ SourceMediaStream::AddDirectTrackListene
     if (track) {
       isAudio = track->GetType() == MediaSegment::AUDIO;
       isVideo = track->GetType() == MediaSegment::VIDEO;
     }
 
     if (track && isVideo && listener->AsMediaStreamVideoSink()) {
       // Re-send missed VideoSegment to new added MediaStreamVideoSink.
       VideoSegment* trackSegment = static_cast<VideoSegment*>(track->GetSegment());
-      VideoSegment videoSegment;
       if (mTracks.GetForgottenDuration() < trackSegment->GetDuration()) {
-        videoSegment.AppendSlice(*trackSegment,
+        bufferedData.AppendSlice(*trackSegment,
                                  mTracks.GetForgottenDuration(),
                                  trackSegment->GetDuration());
       }
       if (updateData) {
-        videoSegment.AppendSlice(*updateData->mData, 0, updateData->mData->GetDuration());
+        bufferedData.AppendSlice(*updateData->mData, 0, updateData->mData->GetDuration());
       }
-      listener->NotifyRealtimeTrackData(Graph(), 0, videoSegment);
     }
 
     if (track && (isAudio || isVideo)) {
       for (auto entry : mDirectTrackListeners) {
         if (entry.mListener == listener &&
             (entry.mTrackID == TRACK_ANY || entry.mTrackID == aTrackID)) {
           listener->NotifyDirectListenerInstalled(
             DirectMediaStreamTrackListener::InstallationResult::ALREADY_EXISTS);
@@ -3023,16 +3022,21 @@ SourceMediaStream::AddDirectTrackListene
     MOZ_ASSERT(false);
     return;
   }
   LOG(
     LogLevel::Debug,
     ("Added direct track listener %p. ended=%d", listener.get(), !updateData));
   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