diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp index 5ebc2b98ca639..935b8f8ee2bea 100644 --- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp +++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp @@ -218,6 +218,25 @@ void RealtimeMediaSource::videoFrameAvailable(VideoFrame& videoFrame, VideoFrame updateHasStartedProducingData(); Locker locker { m_videoFrameObserversLock }; + if (m_videoFrameObservers.isEmpty()) { + if (m_pendingVideoFrames.size() < maxPendingVideoFramesBeforeAddTrack) { + m_pendingVideoFrames.append(PendingVideoFrame { &videoFrame, metadata }); + } + else { + WTFLogAlways("RealtimeMediaSource: Dropping video frame (queue is full) %zu frames", m_pendingVideoFrames.size()); + } + return; + } + if (!m_pendingVideoFrames.isEmpty()) { + WTFLogAlways("RealtimeMediaSource: Delivering %zu queued frame(s) (pipeline ready)", m_pendingVideoFrames.size()); + for (auto& pending : m_pendingVideoFrames) { + if (pending.frame) { + for (auto* obs : m_videoFrameObservers) + obs->videoFrameAvailable(*pending.frame, pending.metadata); + } + } + m_pendingVideoFrames.clear(); + } for (auto* observer : m_videoFrameObservers) observer->videoFrameAvailable(videoFrame, metadata); } diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h index 091aa0ead2afe..ffc3ad1007dc8 100644 --- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h +++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h @@ -300,6 +300,13 @@ class WEBCORE_EXPORT RealtimeMediaSource mutable Lock m_videoFrameObserversLock; HashSet m_videoFrameObservers WTF_GUARDED_BY_LOCK(m_videoFrameObserversLock); + struct PendingVideoFrame { + RefPtr frame; + VideoFrameTimeMetadata metadata; + }; + static constexpr size_t maxPendingVideoFramesBeforeAddTrack = 30; + Vector m_pendingVideoFrames WTF_GUARDED_BY_LOCK(m_videoFrameObserversLock); + // Set on the main thread from constraints. IntSize m_size; // Set on sample generation thread.