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