2 * Copyright (C) 2011-2014 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 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 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 "InbandTextTrackPrivateAVF.h"
33 #include "MediaPlayerPrivate.h"
36 #include <wtf/Functional.h>
37 #include <wtf/RetainPtr.h>
38 #include <wtf/WeakPtr.h>
42 class InbandMetadataTextTrackPrivateAVF;
43 class InbandTextTrackPrivateAVF;
46 class MediaPlayerPrivateAVFoundation : public MediaPlayerPrivateInterface, public AVFInbandTrackParent
50 virtual void repaint();
51 virtual void metadataLoaded();
52 virtual void playabilityKnown();
53 virtual void rateChanged();
54 virtual void loadedTimeRangesChanged();
55 virtual void seekableTimeRangesChanged();
56 virtual void timeChanged(double);
57 virtual void seekCompleted(bool);
58 virtual void didEnd();
59 virtual void contentsNeedsDisplay() { }
60 virtual void configureInbandTracks();
61 virtual void setCurrentTextTrack(InbandTextTrackPrivateAVF*) { }
62 virtual InbandTextTrackPrivateAVF* currentTextTrack() const = 0;
63 #if ENABLE(IOS_AIRPLAY)
64 void playbackTargetIsWirelessChanged();
69 #define FOR_EACH_MEDIAPLAYERPRIVATEAVFOUNDATION_NOTIFICATION_TYPE(macro) \
71 macro(ItemDidPlayToEndTime) \
72 macro(ItemTracksChanged) \
73 macro(ItemStatusChanged) \
74 macro(ItemSeekableTimeRangesChanged) \
75 macro(ItemLoadedTimeRangesChanged) \
76 macro(ItemPresentationSizeChanged) \
77 macro(ItemIsPlaybackLikelyToKeepUpChanged) \
78 macro(ItemIsPlaybackBufferEmptyChanged) \
79 macro(ItemIsPlaybackBufferFullChanged) \
80 macro(AssetMetadataLoaded) \
81 macro(AssetPlayabilityKnown) \
82 macro(PlayerRateChanged) \
83 macro(PlayerTimeChanged) \
84 macro(SeekCompleted) \
85 macro(DurationChanged) \
86 macro(ContentsNeedsDisplay) \
87 macro(InbandTracksNeedConfiguration) \
88 macro(TargetIsWirelessChanged) \
91 #define DEFINE_TYPE_ENUM(type) type,
92 FOR_EACH_MEDIAPLAYERPRIVATEAVFOUNDATION_NOTIFICATION_TYPE(DEFINE_TYPE_ENUM)
93 #undef DEFINE_TYPE_ENUM
104 Notification(Type type, double time)
111 Notification(Type type, bool finished)
114 , m_finished(finished)
118 Notification(std::function<void ()> function)
119 : m_type(FunctionType)
122 , m_function(function)
126 Type type() { return m_type; }
127 bool isValid() { return m_type != None; }
128 double time() { return m_time; }
129 bool finished() { return m_finished; }
130 std::function<void ()>& function() { return m_function; }
136 std::function<void ()> m_function;
139 void scheduleMainThreadNotification(Notification);
140 void scheduleMainThreadNotification(Notification::Type, double time = 0);
141 void scheduleMainThreadNotification(Notification::Type, bool completed);
142 void dispatchNotification();
143 void clearMainThreadPendingFlag();
146 MediaPlayerPrivateAVFoundation(MediaPlayer*);
147 virtual ~MediaPlayerPrivateAVFoundation();
149 WeakPtr<MediaPlayerPrivateAVFoundation> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
151 // MediaPlayerPrivatePrivateInterface overrides.
152 virtual void load(const String& url) override;
153 #if ENABLE(MEDIA_SOURCE)
154 virtual void load(const String&, MediaSourcePrivateClient*);
156 virtual void cancelLoad() = 0;
158 virtual void prepareToPlay() override;
159 virtual PlatformMedia platformMedia() const = 0;
161 virtual void play() override;
162 virtual void pause() override;
164 virtual IntSize naturalSize() const override;
165 virtual bool hasVideo() const override { return m_cachedHasVideo; }
166 virtual bool hasAudio() const override { return m_cachedHasAudio; }
167 virtual void setVisible(bool) override;
168 virtual float duration() const override;
169 virtual float currentTime() const = 0;
170 virtual void seek(float) override;
171 virtual void seekWithTolerance(double, double, double) override;
172 virtual bool seeking() const override;
173 virtual void setRate(float) override;
174 virtual bool paused() const override;
175 virtual void setVolume(float) = 0;
176 virtual bool hasClosedCaptions() const override { return m_cachedHasCaptions; }
177 virtual void setClosedCaptionsVisible(bool) = 0;
178 virtual MediaPlayer::NetworkState networkState() const override { return m_networkState; }
179 virtual MediaPlayer::ReadyState readyState() const override { return m_readyState; }
180 virtual double maxTimeSeekableDouble() const override;
181 virtual double minTimeSeekable() const override;
182 virtual std::unique_ptr<PlatformTimeRanges> buffered() const override;
183 virtual bool didLoadingProgress() const override;
184 virtual void setSize(const IntSize&) override;
185 virtual void paint(GraphicsContext*, const IntRect&) = 0;
186 virtual void paintCurrentFrameInContext(GraphicsContext*, const IntRect&) = 0;
187 virtual void setPreload(MediaPlayer::Preload) override;
188 virtual PlatformLayer* platformLayer() const { return 0; }
189 virtual bool supportsAcceleratedRendering() const = 0;
190 virtual void acceleratedRenderingStateChanged() override;
191 virtual bool shouldMaintainAspectRatio() const override { return m_shouldMaintainAspectRatio; }
192 virtual void setShouldMaintainAspectRatio(bool) override;
194 virtual MediaPlayer::MovieLoadType movieLoadType() const;
195 virtual void prepareForRendering();
196 virtual float mediaTimeForTimeValue(float) const = 0;
198 virtual bool supportsFullscreen() const;
199 virtual bool supportsScanning() const { return true; }
200 unsigned long long fileSize() const { return totalBytes(); }
202 // Required interfaces for concrete derived classes.
203 virtual void createAVAssetForURL(const String&) = 0;
204 virtual void createAVPlayer() = 0;
205 virtual void createAVPlayerItem() = 0;
208 MediaPlayerAVPlayerItemStatusDoesNotExist,
209 MediaPlayerAVPlayerItemStatusUnknown,
210 MediaPlayerAVPlayerItemStatusFailed,
211 MediaPlayerAVPlayerItemStatusReadyToPlay,
212 MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty,
213 MediaPlayerAVPlayerItemStatusPlaybackBufferFull,
214 MediaPlayerAVPlayerItemStatusPlaybackLikelyToKeepUp,
216 virtual ItemStatus playerItemStatus() const = 0;
219 MediaPlayerAVAssetStatusDoesNotExist,
220 MediaPlayerAVAssetStatusUnknown,
221 MediaPlayerAVAssetStatusLoading,
222 MediaPlayerAVAssetStatusFailed,
223 MediaPlayerAVAssetStatusCancelled,
224 MediaPlayerAVAssetStatusLoaded,
225 MediaPlayerAVAssetStatusPlayable,
227 virtual AssetStatus assetStatus() const = 0;
229 virtual void platformSetVisible(bool) = 0;
230 virtual void platformPlay() = 0;
231 virtual void platformPause() = 0;
232 virtual void checkPlayability() = 0;
233 virtual void updateRate() = 0;
234 virtual float rate() const = 0;
235 virtual void seekToTime(double time, double negativeTolerance, double positiveTolerance) = 0;
236 virtual unsigned long long totalBytes() const = 0;
237 virtual std::unique_ptr<PlatformTimeRanges> platformBufferedTimeRanges() const = 0;
238 virtual double platformMaxTimeSeekable() const = 0;
239 virtual double platformMinTimeSeekable() const = 0;
240 virtual float platformMaxTimeLoaded() const = 0;
241 virtual float platformDuration() const = 0;
243 virtual void beginLoadingMetadata() = 0;
244 virtual void tracksChanged() = 0;
245 virtual void sizeChanged() = 0;
247 virtual void createContextVideoRenderer() = 0;
248 virtual void destroyContextVideoRenderer() = 0;
250 virtual void createVideoLayer() = 0;
251 virtual void destroyVideoLayer() = 0;
253 virtual bool hasAvailableVideoFrame() const = 0;
255 virtual bool hasContextRenderer() const = 0;
256 virtual bool hasLayerRenderer() const = 0;
258 virtual void updateVideoLayerGravity() = 0;
263 void setHasVideo(bool);
264 void setHasAudio(bool);
265 void setHasClosedCaptions(bool);
266 void characteristicsChanged();
267 void setDelayCharacteristicsChangedNotification(bool);
268 void setDelayCallbacks(bool) const;
269 void setIgnoreLoadStateChanges(bool delay) { m_ignoreLoadStateChanges = delay; }
270 void setNaturalSize(IntSize);
271 bool isLiveStream() const { return std::isinf(duration()); }
273 enum MediaRenderingMode { MediaRenderingNone, MediaRenderingToContext, MediaRenderingToLayer };
274 MediaRenderingMode currentRenderingMode() const;
275 MediaRenderingMode preferredRenderingMode() const;
277 bool metaDataAvailable() const { return m_readyState >= MediaPlayer::HaveMetadata; }
278 float requestedRate() const { return m_requestedRate; }
279 float maxTimeLoaded() const;
280 bool isReadyForVideoSetup() const;
281 virtual void setUpVideoRendering();
282 virtual void tearDownVideoRendering();
283 bool hasSetUpVideoRendering() const;
285 static void mainThreadCallback(void*);
287 void invalidateCachedDuration();
289 const String& assetURL() const { return m_assetURL; }
291 MediaPlayer* player() { return m_player; }
293 virtual String engineDescription() const { return "AVFoundation"; }
295 virtual size_t extraMemoryCost() const override;
297 virtual void trackModeChanged() override;
298 #if ENABLE(AVF_CAPTIONS)
299 virtual void notifyTrackModeChanged() { }
300 virtual void synchronizeTextTrackState() { }
302 void processNewAndRemovedTextTracks(const Vector<RefPtr<InbandTextTrackPrivateAVF>>&);
303 void clearTextTracks();
304 Vector<RefPtr<InbandTextTrackPrivateAVF>> m_textTracks;
307 MediaPlayer* m_player;
309 WeakPtrFactory<MediaPlayerPrivateAVFoundation> m_weakPtrFactory;
311 std::function<void()> m_pendingSeek;
313 Vector<Notification> m_queuedNotifications;
314 mutable Mutex m_queueMutex;
316 mutable std::unique_ptr<PlatformTimeRanges> m_cachedLoadedTimeRanges;
318 MediaPlayer::NetworkState m_networkState;
319 MediaPlayer::ReadyState m_readyState;
322 MediaPlayer::Preload m_preload;
324 IntSize m_cachedNaturalSize;
325 mutable float m_cachedMaxTimeLoaded;
326 mutable double m_cachedMaxTimeSeekable;
327 mutable double m_cachedMinTimeSeekable;
328 mutable float m_cachedDuration;
329 float m_reportedDuration;
330 mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
331 float m_requestedRate;
332 mutable int m_delayCallbacks;
333 int m_delayCharacteristicsChangedNotification;
334 bool m_mainThreadCallPending;
335 bool m_assetIsPlayable;
337 bool m_loadingMetadata;
338 bool m_isAllowedToRender;
339 bool m_cachedHasAudio;
340 bool m_cachedHasVideo;
341 bool m_cachedHasCaptions;
342 bool m_ignoreLoadStateChanges;
343 bool m_haveReportedFirstVideoFrame;
344 bool m_playWhenFramesAvailable;
345 bool m_inbandTrackConfigurationPending;
346 bool m_characteristicsChanged;
347 bool m_shouldMaintainAspectRatio;
351 } // namespace WebCore
353 #endif // ENABLE(VIDEO) && USE(AVFOUNDATION)
355 #endif // MediaPlayerPrivateAVFoundation_h