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

Reply via email to