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