Skip to content

Commit

Permalink
[MSE] Remove need for SourceBufferPrivate to query MediaSource duration
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=265778
rdar://119114938

Reviewed by Youenn Fablet.

We notify each SourceBufferPrivate that the MediaSource duration has changed
and use this cache value instead.

Covered by existing tests, no change in observable behaviour.

* Source/WebCore/Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::MediaSource):
(WebCore::MediaSource::hasFutureTime):
(WebCore::MediaSource::setDurationInternal):
* Source/WebCore/Modules/mediasource/MediaSource.h:
* Source/WebCore/platform/graphics/MediaSourcePrivate.cpp:
(WebCore::MediaSourcePrivate::hasFutureTime const):
We don't need to pass the duration nor the buffered range as the MediaSourcePrivate owns this information anyway.
(WebCore::MediaSourcePrivate::duration const):
(WebCore::MediaSourcePrivate::durationChanged):
* Source/WebCore/platform/graphics/MediaSourcePrivate.h:
* Source/WebCore/platform/graphics/MediaSourcePrivateClient.h:
* Source/WebCore/platform/graphics/SourceBufferPrivate.cpp:
(WebCore::SourceBufferPrivate::mediaSourceDuration const):
Rename duration() to mediaSourceDuration() to remove ambiguity as to which duration this is related to.
(WebCore::SourceBufferPrivate::append):
(WebCore::SourceBufferPrivate::duration const): Deleted.
* Source/WebCore/platform/graphics/SourceBufferPrivate.h:
(WebCore::SourceBufferPrivate::setMediaSourceDuration):
* Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::currentMediaTimeMayProgress const):
* Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
(WebCore::MediaSourcePrivateAVFObjC::durationChanged):
* Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::MediaPlayerPrivateGStreamerMSE::load):
(WebCore::MediaPlayerPrivateGStreamerMSE::doSeek):
(WebCore::MediaPlayerPrivateGStreamerMSE::buffered const):
(WebCore::MediaPlayerPrivateGStreamerMSE::sourceSetup):
(WebCore::MediaPlayerPrivateGStreamerMSE::isTimeBuffered const):
(WebCore::MediaPlayerPrivateGStreamerMSE::durationChanged):
* Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h: remove need to keep reference to MediaSourcePrivateClient,
it was an API violation for the MediaPlayerPrivate to talk to the MediaSourcePrivateClient, this interface is reserved for the MediaSourcePrivate to talk to the MediaSource.
The MediaPlayerPrivateGStreamerMSE already contains a strong reference to the MediaSourcePrivate so we query it directly instead.
(The MediaSourcePrivateClient would have queried its private anyway)
(WebCore::MediaPlayerPrivateGStreamerMSE::mediaSourcePrivateClient): Deleted.
* Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp:
(WebCore::MockMediaPlayerMediaSource::currentMediaTimeMayProgress const):
* Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:
(WebCore::MockMediaSourcePrivate::durationChanged):
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.cpp:
(WebKit::RemoteMediaSourceProxy::durationChanged):
(WebKit::RemoteMediaSourceProxy::duration const): Deleted.
* Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.h:

Canonical link: https://commits.webkit.org/271514@main
  • Loading branch information
jyavenard committed Dec 4, 2023
1 parent c7b9248 commit adb77f8
Show file tree
Hide file tree
Showing 16 changed files with 48 additions and 65 deletions.
19 changes: 5 additions & 14 deletions Source/WebCore/Modules/mediasource/MediaSource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ MediaSource::MediaSource(ScriptExecutionContext& context)
: ActiveDOMObject(&context)
, m_sourceBuffers(SourceBufferList::create(scriptExecutionContext()))
, m_activeSourceBuffers(SourceBufferList::create(scriptExecutionContext()))
, m_duration(MediaTime::invalidTime())
#if !RELEASE_LOG_DISABLED
, m_logger(downcast<Document>(context).logger())
#endif
Expand Down Expand Up @@ -388,10 +387,7 @@ bool MediaSource::hasFutureTime()
if (isClosed())
return false;

MediaTime currentTime = this->currentTime();
MediaTime duration = this->duration();

return m_private->hasFutureTime(currentTime, duration, m_buffered);
return m_private->hasFutureTime(currentTime());
}

void MediaSource::monitorSourceBuffers()
Expand Down Expand Up @@ -500,13 +496,11 @@ ExceptionOr<void> MediaSource::setDuration(double duration)
return setDurationInternal(MediaTime::createWithDouble(duration));
}

ExceptionOr<void> MediaSource::setDurationInternal(const MediaTime& duration)
ExceptionOr<void> MediaSource::setDurationInternal(const MediaTime& newDuration)
{
// 2.4.6 Duration Change
// https://www.w3.org/TR/2016/REC-media-source-20161117/#duration-change-algorithm

MediaTime newDuration = duration;

// 1. If the current value of duration is equal to new duration, then return.
if (newDuration == m_duration)
return { };
Expand All @@ -527,15 +521,12 @@ ExceptionOr<void> MediaSource::setDurationInternal(const MediaTime& duration)

// 4. If new duration is less than highest end time, then
// 4.1. Update new duration to equal highest end time.
if (highestEndTime.isValid() && newDuration < highestEndTime)
newDuration = highestEndTime;

// 5. Update duration to new duration.
m_duration = newDuration;
ALWAYS_LOG(LOGIDENTIFIER, newDuration);
m_duration = highestEndTime.isValid() && newDuration < highestEndTime ? highestEndTime : newDuration;
ALWAYS_LOG(LOGIDENTIFIER, m_duration);

// 6. Update the media duration to new duration and run the HTMLMediaElement duration change algorithm.
m_private->durationChanged(newDuration);
m_private->durationChanged(m_duration);

// Changing the duration affects the buffered range.
monitorSourceBuffers();
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/Modules/mediasource/MediaSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,11 @@ class MediaSource
bool isClosed() const;
bool isEnded() const;
void sourceBufferDidChangeActiveState(SourceBuffer&, bool);
MediaTime duration() const;

enum class EndOfStreamError { Network, Decode };
void streamEndedWithError(std::optional<EndOfStreamError>);

MediaTime duration() const final;
const PlatformTimeRanges& buffered() const final;

bool attachToElement(HTMLMediaElement&);
Expand Down Expand Up @@ -186,7 +186,7 @@ class MediaSource
PlatformTimeRanges m_buffered;
PlatformTimeRanges m_liveSeekable;
WeakPtr<HTMLMediaElement, WeakPtrImplWithEventTargetData> m_mediaElement;
MediaTime m_duration;
MediaTime m_duration { MediaTime::invalidTime() };
std::optional<SeekTarget> m_pendingSeekTarget;
std::optional<MediaTimePromise::Producer> m_seekTargetPromise;
ReadyState m_readyState { ReadyState::Closed };
Expand Down
18 changes: 12 additions & 6 deletions Source/WebCore/platform/graphics/MediaSourcePrivate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@

namespace WebCore {

bool MediaSourcePrivate::hasFutureTime(const MediaTime& currentTime, const MediaTime& duration, const PlatformTimeRanges& ranges) const
bool MediaSourcePrivate::hasFutureTime(const MediaTime& currentTime) const
{
if (currentTime > duration)
if (currentTime >= duration())
return false;

auto& ranges = buffered();
MediaTime nearest = ranges.nearest(currentTime);
if (abs(nearest - currentTime) > timeFudgeFactor())
return false;
Expand All @@ -48,7 +49,7 @@ bool MediaSourcePrivate::hasFutureTime(const MediaTime& currentTime, const Media
return false;

MediaTime localEnd = ranges.end(found);
if (localEnd == duration)
if (localEnd == duration())
return true;

return localEnd - currentTime > timeFudgeFactor();
Expand All @@ -68,9 +69,7 @@ RefPtr<MediaSourcePrivateClient> MediaSourcePrivate::client() const

MediaTime MediaSourcePrivate::duration() const
{
if (RefPtr client = this->client())
return client->duration();
return MediaTime::invalidTime();
return m_duration;
}

const PlatformTimeRanges& MediaSourcePrivate::buffered() const
Expand Down Expand Up @@ -136,6 +135,13 @@ bool MediaSourcePrivate::hasVideo() const
});
}

void MediaSourcePrivate::durationChanged(const MediaTime& duration)
{
m_duration = duration;
for (auto& sourceBuffer : m_sourceBuffers)
sourceBuffer->setMediaSourceDuration(duration);
}

#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
void MediaSourcePrivate::setCDMSession(LegacyCDMSession* session)
{
Expand Down
5 changes: 3 additions & 2 deletions Source/WebCore/platform/graphics/MediaSourcePrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class WEBCORE_EXPORT MediaSourcePrivate
virtual void removeSourceBuffer(SourceBufferPrivate&);
void sourceBufferPrivateDidChangeActiveState(SourceBufferPrivate&, bool active);
virtual void notifyActiveSourceBuffersChanged() = 0;
virtual void durationChanged(const MediaTime&) = 0;
virtual void durationChanged(const MediaTime&);
virtual void bufferedChanged(const PlatformTimeRanges&) { }

virtual void markEndOfStream(EndOfStreamStatus) { m_isEnded = true; }
Expand All @@ -95,7 +95,7 @@ class WEBCORE_EXPORT MediaSourcePrivate
MediaTime duration() const;
const PlatformTimeRanges& buffered() const;

bool hasFutureTime(const MediaTime& currentTime, const MediaTime& duration, const PlatformTimeRanges&) const;
bool hasFutureTime(const MediaTime& currentTime) const;
bool hasAudio() const;
bool hasVideo() const;

Expand All @@ -109,6 +109,7 @@ class WEBCORE_EXPORT MediaSourcePrivate
bool m_isEnded { false };

private:
MediaTime m_duration { MediaTime::invalidTime() };
MediaTime m_timeFudgeFactor;
ThreadSafeWeakPtr<MediaSourcePrivateClient> m_client;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ class MediaSourcePrivateClient : public ThreadSafeRefCountedAndCanMakeThreadSafe
virtual ~MediaSourcePrivateClient() = default;

virtual void setPrivateAndOpen(Ref<MediaSourcePrivate>&&) = 0;
virtual MediaTime duration() const = 0;
virtual const PlatformTimeRanges& buffered() const = 0;
virtual Ref<MediaTimePromise> waitForTarget(const SeekTarget&) = 0;
virtual Ref<MediaPromise> seekToTime(const MediaTime&) = 0;
Expand Down
8 changes: 3 additions & 5 deletions Source/WebCore/platform/graphics/SourceBufferPrivate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,9 @@ MediaTime SourceBufferPrivate::currentMediaTime() const
return { };
}

MediaTime SourceBufferPrivate::duration() const
MediaTime SourceBufferPrivate::mediaSourceDuration() const
{
if (RefPtr mediaSource = m_mediaSource.get())
return mediaSource->duration();
return { };
return m_mediaSourceDuration;
}

void SourceBufferPrivate::resetTimestampOffsetInTrackBuffers()
Expand Down Expand Up @@ -718,7 +716,7 @@ Ref<MediaPromise> SourceBufferPrivate::append(Ref<SharedBuffer>&& buffer)

Vector<Ref<MediaPromise>> promises;
promises.append(updateBufferedFromTrackBuffers(trackBuffers));
if (m_groupEndTimestamp > duration()) {
if (m_groupEndTimestamp > mediaSourceDuration()) {
// https://w3c.github.io/media-source/#sourcebuffer-coded-frame-processing
// 5. If the media segment contains data beyond the current duration, then run the duration change algorithm with new
// duration set to the maximum of the current duration and the group end timestamp.
Expand Down
6 changes: 5 additions & 1 deletion Source/WebCore/platform/graphics/SourceBufferPrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ class SourceBufferPrivate
virtual void setTimestampOffset(const MediaTime& timestampOffset) { m_timestampOffset = timestampOffset; }
virtual void setAppendWindowStart(const MediaTime& appendWindowStart) { m_appendWindowStart = appendWindowStart;}
virtual void setAppendWindowEnd(const MediaTime& appendWindowEnd) { m_appendWindowEnd = appendWindowEnd; }

using ComputeSeekPromise = MediaTimePromise;
WEBCORE_EXPORT virtual Ref<ComputeSeekPromise> computeSeekTime(const SeekTarget&);
WEBCORE_EXPORT virtual void seekToTime(const MediaTime&);
Expand All @@ -126,6 +127,8 @@ class SourceBufferPrivate
WEBCORE_EXPORT void setClient(SourceBufferPrivateClient&);
WEBCORE_EXPORT void detach();

void setMediaSourceDuration(const MediaTime& duration) { m_mediaSourceDuration = duration; }

const PlatformTimeRanges& buffered() const { return m_buffered; }

bool isBufferFullFor(uint64_t requiredSize, uint64_t maximumBufferSize);
Expand Down Expand Up @@ -168,7 +171,7 @@ class SourceBufferPrivate
WEBCORE_EXPORT Ref<MediaPromise> updateBufferedFromTrackBuffers(const Vector<PlatformTimeRanges>&);

MediaTime currentMediaTime() const;
MediaTime duration() const;
MediaTime mediaSourceDuration() const;

using InitializationSegment = SourceBufferPrivateClient::InitializationSegment;
WEBCORE_EXPORT void didReceiveInitializationSegment(InitializationSegment&&);
Expand Down Expand Up @@ -252,6 +255,7 @@ class SourceBufferPrivate
MediaTime m_appendWindowStart { MediaTime::zeroTime() };
MediaTime m_appendWindowEnd { MediaTime::positiveInfiniteTime() };
MediaTime m_highestPresentationTimestamp;
MediaTime m_mediaSourceDuration { MediaTime::invalidTime() };

MediaTime m_groupStartTimestamp { MediaTime::invalidTime() };
MediaTime m_groupEndTimestamp { MediaTime::zeroTime() };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ void getSupportedTypes(HashSet<String>& types) const final

bool MediaPlayerPrivateMediaSourceAVFObjC::currentMediaTimeMayProgress() const
{
return m_mediaSourcePrivate ? m_mediaSourcePrivate->hasFutureTime(currentMediaTime(), durationMediaTime(), buffered()) : false;
return m_mediaSourcePrivate ? m_mediaSourcePrivate->hasFutureTime(currentMediaTime()) : false;
}

MediaTime MediaPlayerPrivateMediaSourceAVFObjC::clampTimeToLastSeekTime(const MediaTime& time) const
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,9 @@
player->notifyActiveSourceBuffersChanged();
}

void MediaSourcePrivateAVFObjC::durationChanged(const MediaTime&)
void MediaSourcePrivateAVFObjC::durationChanged(const MediaTime& duration)
{
MediaSourcePrivate::durationChanged(duration);
if (auto* player = this->player())
player->durationChanged();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,7 @@ void MediaPlayerPrivateGStreamerMSE::load(const URL& url, const ContentType&, Me
{
auto mseBlobURI = makeString("mediasource", url.string().isEmpty() ? "blob://"_s : url.string());
GST_DEBUG("Loading %s", mseBlobURI.ascii().data());
m_mediaSource = mediaSource;

m_mediaSourcePrivate = MediaSourcePrivateGStreamer::open(*m_mediaSource.get(), *this);
m_mediaSourcePrivate = MediaSourcePrivateGStreamer::open(mediaSource, *this);

MediaPlayerPrivateGStreamer::load(mseBlobURI);
}
Expand Down Expand Up @@ -197,15 +195,14 @@ bool MediaPlayerPrivateGStreamerMSE::doSeek(const SeekTarget& target, float rate
// Notify MediaSource and have new frames enqueued (when they're available).
// Seek should only continue once the seekToTarget completionhandler has run.
// This will also add support for fastSeek once done (see webkit.org/b/260607)
RefPtr mediaSource = m_mediaSource.get();
if (!mediaSource)
if (!m_mediaSourcePrivate)
return false;
mediaSource->waitForTarget(target)->whenSettled(RunLoop::current(), [this, weakThis = WeakPtr { *this }](auto&& result) {
m_mediaSourcePrivate->waitForTarget(target)->whenSettled(RunLoop::current(), [this, weakThis = WeakPtr { *this }](auto&& result) {
if (!weakThis || !result)
return;

if (RefPtr mediaSource = m_mediaSource.get())
mediaSource->seekToTime(*result);
if (m_mediaSourcePrivate)
m_mediaSourcePrivate->seekToTime(*result);

auto player = m_player.get();
if (player && !player->isVideoPlayer() && m_audioSink) {
Expand Down Expand Up @@ -303,8 +300,8 @@ void MediaPlayerPrivateGStreamerMSE::didPreroll()

const PlatformTimeRanges& MediaPlayerPrivateGStreamerMSE::buffered() const
{
if (RefPtr mediaSource = m_mediaSource.get())
return mediaSource->buffered();
if (m_mediaSourcePrivate)
return m_mediaSourcePrivate->buffered();
return PlatformTimeRanges::emptyRanges();
}

Expand All @@ -315,7 +312,7 @@ void MediaPlayerPrivateGStreamerMSE::sourceSetup(GstElement* sourceElement)
webKitMediaSrcSetPlayer(WEBKIT_MEDIA_SRC(sourceElement), WeakPtr { *this });
m_source = sourceElement;

if (m_mediaSourcePrivate->hasAllTracks())
if (m_mediaSourcePrivate && m_mediaSourcePrivate->hasAllTracks())
webKitMediaSrcEmitStreams(WEBKIT_MEDIA_SRC(m_source.get()), m_tracks);
}

Expand All @@ -339,8 +336,7 @@ void MediaPlayerPrivateGStreamerMSE::updateStates()
bool MediaPlayerPrivateGStreamerMSE::isTimeBuffered(const MediaTime &time) const
{

RefPtr mediaSource = m_mediaSource.get();
bool result = mediaSource && mediaSource->buffered().contain(time);
bool result = m_mediaSourcePrivate && m_mediaSourcePrivate->buffered().contain(time);
GST_DEBUG("Time %s buffered? %s", toString(time).utf8().data(), boolForPrinting(result));
return result;
}
Expand All @@ -350,8 +346,7 @@ void MediaPlayerPrivateGStreamerMSE::durationChanged()
ASSERT(isMainThread());

MediaTime previousDuration = m_mediaTimeDuration;
RefPtr mediaSource = m_mediaSource.get();
m_mediaTimeDuration = mediaSource ? mediaSource->duration() : MediaTime::invalidTime();
m_mediaTimeDuration = m_mediaSourcePrivate ? m_mediaSourcePrivate->duration() : MediaTime::invalidTime();

GST_TRACE("previous=%s, new=%s", toString(previousDuration).utf8().data(), toString(m_mediaTimeDuration).utf8().data());

Expand Down Expand Up @@ -439,7 +434,7 @@ bool MediaPlayerPrivateGStreamerMSE::currentMediaTimeMayProgress() const
{
if (!m_mediaSourcePrivate)
return false;
return m_mediaSourcePrivate->hasFutureTime(currentMediaTime(), durationMediaTime(), buffered());
return m_mediaSourcePrivate->hasFutureTime(currentMediaTime());
}

void MediaPlayerPrivateGStreamerMSE::notifyActiveSourceBuffersChanged()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,9 @@ class MediaPlayerPrivateGStreamerMSE : public MediaPlayerPrivateGStreamer {
bool isTimeBuffered(const MediaTime&) const;

bool isMediaSource() const override { return true; }
RefPtr<MediaSourcePrivateClient> mediaSourcePrivateClient() { return m_mediaSource.get(); }

void propagateReadyStateToPlayer();

ThreadSafeWeakPtr<MediaSourcePrivateClient> m_mediaSource;
RefPtr<MediaSourcePrivateGStreamer> m_mediaSourcePrivate;
MediaTime m_mediaTimeDuration { MediaTime::invalidTime() };
bool m_isPipelinePlaying = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,11 @@ MediaSourcePrivateGStreamer::AddStatus MediaSourcePrivateGStreamer::addSourceBuf
return MediaSourcePrivateGStreamer::AddStatus::Ok;
}

void MediaSourcePrivateGStreamer::durationChanged(const MediaTime&)
void MediaSourcePrivateGStreamer::durationChanged(const MediaTime& duration)
{
ASSERT(isMainThread());

MediaTime duration = this->duration();
MediaSourcePrivate::durationChanged(duration);
GST_TRACE_OBJECT(m_playerPrivate.pipeline(), "Duration: %" GST_TIME_FORMAT, GST_TIME_ARGS(toGstClockTime(duration)));
if (!duration.isValid() || duration.isNegativeInfinite())
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ MediaTime MockMediaPlayerMediaSource::currentMediaTime() const

bool MockMediaPlayerMediaSource::currentMediaTimeMayProgress() const
{
return m_mediaSourcePrivate && m_mediaSourcePrivate->hasFutureTime(currentMediaTime(), durationMediaTime(), buffered());
return m_mediaSourcePrivate && m_mediaSourcePrivate->hasFutureTime(currentMediaTime());
}

void MockMediaPlayerMediaSource::notifyActiveSourceBuffersChanged()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ MediaSourcePrivate::AddStatus MockMediaSourcePrivate::addSourceBuffer(const Cont

void MockMediaSourcePrivate::durationChanged(const MediaTime& duration)
{
MediaSourcePrivate::durationChanged(duration);
m_player.updateDuration(duration);
}

Expand Down
9 changes: 0 additions & 9 deletions Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,6 @@ void RemoteMediaSourceProxy::setPrivateAndOpen(Ref<MediaSourcePrivate>&& mediaSo
m_private = WTFMove(mediaSourcePrivate);
}

MediaTime RemoteMediaSourceProxy::duration() const
{
return m_duration;
}

const PlatformTimeRanges& RemoteMediaSourceProxy::buffered() const
{
return m_buffered;
Expand Down Expand Up @@ -141,10 +136,6 @@ void RemoteMediaSourceProxy::addSourceBuffer(const WebCore::ContentType& content

void RemoteMediaSourceProxy::durationChanged(const MediaTime& duration)
{
if (m_duration == duration)
return;

m_duration = duration;
if (m_private)
m_private->durationChanged(duration);
}
Expand Down
2 changes: 0 additions & 2 deletions Source/WebKit/GPUProcess/media/RemoteMediaSourceProxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ class RemoteMediaSourceProxy final

// MediaSourcePrivateClient overrides
void setPrivateAndOpen(Ref<WebCore::MediaSourcePrivate>&&) final;
MediaTime duration() const final;
const WebCore::PlatformTimeRanges& buffered() const final;
Ref<WebCore::MediaTimePromise> waitForTarget(const WebCore::SeekTarget&) final;
Ref<WebCore::MediaPromise> seekToTime(const MediaTime&) final;
Expand Down Expand Up @@ -97,7 +96,6 @@ class RemoteMediaSourceProxy final
RefPtr<WebCore::MediaSourcePrivate> m_private;
WeakPtr<RemoteMediaPlayerProxy> m_remoteMediaPlayerProxy;

MediaTime m_duration;
WebCore::PlatformTimeRanges m_buffered;

Vector<RefPtr<RemoteSourceBufferProxy>> m_sourceBuffers;
Expand Down

0 comments on commit adb77f8

Please sign in to comment.