49269ffe2c77f897ee781b3b034daa249ef1627c
[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     // EventTarget interface
110     virtual ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
111     virtual 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     const AtomicString& mode() const { return m_mode; }
121     void setMode(const AtomicString&, 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     // ActiveDOMObject API.
129     bool hasPendingActivity() const override;
130
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     // ActiveDOMObject API.
140     void stop() override;
141     const char* activeDOMObjectName() const override;
142     bool canSuspend() const override;
143
144     // SourceBufferPrivateClient
145     virtual void sourceBufferPrivateDidEndStream(SourceBufferPrivate*, const WTF::AtomicString&) override;
146     virtual void sourceBufferPrivateDidReceiveInitializationSegment(SourceBufferPrivate*, const InitializationSegment&) override;
147     virtual void sourceBufferPrivateDidReceiveSample(SourceBufferPrivate*, PassRefPtr<MediaSample>) override;
148     virtual bool sourceBufferPrivateHasAudio(const SourceBufferPrivate*) const override;
149     virtual bool sourceBufferPrivateHasVideo(const SourceBufferPrivate*) const override;
150     virtual void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*, AtomicString trackID) override;
151     virtual MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold);
152     virtual void sourceBufferPrivateAppendComplete(SourceBufferPrivate*, AppendResult) override;
153     virtual void sourceBufferPrivateDidReceiveRenderingError(SourceBufferPrivate*, int errorCode) override;
154
155     // AudioTrackClient
156     virtual void audioTrackEnabledChanged(AudioTrack*) override;
157
158     // VideoTrackClient
159     virtual void videoTrackSelectedChanged(VideoTrack*) override;
160
161     // TextTrackClient
162     virtual void textTrackKindChanged(TextTrack*) override;
163     virtual void textTrackModeChanged(TextTrack*) override;
164     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) override;
165     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) override;
166     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
167     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
168
169     static const WTF::AtomicString& decodeError();
170     static const WTF::AtomicString& networkError();
171
172     bool isRemoved() const;
173     void scheduleEvent(const AtomicString& eventName);
174
175     void appendBufferInternal(unsigned char*, unsigned, ExceptionCode&);
176     void appendBufferTimerFired();
177     void resetParserState();
178
179     void setActive(bool);
180
181     bool validateInitializationSegment(const InitializationSegment&);
182
183     void reenqueueMediaForTime(TrackBuffer&, AtomicString trackID, const MediaTime&);
184     void provideMediaData(TrackBuffer&, AtomicString trackID);
185     void didDropSample();
186     void evictCodedFrames(size_t newDataSize);
187     size_t maximumBufferSize() const;
188
189     void monitorBufferingRate();
190
191     void removeTimerFired();
192     void removeCodedFrames(const MediaTime& start, const MediaTime& end);
193
194     size_t extraMemoryCost() const;
195     void reportExtraMemoryCost();
196
197     std::unique_ptr<PlatformTimeRanges> bufferedAccountingForEndOfStream() const;
198
199     // Internals
200     friend class Internals;
201     WEBCORE_EXPORT Vector<String> bufferedSamplesForTrackID(const AtomicString&);
202
203     Ref<SourceBufferPrivate> m_private;
204     MediaSource* m_source;
205     GenericEventQueue m_asyncEventQueue;
206     AtomicString m_mode;
207
208     Vector<unsigned char> m_pendingAppendData;
209     Timer m_appendBufferTimer;
210
211     RefPtr<VideoTrackList> m_videoTracks;
212     RefPtr<AudioTrackList> m_audioTracks;
213     RefPtr<TextTrackList> m_textTracks;
214
215     Vector<AtomicString> m_videoCodecs;
216     Vector<AtomicString> m_audioCodecs;
217     Vector<AtomicString> m_textCodecs;
218
219     MediaTime m_timestampOffset;
220     MediaTime m_appendWindowStart;
221     MediaTime m_appendWindowEnd;
222
223     MediaTime m_groupStartTimestamp;
224     MediaTime m_groupEndTimestamp;
225
226     HashMap<AtomicString, TrackBuffer> m_trackBufferMap;
227     RefPtr<TimeRanges> m_buffered;
228
229     enum AppendStateType { WaitingForSegment, ParsingInitSegment, ParsingMediaSegment };
230     AppendStateType m_appendState;
231
232     double m_timeOfBufferingMonitor;
233     double m_bufferedSinceLastMonitor;
234     double m_averageBufferRate;
235
236     size_t m_reportedExtraMemoryCost;
237
238     MediaTime m_pendingRemoveStart;
239     MediaTime m_pendingRemoveEnd;
240     Timer m_removeTimer;
241
242     bool m_updating;
243     bool m_receivedFirstInitializationSegment;
244     bool m_active;
245     bool m_bufferFull;
246     bool m_shouldGenerateTimestamps;
247 };
248
249 } // namespace WebCore
250
251 #endif
252
253 #endif