[MediaStream] new load method for MediaStreamPrivate objects
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / MediaPlayerPrivateAVFoundation.h
1 /*
2  * Copyright (C) 2011-2014 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/Functional.h>
37 #include <wtf/RetainPtr.h>
38 #include <wtf/WeakPtr.h>
39
40 namespace WebCore {
41
42 class InbandMetadataTextTrackPrivateAVF;
43 class InbandTextTrackPrivateAVF;
44 class GenericCueData;
45
46 class MediaPlayerPrivateAVFoundation : public MediaPlayerPrivateInterface, public AVFInbandTrackParent
47 {
48 public:
49     virtual void repaint();
50     virtual void metadataLoaded();
51     virtual void playabilityKnown();
52     virtual void rateChanged();
53     virtual void loadedTimeRangesChanged();
54     virtual void seekableTimeRangesChanged();
55     virtual void timeChanged(const MediaTime&);
56     virtual void seekCompleted(bool);
57     virtual void didEnd();
58     virtual void contentsNeedsDisplay() { }
59     virtual void configureInbandTracks();
60     virtual void setCurrentTextTrack(InbandTextTrackPrivateAVF*) { }
61     virtual InbandTextTrackPrivateAVF* currentTextTrack() const = 0;
62 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
63     void playbackTargetIsWirelessChanged();
64 #endif
65     
66     class Notification {
67     public:
68 #define FOR_EACH_MEDIAPLAYERPRIVATEAVFOUNDATION_NOTIFICATION_TYPE(macro) \
69     macro(None) \
70     macro(ItemDidPlayToEndTime) \
71     macro(ItemTracksChanged) \
72     macro(ItemStatusChanged) \
73     macro(ItemSeekableTimeRangesChanged) \
74     macro(ItemLoadedTimeRangesChanged) \
75     macro(ItemPresentationSizeChanged) \
76     macro(ItemIsPlaybackLikelyToKeepUpChanged) \
77     macro(ItemIsPlaybackBufferEmptyChanged) \
78     macro(ItemIsPlaybackBufferFullChanged) \
79     macro(AssetMetadataLoaded) \
80     macro(AssetPlayabilityKnown) \
81     macro(PlayerRateChanged) \
82     macro(PlayerTimeChanged) \
83     macro(SeekCompleted) \
84     macro(DurationChanged) \
85     macro(ContentsNeedsDisplay) \
86     macro(InbandTracksNeedConfiguration) \
87     macro(TargetIsWirelessChanged) \
88
89         enum Type {
90 #define DEFINE_TYPE_ENUM(type) type,
91             FOR_EACH_MEDIAPLAYERPRIVATEAVFOUNDATION_NOTIFICATION_TYPE(DEFINE_TYPE_ENUM)
92 #undef DEFINE_TYPE_ENUM
93             FunctionType,
94         };
95         
96         Notification()
97             : m_type(None)
98             , m_finished(false)
99         {
100         }
101
102         Notification(Type type, const MediaTime& time)
103             : m_type(type)
104             , m_time(time)
105             , m_finished(false)
106         {
107         }
108         
109         Notification(Type type, bool finished)
110             : m_type(type)
111             , m_finished(finished)
112         {
113         }
114
115         Notification(std::function<void ()> function)
116             : m_type(FunctionType)
117             , m_finished(false)
118             , m_function(function)
119         {
120         }
121         
122         Type type() { return m_type; }
123         bool isValid() { return m_type != None; }
124         MediaTime time() { return m_time; }
125         bool finished() { return m_finished; }
126         std::function<void ()>& function() { return m_function; }
127         
128     private:
129         Type m_type;
130         MediaTime m_time;
131         bool m_finished;
132         std::function<void ()> m_function;
133     };
134
135     void scheduleMainThreadNotification(Notification);
136     void scheduleMainThreadNotification(Notification::Type, const MediaTime& = MediaTime::zeroTime());
137     void scheduleMainThreadNotification(Notification::Type, bool completed);
138     void dispatchNotification();
139     void clearMainThreadPendingFlag();
140
141 #if ENABLE(ENCRYPTED_MEDIA) || ENABLE(ENCRYPTED_MEDIA_V2)
142     static bool extractKeyURIKeyIDAndCertificateFromInitData(Uint8Array* initData, String& keyURI, String& keyID, RefPtr<Uint8Array>& certificate);
143 #endif
144
145 protected:
146     explicit MediaPlayerPrivateAVFoundation(MediaPlayer*);
147     virtual ~MediaPlayerPrivateAVFoundation();
148
149     WeakPtr<MediaPlayerPrivateAVFoundation> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
150
151     // MediaPlayerPrivatePrivateInterface overrides.
152     virtual void load(const String& url) override;
153 #if ENABLE(MEDIA_SOURCE)
154     virtual void load(const String&, MediaSourcePrivateClient*);
155 #endif
156 #if ENABLE(MEDIA_STREAM)
157     virtual void load(MediaStreamPrivate*) { }
158 #endif
159     virtual void cancelLoad() = 0;
160
161     virtual void prepareToPlay() override;
162     virtual PlatformMedia platformMedia() const = 0;
163
164     virtual void play() override;
165     virtual void pause() override;
166
167     virtual FloatSize naturalSize() const override;
168     virtual bool hasVideo() const override { return m_cachedHasVideo; }
169     virtual bool hasAudio() const override { return m_cachedHasAudio; }
170     virtual void setVisible(bool) override;
171     virtual MediaTime durationMediaTime() const override;
172     virtual MediaTime currentMediaTime() const = 0;
173     virtual void seek(const MediaTime&) override;
174     virtual void seekWithTolerance(const MediaTime&, const MediaTime&, const MediaTime&) override;
175     virtual bool seeking() const override;
176     virtual bool paused() const override;
177     virtual void setVolume(float) = 0;
178     virtual bool hasClosedCaptions() const override { return m_cachedHasCaptions; }
179     virtual void setClosedCaptionsVisible(bool) = 0;
180     virtual MediaPlayer::NetworkState networkState() const override { return m_networkState; }
181     virtual MediaPlayer::ReadyState readyState() const override { return m_readyState; }
182     virtual MediaTime maxMediaTimeSeekable() const override;
183     virtual MediaTime minMediaTimeSeekable() const override;
184     virtual std::unique_ptr<PlatformTimeRanges> buffered() const override;
185     virtual bool didLoadingProgress() const override;
186     virtual void setSize(const IntSize&) override;
187     virtual void paint(GraphicsContext*, const FloatRect&) = 0;
188     virtual void paintCurrentFrameInContext(GraphicsContext*, const FloatRect&) = 0;
189     virtual void setPreload(MediaPlayer::Preload) override;
190     virtual PlatformLayer* platformLayer() const { return 0; }
191     virtual bool supportsAcceleratedRendering() const = 0;
192     virtual void acceleratedRenderingStateChanged() override;
193     virtual bool shouldMaintainAspectRatio() const override { return m_shouldMaintainAspectRatio; }
194     virtual void setShouldMaintainAspectRatio(bool) override;
195     virtual bool canSaveMediaData() const override;
196
197     virtual MediaPlayer::MovieLoadType movieLoadType() const;
198     virtual void prepareForRendering();
199
200     virtual bool supportsFullscreen() const;
201     virtual bool supportsScanning() const { return true; }
202     unsigned long long fileSize() const { return totalBytes(); }
203
204     // Required interfaces for concrete derived classes.
205     virtual void createAVAssetForURL(const String&) = 0;
206     virtual void createAVPlayer() = 0;
207     virtual void createAVPlayerItem() = 0;
208
209     enum ItemStatus {
210         MediaPlayerAVPlayerItemStatusDoesNotExist,
211         MediaPlayerAVPlayerItemStatusUnknown,
212         MediaPlayerAVPlayerItemStatusFailed,
213         MediaPlayerAVPlayerItemStatusReadyToPlay,
214         MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty,
215         MediaPlayerAVPlayerItemStatusPlaybackBufferFull,
216         MediaPlayerAVPlayerItemStatusPlaybackLikelyToKeepUp,
217     };
218     virtual ItemStatus playerItemStatus() const = 0;
219
220     enum AssetStatus {
221         MediaPlayerAVAssetStatusDoesNotExist,
222         MediaPlayerAVAssetStatusUnknown,
223         MediaPlayerAVAssetStatusLoading,
224         MediaPlayerAVAssetStatusFailed,
225         MediaPlayerAVAssetStatusCancelled,
226         MediaPlayerAVAssetStatusLoaded,
227         MediaPlayerAVAssetStatusPlayable,
228     };
229     virtual AssetStatus assetStatus() const = 0;
230     virtual long assetErrorCode() const = 0;
231
232     virtual void platformSetVisible(bool) = 0;
233     virtual void platformPlay() = 0;
234     virtual void platformPause() = 0;
235     virtual void checkPlayability() = 0;
236     virtual void seekToTime(const MediaTime&, const MediaTime& negativeTolerance, const MediaTime& positiveTolerance) = 0;
237     virtual unsigned long long totalBytes() const = 0;
238     virtual std::unique_ptr<PlatformTimeRanges> platformBufferedTimeRanges() const = 0;
239     virtual MediaTime platformMaxTimeSeekable() const = 0;
240     virtual MediaTime platformMinTimeSeekable() const = 0;
241     virtual MediaTime platformMaxTimeLoaded() const = 0;
242     virtual MediaTime platformDuration() const = 0;
243
244     virtual void beginLoadingMetadata() = 0;
245     virtual void tracksChanged() = 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     virtual bool hasAvailableVideoFrame() const = 0;
255
256     virtual bool hasContextRenderer() const = 0;
257     virtual bool hasLayerRenderer() const = 0;
258
259     virtual void updateVideoLayerGravity() = 0;
260
261 protected:
262     void updateStates();
263
264     void setHasVideo(bool);
265     void setHasAudio(bool);
266     void setHasClosedCaptions(bool);
267     void characteristicsChanged();
268     void setDelayCharacteristicsChangedNotification(bool);
269     void setDelayCallbacks(bool) const;
270     void setIgnoreLoadStateChanges(bool delay) { m_ignoreLoadStateChanges = delay; }
271     void setNaturalSize(FloatSize);
272     bool isLiveStream() const { return std::isinf(duration()); }
273
274     enum MediaRenderingMode { MediaRenderingNone, MediaRenderingToContext, MediaRenderingToLayer };
275     MediaRenderingMode currentRenderingMode() const;
276     MediaRenderingMode preferredRenderingMode() const;
277
278     bool metaDataAvailable() const { return m_readyState >= MediaPlayer::HaveMetadata; }
279     double requestedRate() const;
280     MediaTime maxTimeLoaded() const;
281     bool isReadyForVideoSetup() const;
282     virtual void setUpVideoRendering();
283     virtual void tearDownVideoRendering();
284     bool hasSetUpVideoRendering() const;
285
286     static void mainThreadCallback(void*);
287     
288     void invalidateCachedDuration();
289
290     const String& assetURL() const { return m_assetURL; }
291
292     MediaPlayer* player() { return m_player; }
293
294     virtual String engineDescription() const { return "AVFoundation"; }
295     virtual long platformErrorCode() const { return assetErrorCode(); }
296
297     virtual void trackModeChanged() override;
298 #if ENABLE(AVF_CAPTIONS)
299     virtual void notifyTrackModeChanged() { }
300     virtual void synchronizeTextTrackState() { }
301 #endif
302     void processNewAndRemovedTextTracks(const Vector<RefPtr<InbandTextTrackPrivateAVF>>&);
303     void clearTextTracks();
304     Vector<RefPtr<InbandTextTrackPrivateAVF>> m_textTracks;
305
306 virtual URL resolvedURL() const;
307
308 private:
309     MediaPlayer* m_player;
310
311     WeakPtrFactory<MediaPlayerPrivateAVFoundation> m_weakPtrFactory;
312
313     std::function<void()> m_pendingSeek;
314
315     Vector<Notification> m_queuedNotifications;
316     mutable Mutex m_queueMutex;
317
318     mutable std::unique_ptr<PlatformTimeRanges> m_cachedLoadedTimeRanges;
319
320     MediaPlayer::NetworkState m_networkState;
321     MediaPlayer::ReadyState m_readyState;
322
323     String m_assetURL;
324     MediaPlayer::Preload m_preload;
325
326     FloatSize m_cachedNaturalSize;
327     mutable MediaTime m_cachedMaxTimeLoaded;
328     mutable MediaTime m_cachedMaxTimeSeekable;
329     mutable MediaTime m_cachedMinTimeSeekable;
330     mutable MediaTime m_cachedDuration;
331     MediaTime m_reportedDuration;
332     mutable MediaTime m_maxTimeLoadedAtLastDidLoadingProgress;
333     mutable int m_delayCallbacks;
334     int m_delayCharacteristicsChangedNotification;
335     bool m_mainThreadCallPending;
336     bool m_assetIsPlayable;
337     bool m_visible;
338     bool m_loadingMetadata;
339     bool m_isAllowedToRender;
340     bool m_cachedHasAudio;
341     bool m_cachedHasVideo;
342     bool m_cachedHasCaptions;
343     bool m_ignoreLoadStateChanges;
344     bool m_haveReportedFirstVideoFrame;
345     bool m_playWhenFramesAvailable;
346     bool m_inbandTrackConfigurationPending;
347     bool m_characteristicsChanged;
348     bool m_shouldMaintainAspectRatio;
349     bool m_seeking;
350 };
351
352 } // namespace WebCore
353
354 #endif // ENABLE(VIDEO) && USE(AVFOUNDATION)
355
356 #endif // MediaPlayerPrivateAVFoundation_h