1 /* 2 * Copyright (C) 2007, 2008, 2009, 2010 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 "IntRect.h" 36 #include "StringHash.h" 37 #include <wtf/HashSet.h> 38 #include <wtf/OwnPtr.h> 39 #include <wtf/Noncopyable.h> 40 #include <wtf/PassOwnPtr.h> 41 42 #ifdef __OBJC__ 43 @class QTMovie; 44 #else 45 class QTMovie; 46 #endif 47 48 namespace WebCore { 49 50 // Structure that will hold every native 51 // types supported by the current media player. 52 // We have to do that has multiple media players 53 // backend can live at runtime. 54 typedef struct PlatformMedia { 55 QTMovie* qtMovie; 56 } PlatformMedia; 57 58 static const PlatformMedia NoPlatformMedia = { 0 }; 59 60 class ContentType; 61 class FrameView; 62 class GraphicsContext; 63 class IntRect; 64 class IntSize; 65 class MediaPlayer; 66 class MediaPlayerPrivateInterface; 67 class String; 68 class TimeRanges; 69 70 #if USE(ACCELERATED_COMPOSITING) 71 class GraphicsLayer; 72 #endif 73 74 class MediaPlayerClient { 75 public: 76 virtual ~MediaPlayerClient() { } 77 78 // the network state has changed 79 virtual void mediaPlayerNetworkStateChanged(MediaPlayer*) { } 80 81 // the ready state has changed 82 virtual void mediaPlayerReadyStateChanged(MediaPlayer*) { } 83 84 // the volume state has changed 85 virtual void mediaPlayerVolumeChanged(MediaPlayer*) { } 86 87 // the mute state has changed 88 virtual void mediaPlayerMuteChanged(MediaPlayer*) { } 89 90 // time has jumped, eg. not as a result of normal playback 91 virtual void mediaPlayerTimeChanged(MediaPlayer*) { } 92 93 // the media file duration has changed, or is now known 94 virtual void mediaPlayerDurationChanged(MediaPlayer*) { } 95 96 // the playback rate has changed 97 virtual void mediaPlayerRateChanged(MediaPlayer*) { } 98 99 // The MediaPlayer has found potentially problematic media content. 100 // This is used internally to trigger swapping from a <video> 101 // element to an <embed> in standalone documents 102 virtual void mediaPlayerSawUnsupportedTracks(MediaPlayer*) { } 103 104 // Presentation-related methods 105 // a new frame of video is available 106 virtual void mediaPlayerRepaint(MediaPlayer*) { } 107 108 // the movie size has changed 109 virtual void mediaPlayerSizeChanged(MediaPlayer*) { } 110 111 #if USE(ACCELERATED_COMPOSITING) 112 // whether the rendering system can accelerate the display of this MediaPlayer. 113 virtual bool mediaPlayerRenderingCanBeAccelerated(MediaPlayer*) { return false; } 114 115 // return the GraphicsLayer that will host the presentation for this MediaPlayer. 116 virtual GraphicsLayer* mediaPlayerGraphicsLayer(MediaPlayer*) { return 0; } 117 #endif 118 }; 119 120 class MediaPlayer : public Noncopyable { 121 public: 122 123 static PassOwnPtr<MediaPlayer> create(MediaPlayerClient* client) 124 { 125 return new MediaPlayer(client); 126 } 127 virtual ~MediaPlayer(); 128 129 // media engine support 130 enum SupportsType { IsNotSupported, IsSupported, MayBeSupported }; 131 static MediaPlayer::SupportsType supportsType(ContentType contentType); 132 static void getSupportedTypes(HashSet<String>&); 133 static bool isAvailable(); 134 135 bool supportsFullscreen() const; 136 bool supportsSave() const; 137 PlatformMedia platformMedia() const; 138 139 IntSize naturalSize(); 140 bool hasVideo() const; 141 bool hasAudio() const; 142 #if PLATFORM(ANDROID) 143 enum MediaElementType { Video, Audio }; 144 void setMediaElementType(MediaElementType type) { m_mediaElementType = type; } 145 MediaElementType mediaElementType() { return m_mediaElementType; } 146 #endif 147 148 void setFrameView(FrameView* frameView) { m_frameView = frameView; } 149 FrameView* frameView() { return m_frameView; } 150 bool inMediaDocument(); 151 152 IntSize size() const { return m_size; } 153 void setSize(const IntSize& size); 154 155 void load(const String& url, const ContentType& contentType); 156 void cancelLoad(); 157 158 bool visible() const; 159 void setVisible(bool); 160 161 void prepareToPlay(); 162 void play(); 163 void pause(); 164 165 bool paused() const; 166 bool seeking() const; 167 168 float duration() const; 169 float currentTime() const; 170 void seek(float time); 171 172 float startTime() const; 173 174 float rate() const; 175 void setRate(float); 176 177 bool preservesPitch() const; 178 void setPreservesPitch(bool); 179 180 PassRefPtr<TimeRanges> buffered(); 181 float maxTimeSeekable(); 182 183 unsigned bytesLoaded(); 184 185 float volume() const; 186 void setVolume(float); 187 188 bool supportsMuting() const; 189 bool muted() const; 190 void setMuted(bool); 191 192 bool hasClosedCaptions() const; 193 void setClosedCaptionsVisible(bool closedCaptionsVisible); 194 195 bool autobuffer() const; 196 void setAutobuffer(bool); 197 198 void paint(GraphicsContext*, const IntRect&); 199 void paintCurrentFrameInContext(GraphicsContext*, const IntRect&); 200 201 enum NetworkState { Empty, Idle, Loading, Loaded, FormatError, NetworkError, DecodeError }; 202 NetworkState networkState(); 203 204 enum ReadyState { HaveNothing, HaveMetadata, HaveCurrentData, HaveFutureData, HaveEnoughData }; 205 ReadyState readyState(); 206 207 enum MovieLoadType { Unknown, Download, StoredStream, LiveStream }; 208 MovieLoadType movieLoadType() const; 209 210 void networkStateChanged(); 211 void readyStateChanged(); 212 void volumeChanged(float); 213 void muteChanged(bool); 214 void timeChanged(); 215 void sizeChanged(); 216 void rateChanged(); 217 void durationChanged(); 218 219 void repaint(); 220 221 MediaPlayerClient* mediaPlayerClient() const { return m_mediaPlayerClient; } 222 223 bool hasAvailableVideoFrame() const; 224 225 bool canLoadPoster() const; 226 void setPoster(const String&); 227 228 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 229 void deliverNotification(MediaPlayerProxyNotificationType notification); 230 void setMediaPlayerProxy(WebMediaPlayerProxy* proxy); 231 #endif 232 233 #if USE(ACCELERATED_COMPOSITING) 234 // whether accelerated rendering is supported by the media engine for the current media. 235 bool supportsAcceleratedRendering() const; 236 // called when the rendering system flips the into or out of accelerated rendering mode. 237 void acceleratedRenderingStateChanged(); 238 #endif 239 240 bool hasSingleSecurityOrigin() const; 241 242 private: 243 MediaPlayer(MediaPlayerClient*); 244 245 static void initializeMediaEngines(); 246 247 MediaPlayerClient* m_mediaPlayerClient; 248 OwnPtr<MediaPlayerPrivateInterface*> m_private; 249 void* m_currentMediaEngine; 250 FrameView* m_frameView; 251 IntSize m_size; 252 bool m_visible; 253 float m_rate; 254 float m_volume; 255 bool m_muted; 256 bool m_preservesPitch; 257 bool m_autobuffer; 258 #if PLATFORM(ANDROID) 259 MediaElementType m_mediaElementType; 260 #endif 261 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 262 WebMediaPlayerProxy* m_playerProxy; // not owned or used, passed to m_private 263 #endif 264 }; 265 266 typedef MediaPlayerPrivateInterface* (*CreateMediaEnginePlayer)(MediaPlayer*); 267 typedef void (*MediaEngineSupportedTypes)(HashSet<String>& types); 268 typedef MediaPlayer::SupportsType (*MediaEngineSupportsType)(const String& type, const String& codecs); 269 270 typedef void (*MediaEngineRegistrar)(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType); 271 272 273 } 274 275 #endif // ENABLE(VIDEO) 276 277 #endif 278