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