Bug 1296531 - Notify of realtime data after NotifyDirectListenerInstalled. r?jesup
MozReview-Commit-ID: Byw5PZTHdLC
--- 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