Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: a828526141568b22502568378e54a53f77fe85ef
https://github.com/WebKit/WebKit/commit/a828526141568b22502568378e54a53f77fe85ef
Author: Jean-Yves Avenard <[email protected]>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
R LayoutTests/media/media-source/media-source-fudge-factor-expected.txt
R LayoutTests/media/media-source/media-source-fudge-factor.html
A LayoutTests/media/media-source/media-source-gap-policy-expected.txt
A LayoutTests/media/media-source/media-source-gap-policy.html
M Source/WebCore/Modules/mediasource/MediaSource.cpp
M Source/WebCore/Modules/mediasource/MediaSource.h
M Source/WebCore/platform/graphics/MediaSourcePrivate.cpp
M Source/WebCore/platform/graphics/MediaSourcePrivate.h
M Source/WebCore/platform/graphics/PlatformTimeRanges.cpp
M Source/WebCore/platform/graphics/PlatformTimeRanges.h
M Source/WebCore/platform/graphics/SourceBufferPrivate.cpp
M Source/WebCore/platform/graphics/SourceBufferPrivate.h
M Source/WebCore/platform/graphics/TrackBuffer.cpp
M Source/WebCore/platform/graphics/TrackBuffer.h
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm
M
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h
M
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm
M Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm
Log Message:
-----------
[MSE] Loosen gap tolerance during playback and seek
https://bugs.webkit.org/show_bug.cgi?id=317681
rdar://180439090
Reviewed by Jer Noble.
MediaSourcePrivate now owns a single gap policy consulted at every
buffered-range boundary. Three tolerances replace the prior fixed
timeFudgeFactor:
- Start-of-stream allowance: 1s. Per MSE 2 §presentation-start-time:
"implementations MAY choose to allow a current playback position at
or after presentation start time and before the first TimeRanges to
play the first TimeRanges if that TimeRanges starts within a
reasonably short time, like 1 second, after presentation start time".
Applied only when time is before ranges.start(0). HTMLMediaElement.
buffered reported to JS is unchanged.
- Mid-stream gap tolerance: 125 ms. Default tolerance for gaps between
buffered sub-ranges.
- Audio-covered gap tolerance: 250 ms. Widened tolerance when an active
audio track covers the gap position (typical video-only gap with
audio continuous through it).
setTimeFudgeFactor IPC and MediaSource::currentTimeFudgeFactor removed.
* LayoutTests/media/media-source/media-source-fudge-factor-expected.txt:
Removed.
* LayoutTests/media/media-source/media-source-fudge-factor.html: Removed.
* LayoutTests/media/media-source/media-source-gap-policy-expected.txt: Added.
* LayoutTests/media/media-source/media-source-gap-policy.html: Added.
* LayoutTests/media/media-source/media-source-video-renders.html:
* Source/WebCore/Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::setPrivateAndOpen):
(WebCore::MediaSource::currentTimeFudgeFactor): Deleted.
* Source/WebCore/Modules/mediasource/MediaSource.h:
* Source/WebCore/platform/graphics/MediaSourcePrivate.cpp:
(WebCore::MediaSourcePrivate::hasFutureTime const):
(WebCore::MediaSourcePrivate::hasBufferedTime const):
(WebCore::MediaSourcePrivate::hasCurrentTime const):
(WebCore::MediaSourcePrivate::isBuffered const):
(WebCore::MediaSourcePrivate::cancelPendingWaitForTarget):
(WebCore::MediaSourcePrivate::updateBufferedRanges):
(WebCore::MediaSourcePrivate::nextStallTime const):
(WebCore::MediaSourcePrivate::gapToleranceAtTime const): returns the applicable
tolerance for time,
consulted by hasFutureTime, hasBufferedTime, isBuffered, nextStallTime,
canCompleteWaitForTarget, and TrackBuffer's enqueue gap check.
(WebCore::MediaSourcePrivate::isWithinStartGapAllowance const):
* Source/WebCore/platform/graphics/MediaSourcePrivate.h:
* Source/WebCore/platform/graphics/PlatformTimeRanges.cpp:
(WebCore::PlatformTimeRanges::containWithEpsilon const): overload so
that isBuffered can apply a per-position tolerance at each gap.
* Source/WebCore/platform/graphics/PlatformTimeRanges.h:
* Source/WebCore/platform/graphics/SourceBufferPrivate.cpp:
(WebCore::SourceBufferPrivate::reenqueueMediaForTime):
(WebCore::SourceBufferPrivate::addTrackBuffer):
(WebCore::SourceBufferPrivate::isAudioBufferedAt const):
(WebCore::SourceBufferPrivate::audioBufferedRanges const):
* Source/WebCore/platform/graphics/SourceBufferPrivate.h:
(WebCore::SourceBufferPrivate::timeFudgeFactor const): Deleted.
* Source/WebCore/platform/graphics/TrackBuffer.cpp:
(WebCore::TrackBuffer::create):
(WebCore::TrackBuffer::TrackBuffer):
(WebCore::TrackBuffer::isAcceptableEnqueueGap const):
(WebCore::TrackBuffer::nextSample):
(WebCore::TrackBuffer::reenqueueMediaForTime):
* Source/WebCore/platform/graphics/TrackBuffer.h:
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::resetStallForTime): Move
nextStallTime(time)
logic to MediaSourcePrivate.
*
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h:
*
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
(WebCore::SourceBufferPrivateAVFObjC::timeFudgeFactor const): Deleted.
* Source/WebCore/platform/graphics/cocoa/MediaPlayerPrivateWebM.mm:
(WebCore::MediaPlayerPrivateWebM::reenqueueMediaForTime):
(WebCore::MediaPlayerPrivateWebM::addTrackBuffer):
(WebCore::MediaPlayerPrivateWebM::monitorReadyState):
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.cpp:
(WebKit::RemoteMediaSourceProxy::setTimeFudgeFactor): Deleted.
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.h:
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.messages.in:
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
(WebKit::MediaPlayerPrivateRemote::currentTimeWithLockHeld const):
* Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.cpp:
(WebKit::MediaSourcePrivateRemote::setTimeFudgeFactor): Deleted.
* Source/WebKit/WebProcess/GPU/media/MediaSourcePrivateRemote.h:
Canonical link: https://commits.webkit.org/316146@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications