Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: ae8698d30174d73c3c7da72a642fc42b74ad46ae
https://github.com/WebKit/WebKit/commit/ae8698d30174d73c3c7da72a642fc42b74ad46ae
Author: Jean-Yves Avenard <[email protected]>
Date: 2025-11-20 (Thu, 20 Nov 2025)
Changed paths:
M LayoutTests/media/media-source/media-detachablemse-append.html
M LayoutTests/media/media-source/media-source-video-renders.html
M
LayoutTests/media/media-source/media-source-webm-append-buffer-after-abort-expected.txt
M
LayoutTests/media/media-source/media-source-webm-append-buffer-after-abort.html
M Source/WebCore/platform/graphics/MediaPlayerPrivate.h
M Source/WebCore/platform/graphics/MediaSourcePrivate.cpp
M Source/WebCore/platform/graphics/MediaSourcePrivate.h
M Source/WebCore/platform/graphics/avfoundation/AudioVideoRendererAVFObjC.mm
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h
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/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp
M
Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h
M
Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp
M
Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h
M Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp
M Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.h
M Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp
M Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.h
M Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp
M Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.cpp
M Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.h
M Source/WebKit/WebProcess/GPU/media/RemoteMediaPlayerConfiguration.h
Log Message:
-----------
MediaSourcePrivate should be the reference when calculating the MediaPlayer's
readyState
https://bugs.webkit.org/show_bug.cgi?id=302242
rdar://164381937
Reviewed by Andy Estes.
The HTMLMediaElement's readyState is controlled via the MediaSource's monitor
source buffer algorithm.
We have four participants at play:
HTMLMediaElement (main thread)
MediaPlayerPrivate (main thread)
MediaSource (worker)
MediaSourcePrivate (dedicated workqueue once webkit.org/b/302054 is completed).
The MediaSource used to call MediaSourcePrivate::setMediaPlayerReadyState
which would in turn call into MediaPlayerPrivate::setReadyState.
This required the MediaPlayerPrivate to provide thread-safe access to
readyState().
A MediaPlayerPrivate is a main-thread only object and shouldn't know about any
others.
So we make the MediaSourcePrivate the reference point for the readyState value
so that the MediaSourcePrivate can act as the multi-thread bridge between
MediaSource and MediaSourcePrivate.
No changes in existing behaviour; covered by existing tests.
* LayoutTests/media/media-source/media-detachablemse-append.html: Intermittent
failures was revealed, we didn't wait for the `sourceended`
event, resulting in different results from time to time. Wait for the event to
be fired being continuing
* LayoutTests/media/media-source/media-source-video-renders.html: Wait for seek
event to be fired, otherwise there's no guarantee the expected frame is showing.
as the operation is asynchronous. Do not log it.
*
LayoutTests/media/media-source/media-source-webm-append-buffer-after-abort-expected.txt:
*
LayoutTests/media/media-source/media-source-webm-append-buffer-after-abort.html:
`updateend` can be fired after `loadeddata` event is fired
* Source/WebCore/platform/graphics/MediaPlayerPrivate.h:
(WebCore::MediaPlayerPrivateInterface::readyStateFromMediaSourceChanged):
* Source/WebCore/platform/graphics/MediaSourcePrivate.cpp:
(WebCore::MediaSourcePrivate::mediaPlayerReadyState const):
(WebCore::MediaSourcePrivate::setMediaPlayerReadyState):
* Source/WebCore/platform/graphics/MediaSourcePrivate.h:
* Source/WebCore/platform/graphics/avfoundation/AudioVideoRendererAVFObjC.mm:
(WebCore::AudioVideoRendererAVFObjC::maybeCompleteSeek): Fly-by fix: the seek
promise wasn't resolved with the currentTime, causing the readyState
to incorrectly changed to HAVE_METADATA instead of HAVE_CURRENT_DATA. This
issue was exposed due to the change of operation orders in this commit.
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h:
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::MediaPlayerPrivateMediaSourceAVFObjC):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::readyState const):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::readyStateFromMediaSourceChanged):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::shouldBePlaying const):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::setReadyState):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::updateStateFromReadyState):
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h:
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
(WebCore::MediaSourcePrivateAVFObjC::setPlayer):
(WebCore::MediaSourcePrivateAVFObjC::mediaPlayerReadyState const): Deleted.
(WebCore::MediaSourcePrivateAVFObjC::setMediaPlayerReadyState): Deleted.
(WebCore::MediaSourcePrivateAVFObjC::hasSelectedVideo const): Deleted. Fly-by
Removed unused method.
*
Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::MediaPlayerPrivateGStreamerMSE::readyStateFromMediaSourceChanged):
(WebCore::MediaPlayerPrivateGStreamerMSE::propagateReadyStateToPlayer):
(WebCore::MediaPlayerPrivateGStreamerMSE::setReadyState): Deleted.
*
Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h:
*
Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp:
(WebCore::MediaSourcePrivateGStreamer::mediaPlayerReadyState const): Deleted.
(WebCore::MediaSourcePrivateGStreamer::setMediaPlayerReadyState): Deleted.
* Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h:
* Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp:
(WebCore::MockMediaPlayerMediaSource::readyState const):
(WebCore::MockMediaPlayerMediaSource::readyStateFromMediaSourceChanged):
(WebCore::MockMediaPlayerMediaSource::setReadyState): Deleted.
* Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.h:
* Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:
(WebCore::MockMediaSourcePrivate::mediaPlayerReadyState const): Deleted.
(WebCore::MockMediaSourcePrivate::setMediaPlayerReadyState): Deleted.
* Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.h:
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp: Replace all
instances of `if (auto player = m_player.get())` with `if (RefPtr player =
m_player.get())`
(WebKit::MediaPlayerPrivateRemote::load):
(WebKit::MediaPlayerPrivateRemote::networkStateChanged):
(WebKit::MediaPlayerPrivateRemote::setReadyState):
(WebKit::MediaPlayerPrivateRemote::volumeChanged):
(WebKit::MediaPlayerPrivateRemote::muteChanged):
(WebKit::MediaPlayerPrivateRemote::seeked):
(WebKit::MediaPlayerPrivateRemote::timeChanged):
(WebKit::MediaPlayerPrivateRemote::durationChanged):
(WebKit::MediaPlayerPrivateRemote::rateChanged):
(WebKit::MediaPlayerPrivateRemote::playbackStateChanged):
(WebKit::MediaPlayerPrivateRemote::engineFailedToLoad):
(WebKit::MediaPlayerPrivateRemote::characteristicChanged):
(WebKit::MediaPlayerPrivateRemote::sizeChanged):
(WebKit::MediaPlayerPrivateRemote::currentTimeChanged):
(WebKit::MediaPlayerPrivateRemote::firstVideoFrameAvailable):
(WebKit::MediaPlayerPrivateRemote::renderingModeChanged):
(WebKit::MediaPlayerPrivateRemote::acceleratedRenderingStateChanged):
(WebKit::MediaPlayerPrivateRemote::addRemoteAudioTrack):
(WebKit::MediaPlayerPrivateRemote::removeRemoteAudioTrack):
(WebKit::MediaPlayerPrivateRemote::addRemoteTextTrack):
(WebKit::MediaPlayerPrivateRemote::removeRemoteTextTrack):
(WebKit::MediaPlayerPrivateRemote::addRemoteVideoTrack):
(WebKit::MediaPlayerPrivateRemote::removeRemoteVideoTrack):
(WebKit::MediaPlayerPrivateRemote::currentPlaybackTargetIsWirelessChanged):
(WebKit::MediaPlayerPrivateRemote::mediaPlayerKeyNeeded):
(WebKit::MediaPlayerPrivateRemote::waitingForKeyChanged):
(WebKit::MediaPlayerPrivateRemote::initializationDataEncountered):
(WebKit::MediaPlayerPrivateRemote::reportGPUMemoryFootprint):
(WebKit::MediaPlayerPrivateRemote::resourceNotSupported):
(WebKit::MediaPlayerPrivateRemote::activeSourceBuffersChanged):
(WebKit::MediaPlayerPrivateRemote::getRawCookies const):
* Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.cpp:
(WebKit::MediaSourcePrivateRemote::mediaPlayerReadyState const): Deleted.
* Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.h:
* Source/WebKit/WebProcess/GPU/media/RemoteMediaPlayerConfiguration.h:
Initialize the default identifier with a nullString
as it could cause crash in logging should we attempt to log a media operation
before the RemoteMediaPlayerProxy has returned
with a new value.
Canonical link: https://commits.webkit.org/303379@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications