diff options
Diffstat (limited to 'Source/WebCore/Modules/mediasource/SourceBuffer.h')
-rw-r--r-- | Source/WebCore/Modules/mediasource/SourceBuffer.h | 198 |
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 |