<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[280723] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/280723">280723</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2021-08-06 08:09:20 -0700 (Fri, 06 Aug 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cocoa] Remove support for AVAssetImageGenerator
https://bugs.webkit.org/show_bug.cgi?id=228560
<rdar://problem/81336280>

Reviewed by Eric Carlson.

Source/WebCore:

A much more minimal approach to removing support for AVAssetImageGenerator.

The only time we use an AVAssetImageGenerator (as opposed to an AVPlayerItemVideoOutput)
is when the latter does not currently have an available image enqueued. Because painting
is a synchronous operation, we use a synchronous API (the generator) to create an image
for that operation. However, this can create deadlocks if (for example) the resource needs
to load data on the main thread in order to complete the painting operation.

Instead, allow the main runloop to spin while waiting (up to 1_s) for the video output
to receive a decoded frame.

Drive-by fixes:
- Don't create an AVPlayerLayer at AVPlayer-creation; this causes the AVPlayerItemVideoOutput
  to never receive a decoded frambe (as the layer is not in a CALayer-heirarchy).
- preferredRenderingMode() shouldn't be "none" when the page isn't visible. We already
  just mark the layer as "hidden" in that case.
- Don't tear down the AVPlayerItemVideoOutput when creating an AVPlayerLayer; it'll just
  get re-created anyway.

* platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
(WebCore::MediaPlayerPrivateAVFoundation::preferredRenderingMode const):
(WebCore::MediaPlayerPrivateAVFoundation::setUpVideoRendering):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer):
(WebCore::MediaPlayerPrivateAVFoundationObjC::paintCurrentFrameInContext):
(WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoOutput):
(WebCore::MediaPlayerPrivateAVFoundationObjC::paintWithVideoOutput):
(WebCore::MediaPlayerPrivateAVFoundationObjC::waitForVideoOutputMediaDataWillChange):
(WebCore::MediaPlayerPrivateAVFoundationObjC::outputMediaDataWillChange):
(-[WebCoreAVFPullDelegate outputMediaDataWillChange:]):
(-[WebCoreAVFPullDelegate setParent:]):

Source/WebKit:

Drive-by fix: we're passing the wrong value into acceleratedRenderingStateChanged(), and
we're not setting the correct initial value on MediaPlayerPrivateRemote creation.

* GPUProcess/media/RemoteMediaPlayerProxy.h:
* WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
(WebKit::MediaPlayerPrivateRemote::MediaPlayerPrivateRemote):
(WebKit::MediaPlayerPrivateRemote::acceleratedRenderingStateChanged):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp">trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitGPUProcessmediaRemoteMediaPlayerProxyh">trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h</a></li>
<li><a href="#trunkSourceWebKitWebProcessGPUmediaMediaPlayerPrivateRemotecpp">trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (280722 => 280723)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-08-06 15:04:13 UTC (rev 280722)
+++ trunk/Source/WebCore/ChangeLog      2021-08-06 15:09:20 UTC (rev 280723)
</span><span class="lines">@@ -1,3 +1,44 @@
</span><ins>+2021-08-06  Jer Noble  <jer.noble@apple.com>
+
+        [Cocoa] Remove support for AVAssetImageGenerator
+        https://bugs.webkit.org/show_bug.cgi?id=228560
+        <rdar://problem/81336280>
+
+        Reviewed by Eric Carlson.
+
+        A much more minimal approach to removing support for AVAssetImageGenerator.
+
+        The only time we use an AVAssetImageGenerator (as opposed to an AVPlayerItemVideoOutput)
+        is when the latter does not currently have an available image enqueued. Because painting
+        is a synchronous operation, we use a synchronous API (the generator) to create an image
+        for that operation. However, this can create deadlocks if (for example) the resource needs
+        to load data on the main thread in order to complete the painting operation.
+
+        Instead, allow the main runloop to spin while waiting (up to 1_s) for the video output
+        to receive a decoded frame.
+
+        Drive-by fixes:
+        - Don't create an AVPlayerLayer at AVPlayer-creation; this causes the AVPlayerItemVideoOutput
+          to never receive a decoded frambe (as the layer is not in a CALayer-heirarchy).
+        - preferredRenderingMode() shouldn't be "none" when the page isn't visible. We already
+          just mark the layer as "hidden" in that case.
+        - Don't tear down the AVPlayerItemVideoOutput when creating an AVPlayerLayer; it'll just
+          get re-created anyway.
+
+        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
+        (WebCore::MediaPlayerPrivateAVFoundation::preferredRenderingMode const):
+        (WebCore::MediaPlayerPrivateAVFoundation::setUpVideoRendering):
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::paintCurrentFrameInContext):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoOutput):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::paintWithVideoOutput):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::waitForVideoOutputMediaDataWillChange):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::outputMediaDataWillChange):
+        (-[WebCoreAVFPullDelegate outputMediaDataWillChange:]):
+        (-[WebCoreAVFPullDelegate setParent:]):
+
</ins><span class="cx"> 2021-08-06  Antti Koivisto  <antti@apple.com>
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r274038): Keyframe animation with top/left with percentages fails to animate
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp (280722 => 280723)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp   2021-08-06 15:04:13 UTC (rev 280722)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp      2021-08-06 15:09:20 UTC (rev 280723)
</span><span class="lines">@@ -105,7 +105,7 @@
</span><span class="cx"> 
</span><span class="cx"> MediaPlayerPrivateAVFoundation::MediaRenderingMode MediaPlayerPrivateAVFoundation::preferredRenderingMode() const
</span><span class="cx"> {
</span><del>-    if (!m_visible || assetStatus() == MediaPlayerAVAssetStatusUnknown)
</del><ins>+    if (assetStatus() == MediaPlayerAVAssetStatusUnknown)
</ins><span class="cx">         return MediaRenderingNone;
</span><span class="cx"> 
</span><span class="cx">     if (supportsAcceleratedRendering() && m_player->renderingCanBeAccelerated())
</span><span class="lines">@@ -122,18 +122,16 @@
</span><span class="cx">     MediaRenderingMode currentMode = currentRenderingMode();
</span><span class="cx">     MediaRenderingMode preferredMode = preferredRenderingMode();
</span><span class="cx"> 
</span><del>-    if (preferredMode == MediaRenderingNone)
-        preferredMode = MediaRenderingToContext;
-
</del><span class="cx">     if (currentMode == preferredMode && currentMode != MediaRenderingNone)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (currentMode != MediaRenderingNone)
</del><ins>+    switch (preferredMode) {
+    case MediaRenderingNone:
</ins><span class="cx">         tearDownVideoRendering();
</span><ins>+        break;
</ins><span class="cx"> 
</span><del>-    switch (preferredMode) {
-    case MediaRenderingNone:
</del><span class="cx">     case MediaRenderingToContext:
</span><ins>+        destroyVideoLayer();
</ins><span class="cx">         createContextVideoRenderer();
</span><span class="cx">         break;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (280722 => 280723)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h    2021-08-06 15:04:13 UTC (rev 280722)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h       2021-08-06 15:09:20 UTC (rev 280723)
</span><span class="lines">@@ -117,6 +117,7 @@
</span><span class="cx">     void outputObscuredDueToInsufficientExternalProtectionChanged(bool);
</span><span class="cx"> 
</span><span class="cx">     MediaTime currentMediaTime() const final;
</span><ins>+    void outputMediaDataWillChange();
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx"> #if ENABLE(ENCRYPTED_MEDIA)
</span><span class="lines">@@ -435,6 +436,7 @@
</span><span class="cx">     mutable bool m_allowsWirelessVideoPlayback { true };
</span><span class="cx">     bool m_shouldPlayToPlaybackTarget { false };
</span><span class="cx"> #endif
</span><ins>+    bool m_runningModalPaint { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (280722 => 280723)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm   2021-08-06 15:04:13 UTC (rev 280722)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm      2021-08-06 15:09:20 UTC (rev 280723)
</span><span class="lines">@@ -196,6 +196,7 @@
</span><span class="cx"> @interface WebCoreAVFPullDelegate : NSObject<AVPlayerItemOutputPullDelegate> {
</span><span class="cx">     BinarySemaphore m_semaphore;
</span><span class="cx"> }
</span><ins>+- (id)initWithPlayer:(WeakPtr<MediaPlayerPrivateAVFoundationObjC>&&)player;
</ins><span class="cx"> - (void)outputMediaDataWillChange:(AVPlayerItemOutput *)sender;
</span><span class="cx"> - (void)outputSequenceWasFlushed:(AVPlayerItemOutput *)output;
</span><span class="cx"> 
</span><span class="lines">@@ -1070,9 +1071,6 @@
</span><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (player()->isVideoPlayer())
-        createAVPlayerLayer();
-
</del><span class="cx">     if (m_avPlayerItem)
</span><span class="cx">         setAVPlayerItem(m_avPlayerItem.get());
</span><span class="cx"> 
</span><span class="lines">@@ -1802,19 +1800,7 @@
</span><span class="cx">     setDelayCallbacks(true);
</span><span class="cx">     BEGIN_BLOCK_OBJC_EXCEPTIONS
</span><span class="cx"> 
</span><del>-    // Callers of this will often call copyVideoTextureToPlatformTexture first,
-    // which calls updateLastPixelBuffer, which clears m_lastImage whenever the
-    // video delivers a new frame. This breaks videoOutputHasAvailableFrame's
-    // short-circuiting when m_lastImage is non-null, but the video often
-    // doesn't have a new frame to deliver since the last time
-    // hasNewPixelBufferForItemTime was called against m_videoOutput. To avoid
-    // changing the semantics of videoOutputHasAvailableFrame in ways that might
-    // break other callers, look for production of a recent pixel buffer from
-    // the video output, too.
-    if (videoOutputHasAvailableFrame() || (m_videoOutput && m_lastPixelBuffer))
-        paintWithVideoOutput(context, rect);
-    else
-        paintWithImageGenerator(context, rect);
</del><ins>+    paintWithVideoOutput(context, rect);
</ins><span class="cx"> 
</span><span class="cx">     END_BLOCK_OBJC_EXCEPTIONS
</span><span class="cx">     setDelayCallbacks(false);
</span><span class="lines">@@ -2439,7 +2425,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_videoOutputDelegate = adoptNS([[WebCoreAVFPullDelegate alloc] init]);
</del><ins>+    m_videoOutputDelegate = adoptNS([[WebCoreAVFPullDelegate alloc] initWithPlayer:makeWeakPtr(*this)]);
</ins><span class="cx">     [m_videoOutput setDelegate:m_videoOutputDelegate.get() queue:globalPullDelegateQueue()];
</span><span class="cx"> 
</span><span class="cx">     [m_avPlayerItem.get() addOutput:m_videoOutput.get()];
</span><span class="lines">@@ -2523,11 +2509,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationObjC::paintWithVideoOutput(GraphicsContext& context, const FloatRect& outputRect)
</span><span class="cx"> {
</span><del>-    // It's crucial to not wait synchronously for the next image. Videos that
-    // come down this path are performing slow-case software uploads, and such
-    // videos may not return metadata in a timely fashion. Use the most recently
-    // available pixel buffer, if any.
-    updateLastImage();
</del><ins>+    updateLastImage(UpdateType::UpdateSynchronously);
</ins><span class="cx">     if (!m_lastImage)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -2567,11 +2549,30 @@
</span><span class="cx">     [m_videoOutput requestNotificationOfMediaDataChangeWithAdvanceInterval:0];
</span><span class="cx"> 
</span><span class="cx">     // Wait for 1 second.
</span><del>-    bool satisfied = [m_videoOutputDelegate semaphore].waitFor(1_s);
</del><ins>+    MonotonicTime start = MonotonicTime::now();
+
+    RunLoop::Timer<MediaPlayerPrivateAVFoundationObjC> timeoutTimer { RunLoop::main(), [] {
+        RunLoop::main().stop();
+    } };
+    timeoutTimer.startOneShot(1_s);
+
+    m_runningModalPaint = true;
+    RunLoop::run();
+    m_runningModalPaint = false;
+
+    bool satisfied = timeoutTimer.isActive();
</ins><span class="cx">     if (!satisfied)
</span><span class="cx">         ERROR_LOG(LOGIDENTIFIER, "timed out");
</span><ins>+    else
+        INFO_LOG(LOGIDENTIFIER, "waiting for videoOutput took ", (MonotonicTime::now() - start).seconds());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MediaPlayerPrivateAVFoundationObjC::outputMediaDataWillChange()
+{
+    if (m_runningModalPaint)
+        RunLoop::main().stop();
+}
+
</ins><span class="cx"> #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
</span><span class="cx"> 
</span><span class="cx"> RetainPtr<AVAssetResourceLoadingRequest> MediaPlayerPrivateAVFoundationObjC::takeRequestForKeyURI(const String& keyURI)
</span><span class="lines">@@ -3899,14 +3900,29 @@
</span><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span><del>-@implementation WebCoreAVFPullDelegate
</del><ins>+@implementation WebCoreAVFPullDelegate {
+    WeakPtr<WebCore::MediaPlayerPrivateAVFoundationObjC> _player;
+}
</ins><span class="cx"> 
</span><span class="cx"> @synthesize semaphore = m_semaphore;
</span><span class="cx"> 
</span><ins>+- (id)initWithPlayer:(WeakPtr<MediaPlayerPrivateAVFoundationObjC>&&)player
+{
+    self = [super init];
+    if (!self)
+        return nil;
+    _player = WTFMove(player);
+    return self;
+}
+
</ins><span class="cx"> - (void)outputMediaDataWillChange:(AVPlayerItemVideoOutput *)output
</span><span class="cx"> {
</span><span class="cx">     UNUSED_PARAM(output);
</span><span class="cx">     m_semaphore.signal();
</span><ins>+    RunLoop::main().dispatch([player = _player] {
+        if (player)
+            player->outputMediaDataWillChange();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)outputSequenceWasFlushed:(AVPlayerItemVideoOutput *)output
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (280722 => 280723)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2021-08-06 15:04:13 UTC (rev 280722)
+++ trunk/Source/WebKit/ChangeLog       2021-08-06 15:09:20 UTC (rev 280723)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2021-08-06  Jer Noble  <jer.noble@apple.com>
+
+        [Cocoa] Remove support for AVAssetImageGenerator
+        https://bugs.webkit.org/show_bug.cgi?id=228560
+        <rdar://problem/81336280>
+
+        Reviewed by Eric Carlson.
+
+        Drive-by fix: we're passing the wrong value into acceleratedRenderingStateChanged(), and
+        we're not setting the correct initial value on MediaPlayerPrivateRemote creation.
+
+        * GPUProcess/media/RemoteMediaPlayerProxy.h:
+        * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
+        (WebKit::MediaPlayerPrivateRemote::MediaPlayerPrivateRemote):
+        (WebKit::MediaPlayerPrivateRemote::acceleratedRenderingStateChanged):
+
</ins><span class="cx"> 2021-08-06  Eric Carlson  <eric.carlson@apple.com>
</span><span class="cx"> 
</span><span class="cx">         REGRESSION: ASSERTION FAILED: !DeprecatedGlobalSettings::shouldManageAudioSessionCategory() || AudioSession::sharedSession().category() == AudioSession::CategoryType::PlayAndRecord
</span></span></pre></div>
<a id="trunkSourceWebKitGPUProcessmediaRemoteMediaPlayerProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h (280722 => 280723)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h    2021-08-06 15:04:13 UTC (rev 280722)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h       2021-08-06 15:09:20 UTC (rev 280723)
</span><span class="lines">@@ -353,7 +353,7 @@
</span><span class="cx">     float m_videoContentScale { 1.0 };
</span><span class="cx"> 
</span><span class="cx">     bool m_bufferedChanged { true };
</span><del>-    bool m_renderingCanBeAccelerated { true };
</del><ins>+    bool m_renderingCanBeAccelerated { false };
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(LEGACY_ENCRYPTED_MEDIA) && ENABLE(ENCRYPTED_MEDIA)
</span><span class="cx">     bool m_shouldContinueAfterKeyNeeded { false };
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessGPUmediaMediaPlayerPrivateRemotecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp (280722 => 280723)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp    2021-08-06 15:04:13 UTC (rev 280722)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp       2021-08-06 15:09:20 UTC (rev 280723)
</span><span class="lines">@@ -114,6 +114,8 @@
</span><span class="cx">     , m_documentSecurityOrigin(player->documentSecurityOrigin())
</span><span class="cx"> {
</span><span class="cx">     INFO_LOG(LOGIDENTIFIER);
</span><ins>+
+    acceleratedRenderingStateChanged();
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -455,7 +457,7 @@
</span><span class="cx"> void MediaPlayerPrivateRemote::acceleratedRenderingStateChanged()
</span><span class="cx"> {
</span><span class="cx">     if (auto player = makeRefPtr(m_player.get()))
</span><del>-        connection().send(Messages::RemoteMediaPlayerProxy::AcceleratedRenderingStateChanged(player->supportsAcceleratedRendering()), m_id);
</del><ins>+        connection().send(Messages::RemoteMediaPlayerProxy::AcceleratedRenderingStateChanged(player->renderingCanBeAccelerated()), m_id);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span></span></pre>
</div>
</div>

</body>
</html>