Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: d7e69a605f2ae52d006f4716edccd688fc6cba17
      
https://github.com/WebKit/WebKit/commit/d7e69a605f2ae52d006f4716edccd688fc6cba17
  Author: Jean-Yves Avenard <j...@apple.com>
  Date:   2024-01-26 (Fri, 26 Jan 2024)

  Changed paths:
    M 
LayoutTests/media/media-source/media-source-video-playback-quality-expected.txt
    M LayoutTests/media/media-source/media-source-video-playback-quality.html
    M Source/WebCore/html/HTMLMediaElement.cpp
    M Source/WebCore/platform/PlatformMediaError.cpp
    M Source/WebCore/platform/PlatformMediaError.h
    M Source/WebCore/platform/graphics/MediaPlayer.cpp
    M Source/WebCore/platform/graphics/MediaPlayer.h
    M Source/WebCore/platform/graphics/MediaPlayerPrivate.cpp
    M Source/WebCore/platform/graphics/MediaPlayerPrivate.h
    M Source/WebCore/platform/graphics/VideoPlaybackQualityMetrics.h
    M 
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h
    M 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h
    M 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
    M Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp
    M Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h
    M Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp
    M Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h
    M Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in

  Log Message:
  -----------
  [AVFObjC] [AVPlayerLayer videoPerformanceMetrics] may deadlock
https://bugs.webkit.org/show_bug.cgi?id=268136
rdar://121637422

Reviewed by Youenn Fablet.

A call to [AVPlayerLayer videoPerformanceMetrics] may deadlock if the AVPlayer 
is
also waiting in the main thread for more data to be delivered.
This commonly occurs when there are lots of videos playing at once and result in
a blocked GPU process.

Dealing with getting the networking data being delivered on the main thread 
will be
dealt in bug 235353.
For now, call [AVPlayerLayer videoPerformanceMetrics] on a different WorkQueue.
The RemoteMediaPlayerProxy already regularly polls the MediaPlayerPrivate for 
the
videoPlaybackQualityMetrics, so performing the actions asynchronously doesn't 
have
a measurable impact.
And it does prevent the GPU process to be deadlock.

Fly-by: While the VideoPlaybackQualityMetrics were properly calculated
and updated in the GPU process at a set interval, the values weren't
being sent to the Content Process except under some limited circumstances
(video got paused, started playing or stall). As such, retrieving the
VideoPlaybackQuality from the video element would typically always return
the same values.

* 
LayoutTests/media/media-source/media-source-video-playback-quality-expected.txt:
* LayoutTests/media/media-source/media-source-video-playback-quality.html:
The quality metrics are calculated every 0.25s (250ms) but we were only
waiting for 50ms.
* Source/WebCore/html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::getVideoPlaybackQuality):
* Source/WebCore/platform/PlatformMediaError.cpp: Adding new error code.
A prior change was incomplete and failed to add the serialisation data.
(WebCore::convertEnumerationToString):
* Source/WebCore/platform/PlatformMediaError.h:
* Source/WebCore/platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::asyncVideoPlaybackQualityMetrics):
* Source/WebCore/platform/graphics/MediaPlayer.h:
* Source/WebCore/platform/graphics/MediaPlayerPrivate.cpp:
(WebCore::MediaPlayerPrivateInterface::asyncVideoPlaybackQualityMetrics):
* Source/WebCore/platform/graphics/MediaPlayerPrivate.h:
* Source/WebCore/platform/graphics/VideoPlaybackQualityMetrics.h:
(WebCore::VideoPlaybackQualityMetrics::operator+=):
* 
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
* 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::asyncVideoPlaybackQualityMetrics):
* Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp:
(WebKit::RemoteMediaPlayerProxy::maybeUpdateCachedVideoMetrics):
(WebKit::RemoteMediaPlayerProxy::updateCachedVideoMetrics):
* Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h:
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
(WebKit::MediaPlayerPrivateRemote::updatePlaybackQualityMetrics):
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in:
Add specific message for sending the VideoPlaybackQualityMetrics, as sending
the entire cached state is expensive (particularly reading the video time).

Canonical link: https://commits.webkit.org/273580@main


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to