#ifndef SourceBuffer_h
#define SourceBuffer_h
#if ENABLE(MEDIA_SOURCE)
#include "ActiveDOMObject.h"
#include "AudioTrack.h"
#include "EventTarget.h"
#include "ExceptionCode.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 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 {
public:
static Ref<SourceBuffer> create(Ref<SourceBufferPrivate>&&, MediaSource*);
static const AtomicString& segmentsKeyword();
static const AtomicString& sequenceKeyword();
virtual ~SourceBuffer();
bool updating() const { return m_updating; }
PassRefPtr<TimeRanges> buffered(ExceptionCode&) const;
const RefPtr<TimeRanges>& buffered() const;
double timestampOffset() const;
void setTimestampOffset(double, ExceptionCode&);
#if ENABLE(VIDEO_TRACK)
VideoTrackList* videoTracks();
AudioTrackList* audioTracks();
TextTrackList* textTracks();
#endif
double appendWindowStart() const;
void setAppendWindowStart(double, ExceptionCode&);
double appendWindowEnd() const;
void setAppendWindowEnd(double, ExceptionCode&);
void appendBuffer(PassRefPtr<ArrayBuffer> data, ExceptionCode&);
void appendBuffer(PassRefPtr<ArrayBufferView> data, ExceptionCode&);
void abort(ExceptionCode&);
void remove(double start, double end, ExceptionCode&);
void remove(const MediaTime&, const MediaTime&, ExceptionCode&);
void appendError(bool);
void abortIfUpdating();
void removedFromMediaSource();
void seekToTime(const MediaTime&);
bool hasCurrentTime() const;
bool hasFutureTime() const;
bool canPlayThrough();
bool hasVideo() const;
bool hasAudio() const;
bool active() const { return m_active; }
virtual ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
virtual EventTargetInterface eventTargetInterface() const override { return SourceBufferEventTargetInterfaceType; }
using RefCounted<SourceBuffer>::ref;
using RefCounted<SourceBuffer>::deref;
struct TrackBuffer;
Document& document() const;
const AtomicString& mode() const { return m_mode; }
void setMode(const AtomicString&, ExceptionCode&);
bool shouldGenerateTimestamps() const { return m_shouldGenerateTimestamps; }
void setShouldGenerateTimestamps(bool flag) { m_shouldGenerateTimestamps = flag; }
void rangeRemoval(const MediaTime&, const MediaTime&);
bool hasPendingActivity() const override;
protected:
virtual void refEventTarget() override { ref(); }
virtual void derefEventTarget() override { deref(); }
private:
SourceBuffer(Ref<SourceBufferPrivate>&&, MediaSource*);
void stop() override;
const char* activeDOMObjectName() const override;
bool canSuspendForPageCache() const override;
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 MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold) override;
virtual void sourceBufferPrivateAppendComplete(SourceBufferPrivate*, AppendResult) override;
virtual void sourceBufferPrivateDidReceiveRenderingError(SourceBufferPrivate*, int errorCode) override;
virtual void audioTrackEnabledChanged(AudioTrack*) override;
virtual void videoTrackSelectedChanged(VideoTrack*) override;
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;
static const WTF::AtomicString& decodeError();
static const WTF::AtomicString& networkError();
bool isRemoved() const;
void scheduleEvent(const AtomicString& eventName);
void appendBufferInternal(unsigned char*, unsigned, ExceptionCode&);
void appendBufferTimerFired();
void resetParserState();
void setActive(bool);
bool validateInitializationSegment(const InitializationSegment&);
void reenqueueMediaForTime(TrackBuffer&, AtomicString trackID, const MediaTime&);
void provideMediaData(TrackBuffer&, 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();
std::unique_ptr<PlatformTimeRanges> bufferedAccountingForEndOfStream() const;
friend class Internals;
WEBCORE_EXPORT Vector<String> bufferedSamplesForTrackID(const AtomicString&);
Ref<SourceBufferPrivate> m_private;
MediaSource* m_source;
GenericEventQueue m_asyncEventQueue;
AtomicString m_mode;
Vector<unsigned char> m_pendingAppendData;
Timer m_appendBufferTimer;
RefPtr<VideoTrackList> m_videoTracks;
RefPtr<AudioTrackList> m_audioTracks;
RefPtr<TextTrackList> m_textTracks;
Vector<AtomicString> m_videoCodecs;
Vector<AtomicString> m_audioCodecs;
Vector<AtomicString> m_textCodecs;
MediaTime m_timestampOffset;
MediaTime m_appendWindowStart;
MediaTime m_appendWindowEnd;
MediaTime m_groupStartTimestamp;
MediaTime m_groupEndTimestamp;
HashMap<AtomicString, TrackBuffer> m_trackBufferMap;
RefPtr<TimeRanges> m_buffered;
enum AppendStateType { WaitingForSegment, ParsingInitSegment, ParsingMediaSegment };
AppendStateType m_appendState;
double m_timeOfBufferingMonitor;
double m_bufferedSinceLastMonitor;
double m_averageBufferRate;
size_t m_reportedExtraMemoryCost;
MediaTime m_pendingRemoveStart;
MediaTime m_pendingRemoveEnd;
Timer m_removeTimer;
bool m_updating;
bool m_receivedFirstInitializationSegment;
bool m_active;
bool m_bufferFull;
bool m_shouldGenerateTimestamps;
};
}
#endif
#endif