[webkit-changes] [WebKit/WebKit] 174634: media/media-source/media-managedmse-memorypressure...

Jean-Yves Avenard noreply at github.com
Fri Mar 17 11:50:39 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 174634df51d32a92ba9e7af449f5283338f705ab
      https://github.com/WebKit/WebKit/commit/174634df51d32a92ba9e7af449f5283338f705ab
  Author: Jean-Yves Avenard <jya at apple.com>
  Date:   2023-03-17 (Fri, 17 Mar 2023)

  Changed paths:
    M Source/WebCore/Modules/mediasource/ManagedMediaSource.cpp
    M Source/WebCore/Modules/mediasource/MediaSource.cpp
    M Source/WebCore/Modules/mediasource/MediaSource.h
    M Source/WebCore/Modules/mediasource/SourceBuffer.cpp
    M Source/WebCore/Modules/mediasource/SourceBuffer.h
    M Source/WebCore/platform/graphics/MediaSourcePrivate.h
    M Source/WebCore/platform/graphics/MediaSourcePrivateClient.h
    M Source/WebCore/platform/graphics/SourceBufferPrivate.cpp
    M Source/WebCore/platform/graphics/SourceBufferPrivate.h
    M Source/WebCore/platform/graphics/SourceBufferPrivateClient.h
    M Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.cpp
    M Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.h
    M Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.messages.in
    M Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp
    M Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.h
    M Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.messages.in
    M Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.cpp
    M Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.h
    M Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp
    M Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h
    M Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in

  Log Message:
  -----------
  media/media-source/media-managedmse-memorypressure-inactive.html is flaky.
https://bugs.webkit.org/show_bug.cgi?id=253560
rdar://106416033

Reviewed by Jer Noble.

The test exposed an underlying problem related to how we notified the
SourceBuffer that its buffered attribute was "dirty".
When the SourceBufferPrivate modified its buffered range, it would signal
the SourceBufferPrivateClient (here the SourceBuffer) that the buffered
range became dirty and needed to be recalculated.
However, in WK2 and if the GPU process is enabled, the SourceBufferClient
is a RemoteSourceBufferProxy: the new buffered range
wasn't actually sent back to the content process, only that it became dirty.
If we attempted to read the SourceBuffer's buffered attribute (operation
happening in the content process) then we could return the stale old value.
This would be particularly problematic during the Prepare Append algorithm
(https://w3c.github.io/media-source/#sourcebuffer-prepare-append) where
eviction could occur: the buffered attribute if read then would be the
wrong value and not indicating that an eviction occurred.
As this code is excercised via MockMediaSource which never runs in the
GPU Process, this issue wasn't identified earlier (will be handled in webkit.org/b/253884).

Notifying the SourceBufferPrivate became dirty was an unnecessary operation
- There are limited cases during which the source buffer's buffered attribute can
  change:
    - during the prepare append algorithm
    - after an append operation
    - after a remove operation
    - if ManagedSourceBuffer, after a memory pressure signal.

We only have to update the buffered range at the completion of those
operations, and ensure that we always return an up to date value.
MediaSource.buffered is modified to only calculate the HTMLMediaElement
buffered attribute when it is read.

* Source/WebCore/Modules/mediasource/ManagedMediaSource.cpp:
(WebCore::ManagedMediaSource::isBuffered const):
* Source/WebCore/Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::buffered):
(WebCore::MediaSource::onReadyStateChange):
(WebCore::MediaSource::updateBufferedIfNeeded):
(WebCore::MediaSource::buffered const): Deleted.
(WebCore::MediaSource::sourceBufferDidChangeBufferedDirty): Deleted.
* Source/WebCore/Modules/mediasource/MediaSource.h:
* Source/WebCore/Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::sourceBufferPrivateBufferedChanged):
(WebCore::SourceBuffer::sourceBufferPrivateBufferedDirtyChanged): Deleted.
* Source/WebCore/Modules/mediasource/SourceBuffer.h:
* Source/WebCore/platform/graphics/MediaSourcePrivate.h:
(WebCore::MediaSourcePrivate::bufferedChanged): Deleted.
* Source/WebCore/platform/graphics/MediaSourcePrivateClient.h:
* Source/WebCore/platform/graphics/SourceBufferPrivate.cpp:
(WebCore::SourceBufferPrivate::setBufferedRanges): Use move semantics.
(WebCore::SourceBufferPrivate::updateBufferedFromTrackBuffers):
(WebCore::SourceBufferPrivate::clearTrackBuffers):
(WebCore::SourceBufferPrivate::removeCodedFrames):
(WebCore::SourceBufferPrivate::didReceiveSample):
(WebCore::SourceBufferPrivate::memoryPressure):
(WebCore::SourceBufferPrivate::setBufferedDirty): Deleted.
* Source/WebCore/platform/graphics/SourceBufferPrivate.h:
* Source/WebCore/platform/graphics/SourceBufferPrivateClient.h:
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.cpp:
(WebKit::RemoteMediaSourceProxy::buffered):
(WebKit::RemoteMediaSourceProxy::buffered const): Deleted.
(WebKit::RemoteMediaSourceProxy::bufferedChanged): Deleted.
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.h:
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.messages.in:
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp:
(WebKit::RemoteSourceBufferProxy::evictCodedFrames): Return updated buffered range.
(WebKit::RemoteSourceBufferProxy::sourceBufferPrivateBufferedDirtyChanged): Deleted.
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.h:
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.messages.in: Return updated buffered range.
* Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.cpp:
(WebKit::MediaSourcePrivateRemote::bufferedChanged): Deleted.
* Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.h:
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp:
(WebKit::SourceBufferPrivateRemote::evictCodedFrames):
(WebKit::SourceBufferPrivateRemote::updateBufferedFromTrackBuffers):
(WebKit::SourceBufferPrivateRemote::removeCodedFrames):
(WebKit::SourceBufferPrivateRemote::sourceBufferPrivateAppendComplete):
(WebKit::SourceBufferPrivateRemote::memoryPressure):
(WebKit::SourceBufferPrivateRemote::sourceBufferPrivateBufferedDirtyChanged): Deleted.
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h:
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in:

Canonical link: https://commits.webkit.org/261801@main




More information about the webkit-changes mailing list