Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: bf1106bdd665bf75610af67854fd672030bac1f2
https://github.com/WebKit/WebKit/commit/bf1106bdd665bf75610af67854fd672030bac1f2
Author: Jean-Yves Avenard <[email protected]>
Date: 2026-10-14 (Wed, 14 Oct 2026)
Changed paths:
M Source/WebCore/Modules/mediasource/MediaSource.cpp
M Source/WebCore/platform/PlatformMediaError.cpp
M Source/WebCore/platform/PlatformMediaError.h
M Source/WebCore/platform/graphics/AudioVideoRenderer.h
M Source/WebCore/platform/graphics/MediaSourcePrivate.h
M Source/WebCore/platform/graphics/avfoundation/AudioVideoRendererAVFObjC.h
M Source/WebCore/platform/graphics/avfoundation/AudioVideoRendererAVFObjC.mm
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm
M Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm
M Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.cpp
M Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.h
M
Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.messages.in
M Source/WebKit/Shared/WebCoreArgumentCodersMedia.serialization.in
M Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.cpp
M Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.h
Log Message:
-----------
REGRESSION(319230@main): PLT7-SI | iPad | ~3%
https://bugs.webkit.org/show_bug.cgi?id=326639
rdar://188813004
Reviewed by Eric Carlson.
Following 319230@main, site-isolated pages ran with a 4096-frame (85 ms) audio
IO buffer. When a page playing MSE video was torn down, the GPU process paused,
flushed and removed each renderer's audio track one by one on its main thread.
While an AVSampleBufferAudioRenderer is playing,
-[AVSampleBufferRenderSynchronizer
setRate:], -[AVSampleBufferAudioRenderer flush] and -setMuted: each block for
about one IO cycle, so a teardown held the main thread for 85 to 170 ms in
each method, and the next page's GPU process connection was only set up after
it.
AudioVideoRenderer now has shutdown(), which the players call when they are
destroyed instead of pause(), and which RemoteAudioVideoRendererProxyManager
calls instead of pause() and flush(). AudioVideoRendererAVFObjC::shutdown()
detaches the renderers from the synchronizer and stops requesting media data
without pausing or flushing them. Once shut down, a renderer ignores further
calls, and its promises reject with the new PlatformMediaError::Shutdown.
MediaSourcePrivate::willShutdown() is added and called at the start of
MediaSource::detachFromElement(), so that MediaSourcePrivateAVFObjC shuts the
renderer down before the SourceBuffers attempt to remove all tracks.
The Shutdown message now only shuts the GPU-side renderer down; the new
Destroy message, sent when AudioVideoRendererRemote is destroyed, removes it,
so messages still in flight after a shutdown remain valid.
* Source/WebCore/Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::detachFromElement): Call willShutdown() on the
MediaSourcePrivate.
* Source/WebCore/platform/PlatformMediaError.cpp:
(WebCore::convertEnumerationToString): Add Shutdown.
* Source/WebCore/platform/PlatformMediaError.h:
* Source/WebCore/platform/graphics/AudioVideoRenderer.h:
* Source/WebCore/platform/graphics/MediaSourcePrivate.h:
(WebCore::MediaSourcePrivate::willShutdown): Added.
* Source/WebCore/platform/graphics/avfoundation/AudioVideoRendererAVFObjC.h:
* Source/WebCore/platform/graphics/avfoundation/AudioVideoRendererAVFObjC.mm:
(WebCore::AudioVideoRendererAVFObjC::shutdown): Added.
(WebCore::AudioVideoRendererAVFObjC::setResourceOwner): Moved out of line.
(WebCore::AudioVideoRendererAVFObjC::addTrack): Return early once shut down.
(WebCore::AudioVideoRendererAVFObjC::requestMediaDataWhenReady): Ditto.
(WebCore::AudioVideoRendererAVFObjC::notifyTimeReachedAndStall): Ditto.
(WebCore::AudioVideoRendererAVFObjC::prepareToSeek): Ditto.
(WebCore::AudioVideoRendererAVFObjC::finishSeek): Ditto.
(WebCore::AudioVideoRendererAVFObjC::notifyWhenErrorOccurs): Report Shutdown
once shut down.
(WebCore::AudioVideoRendererAVFObjC::setVideoFullscreenLayer): Call the
completion handler once shut down.
Other overridden methods also return early once shut down.
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::~MediaPlayerPrivateMediaSourceAVFObjC):
Shut down the renderer instead of pausing it.
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h:
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
(WebCore::MediaSourcePrivateAVFObjC::willShutdown): Added. Shut down the
renderer.
* Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm:
(WebCore::MediaPlayerPrivateWebM::~MediaPlayerPrivateWebM): Shut down the
renderer.
* Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.cpp:
(WebKit::RemoteAudioVideoRendererProxyManager::~RemoteAudioVideoRendererProxyManager):
Shut down the renderers instead of pausing and flushing them.
(WebKit::RemoteAudioVideoRendererProxyManager::connectionToWebProcessClosed):
Ditto.
(WebKit::RemoteAudioVideoRendererProxyManager::shutdown): Shut down the
renderer without removing it.
(WebKit::RemoteAudioVideoRendererProxyManager::destroy): Added. Shut down and
remove the renderer.
* Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.h:
*
Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.messages.in:
Add Destroy.
* Source/WebKit/Shared/WebCoreArgumentCodersMedia.serialization.in:
* Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.cpp:
(WebKit::AudioVideoRendererRemote::~AudioVideoRendererRemote): Send Destroy
instead of Shutdown.
(WebKit::AudioVideoRendererRemote::shutdown): Added.
(WebKit::AudioVideoRendererRemote::ensureOnDispatcherWithConnection): Drop the
call once shut down.
(WebKit::AudioVideoRendererRemote::prepareToSeek): Reject with Shutdown once
shut down.
(WebKit::AudioVideoRendererRemote::finishSeek): Reject once shut down.
(WebKit::AudioVideoRendererRemote::requestMediaDataWhenReady): Reject with
Shutdown once shut down.
(WebKit::AudioVideoRendererRemote::notifyTimeReachedAndStall): Ditto.
(WebKit::AudioVideoRendererRemote::setInitData): Ditto.
(WebKit::AudioVideoRendererRemote::requestHostingContext): Reject once shut
down.
(WebKit::AudioVideoRendererRemote::currentBitmapImage): Ditto.
(WebKit::AudioVideoRendererRemote::addTrack): Don't send AddTrack once shut
down.
(WebKit::AudioVideoRendererRemote::currentVideoFrame): Don't send
CurrentVideoFrame once shut down.
(WebKit::AudioVideoRendererRemote::enqueueSample): Don't send
RequestMediaDataWhenReady once shut down.
(WebKit::AudioVideoRendererRemote::flushTrack): Ditto.
(WebKit::AudioVideoRendererRemote::notifyWhenErrorOccurs): Report Shutdown once
shut down.
(WebKit::AudioVideoRendererRemote::setVideoFullscreenLayer): Call the
completion handler once shut down.
(WebKit::AudioVideoRendererRemote::notifyTrackNeedsReenqueuing): Ignore once
shut down.
(WebKit::AudioVideoRendererRemote::notifyEffectiveRateChanged): Ditto.
(WebKit::AudioVideoRendererRemote::notifyVideoLayerSizeChanged): Ditto.
(WebKit::AudioVideoRendererRemote::gpuProcessConnectionDidClose): Send Destroy
instead of Shutdown.
* Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.h:
Canonical link: https://commits.webkit.org/323717@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications