2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef MediaPlayerPrivateAVFoundation_h
27 #define MediaPlayerPrivateAVFoundation_h
29 #if ENABLE(VIDEO) && USE(AVFOUNDATION)
31 #include "FloatSize.h"
32 #include "MediaPlayerPrivate.h"
34 #include <wtf/RetainPtr.h>
38 class MediaPlayerPrivateAVFoundation : public MediaPlayerPrivateInterface {
41 virtual void repaint();
42 virtual void metadataLoaded();
43 virtual void playabilityKnown();
44 virtual void rateChanged();
45 virtual void loadedTimeRangesChanged();
46 virtual void seekableTimeRangesChanged();
47 virtual void timeChanged(double);
48 virtual void seekCompleted(bool);
49 virtual void didEnd();
50 virtual void contentsNeedsDisplay() { }
59 ItemSeekableTimeRangesChanged,
60 ItemLoadedTimeRangesChanged,
61 ItemPresentationSizeChanged,
62 ItemIsPlaybackLikelyToKeepUpChanged,
63 ItemIsPlaybackBufferEmptyChanged,
64 ItemIsPlaybackBufferFullChanged,
66 AssetPlayabilityKnown,
81 Notification(Type type, double time)
88 Notification(Type type, bool finished)
91 , m_finished(finished)
95 Type type() { return m_type; }
96 bool isValid() { return m_type != None; }
97 double time() { return m_time; }
98 bool finished() { return m_finished; }
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();
113 MediaPlayerPrivateAVFoundation(MediaPlayer*);
114 virtual ~MediaPlayerPrivateAVFoundation();
116 // MediaPlayerPrivatePrivateInterface overrides.
117 virtual void load(const String& url);
118 virtual void cancelLoad() = 0;
120 virtual void prepareToPlay();
121 virtual PlatformMedia platformMedia() const = 0;
124 virtual void pause();
126 virtual IntSize naturalSize() const;
127 virtual bool hasVideo() const { return m_cachedHasVideo; }
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;
137 virtual bool hasClosedCaptions() const { return m_cachedHasCaptions; }
138 virtual void setClosedCaptionsVisible(bool) = 0;
139 virtual MediaPlayer::NetworkState networkState() const { return m_networkState; }
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&) = 0;
146 virtual void paintCurrentFrameInContext(GraphicsContext*, const IntRect&) = 0;
147 virtual void setPreload(MediaPlayer::Preload);
148 #if USE(ACCELERATED_COMPOSITING)
149 virtual PlatformLayer* platformLayer() const { return 0; }
150 virtual bool supportsAcceleratedRendering() const = 0;
151 virtual void acceleratedRenderingStateChanged();
153 virtual MediaPlayer::MovieLoadType movieLoadType() const;
154 virtual void prepareForRendering();
155 virtual float mediaTimeForTimeValue(float) const = 0;
157 virtual bool supportsFullscreen() const;
159 // Required interfaces for concrete derived classes.
160 virtual void createAVAssetForURL(const String&) = 0;
161 virtual void createAVPlayer() = 0;
162 virtual void createAVPlayerItem() = 0;
165 MediaPlayerAVPlayerItemStatusDoesNotExist,
166 MediaPlayerAVPlayerItemStatusUnknown,
167 MediaPlayerAVPlayerItemStatusFailed,
168 MediaPlayerAVPlayerItemStatusReadyToPlay,
169 MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty,
170 MediaPlayerAVPlayerItemStatusPlaybackBufferFull,
171 MediaPlayerAVPlayerItemStatusPlaybackLikelyToKeepUp,
173 virtual ItemStatus playerItemStatus() const = 0;
176 MediaPlayerAVAssetStatusDoesNotExist,
177 MediaPlayerAVAssetStatusUnknown,
178 MediaPlayerAVAssetStatusLoading,
179 MediaPlayerAVAssetStatusFailed,
180 MediaPlayerAVAssetStatusCancelled,
181 MediaPlayerAVAssetStatusLoaded,
182 MediaPlayerAVAssetStatusPlayable,
184 virtual AssetStatus assetStatus() const = 0;
186 virtual void platformSetVisible(bool) = 0;
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;
199 virtual void beginLoadingMetadata() = 0;
200 virtual void tracksChanged() = 0;
201 virtual void sizeChanged() = 0;
203 virtual void createContextVideoRenderer() = 0;
204 virtual void destroyContextVideoRenderer() = 0;
206 virtual void createVideoLayer() = 0;
207 virtual void destroyVideoLayer() = 0;
209 virtual bool hasAvailableVideoFrame() const = 0;
211 virtual bool hasContextRenderer() const = 0;
212 virtual bool hasLayerRenderer() const = 0;
217 void setHasVideo(bool);
218 void setHasAudio(bool);
219 void setHasClosedCaptions(bool);
220 void setDelayCallbacks(bool) const;
221 void setIgnoreLoadStateChanges(bool delay) { m_ignoreLoadStateChanges = delay; }
222 void setNaturalSize(IntSize);
223 bool isLiveStream() const { return isinf(duration()); }
225 enum MediaRenderingMode { MediaRenderingNone, MediaRenderingToContext, MediaRenderingToLayer };
226 MediaRenderingMode currentRenderingMode() const;
227 MediaRenderingMode preferredRenderingMode() const;
229 bool metaDataAvailable() const { return m_readyState >= MediaPlayer::HaveMetadata; }
230 float requestedRate() const { return m_requestedRate; }
231 float maxTimeLoaded() const;
232 bool isReadyForVideoSetup() const;
233 virtual void setUpVideoRendering();
234 virtual void tearDownVideoRendering();
235 bool hasSetUpVideoRendering() const;
237 static void mainThreadCallback(void*);
239 float invalidTime() const { return -1.0f; }
240 void invalidateCachedDuration();
242 const String& assetURL() const { return m_assetURL; }
245 MediaPlayer* m_player;
247 Vector<Notification> m_queuedNotifications;
248 mutable Mutex m_queueMutex;
250 mutable RefPtr<TimeRanges> m_cachedLoadedTimeRanges;
252 MediaPlayer::NetworkState m_networkState;
253 MediaPlayer::ReadyState m_readyState;
256 MediaPlayer::Preload m_preload;
258 IntSize m_cachedNaturalSize;
259 mutable float m_cachedMaxTimeLoaded;
260 mutable float m_cachedMaxTimeSeekable;
261 mutable float m_cachedDuration;
262 float m_reportedDuration;
265 float m_requestedRate;
266 mutable int m_delayCallbacks;
267 bool m_mainThreadCallPending;
268 bool m_assetIsPlayable;
270 bool m_loadingMetadata;
271 bool m_isAllowedToRender;
272 bool m_cachedHasAudio;
273 bool m_cachedHasVideo;
274 bool m_cachedHasCaptions;
275 bool m_ignoreLoadStateChanges;
276 bool m_haveReportedFirstVideoFrame;
277 bool m_playWhenFramesAvailable;
280 } // namespace WebCore
282 #endif // ENABLE(VIDEO) && USE(AVFOUNDATION)
284 #endif // MediaPlayerPrivateAVFoundation_h