Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 2e95a76cf633a08aff0df1a41f05cbdaa186f6f0
      
https://github.com/WebKit/WebKit/commit/2e95a76cf633a08aff0df1a41f05cbdaa186f6f0
  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/302690@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to