summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/mediasource/SourceBuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/Modules/mediasource/SourceBuffer.h')
-rw-r--r--Source/WebCore/Modules/mediasource/SourceBuffer.h198
1 files changed, 126 insertions, 72 deletions
diff --git a/Source/WebCore/Modules/mediasource/SourceBuffer.h b/Source/WebCore/Modules/mediasource/SourceBuffer.h
index 163405045..5a142d4ca 100644
--- a/Source/WebCore/Modules/mediasource/SourceBuffer.h
+++ b/Source/WebCore/Modules/mediasource/SourceBuffer.h
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2013 Google Inc. All rights reserved.
+ * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -28,130 +29,167 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef SourceBuffer_h
-#define SourceBuffer_h
+#pragma once
#if ENABLE(MEDIA_SOURCE)
#include "ActiveDOMObject.h"
#include "AudioTrack.h"
#include "EventTarget.h"
-#include "ExceptionCode.h"
+#include "ExceptionOr.h"
#include "GenericEventQueue.h"
-#include "ScriptWrappable.h"
#include "SourceBufferPrivateClient.h"
#include "TextTrack.h"
#include "Timer.h"
#include "VideoTrack.h"
-#include <runtime/ArrayBufferView.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefCounted.h>
-#include <wtf/text/WTFString.h>
namespace WebCore {
class AudioTrackList;
+class BufferSource;
class MediaSource;
+class PlatformTimeRanges;
class SourceBufferPrivate;
class TextTrackList;
class TimeRanges;
class VideoTrackList;
-class SourceBuffer final : public RefCounted<SourceBuffer>, public ActiveDOMObject, public EventTargetWithInlineData, public ScriptWrappable, public SourceBufferPrivateClient, public AudioTrackClient, public VideoTrackClient, public TextTrackClient {
+class SourceBuffer final : public RefCounted<SourceBuffer>, public ActiveDOMObject, public EventTargetWithInlineData, private SourceBufferPrivateClient, private AudioTrackClient, private VideoTrackClient, private TextTrackClient {
public:
- static PassRef<SourceBuffer> create(PassRef<SourceBufferPrivate>, MediaSource*);
-
+ static Ref<SourceBuffer> create(Ref<SourceBufferPrivate>&&, MediaSource*);
virtual ~SourceBuffer();
- // SourceBuffer.idl methods
bool updating() const { return m_updating; }
- PassRefPtr<TimeRanges> buffered(ExceptionCode&) const;
- const RefPtr<TimeRanges>& buffered() const;
+ ExceptionOr<Ref<TimeRanges>> buffered() const;
double timestampOffset() const;
- void setTimestampOffset(double, ExceptionCode&);
- void appendBuffer(PassRefPtr<ArrayBuffer> data, ExceptionCode&);
- void appendBuffer(PassRefPtr<ArrayBufferView> data, ExceptionCode&);
- void abort(ExceptionCode&);
+ ExceptionOr<void> setTimestampOffset(double);
+
+#if ENABLE(VIDEO_TRACK)
+ VideoTrackList& videoTracks();
+ AudioTrackList& audioTracks();
+ TextTrackList& textTracks();
+#endif
+
+ double appendWindowStart() const;
+ ExceptionOr<void> setAppendWindowStart(double);
+ double appendWindowEnd() const;
+ ExceptionOr<void> setAppendWindowEnd(double);
+
+ ExceptionOr<void> appendBuffer(const BufferSource&);
+ ExceptionOr<void> abort();
+ ExceptionOr<void> remove(double start, double end);
+ ExceptionOr<void> remove(const MediaTime&, const MediaTime&);
+
+ const TimeRanges& bufferedInternal() const { ASSERT(m_buffered); return *m_buffered; }
void abortIfUpdating();
void removedFromMediaSource();
- const MediaTime& highestPresentationEndTimestamp() const { return m_highestPresentationEndTimestamp; }
+ void seekToTime(const MediaTime&);
-#if ENABLE(VIDEO_TRACK)
- VideoTrackList* videoTracks();
- AudioTrackList* audioTracks();
- TextTrackList* textTracks();
-#endif
+ bool canPlayThroughRange(PlatformTimeRanges&);
+
+ bool hasVideo() const;
+
+ bool active() const { return m_active; }
+
+ ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
+
+ using RefCounted::ref;
+ using RefCounted::deref;
+
+ struct TrackBuffer;
+
+ Document& document() const;
+
+ enum class AppendMode { Segments, Sequence };
+ AppendMode mode() const { return m_mode; }
+ ExceptionOr<void> setMode(AppendMode);
- // ActiveDOMObject interface
- virtual bool hasPendingActivity() const override;
- virtual void stop() override;
+ void setShouldGenerateTimestamps(bool flag) { m_shouldGenerateTimestamps = flag; }
- // EventTarget interface
- virtual ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
- virtual EventTargetInterface eventTargetInterface() const override { return SourceBufferEventTargetInterfaceType; }
+ bool isBufferedDirty() const { return m_bufferedDirty; }
+ void setBufferedDirty(bool flag) { m_bufferedDirty = flag; }
- using RefCounted<SourceBuffer>::ref;
- using RefCounted<SourceBuffer>::deref;
+ MediaTime highestPresentationTimestamp() const;
+ void readyStateChanged();
-protected:
- // EventTarget interface
- virtual void refEventTarget() override { ref(); }
- virtual void derefEventTarget() override { deref(); }
+ bool hasPendingActivity() const final;
private:
- SourceBuffer(PassRef<SourceBufferPrivate>, MediaSource*);
+ SourceBuffer(Ref<SourceBufferPrivate>&&, MediaSource*);
- // SourceBufferPrivateClient
- virtual void sourceBufferPrivateDidEndStream(SourceBufferPrivate*, const WTF::AtomicString&) override;
- virtual void sourceBufferPrivateDidReceiveInitializationSegment(SourceBufferPrivate*, const InitializationSegment&) override;
- virtual void sourceBufferPrivateDidReceiveSample(SourceBufferPrivate*, PassRefPtr<MediaSample>) override;
- virtual bool sourceBufferPrivateHasAudio(const SourceBufferPrivate*) const override;
- virtual bool sourceBufferPrivateHasVideo(const SourceBufferPrivate*) const override;
- virtual void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*, AtomicString trackID) override;
- virtual void sourceBufferPrivateSeekToTime(SourceBufferPrivate*, const MediaTime&);
- virtual MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold);
+ void refEventTarget() final { ref(); }
+ void derefEventTarget() final { deref(); }
+ void stop() final;
+ const char* activeDOMObjectName() const final;
+ bool canSuspendForDocumentSuspension() const final;
- // AudioTrackClient
- virtual void audioTrackEnabledChanged(AudioTrack*) override;
+ void sourceBufferPrivateDidReceiveInitializationSegment(const InitializationSegment&) final;
+ void sourceBufferPrivateDidReceiveSample(MediaSample&) final;
+ bool sourceBufferPrivateHasAudio() const final;
+ bool sourceBufferPrivateHasVideo() const final;
+ void sourceBufferPrivateDidBecomeReadyForMoreSamples(const AtomicString& trackID) final;
+ MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold) final;
+ void sourceBufferPrivateAppendComplete(AppendResult) final;
+ void sourceBufferPrivateDidReceiveRenderingError(int errorCode) final;
- // VideoTrackClient
- virtual void videoTrackSelectedChanged(VideoTrack*) override;
+ void audioTrackEnabledChanged(AudioTrack&) final;
+ void videoTrackSelectedChanged(VideoTrack&) final;
- // TextTrackClient
- virtual void textTrackKindChanged(TextTrack*) override;
- virtual void textTrackModeChanged(TextTrack*) override;
- virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) override;
- virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) override;
- virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
- virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
+ void textTrackKindChanged(TextTrack&) final;
+ void textTrackModeChanged(TextTrack&) final;
+ void textTrackAddCues(TextTrack&, const TextTrackCueList&) final;
+ void textTrackRemoveCues(TextTrack&, const TextTrackCueList&) final;
+ void textTrackAddCue(TextTrack&, TextTrackCue&) final;
+ void textTrackRemoveCue(TextTrack&, TextTrackCue&) final;
- static const WTF::AtomicString& decodeError();
- static const WTF::AtomicString& networkError();
+ EventTargetInterface eventTargetInterface() const final { return SourceBufferEventTargetInterfaceType; }
bool isRemoved() const;
void scheduleEvent(const AtomicString& eventName);
- void appendBufferInternal(unsigned char*, unsigned, ExceptionCode&);
- void appendBufferTimerFired(Timer<SourceBuffer>&);
+ ExceptionOr<void> appendBufferInternal(const unsigned char*, unsigned);
+ void appendBufferTimerFired();
+ void resetParserState();
void setActive(bool);
bool validateInitializationSegment(const InitializationSegment&);
- struct TrackBuffer;
- void provideMediaData(TrackBuffer&, AtomicString trackID);
+ void reenqueueMediaForTime(TrackBuffer&, const AtomicString& trackID, const MediaTime&);
+ void provideMediaData(TrackBuffer&, const AtomicString& trackID);
void didDropSample();
+ void evictCodedFrames(size_t newDataSize);
+ size_t maximumBufferSize() const;
+
+ void monitorBufferingRate();
+
+ void removeTimerFired();
+ void removeCodedFrames(const MediaTime& start, const MediaTime& end);
+
+ size_t extraMemoryCost() const;
+ void reportExtraMemoryAllocated();
+
+ void updateBufferedFromTrackBuffers();
+
+ void appendError(bool);
+
+ bool hasAudio() const;
+
+ void rangeRemoval(const MediaTime&, const MediaTime&);
- RefPtr<SourceBufferPrivate> m_private;
+ friend class Internals;
+ WEBCORE_EXPORT Vector<String> bufferedSamplesForTrackID(const AtomicString&);
+ WEBCORE_EXPORT Vector<String> enqueuedSamplesForTrackID(const AtomicString&);
+
+ Ref<SourceBufferPrivate> m_private;
MediaSource* m_source;
GenericEventQueue m_asyncEventQueue;
-
- bool m_updating;
+ AppendMode m_mode { AppendMode::Segments };
Vector<unsigned char> m_pendingAppendData;
- Timer<SourceBuffer> m_appendBufferTimer;
+ Timer m_appendBufferTimer;
RefPtr<VideoTrackList> m_videoTracks;
RefPtr<AudioTrackList> m_audioTracks;
@@ -162,20 +200,36 @@ private:
Vector<AtomicString> m_textCodecs;
MediaTime m_timestampOffset;
- MediaTime m_highestPresentationEndTimestamp;
+ MediaTime m_appendWindowStart;
+ MediaTime m_appendWindowEnd;
+
+ MediaTime m_groupStartTimestamp;
+ MediaTime m_groupEndTimestamp;
HashMap<AtomicString, TrackBuffer> m_trackBufferMap;
- bool m_receivedFirstInitializationSegment;
RefPtr<TimeRanges> m_buffered;
- bool m_active;
+ bool m_bufferedDirty { true };
enum AppendStateType { WaitingForSegment, ParsingInitSegment, ParsingMediaSegment };
AppendStateType m_appendState;
+ double m_timeOfBufferingMonitor;
+ double m_bufferedSinceLastMonitor { 0 };
+ double m_averageBufferRate { 0 };
+
+ size_t m_reportedExtraMemoryCost { 0 };
+
+ MediaTime m_pendingRemoveStart;
+ MediaTime m_pendingRemoveEnd;
+ Timer m_removeTimer;
+
+ bool m_updating { false };
+ bool m_receivedFirstInitializationSegment { false };
+ bool m_active { false };
+ bool m_bufferFull { false };
+ bool m_shouldGenerateTimestamps { false };
};
} // namespace WebCore
#endif
-
-#endif