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