Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: f06680f6e584be39e853222329f2079433e56992
https://github.com/WebKit/WebKit/commit/f06680f6e584be39e853222329f2079433e56992
Author: Jean-Yves Avenard <[email protected]>
Date: 2025-11-06 (Thu, 06 Nov 2025)
Changed paths:
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm
M Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm
M Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.cpp
M Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.cpp
M Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.h
Log Message:
-----------
AudioVideoRendererRemote should use its own work queue
https://bugs.webkit.org/show_bug.cgi?id=301964
rdar://164040921
Reviewed by Youenn Fablet.
We make the AudioVideoRendererRemote thread-safe and run on a dedicated queue.
This will allow the SourceBufferPrivate to run on a thread different than
the main thread (as required when doing MSE in a worker).
As a future improvements, we could make the MediaPlayerPrivateWebM run on
a different thread than the main thread to allow for smoother startup time.
All renderer's callback are now called on the renderer's workqueue, as such
all AudioVideoRenderer's users must be modified to ensure that the callback
is then dispatched on the right thread.
No change in observable behaviour. Covered by existing tests.
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::MediaPlayerPrivateMediaSourceAVFObjC):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::load): Move initialisation of
AudioVideoRenderer from constructor to load() to avoid constructing a WeakPtr
while in the constructor.
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::setCurrentTimeDidChangeCallback):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::bufferedChanged):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::performTaskAtTime):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::startVideoFrameMetadataGathering):
* Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm:
(WebCore::MediaPlayerPrivateWebM::MediaPlayerPrivateWebM):
(WebCore::MediaPlayerPrivateWebM::load): Set the renderer's callback outside
the constructor to avoid constructing a WeakPtr in the constructor which causes
a crash.
(WebCore::MediaPlayerPrivateWebM::setDuration):
(WebCore::MediaPlayerPrivateWebM::notifyClientWhenReadyForMoreSamples):
(WebCore::MediaPlayerPrivateWebM::trackDidChangeEnabled):
(WebCore::MediaPlayerPrivateWebM::startVideoFrameMetadataGathering):
* Source/WebKit/GPUProcess/media/RemoteAudioVideoRendererProxyManager.cpp:
(WebKit::RemoteAudioVideoRendererProxyManager::seekTo): Ensure that we send a
state update once seek completes
so that the currentTime reported in the web content process is always up to
date.
* Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.cpp:
(WebKit::AudioVideoRendererRemote::~AudioVideoRendererRemote):
(WebKit::AudioVideoRendererRemote::setVolume):
(WebKit::AudioVideoRendererRemote::setMuted):
(WebKit::AudioVideoRendererRemote::setPreservesPitchAndCorrectionAlgorithm):
(WebKit::AudioVideoRendererRemote::setOutputDeviceId):
(WebKit::AudioVideoRendererRemote::setIsVisible):
(WebKit::AudioVideoRendererRemote::setPresentationSize):
(WebKit::AudioVideoRendererRemote::setShouldMaintainAspectRatio):
(WebKit::AudioVideoRendererRemote::renderingCanBeAcceleratedChanged):
(WebKit::AudioVideoRendererRemote::contentBoxRectChanged):
(WebKit::AudioVideoRendererRemote::notifyFirstFrameAvailable):
(WebKit::AudioVideoRendererRemote::notifyWhenHasAvailableVideoFrame):
(WebKit::AudioVideoRendererRemote::notifyWhenRequiresFlushToResume):
(WebKit::AudioVideoRendererRemote::notifyRenderingModeChanged):
(WebKit::AudioVideoRendererRemote::expectMinimumUpcomingPresentationTime):
(WebKit::AudioVideoRendererRemote::notifySizeChanged):
(WebKit::AudioVideoRendererRemote::setShouldDisableHDR):
(WebKit::AudioVideoRendererRemote::setPlatformDynamicRangeLimit):
(WebKit::AudioVideoRendererRemote::setResourceOwner):
(WebKit::AudioVideoRendererRemote::flushAndRemoveImage):
(WebKit::AudioVideoRendererRemote::currentVideoFrame const):
(WebKit::AudioVideoRendererRemote::videoPlaybackQualityMetrics):
(WebKit::AudioVideoRendererRemote::platformVideoLayer const):
(WebKit::AudioVideoRendererRemote::setVideoFullscreenLayer):
(WebKit::AudioVideoRendererRemote::setVideoFullscreenFrame):
(WebKit::AudioVideoRendererRemote::isInFullscreenOrPictureInPictureChanged):
(WebKit::AudioVideoRendererRemote::play):
(WebKit::AudioVideoRendererRemote::pause):
(WebKit::AudioVideoRendererRemote::paused const):
(WebKit::AudioVideoRendererRemote::setRate):
(WebKit::AudioVideoRendererRemote::effectiveRate const):
(WebKit::AudioVideoRendererRemote::stall):
(WebKit::AudioVideoRendererRemote::prepareToSeek):
(WebKit::AudioVideoRendererRemote::seekTo):
(WebKit::AudioVideoRendererRemote::seeking const):
(WebKit::AudioVideoRendererRemote::setPreferences):
(WebKit::AudioVideoRendererRemote::setHasProtectedVideoContent):
(WebKit::AudioVideoRendererRemote::addTrack):
(WebKit::AudioVideoRendererRemote::removeTrack):
(WebKit::AudioVideoRendererRemote::enqueueSample):
(WebKit::AudioVideoRendererRemote::isReadyForMoreSamples):
(WebKit::AudioVideoRendererRemote::requestMediaDataWhenReady):
(WebKit::AudioVideoRendererRemote::stopRequestingMediaData):
(WebKit::AudioVideoRendererRemote::notifyTrackNeedsReenqueuing):
(WebKit::AudioVideoRendererRemote::timeIsProgressing const):
(WebKit::AudioVideoRendererRemote::notifyEffectiveRateChanged):
(WebKit::AudioVideoRendererRemote::currentTime const):
(WebKit::AudioVideoRendererRemote::notifyTimeReachedAndStall):
(WebKit::AudioVideoRendererRemote::cancelTimeReachedAction):
(WebKit::AudioVideoRendererRemote::performTaskAtTime):
(WebKit::AudioVideoRendererRemote::flush):
(WebKit::AudioVideoRendererRemote::flushTrack):
(WebKit::AudioVideoRendererRemote::applicationWillResignActive):
(WebKit::AudioVideoRendererRemote::notifyWhenErrorOccurs):
(WebKit::AudioVideoRendererRemote::setSpatialTrackingInfo):
(WebKit::AudioVideoRendererRemote::ensureOnDispatcherSync):
(WebKit::AudioVideoRendererRemote::ensureOnDispatcher):
(WebKit::AudioVideoRendererRemote::ensureOnDispatcherWithConnection): Add
utility method to simplify the dispatch the task on the right workqueue.
(WebKit::AudioVideoRendererRemote::updateCacheState):
(WebKit::AudioVideoRendererRemote::readyForMoreData):
(WebKit::AudioVideoRendererRemote::requestHostingContext):
(WebKit::AudioVideoRendererRemote::hostingContext const):
(WebKit::AudioVideoRendererRemote::setLayerHostingContext):
(WebKit::AudioVideoRendererRemote::inVideoFullscreenOrPictureInPicture const):
(WebKit::AudioVideoRendererRemote::naturalSize const):
(WebKit::AudioVideoRendererRemote::setCDMInstance):
(WebKit::AudioVideoRendererRemote::setInitData):
(WebKit::AudioVideoRendererRemote::attemptToDecrypt):
(WebKit::AudioVideoRendererRemote::setCDMSession):
(WebKit::AudioVideoRendererRemote::videoLayerSize const):
(WebKit::AudioVideoRendererRemote::setVideoLayerSizeFenced):
(WebKit::AudioVideoRendererRemote::notifyVideoLayerSizeChanged):
(WebKit::AudioVideoRendererRemote::gpuProcessConnectionDidClose):
(WebKit::AudioVideoRendererRemote::MessageReceiver::firstFrameAvailable):
(WebKit::AudioVideoRendererRemote::MessageReceiver::hasAvailableVideoFrame):
(WebKit::AudioVideoRendererRemote::MessageReceiver::requiresFlushToResume):
(WebKit::AudioVideoRendererRemote::MessageReceiver::renderingModeChanged):
(WebKit::AudioVideoRendererRemote::MessageReceiver::sizeChanged):
(WebKit::AudioVideoRendererRemote::MessageReceiver::trackNeedsReenqueuing):
(WebKit::AudioVideoRendererRemote::MessageReceiver::effectiveRateChanged):
(WebKit::AudioVideoRendererRemote::MessageReceiver::stallTimeReached):
(WebKit::AudioVideoRendererRemote::MessageReceiver::taskTimeReached):
(WebKit::AudioVideoRendererRemote::MessageReceiver::errorOccurred):
(WebKit::AudioVideoRendererRemote::MessageReceiver::requestMediaDataWhenReady):
(WebKit::AudioVideoRendererRemote::MessageReceiver::stateUpdate):
(WebKit::AudioVideoRendererRemote::MessageReceiver::layerHostingContextChanged):
* Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.h:
Canonical link: https://commits.webkit.org/302657@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications