• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007, 2008, 2009, 2010, 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 MediaPlayer_h
27 #define MediaPlayer_h
28 
29 #if ENABLE(VIDEO)
30 
31 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
32 #include "MediaPlayerProxy.h"
33 #endif
34 
35 #include "Document.h"
36 #include "IntRect.h"
37 #include <wtf/Forward.h>
38 #include <wtf/HashSet.h>
39 #include <wtf/OwnPtr.h>
40 #include <wtf/Noncopyable.h>
41 #include <wtf/PassOwnPtr.h>
42 #include <wtf/text/StringHash.h>
43 
44 #if USE(ACCELERATED_COMPOSITING)
45 #include "GraphicsLayer.h"
46 #endif
47 
48 #ifdef __OBJC__
49 @class AVPlayer;
50 @class QTMovie;
51 #else
52 class AVPlayer;
53 class QTMovie;
54 #endif
55 class QTMovieGWorld;
56 class QTMovieVisualContext;
57 
58 namespace WebCore {
59 
60 class GStreamerGWorld;
61 class MediaPlayerPrivateInterface;
62 
63 // Structure that will hold every native
64 // types supported by the current media player.
65 // We have to do that has multiple media players
66 // backend can live at runtime.
67 struct PlatformMedia {
68     enum {
69         None,
70         QTMovieType,
71         QTMovieGWorldType,
72         QTMovieVisualContextType,
73         GStreamerGWorldType,
74         ChromiumMediaPlayerType,
75         QtMediaPlayerType,
76         AVFoundationMediaPlayerType,
77     } type;
78 
79     union {
80         QTMovie* qtMovie;
81         QTMovieGWorld* qtMovieGWorld;
82         QTMovieVisualContext* qtMovieVisualContext;
83         GStreamerGWorld* gstreamerGWorld;
84         MediaPlayerPrivateInterface* chromiumMediaPlayer;
85         MediaPlayerPrivateInterface* qtMediaPlayer;
86         AVPlayer* avfMediaPlayer;
87     } media;
88 };
89 
90 extern const PlatformMedia NoPlatformMedia;
91 
92 class ContentType;
93 class FrameView;
94 class GraphicsContext;
95 class IntRect;
96 class IntSize;
97 class MediaPlayer;
98 struct MediaPlayerFactory;
99 class TimeRanges;
100 
101 class MediaPlayerClient {
102 public:
~MediaPlayerClient()103     virtual ~MediaPlayerClient() { }
104 
105     // Get the document which the media player is owned by
mediaPlayerOwningDocument()106     virtual Document* mediaPlayerOwningDocument() { return 0; }
107 
108     // the network state has changed
mediaPlayerNetworkStateChanged(MediaPlayer *)109     virtual void mediaPlayerNetworkStateChanged(MediaPlayer*) { }
110 
111     // the ready state has changed
mediaPlayerReadyStateChanged(MediaPlayer *)112     virtual void mediaPlayerReadyStateChanged(MediaPlayer*) { }
113 
114     // the volume state has changed
mediaPlayerVolumeChanged(MediaPlayer *)115     virtual void mediaPlayerVolumeChanged(MediaPlayer*) { }
116 
117     // the mute state has changed
mediaPlayerMuteChanged(MediaPlayer *)118     virtual void mediaPlayerMuteChanged(MediaPlayer*) { }
119 
120     // time has jumped, eg. not as a result of normal playback
mediaPlayerTimeChanged(MediaPlayer *)121     virtual void mediaPlayerTimeChanged(MediaPlayer*) { }
122 
123     // the media file duration has changed, or is now known
mediaPlayerDurationChanged(MediaPlayer *)124     virtual void mediaPlayerDurationChanged(MediaPlayer*) { }
125 
126     // the playback rate has changed
mediaPlayerRateChanged(MediaPlayer *)127     virtual void mediaPlayerRateChanged(MediaPlayer*) { }
128 
129     // the play/pause status changed
mediaPlayerPlaybackStateChanged(MediaPlayer *)130     virtual void mediaPlayerPlaybackStateChanged(MediaPlayer*) { }
131 
132     // The MediaPlayer has found potentially problematic media content.
133     // This is used internally to trigger swapping from a <video>
134     // element to an <embed> in standalone documents
mediaPlayerSawUnsupportedTracks(MediaPlayer *)135     virtual void mediaPlayerSawUnsupportedTracks(MediaPlayer*) { }
136 
137 // Presentation-related methods
138     // a new frame of video is available
mediaPlayerRepaint(MediaPlayer *)139     virtual void mediaPlayerRepaint(MediaPlayer*) { }
140 
141     // the movie size has changed
mediaPlayerSizeChanged(MediaPlayer *)142     virtual void mediaPlayerSizeChanged(MediaPlayer*) { }
143 
mediaPlayerEngineUpdated(MediaPlayer *)144     virtual void mediaPlayerEngineUpdated(MediaPlayer*) { }
145 
146     // The first frame of video is available to render. A media engine need only make this callback if the
147     // first frame is not available immediately when prepareForRendering is called.
mediaPlayerFirstVideoFrameAvailable(MediaPlayer *)148     virtual void mediaPlayerFirstVideoFrameAvailable(MediaPlayer*) { }
149 
150 #if USE(ACCELERATED_COMPOSITING)
151     // whether the rendering system can accelerate the display of this MediaPlayer.
mediaPlayerRenderingCanBeAccelerated(MediaPlayer *)152     virtual bool mediaPlayerRenderingCanBeAccelerated(MediaPlayer*) { return false; }
153 
154     // called when the media player's rendering mode changed, which indicates a change in the
155     // availability of the platformLayer().
mediaPlayerRenderingModeChanged(MediaPlayer *)156     virtual void mediaPlayerRenderingModeChanged(MediaPlayer*) { }
157 #endif
158 };
159 
160 class MediaPlayer {
161     WTF_MAKE_NONCOPYABLE(MediaPlayer); WTF_MAKE_FAST_ALLOCATED;
162 public:
163 
create(MediaPlayerClient * client)164     static PassOwnPtr<MediaPlayer> create(MediaPlayerClient* client)
165     {
166         return adoptPtr(new MediaPlayer(client));
167     }
168     virtual ~MediaPlayer();
169 
170     // Media engine support.
171     enum SupportsType { IsNotSupported, IsSupported, MayBeSupported };
172     static MediaPlayer::SupportsType supportsType(const ContentType&);
173     static void getSupportedTypes(HashSet<String>&);
174     static bool isAvailable();
175     static void getSitesInMediaCache(Vector<String>&);
176     static void clearMediaCache();
177     static void clearMediaCacheForSite(const String&);
178 
179     bool supportsFullscreen() const;
180     bool supportsSave() const;
181     PlatformMedia platformMedia() const;
182 #if USE(ACCELERATED_COMPOSITING)
183     PlatformLayer* platformLayer() const;
184 #endif
185 
186     IntSize naturalSize();
187     bool hasVideo() const;
188     bool hasAudio() const;
189 #if PLATFORM(ANDROID)
190     enum MediaElementType { Video, Audio };
setMediaElementType(MediaElementType type)191     void setMediaElementType(MediaElementType type) { m_mediaElementType = type; }
mediaElementType()192     MediaElementType mediaElementType() { return m_mediaElementType; }
193 #endif
194 
setFrameView(FrameView * frameView)195     void setFrameView(FrameView* frameView) { m_frameView = frameView; }
frameView()196     FrameView* frameView() { return m_frameView; }
197     bool inMediaDocument();
198 
size()199     IntSize size() const { return m_size; }
200     void setSize(const IntSize& size);
201 
202     void load(const String& url, const ContentType&);
203     void cancelLoad();
204 
205     bool visible() const;
206     void setVisible(bool);
207 
208     void prepareToPlay();
209     void play();
210     void pause();
211 
212     bool paused() const;
213     bool seeking() const;
214 
215     float duration() const;
216     float currentTime() const;
217     void seek(float time);
218 
219     float startTime() const;
220 
221     float rate() const;
222     void setRate(float);
223 
224     bool preservesPitch() const;
225     void setPreservesPitch(bool);
226 
227     PassRefPtr<TimeRanges> buffered();
228     float maxTimeSeekable();
229 
230     unsigned bytesLoaded();
231 
232     float volume() const;
233     void setVolume(float);
234 
235     bool muted() const;
236     void setMuted(bool);
237 
238     bool hasClosedCaptions() const;
239     void setClosedCaptionsVisible(bool closedCaptionsVisible);
240 
241     bool autoplay() const;
242     void setAutoplay(bool);
243 
244     void paint(GraphicsContext*, const IntRect&);
245     void paintCurrentFrameInContext(GraphicsContext*, const IntRect&);
246 
247     enum NetworkState { Empty, Idle, Loading, Loaded, FormatError, NetworkError, DecodeError };
248     NetworkState networkState();
249 
250     enum ReadyState  { HaveNothing, HaveMetadata, HaveCurrentData, HaveFutureData, HaveEnoughData };
251     ReadyState readyState();
252 
253     enum MovieLoadType { Unknown, Download, StoredStream, LiveStream };
254     MovieLoadType movieLoadType() const;
255 
256     enum Preload { None, MetaData, Auto };
257     Preload preload() const;
258     void setPreload(Preload);
259 
260     void networkStateChanged();
261     void readyStateChanged();
262     void volumeChanged(float);
263     void muteChanged(bool);
264     void timeChanged();
265     void sizeChanged();
266     void rateChanged();
267     void playbackStateChanged();
268     void durationChanged();
269     void firstVideoFrameAvailable();
270 
271     void repaint();
272 
mediaPlayerClient()273     MediaPlayerClient* mediaPlayerClient() const { return m_mediaPlayerClient; }
274 
275     bool hasAvailableVideoFrame() const;
276     void prepareForRendering();
277 
278     bool canLoadPoster() const;
279     void setPoster(const String&);
280 
281 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
282     void deliverNotification(MediaPlayerProxyNotificationType notification);
283     void setMediaPlayerProxy(WebMediaPlayerProxy* proxy);
284     void setControls(bool);
285     void enterFullscreen();
286     void exitFullscreen();
287 #endif
288 
289 #if USE(ACCELERATED_COMPOSITING)
290     // whether accelerated rendering is supported by the media engine for the current media.
291     bool supportsAcceleratedRendering() const;
292     // called when the rendering system flips the into or out of accelerated rendering mode.
293     void acceleratedRenderingStateChanged();
294 #endif
295 
296     bool hasSingleSecurityOrigin() const;
297 
298     float mediaTimeForTimeValue(float) const;
299 
300     double maximumDurationToCacheMediaTime() const;
301 
302     unsigned decodedFrameCount() const;
303     unsigned droppedFrameCount() const;
304     unsigned audioDecodedByteCount() const;
305     unsigned videoDecodedByteCount() const;
306 
307     void setPrivateBrowsingMode(bool);
308 
309 private:
310     MediaPlayer(MediaPlayerClient*);
311     void loadWithNextMediaEngine(MediaPlayerFactory*);
312     void reloadTimerFired(Timer<MediaPlayer>*);
313 
314     static void initializeMediaEngines();
315 
316     MediaPlayerClient* m_mediaPlayerClient;
317     Timer<MediaPlayer> m_reloadTimer;
318     OwnPtr<MediaPlayerPrivateInterface*> m_private;
319     MediaPlayerFactory* m_currentMediaEngine;
320     String m_url;
321     String m_contentMIMEType;
322     String m_contentTypeCodecs;
323     FrameView* m_frameView;
324     IntSize m_size;
325     Preload m_preload;
326     bool m_visible;
327     float m_rate;
328     float m_volume;
329     bool m_muted;
330     bool m_preservesPitch;
331     bool m_privateBrowsing;
332     bool m_shouldPrepareToRender;
333 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
334     WebMediaPlayerProxy* m_playerProxy;    // not owned or used, passed to m_private
335 #endif
336 #if PLATFORM(ANDROID)
337     MediaElementType m_mediaElementType;
338 #endif
339 };
340 
341 typedef MediaPlayerPrivateInterface* (*CreateMediaEnginePlayer)(MediaPlayer*);
342 typedef void (*MediaEngineSupportedTypes)(HashSet<String>& types);
343 typedef MediaPlayer::SupportsType (*MediaEngineSupportsType)(const String& type, const String& codecs);
344 typedef void (*MediaEngineGetSitesInMediaCache)(Vector<String>&);
345 typedef void (*MediaEngineClearMediaCache)();
346 typedef void (*MediaEngineClearMediaCacheForSite)(const String&);
347 
348 typedef void (*MediaEngineRegistrar)(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType,
349     MediaEngineGetSitesInMediaCache, MediaEngineClearMediaCache, MediaEngineClearMediaCacheForSite);
350 
351 
352 }
353 
354 #endif // ENABLE(VIDEO)
355 
356 #endif
357