Issue #2332 - Refactor code that feeds video stream sink when it gets added

https://bugzilla.mozilla.org/show_bug.cgi?id=1305949 part 1
This commit is contained in:
Basilisk-Dev 2023-10-05 16:47:30 -04:00 • committed by roytam1
commit 1ed778419f

View file

@ -2876,8 +2876,8 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
TrackID aTrackID) TrackID aTrackID)
{ {
MOZ_ASSERT(IsTrackIDExplicit(aTrackID)); MOZ_ASSERT(IsTrackIDExplicit(aTrackID));
TrackData* data; TrackData* updateData = nullptr;
bool found = false; StreamTracks::Track* track = nullptr;
bool isAudio = false; bool isAudio = false;
bool isVideo = false; bool isVideo = false;
RefPtr<DirectMediaStreamTrackListener> listener = aListener; RefPtr<DirectMediaStreamTrackListener> listener = aListener;
@ -2886,44 +2886,30 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
{ {
MutexAutoLock lock(mMutex); MutexAutoLock lock(mMutex);
data = FindDataForTrack(aTrackID); updateData = FindDataForTrack(aTrackID);
found = !!data; track = FindTrack(aTrackID);
if (found) { if (track) {
isAudio = data->mData->GetType() == MediaSegment::AUDIO; isAudio = track->GetType() == MediaSegment::AUDIO;
isVideo = data->mData->GetType() == MediaSegment::VIDEO; isVideo = track->GetType() == MediaSegment::VIDEO;
} }
// The track might be removed from mUpdateTrack but still exist in MediaStreamVideoSink* videoSink = listener->AsMediaStreamVideoSink();
// mTracks. if (track && isVideo && videoSink) {
auto streamTrack = FindTrack(aTrackID);
bool foundTrack = !!streamTrack;
if (foundTrack) {
MediaStreamVideoSink* videoSink = listener->AsMediaStreamVideoSink();
// Re-send missed VideoSegment to new added MediaStreamVideoSink. // Re-send missed VideoSegment to new added MediaStreamVideoSink.
if (streamTrack->GetType() == MediaSegment::VIDEO && videoSink) { VideoSegment* trackSegment = static_cast<VideoSegment*>(track->GetSegment());
VideoSegment videoSegment; VideoSegment videoSegment;
if (mTracks.GetForgottenDuration() < streamTrack->GetSegment()->GetDuration()) { if (mTracks.GetForgottenDuration() < trackSegment->GetDuration()) {
videoSegment.AppendSlice(*streamTrack->GetSegment(), videoSegment.AppendSlice(*trackSegment,
mTracks.GetForgottenDuration(), mTracks.GetForgottenDuration(),
streamTrack->GetSegment()->GetDuration()); trackSegment->GetDuration());
} else {
VideoSegment* streamTrackSegment = static_cast<VideoSegment*>(streamTrack->GetSegment());
VideoChunk* lastChunk = streamTrackSegment->GetLastChunk();
if (lastChunk) {
StreamTime startTime = streamTrackSegment->GetDuration() - lastChunk->GetDuration();
videoSegment.AppendSlice(*streamTrackSegment,
startTime,
streamTrackSegment->GetDuration());
}
}
if (found) {
videoSegment.AppendSlice(*data->mData, 0, data->mData->GetDuration());
}
videoSink->SetCurrentFrames(videoSegment);
} }
if (updateData) {
videoSegment.AppendSlice(*updateData->mData, 0, updateData->mData->GetDuration());
}
videoSink->SetCurrentFrames(videoSegment);
} }
if (found && (isAudio || isVideo)) { if (track && (isAudio || isVideo)) {
for (auto entry : mDirectTrackListeners) { for (auto entry : mDirectTrackListeners) {
if (entry.mListener == listener && if (entry.mListener == listener &&
(entry.mTrackID == TRACK_ANY || entry.mTrackID == aTrackID)) { (entry.mTrackID == TRACK_ANY || entry.mTrackID == aTrackID)) {
@ -2939,7 +2925,7 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
sourceListener->mTrackID = aTrackID; sourceListener->mTrackID = aTrackID;
} }
} }
if (!found) { if (!track) {
STREAM_LOG(LogLevel::Warning, ("Couldn't find source track for direct track listener %p", STREAM_LOG(LogLevel::Warning, ("Couldn't find source track for direct track listener %p",
listener.get())); listener.get()));
listener->NotifyDirectListenerInstalled( listener->NotifyDirectListenerInstalled(
@ -2953,9 +2939,15 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
MOZ_ASSERT(true); MOZ_ASSERT(true);
return; return;
} }
STREAM_LOG(LogLevel::Debug, ("Added direct track listener %p", listener.get())); STREAM_LOG(LogLevel::Debug, ("Added direct track listener %p. ended=%d",
listener.get(), !updateData));
listener->NotifyDirectListenerInstalled( listener->NotifyDirectListenerInstalled(
DirectMediaStreamTrackListener::InstallationResult::SUCCESS); DirectMediaStreamTrackListener::InstallationResult::SUCCESS);
if (!updateData) {
// The track exists but the mUpdateTracks entry was removed.
// This means that the track has ended.
listener->NotifyEnded();
}
} }
void void