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

Reply via email to