Deprecate ActiveDOMObject::canSuspendForDocumentSuspension()
[WebKit-https.git] / Source / WebCore / Modules / mediasource / SourceBuffer.h
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  * Copyright (C) 2013-2017 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 "ExceptionOr.h"
40 #include "GenericEventQueue.h"
41 #include "SourceBufferPrivateClient.h"
42 #include "TextTrack.h"
43 #include "Timer.h"
44 #include "VideoTrack.h"
45 #include <wtf/LoggerHelper.h>
46
47 namespace WebCore {
48
49 class AudioTrackList;
50 class BufferSource;
51 class MediaSource;
52 class PlatformTimeRanges;
53 class SourceBufferPrivate;
54 class TextTrackList;
55 class TimeRanges;
56 class VideoTrackList;
57
58 class SourceBuffer final
59     : public RefCounted<SourceBuffer>
60     , public ActiveDOMObject
61     , public EventTargetWithInlineData
62     , private SourceBufferPrivateClient
63     , private AudioTrackClient
64     , private VideoTrackClient
65     , private TextTrackClient
66 #if !RELEASE_LOG_DISABLED
67     , private LoggerHelper
68 #endif
69 {
70     WTF_MAKE_ISO_ALLOCATED(SourceBuffer);
71 public:
72     static Ref<SourceBuffer> create(Ref<SourceBufferPrivate>&&, MediaSource*);
73     virtual ~SourceBuffer();
74
75     bool updating() const { return m_updating; }
76     ExceptionOr<Ref<TimeRanges>> buffered() const;
77     double timestampOffset() const;
78     ExceptionOr<void> setTimestampOffset(double);
79
80 #if ENABLE(VIDEO_TRACK)
81     VideoTrackList& videoTracks();
82     VideoTrackList* videoTracksIfExists() const { return m_videoTracks.get(); }
83     AudioTrackList& audioTracks();
84     AudioTrackList* audioTracksIfExists() const { return m_audioTracks.get(); }
85     TextTrackList& textTracks();
86     TextTrackList* textTracksIfExists() const { return m_textTracks.get(); }
87 #endif
88
89     double appendWindowStart() const;
90     ExceptionOr<void> setAppendWindowStart(double);
91     double appendWindowEnd() const;
92     ExceptionOr<void> setAppendWindowEnd(double);
93
94     ExceptionOr<void> appendBuffer(const BufferSource&);
95     ExceptionOr<void> abort();
96     ExceptionOr<void> remove(double start, double end);
97     ExceptionOr<void> remove(const MediaTime&, const MediaTime&);
98     ExceptionOr<void> changeType(const String&);
99
100     const TimeRanges& bufferedInternal() const { ASSERT(m_buffered); return *m_buffered; }
101
102     void abortIfUpdating();
103     void removedFromMediaSource();
104     void seekToTime(const MediaTime&);
105
106     bool canPlayThroughRange(PlatformTimeRanges&);
107
108     bool hasVideo() const;
109
110     bool active() const { return m_active; }
111
112     ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
113
114     using RefCounted::ref;
115     using RefCounted::deref;
116
117     struct TrackBuffer;
118
119     Document& document() const;
120
121     enum class AppendMode { Segments, Sequence };
122     AppendMode mode() const { return m_mode; }
123     ExceptionOr<void> setMode(AppendMode);
124
125     void setShouldGenerateTimestamps(bool flag) { m_shouldGenerateTimestamps = flag; }
126
127     bool isBufferedDirty() const { return m_bufferedDirty; }
128     void setBufferedDirty(bool flag) { m_bufferedDirty = flag; }
129
130     MediaTime highestPresentationTimestamp() const;
131     void readyStateChanged();
132
133     bool hasPendingActivity() const final;
134
135     void trySignalAllSamplesEnqueued();
136
137 #if !RELEASE_LOG_DISABLED
138     const Logger& logger() const final { return m_logger.get(); }
139     const void* logIdentifier() const final { return m_logIdentifier; }
140     const char* logClassName() const final { return "SourceBuffer"; }
141     WTFLogChannel& logChannel() const final;
142 #endif
143
144 private:
145     SourceBuffer(Ref<SourceBufferPrivate>&&, MediaSource*);
146
147     void refEventTarget() final { ref(); }
148     void derefEventTarget() final { deref(); }
149
150     void stop() final;
151     const char* activeDOMObjectName() const final;
152
153     void sourceBufferPrivateDidReceiveInitializationSegment(const InitializationSegment&) final;
154     void sourceBufferPrivateDidReceiveSample(MediaSample&) final;
155     bool sourceBufferPrivateHasAudio() const final;
156     bool sourceBufferPrivateHasVideo() const final;
157     void sourceBufferPrivateReenqueSamples(const AtomString& trackID) final;
158     void sourceBufferPrivateDidBecomeReadyForMoreSamples(const AtomString& trackID) final;
159     MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold) final;
160     void sourceBufferPrivateAppendComplete(AppendResult) final;
161     void sourceBufferPrivateDidReceiveRenderingError(int errorCode) final;
162
163     void audioTrackEnabledChanged(AudioTrack&) final;
164     void videoTrackSelectedChanged(VideoTrack&) final;
165
166     void textTrackKindChanged(TextTrack&) final;
167     void textTrackModeChanged(TextTrack&) final;
168     void textTrackAddCues(TextTrack&, const TextTrackCueList&) final;
169     void textTrackRemoveCues(TextTrack&, const TextTrackCueList&) final;
170     void textTrackAddCue(TextTrack&, TextTrackCue&) final;
171     void textTrackRemoveCue(TextTrack&, TextTrackCue&) final;
172
173     EventTargetInterface eventTargetInterface() const final { return SourceBufferEventTargetInterfaceType; }
174
175     bool isRemoved() const;
176     void scheduleEvent(const AtomString& eventName);
177
178     ExceptionOr<void> appendBufferInternal(const unsigned char*, unsigned);
179     void appendBufferTimerFired();
180     void resetParserState();
181
182     void setActive(bool);
183
184     bool validateInitializationSegment(const InitializationSegment&);
185
186     void reenqueueMediaForTime(TrackBuffer&, const AtomString& trackID, const MediaTime&);
187     void provideMediaData(TrackBuffer&, const AtomString& 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     void updateBufferedFromTrackBuffers();
201     void updateMinimumUpcomingPresentationTime(TrackBuffer&, const AtomString& trackID);
202     void resetMinimumUpcomingPresentationTime(TrackBuffer&, const AtomString& trackID);
203
204     void appendError(bool);
205
206     bool hasAudio() const;
207
208     void rangeRemoval(const MediaTime&, const MediaTime&);
209
210     void trySignalAllSamplesInTrackEnqueued(const AtomString&);
211
212     friend class Internals;
213     WEBCORE_EXPORT Vector<String> bufferedSamplesForTrackID(const AtomString&);
214     WEBCORE_EXPORT Vector<String> enqueuedSamplesForTrackID(const AtomString&);
215     WEBCORE_EXPORT MediaTime minimumUpcomingPresentationTimeForTrackID(const AtomString&);
216     WEBCORE_EXPORT void setMaximumQueueDepthForTrackID(const AtomString&, size_t);
217
218     Ref<SourceBufferPrivate> m_private;
219     MediaSource* m_source;
220     UniqueRef<MainThreadGenericEventQueue> m_asyncEventQueue;
221     AppendMode m_mode { AppendMode::Segments };
222
223     Vector<unsigned char> m_pendingAppendData;
224     Timer m_appendBufferTimer;
225
226     RefPtr<VideoTrackList> m_videoTracks;
227     RefPtr<AudioTrackList> m_audioTracks;
228     RefPtr<TextTrackList> m_textTracks;
229
230     Vector<AtomString> m_videoCodecs;
231     Vector<AtomString> m_audioCodecs;
232     Vector<AtomString> m_textCodecs;
233
234     MediaTime m_timestampOffset;
235     MediaTime m_appendWindowStart;
236     MediaTime m_appendWindowEnd;
237
238     MediaTime m_groupStartTimestamp;
239     MediaTime m_groupEndTimestamp;
240
241     HashMap<AtomString, TrackBuffer> m_trackBufferMap;
242     RefPtr<TimeRanges> m_buffered;
243     bool m_bufferedDirty { true };
244
245     enum AppendStateType { WaitingForSegment, ParsingInitSegment, ParsingMediaSegment };
246     AppendStateType m_appendState;
247
248     MonotonicTime m_timeOfBufferingMonitor;
249     double m_bufferedSinceLastMonitor { 0 };
250     double m_averageBufferRate { 0 };
251
252     size_t m_reportedExtraMemoryCost { 0 };
253
254     MediaTime m_pendingRemoveStart;
255     MediaTime m_pendingRemoveEnd;
256     Timer m_removeTimer;
257
258 #if !RELEASE_LOG_DISABLED
259     Ref<const Logger> m_logger;
260     const void* m_logIdentifier;
261 #endif
262
263     bool m_updating { false };
264     bool m_receivedFirstInitializationSegment { false };
265     bool m_active { false };
266     bool m_bufferFull { false };
267     bool m_shouldGenerateTimestamps { false };
268     bool m_pendingInitializationSegmentForChangeType { false };
269 };
270
271 } // namespace WebCore
272
273 #endif