diff --git a/LayoutTests/platform/ios/TestExpectations b/LayoutTests/platform/ios/TestExpectations index 957d98df2cb0..b9cfd7de9c2c 100644 --- a/LayoutTests/platform/ios/TestExpectations +++ b/LayoutTests/platform/ios/TestExpectations @@ -3374,7 +3374,8 @@ http/tests/websocket/tests/hybi/workers/worker-reload.html [ Pass Crash ] http/tests/workers/service/service-worker-download-async-delegates.https.html [ Pass Crash ] # rdar://80396393 ([ iOS15 ] http/wpt/mediarecorder/mute-tracks.html is a flaky failure) -http/wpt/mediarecorder/mute-tracks.html [ Pass Failure ] +# webkit.org/b/238774 [ iOS ] http/wpt/mediarecorder/mute-tracks.html is a flaky crash +http/wpt/mediarecorder/mute-tracks.html [ Pass Failure Crash ] # rdar://80396502 ([ iOS15 ] http/wpt/mediarecorder/pause-recording.html is a flaky crash) http/wpt/mediarecorder/pause-recording.html [ Pass Crash ] diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm index 4907d3626d4d..75ea25ecfd83 100644 --- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm +++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm @@ -1361,6 +1361,8 @@ void getSupportedTypes(HashSet& types) const final [m_synchronizer removeRenderer:audioRenderer atTime:currentTime completionHandler:nil]; m_sampleBufferAudioRendererMap.remove(iter); + if (auto player = m_player.get()) + player->renderingModeChanged(); } void MediaPlayerPrivateMediaSourceAVFObjC::removeAudioTrack(AudioTrackPrivate& track) diff --git a/Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm b/Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm index c016af3b65d1..c59a43381898 100644 --- a/Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm +++ b/Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm @@ -1562,6 +1562,8 @@ static bool isCopyDisplayedPixelBufferAvailable() destroyAudioRenderer(renderer); } m_audioRenderers.clear(); + if (auto player = m_player.get()) + player->renderingModeChanged(); } void MediaPlayerPrivateWebM::clearTracks() diff --git a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp index 37af34d5930a..acebd7d9de7b 100644 --- a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp +++ b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp @@ -128,6 +128,8 @@ MediaPlayerPrivateRemote::MediaPlayerPrivateRemote(MediaPlayer* player, MediaPla , m_documentSecurityOrigin(player->documentSecurityOrigin()) { ALWAYS_LOG(LOGIDENTIFIER); + + acceleratedRenderingStateChanged(); } MediaPlayerPrivateRemote::~MediaPlayerPrivateRemote() @@ -343,8 +345,10 @@ void MediaPlayerPrivateRemote::readyStateChanged(RemoteMediaPlayerState&& state) { ALWAYS_LOG(LOGIDENTIFIER, state.readyState); updateCachedState(WTFMove(state)); - if (auto player = m_player.get()) + if (auto player = m_player.get()) { player->readyStateChanged(); + checkAcceleratedRenderingState(); + } } void MediaPlayerPrivateRemote::volumeChanged(double volume) @@ -487,17 +491,26 @@ bool MediaPlayerPrivateRemote::supportsAcceleratedRendering() const void MediaPlayerPrivateRemote::acceleratedRenderingStateChanged() { if (auto player = m_player.get()) { - connection().send(Messages::RemoteMediaPlayerProxy::AcceleratedRenderingStateChanged(player->renderingCanBeAccelerated()), m_id); + m_renderingCanBeAccelerated = player->renderingCanBeAccelerated(); + connection().send(Messages::RemoteMediaPlayerProxy::AcceleratedRenderingStateChanged(m_renderingCanBeAccelerated), m_id); + } + renderingModeChanged(); +} + +void MediaPlayerPrivateRemote::checkAcceleratedRenderingState() +{ + if (auto player = m_player.get()) { + bool renderingCanBeAccelerated = player->renderingCanBeAccelerated(); + if (m_renderingCanBeAccelerated != renderingCanBeAccelerated) + acceleratedRenderingStateChanged(); } } void MediaPlayerPrivateRemote::updateConfiguration(RemoteMediaPlayerConfiguration&& configuration) { - bool oldSupportsAcceleraterRendering = supportsAcceleratedRendering(); m_configuration = WTFMove(configuration); // player->renderingCanBeAccelerated() result is dependent on m_configuration.supportsAcceleratedRendering value. - if (RefPtr player = m_player.get(); player && oldSupportsAcceleraterRendering != supportsAcceleratedRendering()) - player->renderingModeChanged(); + checkAcceleratedRenderingState(); } #if ENABLE(WIRELESS_PLAYBACK_TARGET) @@ -873,8 +886,7 @@ void MediaPlayerPrivateRemote::setVideoFullscreenLayer(PlatformLayer* videoFulls m_videoLayerManager->setVideoFullscreenLayer(videoFullscreenLayer, WTFMove(completionHandler), nullptr); #endif // A Fullscreen layer has been set, this could update the value returned by player->renderingCanBeAccelerated(). - if (RefPtr player = m_player.get()) - player->renderingModeChanged(); + checkAcceleratedRenderingState(); } void MediaPlayerPrivateRemote::updateVideoFullscreenInlineImage() diff --git a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h index f326c42b3497..abc8ec3b0ed8 100644 --- a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h +++ b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h @@ -336,6 +336,7 @@ class MediaPlayerPrivateRemote final bool supportsAcceleratedRendering() const final; void acceleratedRenderingStateChanged() final; + void checkAcceleratedRenderingState(); void setShouldMaintainAspectRatio(bool) final; @@ -480,6 +481,7 @@ class MediaPlayerPrivateRemote final bool m_isCurrentPlaybackTargetWireless { false }; bool m_waitingForKey { false }; bool m_timeIsProgressing { false }; + bool m_renderingCanBeAccelerated { false }; std::optional m_shouldMaintainAspectRatio; std::optional m_pageIsVisible; RefPtr m_videoFrameForCurrentTime;