Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: c55cda1034c1186dcc545119f1e5f108b86a5159
      
https://github.com/WebKit/WebKit/commit/c55cda1034c1186dcc545119f1e5f108b86a5159
  Author: Enrique Ocaña González <[email protected]>
  Date:   2024-01-08 (Mon, 08 Jan 2024)

  Changed paths:
    M 
LayoutTests/media/media-source/media-managedmse-resume-after-stall-expected.txt
    M LayoutTests/media/media-source/media-managedmse-resume-after-stall.html
    M 
LayoutTests/media/media-source/media-source-monitor-playing-event-expected.txt
    M LayoutTests/media/media-source/media-source-monitor-playing-event.html
    M Source/WebCore/Modules/mediasource/SourceBuffer.cpp
    M Source/WebCore/Modules/mediasource/SourceBuffer.h
    M Source/WebCore/platform/graphics/SourceBufferPrivate.cpp
    M Source/WebCore/platform/graphics/SourceBufferPrivateClient.h
    M Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp
    M Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.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:
  -----------
  [MSE] Change canPlayThroughRange to check buffered data at the current 
position https://bugs.webkit.org/show_bug.cgi?id=265023

Reviewed by Xabier Rodriguez-Calvar.

The current SourceBuffer::canPlayThroughRange() implementation is based on 
average buffering
rate. While this approach makes sense in a context of continuous playback, 
where the JS app
is always trying to append data, this isn't always the case in some real life 
apps. For
instance, an app may append a lot of data on page load (enough for sustained 
playback), then
decide to wait for whatever reason, and then start playback. In those 
circumstances, wait
would cause the average buffering rate to be artificially low. There are more 
examples of
the kind of problems that a time-based/average buffering rate-based approach 
may cause.

See: https://github.com/WebPlatformForEmbedded/WPEWebKit/issues/928

This patch uses the Firefox strategy to this problem[1]: if the ranges to be 
checked have 3
seconds or more buffered after the current position, we consider that sustained 
playback is
possible. This solves the issues seen in some real world apps.

All the logic to monitor and compute the buffering rate has been removed, 
because it would
have remained unused after this change.

Based on code from Arnaud Vrac <[email protected]> and Jean-Yves Avenard 
<[email protected]>.

[1] 
https://github.com/mozilla/gecko-dev/blob/master/dom/media/mediasource/MediaSourceDecoder.cpp#L320

* 
LayoutTests/media/media-source/media-source-monitor-playing-event-expected.txt: 
Changed expectation after second append to be HAVE_CURRENT_DATA instead of 
HAVE_ENOUGH_DATA because the current playback implementation in 
MockMediaPlayerMediaSource advances playback to the end of the buffered range, 
so there's no 3s buffered slack after that (needed to get enough data).
* LayoutTests/media/media-source/media-source-monitor-playing-event.html: Added 
some clarification comments. Coalesce multiple 'waiting' events, since they're 
time dependant and can change between platforms.
* 
LayoutTests/media/media-source/media-managedmse-resume-after-stall-expected.txt:
 Changed expectation to conform to 3s + 3s buffered segments.
* LayoutTests/media/media-source/media-managedmse-resume-after-stall.html: 
Buffer a minimum of 3s (3 segments) instead of 2, because 3s is the new limit 
to reach canPlayThrough.
* Source/WebCore/Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::appendBuffer): Remove call to monitorBufferingRate().
(WebCore::SourceBuffer::sourceBufferPrivateAppendComplete): Ditto.
(WebCore::SourceBuffer::canPlayThroughRange): Removed implementation based on 
m_averageBufferRate. Now return true if the ranges have at least 3 seconds of 
data after currentTime (with a special case that accounts for the end of the 
video). Use a tolerance to prevent small errors.
(WebCore::SourceBuffer::sourceBufferPrivateDidParseSample): Deleted.
(WebCore::SourceBuffer::monitorBufferingRate): Deleted.
* Source/WebCore/Modules/mediasource/SourceBuffer.h: Deleted 
sourceBufferPrivateDidParseSample() and monitorBufferingRate().
* Source/WebCore/platform/graphics/SourceBufferPrivate.cpp:
(WebCore::SourceBufferPrivate::processMediaSample): Remove call to 
sourceBufferPrivateDidParseSample(). Added comment about the tolerance being 
the same as in SourceBuffer::canPlayThroughRange().
* Source/WebCore/platform/graphics/SourceBufferPrivateClient.h: Deleted 
sourceBufferPrivateDidParseSample().
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp:
(WebKit::RemoteSourceBufferProxy::sourceBufferPrivateDidParseSample): Deleted.
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.h: Deleted 
sourceBufferPrivateDidParseSample().
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp:
(WebKit::SourceBufferPrivateRemote::sourceBufferPrivateDidParseSample): Deleted.
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h: Deleted 
sourceBufferPrivateDidParseSample().
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in: 
Deleted sourceBufferPrivateDidParseSample message.

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


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to