Next batch of conversions to use C++ enum class instead of strings for enumerations
[WebKit-https.git] / Source / WebCore / Modules / mediasource / SourceBuffer.h
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  * Copyright (C) 2013-2014 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #pragma once
33
34 #if ENABLE(MEDIA_SOURCE)
35
36 #include "ActiveDOMObject.h"
37 #include "AudioTrack.h"
38 #include "EventTarget.h"
39 #include "ExceptionCode.h"
40 #include "GenericEventQueue.h"
41 #include "ScriptWrappable.h"
42 #include "SourceBufferPrivateClient.h"
43 #include "TextTrack.h"
44 #include "Timer.h"
45 #include "VideoTrack.h"
46 #include <runtime/ArrayBufferView.h>
47 #include <wtf/PassRefPtr.h>
48 #include <wtf/RefCounted.h>
49 #include <wtf/text/WTFString.h>
50
51 namespace WebCore {
52
53 class AudioTrackList;
54 class MediaSource;
55 class PlatformTimeRanges;
56 class SourceBufferPrivate;
57 class TextTrackList;
58 class TimeRanges;
59 class VideoTrackList;
60
61 enum class EndOfStreamError;
62
63 enum class AppendMode { Segments, Sequence };
64
65 class SourceBuffer final : public RefCounted<SourceBuffer>, public ActiveDOMObject, public EventTargetWithInlineData, public SourceBufferPrivateClient, public AudioTrackClient, public VideoTrackClient, public TextTrackClient {
66 public:
67     static Ref<SourceBuffer> create(Ref<SourceBufferPrivate>&&, MediaSource*);
68
69     virtual ~SourceBuffer();
70
71     // SourceBuffer.idl methods
72     bool updating() const { return m_updating; }
73     PassRefPtr<TimeRanges> buffered(ExceptionCode&) const;
74     const RefPtr<TimeRanges>& buffered() const;
75     double timestampOffset() const;
76     void setTimestampOffset(double, ExceptionCode&);
77
78 #if ENABLE(VIDEO_TRACK)
79     VideoTrackList* videoTracks();
80     AudioTrackList* audioTracks();
81     TextTrackList* textTracks();
82 #endif
83
84     double appendWindowStart() const;
85     void setAppendWindowStart(double, ExceptionCode&);
86     double appendWindowEnd() const;
87     void setAppendWindowEnd(double, ExceptionCode&);
88
89     void appendBuffer(ArrayBuffer&, ExceptionCode&);
90     void appendBuffer(ArrayBufferView*, ExceptionCode&);
91     void abort(ExceptionCode&);
92     void remove(double start, double end, ExceptionCode&);
93     void remove(const MediaTime&, const MediaTime&, ExceptionCode&);
94
95     void appendError(bool);
96     void abortIfUpdating();
97     void removedFromMediaSource();
98     void seekToTime(const MediaTime&);
99
100     bool hasCurrentTime() const;
101     bool hasFutureTime() const;
102     bool canPlayThrough();
103
104     bool hasVideo() const;
105     bool hasAudio() const;
106
107     bool active() const { return m_active; }
108
109     // EventTarget interface
110     ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
111     EventTargetInterface eventTargetInterface() const override { return SourceBufferEventTargetInterfaceType; }
112
113     using RefCounted<SourceBuffer>::ref;
114     using RefCounted<SourceBuffer>::deref;
115
116     struct TrackBuffer;
117
118     Document& document() const;
119
120     AppendMode mode() const { return m_mode; }
121     void setMode(AppendMode, ExceptionCode&);
122
123     bool shouldGenerateTimestamps() const { return m_shouldGenerateTimestamps; }
124     void setShouldGenerateTimestamps(bool flag) { m_shouldGenerateTimestamps = flag; }
125
126     void rangeRemoval(const MediaTime&, const MediaTime&);
127
128     bool isBufferedDirty() const { return m_bufferedDirty; }
129     void setBufferedDirty(bool flag) { m_bufferedDirty = flag; }
130
131     // ActiveDOMObject API.
132     bool hasPendingActivity() const override;
133
134 protected:
135     // EventTarget interface
136     void refEventTarget() override { ref(); }
137     void derefEventTarget() override { deref(); }
138
139 private:
140     SourceBuffer(Ref<SourceBufferPrivate>&&, MediaSource*);
141
142     // ActiveDOMObject API.
143     void stop() override;
144     const char* activeDOMObjectName() const override;
145     bool canSuspendForDocumentSuspension() const override;
146
147     // SourceBufferPrivateClient
148     void sourceBufferPrivateDidReceiveInitializationSegment(SourceBufferPrivate*, const InitializationSegment&) override;
149     void sourceBufferPrivateDidReceiveSample(SourceBufferPrivate*, PassRefPtr<MediaSample>) override;
150     bool sourceBufferPrivateHasAudio(const SourceBufferPrivate*) const override;
151     bool sourceBufferPrivateHasVideo(const SourceBufferPrivate*) const override;
152     void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*, AtomicString trackID) override;
153     MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold) override;
154     void sourceBufferPrivateAppendComplete(SourceBufferPrivate*, AppendResult) override;
155     void sourceBufferPrivateDidReceiveRenderingError(SourceBufferPrivate*, int errorCode) override;
156
157     // AudioTrackClient
158     void audioTrackEnabledChanged(AudioTrack*) override;
159
160     // VideoTrackClient
161     void videoTrackSelectedChanged(VideoTrack*) override;
162
163     // TextTrackClient
164     void textTrackKindChanged(TextTrack*) override;
165     void textTrackModeChanged(TextTrack*) override;
166     void textTrackAddCues(TextTrack*, const TextTrackCueList*) override;
167     void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) override;
168     void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
169     void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
170
171     bool isRemoved() const;
172     void scheduleEvent(const AtomicString& eventName);
173
174     void appendBufferInternal(unsigned char*, unsigned, ExceptionCode&);
175     void appendBufferTimerFired();
176     void resetParserState();
177
178     void setActive(bool);
179
180     bool validateInitializationSegment(const InitializationSegment&);
181
182     void reenqueueMediaForTime(TrackBuffer&, AtomicString trackID, const MediaTime&);
183     void provideMediaData(TrackBuffer&, AtomicString trackID);
184     void didDropSample();
185     void evictCodedFrames(size_t newDataSize);
186     size_t maximumBufferSize() const;
187
188     void monitorBufferingRate();
189
190     void removeTimerFired();
191     void removeCodedFrames(const MediaTime& start, const MediaTime& end);
192
193     size_t extraMemoryCost() const;
194     void reportExtraMemoryAllocated();
195
196     std::unique_ptr<PlatformTimeRanges> bufferedAccountingForEndOfStream() const;
197
198     // Internals
199     friend class Internals;
200     WEBCORE_EXPORT Vector<String> bufferedSamplesForTrackID(const AtomicString&);
201
202     Ref<SourceBufferPrivate> m_private;
203     MediaSource* m_source;
204     GenericEventQueue m_asyncEventQueue;
205     AppendMode m_mode { AppendMode::Segments };
206
207     Vector<unsigned char> m_pendingAppendData;
208     Timer m_appendBufferTimer;
209
210     RefPtr<VideoTrackList> m_videoTracks;
211     RefPtr<AudioTrackList> m_audioTracks;
212     RefPtr<TextTrackList> m_textTracks;
213
214     Vector<AtomicString> m_videoCodecs;
215     Vector<AtomicString> m_audioCodecs;
216     Vector<AtomicString> m_textCodecs;
217
218     MediaTime m_timestampOffset;
219     MediaTime m_appendWindowStart;
220     MediaTime m_appendWindowEnd;
221
222     MediaTime m_groupStartTimestamp;
223     MediaTime m_groupEndTimestamp;
224
225     HashMap<AtomicString, TrackBuffer> m_trackBufferMap;
226     RefPtr<TimeRanges> m_buffered;
227     bool m_bufferedDirty { true };
228
229     enum AppendStateType { WaitingForSegment, ParsingInitSegment, ParsingMediaSegment };
230     AppendStateType m_appendState;
231
232     double m_timeOfBufferingMonitor;
233     double m_bufferedSinceLastMonitor { 0 };
234     double m_averageBufferRate { 0 };
235
236     size_t m_reportedExtraMemoryCost { 0 };
237
238     MediaTime m_pendingRemoveStart;
239     MediaTime m_pendingRemoveEnd;
240     Timer m_removeTimer;
241
242     bool m_updating { false };
243     bool m_receivedFirstInitializationSegment { false };
244     bool m_active { false };
245     bool m_bufferFull { false };
246     bool m_shouldGenerateTimestamps { false };
247 };
248
249 } // namespace WebCore
250
251 #endif