Diff
Modified: trunk/Source/ThirdParty/libwebrtc/ChangeLog (263452 => 263453)
--- trunk/Source/ThirdParty/libwebrtc/ChangeLog 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/ThirdParty/libwebrtc/ChangeLog 2020-06-24 14:07:32 UTC (rev 263453)
@@ -1,3 +1,17 @@
+2020-06-24 Youenn Fablet <you...@apple.com>
+
+ Add logging to WebRTC video pipeline to check for frame rate stability
+ https://bugs.webkit.org/show_bug.cgi?id=213369
+
+ Reviewed by Eric Carlson.
+
+ Add logging for encoded frames taking a long time to be received.
+ We log the time take to receive the frame, the time since previous frame, the byte size of the frame.
+ We compute that a frame takes too long by checking whether it is delayed by more than three expected frames.
+
+ * Source/webrtc/video/rtp_video_stream_receiver.cc:
+ * Source/webrtc/video/rtp_video_stream_receiver.h:
+
2020-06-22 Tim Horton <timothy_hor...@apple.com>
libwebrtc fails to build on arm64
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/video/rtp_video_stream_receiver.cc (263452 => 263453)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/video/rtp_video_stream_receiver.cc 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/video/rtp_video_stream_receiver.cc 2020-06-24 14:07:32 UTC (rev 263453)
@@ -47,6 +47,7 @@
#include "rtc_base/location.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/string_builder.h"
+#include "rtc_base/time_utils.h"
#include "system_wrappers/include/field_trial.h"
#include "system_wrappers/include/metrics.h"
#include "system_wrappers/include/ntp_time.h"
@@ -740,6 +741,32 @@
RTC_DCHECK_RUN_ON(&network_tc_);
RTC_DCHECK(frame);
+#if defined(WEBRTC_WEBKIT_BUILD)
+ static const unsigned MaxFrameDelayCount = 3;
+ static const unsigned TimeStampQueueDurationInMs = 2000;
+ static const unsigned _OneSecondInMs_ = 1000;
+ // FIXME: Consider using MovingAverage instead.
+ ++frameCount_;
+
+ auto frameTime = clock_->TimeInMilliseconds();
+ auto lastFrameTime = observedFrameTimeStamps_.empty() ? frameTime : observedFrameTimeStamps_.back();
+
+ if (observedFrameRate_) {
+ auto delay = frameTime - lastFrameTime;
+ if (delay > (MaxFrameDelayCount * OneSecondInMs / observedFrameRate_)) {
+ RTC_LOG(LS_INFO) << "RtpVideoStreamReceiver::OnAssembledFrame at " << frameTime << ", previous frame was at " << lastFrameTime << ", observed frame rate is " << observedFrameRate_ << ", delay since last frame is " << (frameTime - lastFrameTime) << " ms, frame count is " << frameCount_ << ", size is " << frame->EncodedImage().size() << ", frame reception duration is " << (frame->video_timing().receive_finish_ms - frame->video_timing().receive_start_ms) << " ms, " << " observed samples count is " << observedFrameTimeStamps_.size() << ", observed samples duration is " << (observedFrameTimeStamps_.back() - observedFrameTimeStamps_.front());
+ }
+ }
+
+ observedFrameTimeStamps_.push_back(frameTime);
+ while (observedFrameTimeStamps_.front() <= (frameTime - TimeStampQueueDurationInMs))
+ observedFrameTimeStamps_.pop_front();
+
+ auto queueDuration = frameTime - observedFrameTimeStamps_.front();
+ if (queueDuration > OneSecondInMs)
+ observedFrameRate_ = observedFrameTimeStamps_.size() * OneSecondInMs / queueDuration;
+#endif
+
const absl::optional<RTPVideoHeader::GenericDescriptorInfo>& descriptor =
frame->GetRtpVideoHeader().generic;
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/video/rtp_video_stream_receiver.h (263452 => 263453)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/video/rtp_video_stream_receiver.h 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/video/rtp_video_stream_receiver.h 2020-06-24 14:07:32 UTC (rev 263453)
@@ -360,6 +360,12 @@
rtc::scoped_refptr<RtpVideoStreamReceiverFrameTransformerDelegate>
frame_transformer_delegate_;
+
+#if defined(WEBRTC_WEBKIT_BUILD)
+ std::deque<int64_t> observedFrameTimeStamps_;
+ double observedFrameRate_ { 0 };
+ uint64_t frameCount_ { 0 };
+#endif
};
} // namespace webrtc
Modified: trunk/Source/WebCore/ChangeLog (263452 => 263453)
--- trunk/Source/WebCore/ChangeLog 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/WebCore/ChangeLog 2020-06-24 14:07:32 UTC (rev 263453)
@@ -1,3 +1,34 @@
+2020-06-24 Youenn Fablet <you...@apple.com>
+
+ Add logging to WebRTC video pipeline to check for frame rate stability
+ https://bugs.webkit.org/show_bug.cgi?id=213369
+
+ Reviewed by Eric Carlson.
+
+ Add a FrameRateMonitor class to compute frame stability.
+ Use this class at end of the video pipeline (LocalSampleBufferDisplayLayer).
+ Log messages in case a frame gets frozen at LocalSampleBufferDisplayLayer time.
+ We compute that a frame takes too long by checking whether it is delayed by more than three expected frames.
+ This logging is complemented with encoded frame reception logging (at the beginning of the video pipeline)
+ and WebRTC stats logging (freezeCount, totalFreezeDuration, shortly after decoding the frames).
+
+ * Sources.txt:
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/FrameRateMonitor.cpp: Added.
+ (WebCore::FrameRateMonitor::newFrame):
+ * platform/FrameRateMonitor.h: Added.
+ (WebCore::FrameRateMonitor::frameRate const):
+ (WebCore::FrameRateMonitor::frameCount const):
+ (WebCore::FrameRateMonitor::FrameRateMonitor):
+ * platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h:
+ * platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm:
+ (WebCore::LocalSampleBufferDisplayLayer::LocalSampleBufferDisplayLayer):
+ (WebCore::LocalSampleBufferDisplayLayer::enqueueSample):
+ (WebCore::LocalSampleBufferDisplayLayer::enqueueSampleBuffer):
+ (WebCore::LocalSampleBufferDisplayLayer::onFrameRateNotification):
+ * platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h:
+ Unified build fix.
+
2020-06-24 Alexey Shvayka <shvaikal...@gmail.com>
Remove [CallbackNeedsOperatorEqual] extended attribute
Modified: trunk/Source/WebCore/Sources.txt (263452 => 263453)
--- trunk/Source/WebCore/Sources.txt 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/WebCore/Sources.txt 2020-06-24 14:07:32 UTC (rev 263453)
@@ -1800,6 +1800,7 @@
platform/FileHandle.cpp
platform/FileMonitor.cpp
platform/FileStream.cpp
+platform/FrameRateMonitor.cpp
platform/GenericTaskQueue.cpp
platform/LayoutUnit.cpp
platform/LegacySchemeRegistry.cpp
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (263452 => 263453)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2020-06-24 14:07:32 UTC (rev 263453)
@@ -1105,6 +1105,7 @@
418938B22429F9B4007FDC41 /* RetrieveRecordsOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 418938AF2429F9AB007FDC41 /* RetrieveRecordsOptions.h */; settings = {ATTRIBUTES = (Private, ); }; };
418A06D0133C04D500CD379C /* EventDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 418A06CE133C04D500CD379C /* EventDispatcher.h */; };
418F88050FF957AF0080F045 /* JSAbstractWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = 418F88030FF957AE0080F045 /* JSAbstractWorker.h */; };
+ 4190F3A524A0B4EE00531C57 /* FrameRateMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4190F3A3249D152800531C57 /* FrameRateMonitor.h */; settings = {ATTRIBUTES = (Private, ); }; };
419242492127B93E00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 419242472127B7CC00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm */; };
419ACF921F97E7DA009F1A83 /* ServiceWorkerFetch.h in Headers */ = {isa = PBXBuildFile; fileRef = 419ACF8E1F97E7D5009F1A83 /* ServiceWorkerFetch.h */; settings = {ATTRIBUTES = (Private, ); }; };
419BC2DF1685329900D64D6D /* VisitedLinkState.h in Headers */ = {isa = PBXBuildFile; fileRef = 419BC2DD1685329900D64D6D /* VisitedLinkState.h */; };
@@ -7517,6 +7518,8 @@
418C395F1C8F0AAB0051C8A3 /* ReadableStreamDefaultController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReadableStreamDefaultController.h; sourceTree = "<group>"; };
418F88020FF957AE0080F045 /* JSAbstractWorker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAbstractWorker.cpp; sourceTree = "<group>"; };
418F88030FF957AE0080F045 /* JSAbstractWorker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAbstractWorker.h; sourceTree = "<group>"; };
+ 4190F3A1249D152700531C57 /* FrameRateMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FrameRateMonitor.cpp; sourceTree = "<group>"; };
+ 4190F3A3249D152800531C57 /* FrameRateMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrameRateMonitor.h; sourceTree = "<group>"; };
419242472127B7CC00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RealtimeOutgoingVideoSourceCocoa.mm; sourceTree = "<group>"; };
41945694203502A5004BA277 /* ApplicationCacheResourceLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationCacheResourceLoader.cpp; sourceTree = "<group>"; };
41945696203502A6004BA277 /* ApplicationCacheResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplicationCacheResourceLoader.h; sourceTree = "<group>"; };
@@ -26433,6 +26436,8 @@
2EF1BFE9121C9F4200C27627 /* FileStream.h */,
2EF1BFF8121CB0CE00C27627 /* FileStreamClient.h */,
BC073BA90C399B1F000F5979 /* FloatConversion.h */,
+ 4190F3A1249D152700531C57 /* FrameRateMonitor.cpp */,
+ 4190F3A3249D152800531C57 /* FrameRateMonitor.h */,
CD4BE5291CE13425009D87DA /* GenericTaskQueue.cpp */,
CD62FB941AF018E70012ED7D /* GenericTaskQueue.h */,
A8748BDF12CBF2DC001FBA41 /* HashTools.h */,
@@ -30742,6 +30747,7 @@
93B77A380ADD792500EA4B81 /* FrameLoaderTypes.h in Headers */,
658436860AE01B7400E53753 /* FrameLoadRequest.h in Headers */,
628D214E12131EF40055DCFC /* FrameNetworkingContext.h in Headers */,
+ 4190F3A524A0B4EE00531C57 /* FrameRateMonitor.h in Headers */,
93309E0E099E64920056E581 /* FrameSelection.h in Headers */,
C4CD629B18383766007EBAF1 /* FrameSnapshotting.h in Headers */,
65A21485097A3F5300B9050A /* FrameTree.h in Headers */,
Added: trunk/Source/WebCore/platform/FrameRateMonitor.cpp (0 => 263453)
--- trunk/Source/WebCore/platform/FrameRateMonitor.cpp (rev 0)
+++ trunk/Source/WebCore/platform/FrameRateMonitor.cpp 2020-06-24 14:07:32 UTC (rev 263453)
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "FrameRateMonitor.h"
+
+namespace WebCore {
+
+static constexpr Seconds MinimumAverageDuration = 1_s;
+static constexpr Seconds MaxQueueDuration = 2_s;
+static constexpr unsigned MaxFrameDelayCount = 3;
+
+void FrameRateMonitor::update()
+{
+ ++m_frameCount;
+
+ auto frameTime = MonotonicTime::now().secondsSinceEpoch().value();
+ auto lastFrameTime = m_observedFrameTimeStamps.isEmpty() ? frameTime : m_observedFrameTimeStamps.last();
+
+ if (m_observedFrameRate) {
+ auto maxDelay = MaxFrameDelayCount / m_observedFrameRate;
+ if ((frameTime - lastFrameTime) > maxDelay)
+ m_lateFrameCallback({ MonotonicTime::fromRawSeconds(frameTime), MonotonicTime::fromRawSeconds(lastFrameTime) });
+ }
+ m_observedFrameTimeStamps.append(frameTime);
+ m_observedFrameTimeStamps.removeAllMatching([&](auto time) {
+ return time <= frameTime - MaxQueueDuration.value();
+ });
+
+ auto queueDuration = m_observedFrameTimeStamps.last() - m_observedFrameTimeStamps.first();
+ if (queueDuration > MinimumAverageDuration.value())
+ m_observedFrameRate = (m_observedFrameTimeStamps.size() / queueDuration);
+}
+
+}
Added: trunk/Source/WebCore/platform/FrameRateMonitor.h (0 => 263453)
--- trunk/Source/WebCore/platform/FrameRateMonitor.h (rev 0)
+++ trunk/Source/WebCore/platform/FrameRateMonitor.h 2020-06-24 14:07:32 UTC (rev 263453)
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <wtf/Deque.h>
+#include <wtf/MonotonicTime.h>
+
+namespace WebCore {
+
+class FrameRateMonitor {
+public:
+ struct LateFrameInfo {
+ MonotonicTime frameTime;
+ MonotonicTime lastFrameTime;
+ };
+ using LateFrameCallback = Function<void(LateFrameInfo)>;
+ explicit FrameRateMonitor(LateFrameCallback&&);
+
+ void update();
+
+ double observedFrameRate() const { return m_observedFrameRate; }
+ size_t frameCount() const { return m_frameCount; }
+
+private:
+ LateFrameCallback m_lateFrameCallback;
+ Deque<double, 120> m_observedFrameTimeStamps;
+ double m_observedFrameRate { 0 };
+ uint64_t m_frameCount { 0 };
+};
+
+inline FrameRateMonitor::FrameRateMonitor(LateFrameCallback&& callback)
+ : m_lateFrameCallback(WTFMove(callback))
+{
+}
+
+}
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h (263452 => 263453)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h 2020-06-24 14:07:32 UTC (rev 263453)
@@ -27,6 +27,7 @@
#if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
+#include "FrameRateMonitor.h"
#include "SampleBufferDisplayLayer.h"
#include <wtf/Deque.h>
#include <wtf/Forward.h>
@@ -81,6 +82,10 @@
void requestNotificationWhenReadyForVideoData();
void enqueueSampleBuffer(MediaSample&);
+#if !RELEASE_LOG_DISABLED
+ void onIrregularFrameRateNotification(MonotonicTime frameTime, MonotonicTime lastFrameTime);
+#endif
+
private:
RetainPtr<WebAVSampleBufferStatusChangeListener> m_statusChangeListener;
RetainPtr<AVSampleBufferDisplayLayer> m_sampleBufferDisplayLayer;
@@ -92,6 +97,10 @@
// Only accessed through m_processingQueue or if m_processingQueue is null.
using PendingSampleQueue = Deque<Ref<MediaSample>>;
PendingSampleQueue m_pendingVideoSampleQueue;
+
+#if !RELEASE_LOG_DISABLED
+ FrameRateMonitor m_frameRateMonitor;
+#endif
};
inline void LocalSampleBufferDisplayLayer::setRenderPolicy(RenderPolicy renderPolicy)
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm (263452 => 263453)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm 2020-06-24 14:07:32 UTC (rev 263453)
@@ -153,6 +153,9 @@
, m_statusChangeListener(adoptNS([[WebAVSampleBufferStatusChangeListener alloc] initWithParent:this]))
, m_sampleBufferDisplayLayer(WTFMove(sampleBufferDisplayLayer))
, m_processingQueue(WorkQueue::create("LocalSampleBufferDisplayLayer queue"))
+#if !RELEASE_LOG_DISABLED
+ , m_frameRateMonitor([this](auto info) { onIrregularFrameRateNotification(info.frameTime, info.lastFrameTime); })
+#endif
{
}
@@ -300,6 +303,7 @@
{
m_processingQueue->dispatch([this, sample = makeRef(sample)] {
if (![m_sampleBufferDisplayLayer isReadyForMoreMediaData]) {
+ WTFLogAlways("LocalSampleBufferDisplayLayer::enqueueSample not ready for more media data");
addSampleToPendingQueue(sample);
requestNotificationWhenReadyForVideoData();
return;
@@ -324,8 +328,21 @@
}
[m_sampleBufferDisplayLayer enqueueSampleBuffer:sampleToEnqueue];
+
+#if !RELEASE_LOG_DISABLED
+ m_frameRateMonitor.update();
+#endif
}
+#if !RELEASE_LOG_DISABLED
+void LocalSampleBufferDisplayLayer::onIrregularFrameRateNotification(MonotonicTime frameTime, MonotonicTime lastFrameTime)
+{
+ callOnMainThread([frameTime = frameTime.secondsSinceEpoch().value(), lastFrameTime = lastFrameTime.secondsSinceEpoch().value(), observedFrameRate = m_frameRateMonitor.observedFrameRate(), frameCount = m_frameRateMonitor.frameCount()] {
+ WTFLogAlways("LocalSampleBufferDisplayLayer::enqueueSampleBuffer at %f, previous frame was at %f, observed frame rate is %f, delay since last frame is %f ms, frame count is %lu", frameTime, lastFrameTime, observedFrameRate, (frameTime - lastFrameTime) * 1000, frameCount);
+ });
+}
+#endif
+
void LocalSampleBufferDisplayLayer::removeOldSamplesFromPendingQueue()
{
ASSERT(!isMainThread());
Modified: trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h (263452 => 263453)
--- trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h 2020-06-24 12:09:19 UTC (rev 263452)
+++ trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h 2020-06-24 14:07:32 UTC (rev 263453)
@@ -30,6 +30,8 @@
#include <AudioToolbox/AudioToolbox.h>
#include <CoreAudio/CoreAudioTypes.h>
#include <wtf/Forward.h>
+#include <wtf/HashSet.h>
+#include <wtf/Vector.h>
namespace WebCore {