• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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 "MediaPlayerPrivate.h"
33 #include "Timer.h"
34 #include <wtf/RetainPtr.h>
35 
36 namespace WebCore {
37 
38 class ApplicationCacheResource;
39 
40 class MediaPlayerPrivateAVFoundation : public MediaPlayerPrivateInterface {
41 public:
42 
43     virtual void repaint();
44     virtual void metadataLoaded();
45     virtual void loadStateChanged();
46     virtual void playabilityKnown();
47     virtual void rateChanged();
48     virtual void loadedTimeRangesChanged();
49     virtual void seekableTimeRangesChanged();
50     virtual void timeChanged(double);
51     virtual void seekCompleted(bool);
52     virtual void didEnd();
53 
54     class Notification {
55     public:
56         enum Type {
57             None,
58             ItemDidPlayToEndTime,
59             ItemTracksChanged,
60             ItemStatusChanged,
61             ItemSeekableTimeRangesChanged,
62             ItemLoadedTimeRangesChanged,
63             ItemPresentationSizeChanged,
64             ItemIsPlaybackLikelyToKeepUpChanged,
65             ItemIsPlaybackBufferEmptyChanged,
66             ItemIsPlaybackBufferFullChanged,
67             AssetMetadataLoaded,
68             AssetPlayabilityKnown,
69             PlayerRateChanged,
70             PlayerTimeChanged,
71             SeekCompleted,
72         };
73 
Notification()74         Notification()
75             : m_type(None)
76             , m_time(0)
77             , m_finished(false)
78         {
79         }
80 
Notification(Type type,double time)81         Notification(Type type, double time)
82             : m_type(type)
83             , m_time(time)
84             , m_finished(false)
85         {
86         }
87 
Notification(Type type,bool finished)88         Notification(Type type, bool finished)
89         : m_type(type)
90         , m_time(0)
91         , m_finished(finished)
92         {
93         }
94 
type()95         Type type() { return m_type; }
isValid()96         bool isValid() { return m_type != None; }
time()97         double time() { return m_time; }
finished()98         bool finished() { return m_finished; }
99 
100     private:
101         Type m_type;
102         double m_time;
103         bool m_finished;
104     };
105 
106     void scheduleMainThreadNotification(Notification);
107     void scheduleMainThreadNotification(Notification::Type, double time = 0);
108     void scheduleMainThreadNotification(Notification::Type, bool completed);
109     void dispatchNotification();
110     void clearMainThreadPendingFlag();
111 
112 protected:
113     MediaPlayerPrivateAVFoundation(MediaPlayer*);
114     virtual ~MediaPlayerPrivateAVFoundation();
115 
116     // MediaPlayerPrivatePrivateInterface overrides.
117     virtual void load(const String& url);
118     virtual void cancelLoad() = 0;
119 
120     virtual void prepareToPlay();
121     virtual PlatformMedia platformMedia() const = 0;
122 
123     virtual void play();
124     virtual void pause();
125 
126     virtual IntSize naturalSize() const;
hasVideo()127     virtual bool hasVideo() const { return m_cachedHasVideo; }
hasAudio()128     virtual bool hasAudio() const { return m_cachedHasAudio; }
129     virtual void setVisible(bool);
130     virtual float duration() const;
131     virtual float currentTime() const = 0;
132     virtual void seek(float);
133     virtual bool seeking() const;
134     virtual void setRate(float);
135     virtual bool paused() const;
136     virtual void setVolume(float) = 0;
hasClosedCaptions()137     virtual bool hasClosedCaptions() const { return m_cachedHasCaptions; }
138     virtual void setClosedCaptionsVisible(bool) = 0;
networkState()139     virtual MediaPlayer::NetworkState networkState() const { return m_networkState; }
readyState()140     virtual MediaPlayer::ReadyState readyState() const { return m_readyState; }
141     virtual float maxTimeSeekable() const;
142     virtual PassRefPtr<TimeRanges> buffered() const;
143     virtual unsigned bytesLoaded() const;
144     virtual void setSize(const IntSize&);
145     virtual void paint(GraphicsContext*, const IntRect&);
146     virtual void paintCurrentFrameInContext(GraphicsContext*, const IntRect&) = 0;
147     virtual void setPreload(MediaPlayer::Preload);
148     virtual bool hasAvailableVideoFrame() const;
149 #if USE(ACCELERATED_COMPOSITING)
platformLayer()150     virtual PlatformLayer* platformLayer() const { return 0; }
151     virtual bool supportsAcceleratedRendering() const = 0;
152     virtual void acceleratedRenderingStateChanged();
153 #endif
hasSingleSecurityOrigin()154     virtual bool hasSingleSecurityOrigin() const { return true; }
155     virtual MediaPlayer::MovieLoadType movieLoadType() const;
156     virtual void prepareForRendering();
157     virtual float mediaTimeForTimeValue(float) const = 0;
158 
159     virtual bool supportsFullscreen() const;
160 
161     // Required interfaces for concrete derived classes.
162     virtual void createAVPlayerForURL(const String& url) = 0;
163 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
164     virtual void createAVPlayerForCacheResource(ApplicationCacheResource*) = 0;
165 #endif
166 
167     enum ItemStatus {
168         MediaPlayerAVPlayerItemStatusUnknown,
169         MediaPlayerAVPlayerItemStatusFailed,
170         MediaPlayerAVPlayerItemStatusReadyToPlay,
171         MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty,
172         MediaPlayerAVPlayerItemStatusPlaybackBufferFull,
173         MediaPlayerAVPlayerItemStatusPlaybackLikelyToKeepUp,
174     };
175     virtual ItemStatus playerItemStatus() const = 0;
176 
177     enum AVAssetStatus {
178         MediaPlayerAVAssetStatusUnknown,
179         MediaPlayerAVAssetStatusLoading,
180         MediaPlayerAVAssetStatusFailed,
181         MediaPlayerAVAssetStatusCancelled,
182         MediaPlayerAVAssetStatusLoaded,
183         MediaPlayerAVAssetStatusPlayable,
184     };
185     virtual AVAssetStatus assetStatus() const = 0;
186 
187     virtual void platformPlay() = 0;
188     virtual void platformPause() = 0;
189     virtual void checkPlayability() = 0;
190     virtual void updateRate() = 0;
191     virtual float rate() const = 0;
192     virtual void seekToTime(float time) = 0;
193     virtual unsigned totalBytes() const = 0;
194     virtual PassRefPtr<TimeRanges> platformBufferedTimeRanges() const = 0;
195     virtual float platformMaxTimeSeekable() const = 0;
196     virtual float platformMaxTimeLoaded() const = 0;
197     virtual float platformDuration() const = 0;
198 
199     virtual void beginLoadingMetadata() = 0;
200     virtual void tracksChanged() = 0;
201     virtual void sizeChanged() = 0;
202 
203     virtual void createContextVideoRenderer() = 0;
204     virtual void destroyContextVideoRenderer() = 0;
205 
206     virtual void createVideoLayer() = 0;
207     virtual void destroyVideoLayer() = 0;
208     virtual bool videoLayerIsReadyToDisplay() const = 0;
209 
210     virtual bool hasContextRenderer() const = 0;
211     virtual bool hasLayerRenderer() const = 0;
212 
213 protected:
214     void resumeLoad();
215     void updateStates();
216 
setHasVideo(bool b)217     void setHasVideo(bool b) { m_cachedHasVideo = b; };
setHasAudio(bool b)218     void setHasAudio(bool b) { m_cachedHasAudio = b; }
setHasClosedCaptions(bool b)219     void setHasClosedCaptions(bool b) { m_cachedHasCaptions = b; }
220     void setDelayCallbacks(bool);
setIgnoreLoadStateChanges(bool delay)221     void setIgnoreLoadStateChanges(bool delay) { m_ignoreLoadStateChanges = delay; }
222     void setNaturalSize(IntSize);
223 
224     enum MediaRenderingMode { MediaRenderingNone, MediaRenderingToContext, MediaRenderingToLayer };
225     MediaRenderingMode currentRenderingMode() const;
226     MediaRenderingMode preferredRenderingMode() const;
227 
metaDataAvailable()228     bool metaDataAvailable() const { return m_readyState >= MediaPlayer::HaveMetadata; }
requestedRate()229     float requestedRate() const { return m_requestedRate; }
230     float maxTimeLoaded() const;
231     bool isReadyForVideoSetup() const;
232     virtual void setUpVideoRendering();
233     virtual void tearDownVideoRendering();
234     bool hasSetUpVideoRendering() const;
235 
236     static void mainThreadCallback(void*);
237 
238 private:
239 
240     MediaPlayer* m_player;
241 
242     Vector<Notification> m_queuedNotifications;
243     Mutex m_queueMutex;
244     bool m_mainThreadCallPending;
245 
246     mutable RefPtr<TimeRanges> m_cachedLoadedTimeRanges;
247 
248     MediaPlayer::NetworkState m_networkState;
249     MediaPlayer::ReadyState m_readyState;
250 
251     String m_assetURL;
252     MediaPlayer::Preload m_preload;
253     FloatSize m_scaleFactor;
254 
255     IntSize m_cachedNaturalSize;
256     mutable float m_cachedMaxTimeLoaded;
257     mutable float m_cachedMaxTimeSeekable;
258     mutable float m_cachedDuration;
259     float m_reportedDuration;
260 
261     float m_seekTo;
262     float m_requestedRate;
263     int m_delayCallbacks;
264     bool m_havePreparedToPlay;
265     bool m_assetIsPlayable;
266     bool m_visible;
267     bool m_videoFrameHasDrawn;
268     bool m_loadingMetadata;
269     bool m_delayingLoad;
270     bool m_isAllowedToRender;
271     bool m_cachedHasAudio;
272     bool m_cachedHasVideo;
273     bool m_cachedHasCaptions;
274     bool m_ignoreLoadStateChanges;
275     bool m_haveReportedFirstVideoFrame;
276     bool m_playWhenFramesAvailable;
277 };
278 
279 }
280 
281 #endif
282 #endif
283