mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-05 23:38:38 +09:00
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:
parent
c3767681a9
commit
1ed778419f
1 changed files with 30 additions and 38 deletions
|
|
@ -2876,8 +2876,8 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
|
|||
TrackID aTrackID)
|
||||
{
|
||||
MOZ_ASSERT(IsTrackIDExplicit(aTrackID));
|
||||
TrackData* data;
|
||||
bool found = false;
|
||||
TrackData* updateData = nullptr;
|
||||
StreamTracks::Track* track = nullptr;
|
||||
bool isAudio = false;
|
||||
bool isVideo = false;
|
||||
RefPtr<DirectMediaStreamTrackListener> listener = aListener;
|
||||
|
|
@ -2886,44 +2886,30 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
|
|||
|
||||
{
|
||||
MutexAutoLock lock(mMutex);
|
||||
data = FindDataForTrack(aTrackID);
|
||||
found = !!data;
|
||||
if (found) {
|
||||
isAudio = data->mData->GetType() == MediaSegment::AUDIO;
|
||||
isVideo = data->mData->GetType() == MediaSegment::VIDEO;
|
||||
updateData = FindDataForTrack(aTrackID);
|
||||
track = FindTrack(aTrackID);
|
||||
if (track) {
|
||||
isAudio = track->GetType() == MediaSegment::AUDIO;
|
||||
isVideo = track->GetType() == MediaSegment::VIDEO;
|
||||
}
|
||||
|
||||
// The track might be removed from mUpdateTrack but still exist in
|
||||
// mTracks.
|
||||
auto streamTrack = FindTrack(aTrackID);
|
||||
bool foundTrack = !!streamTrack;
|
||||
if (foundTrack) {
|
||||
MediaStreamVideoSink* videoSink = listener->AsMediaStreamVideoSink();
|
||||
MediaStreamVideoSink* videoSink = listener->AsMediaStreamVideoSink();
|
||||
if (track && isVideo && videoSink) {
|
||||
// Re-send missed VideoSegment to new added MediaStreamVideoSink.
|
||||
if (streamTrack->GetType() == MediaSegment::VIDEO && videoSink) {
|
||||
VideoSegment videoSegment;
|
||||
if (mTracks.GetForgottenDuration() < streamTrack->GetSegment()->GetDuration()) {
|
||||
videoSegment.AppendSlice(*streamTrack->GetSegment(),
|
||||
mTracks.GetForgottenDuration(),
|
||||
streamTrack->GetSegment()->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);
|
||||
VideoSegment* trackSegment = static_cast<VideoSegment*>(track->GetSegment());
|
||||
VideoSegment videoSegment;
|
||||
if (mTracks.GetForgottenDuration() < trackSegment->GetDuration()) {
|
||||
videoSegment.AppendSlice(*trackSegment,
|
||||
mTracks.GetForgottenDuration(),
|
||||
trackSegment->GetDuration());
|
||||
}
|
||||
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) {
|
||||
if (entry.mListener == listener &&
|
||||
(entry.mTrackID == TRACK_ANY || entry.mTrackID == aTrackID)) {
|
||||
|
|
@ -2939,7 +2925,7 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
|
|||
sourceListener->mTrackID = aTrackID;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
if (!track) {
|
||||
STREAM_LOG(LogLevel::Warning, ("Couldn't find source track for direct track listener %p",
|
||||
listener.get()));
|
||||
listener->NotifyDirectListenerInstalled(
|
||||
|
|
@ -2953,9 +2939,15 @@ SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStream
|
|||
MOZ_ASSERT(true);
|
||||
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(
|
||||
DirectMediaStreamTrackListener::InstallationResult::SUCCESS);
|
||||
if (!updateData) {
|
||||
// The track exists but the mUpdateTracks entry was removed.
|
||||
// This means that the track has ended.
|
||||
listener->NotifyEnded();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue