Diff
Modified: trunk/Source/WebKit/ChangeLog (276862 => 276863)
--- trunk/Source/WebKit/ChangeLog 2021-04-30 23:33:07 UTC (rev 276862)
+++ trunk/Source/WebKit/ChangeLog 2021-04-30 23:36:24 UTC (rev 276863)
@@ -1,3 +1,39 @@
+2021-04-30 Eric Carlson <[email protected]>
+
+ [GPUP] Poll videoPlaybackQualityMetrics at the frequency is it accessed by script
+ https://bugs.webkit.org/show_bug.cgi?id=225245
+ rdar://77159589
+
+ Reviewed by Jer Noble.
+
+ Updating videoPlaybackQualityMetrics is computationally expensive, so instead of
+ getting it every time cached properties are updated (every 100 ms) keep track of
+ how often the page fetches the property and update it at that frequency.
+
+ * GPUProcess/media/RemoteMediaPlayerProxy.cpp:
+ (WebKit::RemoteMediaPlayerProxy::play):
+ (WebKit::RemoteMediaPlayerProxy::pause):
+ (WebKit::RemoteMediaPlayerProxy::mediaPlayerReadyStateChanged):
+ (WebKit::RemoteMediaPlayerProxy::mediaPlayerRateChanged):
+ (WebKit::RemoteMediaPlayerProxy::mediaPlayerPlaybackStateChanged):
+ (WebKit::RemoteMediaPlayerProxy::mediaPlayerCharacteristicChanged):
+ (WebKit::RemoteMediaPlayerProxy::updateCachedState):
+ (WebKit::RemoteMediaPlayerProxy::setVideoPlaybackMetricsUpdateInterval):
+ (WebKit::RemoteMediaPlayerProxy::maybeUpdateCachedVideoMetrics):
+ (WebKit::RemoteMediaPlayerProxy::updateCachedVideoMetrics):
+ (WebKit::RemoteMediaPlayerProxy::logChannel const):
+ (WebKit::RemoteMediaPlayerProxy::setShouldUpdatePlaybackMetrics): Deleted.
+ * GPUProcess/media/RemoteMediaPlayerProxy.h:
+ * GPUProcess/media/RemoteMediaPlayerProxy.messages.in:
+ * Scripts/webkit/messages.py:
+ (headers_for_type):
+ * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
+ (WebKit::MediaPlayerPrivateRemote::pause):
+ (WebKit::MediaPlayerPrivateRemote::updateCachedState):
+ (WebKit::MediaPlayerPrivateRemote::updateVideoPlaybackMetricsUpdateInterval):
+ (WebKit::MediaPlayerPrivateRemote::videoPlaybackQualityMetrics):
+ * WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
+
2021-04-30 Brent Fulgham <[email protected]>
[Cocoa] Always extend access to local process HTTP/3 cache directory
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp (276862 => 276863)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp 2021-04-30 23:33:07 UTC (rev 276862)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp 2021-04-30 23:36:24 UTC (rev 276863)
@@ -49,6 +49,7 @@
#include "TrackPrivateRemoteConfiguration.h"
#include "WebCoreArgumentCoders.h"
#include <WebCore/LayoutRect.h>
+#include <WebCore/Logging.h>
#include <WebCore/MediaPlayer.h>
#include <WebCore/MediaPlayerPrivate.h>
#include <WebCore/NotImplemented.h>
@@ -176,6 +177,7 @@
void RemoteMediaPlayerProxy::pause()
{
m_updateCachedStateMessageTimer.stop();
+ updateCachedVideoMetrics();
m_player->pause();
sendCachedState();
}
@@ -335,6 +337,7 @@
void RemoteMediaPlayerProxy::mediaPlayerReadyStateChanged()
{
+ updateCachedVideoMetrics();
updateCachedState();
m_cachedState.minTimeSeekable = m_player->minTimeSeekable();
@@ -382,6 +385,7 @@
void RemoteMediaPlayerProxy::mediaPlayerRateChanged()
{
+ updateCachedVideoMetrics();
sendCachedState();
m_webProcessConnection->send(Messages::MediaPlayerPrivateRemote::RateChanged(m_player->rate()), m_id);
}
@@ -460,7 +464,8 @@
void RemoteMediaPlayerProxy::mediaPlayerPlaybackStateChanged()
{
- m_webProcessConnection->send(Messages::MediaPlayerPrivateRemote::PlaybackStateChanged(m_player->paused(), m_player->currentTime(), WallTime::now()), m_id);
+ m_cachedState.paused = m_player->paused();
+ m_webProcessConnection->send(Messages::MediaPlayerPrivateRemote::PlaybackStateChanged(m_cachedState.paused, m_player->currentTime(), WallTime::now()), m_id);
}
void RemoteMediaPlayerProxy::mediaPlayerBufferedTimeRangesChanged()
@@ -481,6 +486,7 @@
void RemoteMediaPlayerProxy::mediaPlayerCharacteristicChanged()
{
+ updateCachedVideoMetrics();
updateCachedState();
m_cachedState.hasClosedCaptions = m_player->hasClosedCaptions();
m_cachedState.languageOfPrimaryAudioTrack = m_player->languageOfPrimaryAudioTrack();
@@ -828,10 +834,7 @@
m_cachedState.paused = m_player->paused();
m_cachedState.hasAudio = m_player->hasAudio();
m_cachedState.hasVideo = m_player->hasVideo();
-
- if (m_shouldUpdatePlaybackMetrics)
- m_cachedState.videoMetrics = m_player->videoPlaybackQualityMetrics();
-
+ maybeUpdateCachedVideoMetrics();
if (m_bufferedChanged) {
m_bufferedChanged = false;
if (m_engineIdentifier != MediaPlayerEnums::MediaEngineIdentifier::AVFoundationMSE)
@@ -989,11 +992,31 @@
completionHandler(m_player->wouldTaintOrigin(originData.securityOrigin()));
}
-void RemoteMediaPlayerProxy::setShouldUpdatePlaybackMetrics(bool should)
+void RemoteMediaPlayerProxy::setVideoPlaybackMetricsUpdateInterval(double interval)
{
- m_shouldUpdatePlaybackMetrics = should;
+ static const Seconds metricsAdvanceUpdate = 0.25_s;
+ ALWAYS_LOG(LOGIDENTIFIER, interval);
+
+ updateCachedVideoMetrics();
+ m_videoPlaybackMetricsUpdateInterval = Seconds(interval);
+ m_nextPlaybackQualityMetricsUpdateTime = WallTime::now() + Seconds(interval) - metricsAdvanceUpdate;
}
+void RemoteMediaPlayerProxy::maybeUpdateCachedVideoMetrics()
+{
+ if (m_cachedState.paused || !m_videoPlaybackMetricsUpdateInterval || WallTime::now() < m_nextPlaybackQualityMetricsUpdateTime)
+ return;
+
+ updateCachedVideoMetrics();
+}
+
+void RemoteMediaPlayerProxy::updateCachedVideoMetrics()
+{
+ ALWAYS_LOG(LOGIDENTIFIER);
+ m_nextPlaybackQualityMetricsUpdateTime = WallTime::now() + m_videoPlaybackMetricsUpdateInterval;
+ m_cachedState.videoMetrics = m_player->videoPlaybackQualityMetrics();
+}
+
void RemoteMediaPlayerProxy::createAudioSourceProvider()
{
#if ENABLE(WEB_AUDIO) && PLATFORM(COCOA)
@@ -1016,6 +1039,13 @@
#endif
}
+#if !RELEASE_LOG_DISABLED
+WTFLogChannel& RemoteMediaPlayerProxy::logChannel() const
+{
+ return WebCore::LogMedia;
+}
+#endif
+
} // namespace WebKit
#endif // ENABLE(GPU_PROCESS)
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h (276862 => 276863)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h 2021-04-30 23:33:07 UTC (rev 276862)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h 2021-04-30 23:36:24 UTC (rev 276863)
@@ -189,8 +189,9 @@
using PerformTaskAtMediaTimeCompletionHandler = CompletionHandler<void(Optional<MediaTime>, Optional<WallTime>)>;
void performTaskAtMediaTime(const MediaTime&, WallTime, PerformTaskAtMediaTimeCompletionHandler&&);
void wouldTaintOrigin(struct WebCore::SecurityOriginData, CompletionHandler<void(Optional<bool>)>&&);
- void setShouldUpdatePlaybackMetrics(bool);
+ void setVideoPlaybackMetricsUpdateInterval(double);
+
RefPtr<WebCore::PlatformMediaResource> requestResource(WebCore::ResourceRequest&&, WebCore::PlatformMediaResourceLoader::LoadOptions);
void sendH2Ping(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&);
void removeResource(RemoteMediaResourceIdentifier);
@@ -284,6 +285,9 @@
void sendCachedState();
void timerFired();
+ void maybeUpdateCachedVideoMetrics();
+ void updateCachedVideoMetrics();
+
void createAudioSourceProvider();
void setShouldEnableAudioSourceProvider(bool);
@@ -295,6 +299,10 @@
#if !RELEASE_LOG_DISABLED
const Logger& mediaPlayerLogger() final { return m_logger; }
const void* mediaPlayerLogIdentifier() { return reinterpret_cast<const void*>(m_configuration.logIdentifier); }
+ const Logger& logger() { return mediaPlayerLogger(); }
+ const void* logIdentifier() { return mediaPlayerLogIdentifier(); }
+ const char* logClassName() const { return "RemoteMediaPlayerProxy"; }
+ WTFLogChannel& logChannel() const;
#endif
HashMap<WebCore::AudioTrackPrivate*, Ref<RemoteAudioTrackProxy>> m_audioTracks;
@@ -320,12 +328,14 @@
RefPtr<RemoteMediaSourceProxy> m_mediaSourceProxy;
#endif
+ Seconds m_videoPlaybackMetricsUpdateInterval;
+ WallTime m_nextPlaybackQualityMetricsUpdateTime;
+
WebCore::IntSize m_videoInlineSize;
float m_videoContentScale { 1.0 };
bool m_bufferedChanged { true };
bool m_renderingCanBeAccelerated { true };
- bool m_shouldUpdatePlaybackMetrics { false };
#if ENABLE(LEGACY_ENCRYPTED_MEDIA) && ENABLE(ENCRYPTED_MEDIA)
bool m_shouldContinueAfterKeyNeeded { false };
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in (276862 => 276863)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in 2021-04-30 23:33:07 UTC (rev 276862)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in 2021-04-30 23:36:24 UTC (rev 276863)
@@ -107,8 +107,9 @@
PerformTaskAtMediaTime(MediaTime mediaTime, WallTime messageTime) -> (Optional<MediaTime> mediaTime, Optional<WallTime> wallTime) Async
WouldTaintOrigin(struct WebCore::SecurityOriginData origin) -> (Optional<bool> wouldTaint) Synchronous
- SetShouldUpdatePlaybackMetrics(bool should)
+ SetVideoPlaybackMetricsUpdateInterval(double interval)
+
#if PLATFORM(IOS_FAMILY)
ErrorLog() -> (String errorLog) Synchronous
AccessLog() -> (String accessLog) Synchronous
Modified: trunk/Source/WebKit/Scripts/webkit/messages.py (276862 => 276863)
--- trunk/Source/WebKit/Scripts/webkit/messages.py 2021-04-30 23:33:07 UTC (rev 276862)
+++ trunk/Source/WebKit/Scripts/webkit/messages.py 2021-04-30 23:36:24 UTC (rev 276863)
@@ -775,6 +775,7 @@
'WebCore::ISOWebVTTCue': ['<WebCore/ISOVTTCue.h>'],
'struct WebCore::Cookie': ['<WebCore/Cookie.h>'],
'struct WebCore::ElementContext': ['<WebCore/ElementContext.h>'],
+ 'struct WebCore::VideoPlaybackQualityMetrics': ['<WebCore/VideoPlaybackQualityMetrics.h>'],
'struct WebKit::WebUserScriptData': ['"WebUserContentControllerDataTypes.h"'],
'struct WebKit::WebUserStyleSheetData': ['"WebUserContentControllerDataTypes.h"'],
'struct WebKit::WebScriptMessageHandlerData': ['"WebUserContentControllerDataTypes.h"'],
Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp (276862 => 276863)
--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp 2021-04-30 23:33:07 UTC (rev 276862)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp 2021-04-30 23:36:24 UTC (rev 276863)
@@ -204,7 +204,7 @@
{
m_cachedState.paused = true;
auto now = WallTime::now();
- m_cachedState.currentTime += MediaTime::createWithDouble(m_rate * (now - m_cachedState.wallTime).seconds());
+ m_cachedState.currentTime += MediaTime::createWithDouble(m_rate * (now - m_cachedState.wallTime).value());
m_cachedState.wallTime = now;
connection().send(Messages::RemoteMediaPlayerProxy::Pause(), m_id);
}
@@ -425,6 +425,8 @@
void MediaPlayerPrivateRemote::updateCachedState(RemoteMediaPlayerState&& state)
{
+ const Seconds playbackQualityMetricsTimeout = 30_s;
+
m_cachedState.wallTime = state.wallTime;
m_cachedState.currentTime = state.currentTime;
m_cachedState.duration = state.duration;
@@ -449,8 +451,10 @@
m_cachedState.hasAudio = state.hasAudio;
m_cachedState.hasVideo = state.hasVideo;
- if (m_wantPlaybackQualityMetrics)
+ if (state.videoMetrics)
m_cachedState.videoMetrics = state.videoMetrics;
+ if (m_videoPlaybackMetricsUpdateInterval && (WallTime::now() - m_lastPlaybackQualityMetricsQueryTime) > playbackQualityMetricsTimeout)
+ updateVideoPlaybackMetricsUpdateInterval(0_s);
m_cachedState.hasClosedCaptions = state.hasClosedCaptions;
m_cachedState.hasAvailableVideoFrame = state.hasAvailableVideoFrame;
@@ -1169,13 +1173,25 @@
return 0;
}
+void MediaPlayerPrivateRemote::updateVideoPlaybackMetricsUpdateInterval(const Seconds& interval)
+{
+ m_videoPlaybackMetricsUpdateInterval = interval;
+ connection().send(Messages::RemoteMediaPlayerProxy::SetVideoPlaybackMetricsUpdateInterval(m_videoPlaybackMetricsUpdateInterval.value()), m_id);
+}
+
Optional<VideoPlaybackQualityMetrics> MediaPlayerPrivateRemote::videoPlaybackQualityMetrics()
{
- if (!m_wantPlaybackQualityMetrics) {
- m_wantPlaybackQualityMetrics = true;
- connection().send(Messages::RemoteMediaPlayerProxy::SetShouldUpdatePlaybackMetrics(true), m_id);
- }
+ const Seconds maximumPlaybackQualityMetricsSampleTimeDelta = 0.25_s;
+ auto now = WallTime::now();
+ auto timeSinceLastQuery = now - m_lastPlaybackQualityMetricsQueryTime;
+ if (!m_videoPlaybackMetricsUpdateInterval)
+ updateVideoPlaybackMetricsUpdateInterval(1_s);
+ else if (std::abs((timeSinceLastQuery - m_videoPlaybackMetricsUpdateInterval).value()) > maximumPlaybackQualityMetricsSampleTimeDelta.value())
+ updateVideoPlaybackMetricsUpdateInterval(timeSinceLastQuery);
+
+ m_lastPlaybackQualityMetricsQueryTime = now;
+
return m_cachedState.videoMetrics;
}
Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h (276862 => 276863)
--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h 2021-04-30 23:33:07 UTC (rev 276862)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h 2021-04-30 23:36:24 UTC (rev 276863)
@@ -365,6 +365,7 @@
size_t extraMemoryCost() const final;
Optional<WebCore::VideoPlaybackQualityMetrics> videoPlaybackQualityMetrics() final;
+ void updateVideoPlaybackMetricsUpdateInterval(const Seconds&);
#if ENABLE(AVF_CAPTIONS)
void notifyTrackModeChanged() final;
@@ -414,6 +415,8 @@
WebCore::SecurityOriginData m_documentSecurityOrigin;
mutable HashMap<WebCore::SecurityOriginData, Optional<bool>> m_wouldTaintOriginCache;
+ WallTime m_lastPlaybackQualityMetricsQueryTime;
+ Seconds m_videoPlaybackMetricsUpdateInterval;
double m_volume { 1 };
double m_rate { 1 };
long m_platformErrorCode { 0 };
@@ -421,7 +424,6 @@
bool m_seeking { false };
bool m_isCurrentPlaybackTargetWireless { false };
bool m_invalid { false };
- bool m_wantPlaybackQualityMetrics { false };
bool m_waitingForKey { false };
};