[MSE] Implement Append Error algorithm.
[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 #ifndef SourceBuffer_h
33 #define SourceBuffer_h
34
35 #if ENABLE(MEDIA_SOURCE)
36
37 #include "ActiveDOMObject.h"
38 #include "AudioTrack.h"
39 #include "EventTarget.h"
40 #include "ExceptionCode.h"
41 #include "GenericEventQueue.h"
42 #include "ScriptWrappable.h"
43 #include "SourceBufferPrivateClient.h"
44 #include "TextTrack.h"
45 #include "Timer.h"
46 #include "VideoTrack.h"
47 #include <runtime/ArrayBufferView.h>
48 #include <wtf/PassRefPtr.h>
49 #include <wtf/RefCounted.h>
50 #include <wtf/text/WTFString.h>
51
52 namespace WebCore {
53
54 class AudioTrackList;
55 class MediaSource;
56 class PlatformTimeRanges;
57 class SourceBufferPrivate;
58 class TextTrackList;
59 class TimeRanges;
60 class VideoTrackList;
61
62 class SourceBuffer final : public RefCounted<SourceBuffer>, public ActiveDOMObject, public EventTargetWithInlineData, public ScriptWrappable, public SourceBufferPrivateClient, public AudioTrackClient, public VideoTrackClient, public TextTrackClient {
63 public:
64     static Ref<SourceBuffer> create(Ref<SourceBufferPrivate>&&, MediaSource*);
65
66     static const AtomicString& segmentsKeyword();
67     static const AtomicString& sequenceKeyword();
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(PassRefPtr<ArrayBuffer> data, ExceptionCode&);
90     void appendBuffer(PassRefPtr<ArrayBufferView> data, 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     // ActiveDOMObject interface
110     virtual bool hasPendingActivity() const override;
111     virtual void stop() override;
112
113     // EventTarget interface
114     virtual ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
115     virtual EventTargetInterface eventTargetInterface() const override { return SourceBufferEventTargetInterfaceType; }
116
117     using RefCounted<SourceBuffer>::ref;
118     using RefCounted<SourceBuffer>::deref;
119
120     struct TrackBuffer;
121
122     Document& document() const;
123
124     const AtomicString& mode() const { return m_mode; }
125     void setMode(const AtomicString&, ExceptionCode&);
126
127     bool shouldGenerateTimestamps() const { return m_shouldGenerateTimestamps; }
128     void setShouldGenerateTimestamps(bool flag) { m_shouldGenerateTimestamps = flag; }
129
130     void rangeRemoval(const MediaTime&, const MediaTime&);
131 protected:
132     // EventTarget interface
133     virtual void refEventTarget() override { ref(); }
134     virtual void derefEventTarget() override { deref(); }
135
136 private:
137     SourceBuffer(Ref<SourceBufferPrivate>&&, MediaSource*);
138
139     virtual const char* activeDOMObjectName() const override { return "SourceBuffer"; }
140
141     // SourceBufferPrivateClient
142     virtual void sourceBufferPrivateDidEndStream(SourceBufferPrivate*, const WTF::AtomicString&) override;
143     virtual void sourceBufferPrivateDidReceiveInitializationSegment(SourceBufferPrivate*, const InitializationSegment&) override;
144     virtual void sourceBufferPrivateDidReceiveSample(SourceBufferPrivate*, PassRefPtr<MediaSample>) override;
145     virtual bool sourceBufferPrivateHasAudio(const SourceBufferPrivate*) const override;
146     virtual bool sourceBufferPrivateHasVideo(const SourceBufferPrivate*) const override;
147     virtual void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*, AtomicString trackID) override;
148     virtual MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold);
149     virtual void sourceBufferPrivateAppendComplete(SourceBufferPrivate*, AppendResult) override;
150     virtual void sourceBufferPrivateDidReceiveRenderingError(SourceBufferPrivate*, int errorCode) override;
151
152     // AudioTrackClient
153     virtual void audioTrackEnabledChanged(AudioTrack*) override;
154
155     // VideoTrackClient
156     virtual void videoTrackSelectedChanged(VideoTrack*) override;
157
158     // TextTrackClient
159     virtual void textTrackKindChanged(TextTrack*) override;
160     virtual void textTrackModeChanged(TextTrack*) override;
161     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) override;
162     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) override;
163     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
164     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
165
166     static const WTF::AtomicString& decodeError();
167     static const WTF::AtomicString& networkError();
168
169     bool isRemoved() const;
170     void scheduleEvent(const AtomicString& eventName);
171
172     void appendBufferInternal(unsigned char*, unsigned, ExceptionCode&);
173     void appendBufferTimerFired();
174     void resetParserState();
175
176     void setActive(bool);
177
178     bool validateInitializationSegment(const InitializationSegment&);
179
180     void reenqueueMediaForTime(TrackBuffer&, AtomicString trackID, const MediaTime&);
181     void provideMediaData(TrackBuffer&, AtomicString trackID);
182     void didDropSample();
183     void evictCodedFrames(size_t newDataSize);
184     size_t maximumBufferSize() const;
185
186     void monitorBufferingRate();
187
188     void removeTimerFired();
189     void removeCodedFrames(const MediaTime& start, const MediaTime& end);
190
191     size_t extraMemoryCost() const;
192     void reportExtraMemoryCost();
193
194     std::unique_ptr<PlatformTimeRanges> bufferedAccountingForEndOfStream() const;
195
196     // Internals
197     friend class Internals;
198     WEBCORE_EXPORT Vector<String> bufferedSamplesForTrackID(const AtomicString&);
199
200     Ref<SourceBufferPrivate> m_private;
201     MediaSource* m_source;
202     GenericEventQueue m_asyncEventQueue;
203     AtomicString m_mode;
204
205     Vector<unsigned char> m_pendingAppendData;
206     Timer m_appendBufferTimer;
207
208     RefPtr<VideoTrackList> m_videoTracks;
209     RefPtr<AudioTrackList> m_audioTracks;
210     RefPtr<TextTrackList> m_textTracks;
211
212     Vector<AtomicString> m_videoCodecs;
213     Vector<AtomicString> m_audioCodecs;
214     Vector<AtomicString> m_textCodecs;
215
216     MediaTime m_timestampOffset;
217     MediaTime m_appendWindowStart;
218     MediaTime m_appendWindowEnd;
219
220     MediaTime m_groupStartTimestamp;
221     MediaTime m_groupEndTimestamp;
222
223     HashMap<AtomicString, TrackBuffer> m_trackBufferMap;
224     RefPtr<TimeRanges> m_buffered;
225
226     enum AppendStateType { WaitingForSegment, ParsingInitSegment, ParsingMediaSegment };
227     AppendStateType m_appendState;
228
229     double m_timeOfBufferingMonitor;
230     double m_bufferedSinceLastMonitor;
231     double m_averageBufferRate;
232
233     size_t m_reportedExtraMemoryCost;
234
235     MediaTime m_pendingRemoveStart;
236     MediaTime m_pendingRemoveEnd;
237     Timer m_removeTimer;
238
239     bool m_updating;
240     bool m_receivedFirstInitializationSegment;
241     bool m_active;
242     bool m_bufferFull;
243     bool m_shouldGenerateTimestamps;
244 };
245
246 } // namespace WebCore
247
248 #endif
249
250 #endif