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

Reply via email to