Title: [276863] trunk/Source/WebKit
Revision
276863
Author
[email protected]
Date
2021-04-30 16:36:24 -0700 (Fri, 30 Apr 2021)

Log Message

[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:

Modified Paths

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 };
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to