Remove "virtual" from all lines that have both "virtual" and "override".
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / MediaPlayerPrivateAVFoundation.h
1 /*
2  * Copyright (C) 2011-2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef MediaPlayerPrivateAVFoundation_h
27 #define MediaPlayerPrivateAVFoundation_h
28
29 #if ENABLE(VIDEO) && USE(AVFOUNDATION)
30
31 #include "FloatSize.h"
32 #include "InbandTextTrackPrivateAVF.h"
33 #include "MediaPlayerPrivate.h"
34 #include "Timer.h"
35 #include <functional>
36 #include <wtf/HashSet.h>
37 #include <wtf/Lock.h>
38 #include <wtf/RetainPtr.h>
39 #include <wtf/WeakPtr.h>
40
41 namespace WebCore {
42
43 class InbandMetadataTextTrackPrivateAVF;
44 class InbandTextTrackPrivateAVF;
45 class GenericCueData;
46
47 class MediaPlayerPrivateAVFoundation : public MediaPlayerPrivateInterface, public AVFInbandTrackParent
48 {
49 public:
50     virtual void repaint();
51     virtual void metadataLoaded();
52     virtual void playabilityKnown();
53     virtual void rateChanged();
54     virtual void loadedTimeRangesChanged();
55     virtual void seekableTimeRangesChanged();
56     virtual void timeChanged(const MediaTime&);
57     virtual void seekCompleted(bool);
58     virtual void didEnd();
59     virtual void contentsNeedsDisplay() { }
60     virtual void configureInbandTracks();
61     virtual void setCurrentTextTrack(InbandTextTrackPrivateAVF*) { }
62     virtual InbandTextTrackPrivateAVF* currentTextTrack() const = 0;
63 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
64     void playbackTargetIsWirelessChanged();
65 #endif
66     
67     class Notification {
68     public:
69 #define FOR_EACH_MEDIAPLAYERPRIVATEAVFOUNDATION_NOTIFICATION_TYPE(macro) \
70     macro(None) \
71     macro(ItemDidPlayToEndTime) \
72     macro(ItemTracksChanged) \
73     macro(ItemStatusChanged) \
74     macro(ItemSeekableTimeRangesChanged) \
75     macro(ItemLoadedTimeRangesChanged) \
76     macro(ItemPresentationSizeChanged) \
77     macro(ItemIsPlaybackLikelyToKeepUpChanged) \
78     macro(ItemIsPlaybackBufferEmptyChanged) \
79     macro(ItemIsPlaybackBufferFullChanged) \
80     macro(AssetMetadataLoaded) \
81     macro(AssetPlayabilityKnown) \
82     macro(PlayerRateChanged) \
83     macro(PlayerTimeChanged) \
84     macro(SeekCompleted) \
85     macro(DurationChanged) \
86     macro(ContentsNeedsDisplay) \
87     macro(InbandTracksNeedConfiguration) \
88     macro(TargetIsWirelessChanged) \
89
90         enum Type {
91 #define DEFINE_TYPE_ENUM(type) type,
92             FOR_EACH_MEDIAPLAYERPRIVATEAVFOUNDATION_NOTIFICATION_TYPE(DEFINE_TYPE_ENUM)
93 #undef DEFINE_TYPE_ENUM
94             FunctionType,
95         };
96         
97         Notification()
98             : m_type(None)
99             , m_finished(false)
100         {
101         }
102
103         Notification(Type type, const MediaTime& time)
104             : m_type(type)
105             , m_time(time)
106             , m_finished(false)
107         {
108         }
109         
110         Notification(Type type, bool finished)
111             : m_type(type)
112             , m_finished(finished)
113         {
114         }
115
116         Notification(std::function<void ()> function)
117             : m_type(FunctionType)
118             , m_finished(false)
119             , m_function(function)
120         {
121         }
122         
123         Type type() { return m_type; }
124         bool isValid() { return m_type != None; }
125         MediaTime time() { return m_time; }
126         bool finished() { return m_finished; }
127         std::function<void ()>& function() { return m_function; }
128         
129     private:
130         Type m_type;
131         MediaTime m_time;
132         bool m_finished;
133         std::function<void ()> m_function;
134     };
135
136     void scheduleMainThreadNotification(Notification);
137     void scheduleMainThreadNotification(Notification::Type, const MediaTime& = MediaTime::zeroTime());
138     void scheduleMainThreadNotification(Notification::Type, bool completed);
139     void dispatchNotification();
140     void clearMainThreadPendingFlag();
141
142 #if ENABLE(ENCRYPTED_MEDIA) || ENABLE(ENCRYPTED_MEDIA_V2)
143     static bool extractKeyURIKeyIDAndCertificateFromInitData(Uint8Array* initData, String& keyURI, String& keyID, RefPtr<Uint8Array>& certificate);
144 #endif
145
146 protected:
147     explicit MediaPlayerPrivateAVFoundation(MediaPlayer*);
148     virtual ~MediaPlayerPrivateAVFoundation();
149
150     WeakPtr<MediaPlayerPrivateAVFoundation> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
151
152     // MediaPlayerPrivatePrivateInterface overrides.
153     void load(const String& url) override;
154 #if ENABLE(MEDIA_SOURCE)
155     void load(const String&, MediaSourcePrivateClient*) override;
156 #endif
157 #if ENABLE(MEDIA_STREAM)
158     void load(MediaStreamPrivate&) override { setNetworkState(MediaPlayer::FormatError); }
159 #endif
160     void cancelLoad() override = 0;
161
162     void prepareToPlay() override;
163     PlatformMedia platformMedia() const override = 0;
164
165     void play() override;
166     void pause() override;
167
168     FloatSize naturalSize() const override;
169     bool hasVideo() const override { return m_cachedHasVideo; }
170     bool hasAudio() const override { return m_cachedHasAudio; }
171     void setVisible(bool) override;
172     MediaTime durationMediaTime() const override;
173     MediaTime currentMediaTime() const override = 0;
174     void seek(const MediaTime&) override;
175     void seekWithTolerance(const MediaTime&, const MediaTime&, const MediaTime&) override;
176     bool seeking() const override;
177     bool paused() const override;
178     void setVolume(float) override = 0;
179     bool hasClosedCaptions() const override { return m_cachedHasCaptions; }
180     void setClosedCaptionsVisible(bool) override = 0;
181     MediaPlayer::NetworkState networkState() const override { return m_networkState; }
182     MediaPlayer::ReadyState readyState() const override { return m_readyState; }
183     MediaTime maxMediaTimeSeekable() const override;
184     MediaTime minMediaTimeSeekable() const override;
185     std::unique_ptr<PlatformTimeRanges> buffered() const override;
186     bool didLoadingProgress() const override;
187     void setSize(const IntSize&) override;
188     void paint(GraphicsContext&, const FloatRect&) override = 0;
189     void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&) override = 0;
190     void setPreload(MediaPlayer::Preload) override;
191     PlatformLayer* platformLayer() const override { return 0; }
192     bool supportsAcceleratedRendering() const override = 0;
193     void acceleratedRenderingStateChanged() override;
194     bool shouldMaintainAspectRatio() const override { return m_shouldMaintainAspectRatio; }
195     void setShouldMaintainAspectRatio(bool) override;
196     bool canSaveMediaData() const override;
197
198     MediaPlayer::MovieLoadType movieLoadType() const override;
199     void prepareForRendering() override;
200
201     bool supportsFullscreen() const override;
202     bool supportsScanning() const override { return true; }
203     unsigned long long fileSize() const override { return totalBytes(); }
204
205     // Required interfaces for concrete derived classes.
206     virtual void createAVAssetForURL(const String&) = 0;
207     virtual void createAVPlayer() = 0;
208     virtual void createAVPlayerItem() = 0;
209
210     enum ItemStatus {
211         MediaPlayerAVPlayerItemStatusDoesNotExist,
212         MediaPlayerAVPlayerItemStatusUnknown,
213         MediaPlayerAVPlayerItemStatusFailed,
214         MediaPlayerAVPlayerItemStatusReadyToPlay,
215         MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty,
216         MediaPlayerAVPlayerItemStatusPlaybackBufferFull,
217         MediaPlayerAVPlayerItemStatusPlaybackLikelyToKeepUp,
218     };
219     virtual ItemStatus playerItemStatus() const = 0;
220
221     enum AssetStatus {
222         MediaPlayerAVAssetStatusDoesNotExist,
223         MediaPlayerAVAssetStatusUnknown,
224         MediaPlayerAVAssetStatusLoading,
225         MediaPlayerAVAssetStatusFailed,
226         MediaPlayerAVAssetStatusCancelled,
227         MediaPlayerAVAssetStatusLoaded,
228         MediaPlayerAVAssetStatusPlayable,
229     };
230     virtual AssetStatus assetStatus() const = 0;
231     virtual long assetErrorCode() const = 0;
232
233     virtual void platformSetVisible(bool) = 0;
234     virtual void platformPlay() = 0;
235     virtual void platformPause() = 0;
236     virtual void checkPlayability() = 0;
237     virtual void seekToTime(const MediaTime&, const MediaTime& negativeTolerance, const MediaTime& positiveTolerance) = 0;
238     unsigned long long totalBytes() const override = 0;
239     virtual std::unique_ptr<PlatformTimeRanges> platformBufferedTimeRanges() const = 0;
240     virtual MediaTime platformMaxTimeSeekable() const = 0;
241     virtual MediaTime platformMinTimeSeekable() const = 0;
242     virtual MediaTime platformMaxTimeLoaded() const = 0;
243     virtual MediaTime platformDuration() const = 0;
244
245     virtual void beginLoadingMetadata() = 0;
246     virtual void sizeChanged() = 0;
247
248     virtual void createContextVideoRenderer() = 0;
249     virtual void destroyContextVideoRenderer() = 0;
250
251     virtual void createVideoLayer() = 0;
252     virtual void destroyVideoLayer() = 0;
253
254     bool hasAvailableVideoFrame() const override = 0;
255
256     virtual bool hasContextRenderer() const = 0;
257     virtual bool hasLayerRenderer() const = 0;
258
259     virtual void updateVideoLayerGravity() = 0;
260
261     static bool isUnsupportedMIMEType(const String&);
262     static const HashSet<String, ASCIICaseInsensitiveHash>& staticMIMETypeList();
263
264 protected:
265     void updateStates();
266
267     void setHasVideo(bool);
268     void setHasAudio(bool);
269     void setHasClosedCaptions(bool);
270     void characteristicsChanged();
271     void setDelayCharacteristicsChangedNotification(bool);
272     void setDelayCallbacks(bool) const;
273     void setIgnoreLoadStateChanges(bool delay) { m_ignoreLoadStateChanges = delay; }
274     void setNaturalSize(FloatSize);
275     bool isLiveStream() const { return std::isinf(duration()); }
276     void setNetworkState(MediaPlayer::NetworkState);
277     void setReadyState(MediaPlayer::ReadyState);
278
279     enum MediaRenderingMode { MediaRenderingNone, MediaRenderingToContext, MediaRenderingToLayer };
280     MediaRenderingMode currentRenderingMode() const;
281     MediaRenderingMode preferredRenderingMode() const;
282
283     bool metaDataAvailable() const { return m_readyState >= MediaPlayer::HaveMetadata; }
284     double requestedRate() const;
285     MediaTime maxTimeLoaded() const;
286     bool isReadyForVideoSetup() const;
287     virtual void setUpVideoRendering();
288     virtual void tearDownVideoRendering();
289     bool hasSetUpVideoRendering() const;
290
291     void mainThreadCallback();
292     
293     void invalidateCachedDuration();
294
295     const String& assetURL() const { return m_assetURL; }
296
297     MediaPlayer* player() { return m_player; }
298
299     String engineDescription() const override { return "AVFoundation"; }
300     long platformErrorCode() const override { return assetErrorCode(); }
301
302     void trackModeChanged() override;
303 #if ENABLE(AVF_CAPTIONS)
304     void notifyTrackModeChanged() override { }
305     virtual void synchronizeTextTrackState() { }
306 #endif
307     void processNewAndRemovedTextTracks(const Vector<RefPtr<InbandTextTrackPrivateAVF>>&);
308     void clearTextTracks();
309     Vector<RefPtr<InbandTextTrackPrivateAVF>> m_textTracks;
310
311     virtual URL resolvedURL() const;
312
313 private:
314     MediaPlayer* m_player;
315
316     WeakPtrFactory<MediaPlayerPrivateAVFoundation> m_weakPtrFactory;
317
318     std::function<void()> m_pendingSeek;
319
320     Vector<Notification> m_queuedNotifications;
321     mutable Lock m_queueMutex;
322
323     mutable std::unique_ptr<PlatformTimeRanges> m_cachedLoadedTimeRanges;
324
325     MediaPlayer::NetworkState m_networkState;
326     MediaPlayer::ReadyState m_readyState;
327
328     String m_assetURL;
329     MediaPlayer::Preload m_preload;
330
331     FloatSize m_cachedNaturalSize;
332     mutable MediaTime m_cachedMaxTimeLoaded;
333     mutable MediaTime m_cachedMaxTimeSeekable;
334     mutable MediaTime m_cachedMinTimeSeekable;
335     mutable MediaTime m_cachedDuration;
336     MediaTime m_reportedDuration;
337     mutable MediaTime m_maxTimeLoadedAtLastDidLoadingProgress;
338     mutable int m_delayCallbacks;
339     int m_delayCharacteristicsChangedNotification;
340     bool m_mainThreadCallPending;
341     bool m_assetIsPlayable;
342     bool m_visible;
343     bool m_loadingMetadata;
344     bool m_isAllowedToRender;
345     bool m_cachedHasAudio;
346     bool m_cachedHasVideo;
347     bool m_cachedHasCaptions;
348     bool m_ignoreLoadStateChanges;
349     bool m_haveReportedFirstVideoFrame;
350     bool m_playWhenFramesAvailable;
351     bool m_inbandTrackConfigurationPending;
352     bool m_characteristicsChanged;
353     bool m_shouldMaintainAspectRatio;
354     bool m_seeking;
355 };
356
357 } // namespace WebCore
358
359 #endif // ENABLE(VIDEO) && USE(AVFOUNDATION)
360
361 #endif // MediaPlayerPrivateAVFoundation_h