321aa191226df6702eb31bfbc16a1be146693822
[WebKit.git] / Source / WebCore / platform / graphics / avfoundation / objc / MediaPlayerPrivateMediaSourceAVFObjC.h
1 /*
2  * Copyright (C) 2013 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 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.
24  */
25
26 #ifndef MediaPlayerPrivateMediaSourceAVFObjC_h
27 #define MediaPlayerPrivateMediaSourceAVFObjC_h
28
29 #if ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
30
31 #include "MediaPlayerPrivate.h"
32 #include "SourceBufferPrivateClient.h"
33 #include <wtf/MediaTime.h>
34 #include <wtf/Vector.h>
35 #include <wtf/WeakPtr.h>
36
37 OBJC_CLASS AVAsset;
38 OBJC_CLASS AVSampleBufferAudioRenderer;
39 OBJC_CLASS AVSampleBufferDisplayLayer;
40 OBJC_CLASS AVSampleBufferRenderSynchronizer;
41 OBJC_CLASS AVStreamSession;
42
43 typedef struct OpaqueCMTimebase* CMTimebaseRef;
44
45 namespace WebCore {
46
47 class CDMSessionMediaSourceAVFObjC;
48 class PlatformClockCM;
49 class MediaSourcePrivateAVFObjC;
50
51 #if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
52 class VideoFullscreenLayerManager;
53 #endif
54
55 class MediaPlayerPrivateMediaSourceAVFObjC : public MediaPlayerPrivateInterface {
56 public:
57     explicit MediaPlayerPrivateMediaSourceAVFObjC(MediaPlayer*);
58     virtual ~MediaPlayerPrivateMediaSourceAVFObjC();
59
60     static void registerMediaEngine(MediaEngineRegistrar);
61
62     // MediaPlayer Factory Methods
63     static bool isAvailable();
64     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>& types);
65     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
66
67     void addDisplayLayer(AVSampleBufferDisplayLayer*);
68     void removeDisplayLayer(AVSampleBufferDisplayLayer*);
69
70     void addAudioRenderer(AVSampleBufferAudioRenderer*);
71     void removeAudioRenderer(AVSampleBufferAudioRenderer*);
72
73     MediaPlayer::NetworkState networkState() const override;
74     MediaPlayer::ReadyState readyState() const override;
75     void setReadyState(MediaPlayer::ReadyState);
76     void setNetworkState(MediaPlayer::NetworkState);
77
78     void seekInternal();
79     void waitForSeekCompleted();
80     void seekCompleted();
81     void setLoadingProgresssed(bool flag) { m_loadingProgressed = flag; }
82     void setHasAvailableVideoFrame(bool flag) { m_hasAvailableVideoFrame = flag; }
83     void durationChanged();
84
85     void effectiveRateChanged();
86     void sizeWillChangeAtTime(const MediaTime&, const FloatSize&);
87     void flushPendingSizeChanges();
88     void characteristicsChanged();
89
90 #if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
91     void setVideoFullscreenLayer(PlatformLayer*, std::function<void()> completionHandler) override;
92     void setVideoFullscreenFrame(FloatRect) override;
93 #endif
94
95 #if ENABLE(ENCRYPTED_MEDIA_V2)
96     bool hasStreamSession() { return m_streamSession; }
97     AVStreamSession *streamSession();
98     void setCDMSession(CDMSession*) override;
99     CDMSessionMediaSourceAVFObjC* cdmSession() const { return m_session; }
100     void keyNeeded(Uint8Array*);
101 #endif
102
103     WeakPtr<MediaPlayerPrivateMediaSourceAVFObjC> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
104
105 private:
106     // MediaPlayerPrivateInterface
107     void load(const String& url) override;
108     void load(const String& url, MediaSourcePrivateClient*) override;
109 #if ENABLE(MEDIA_STREAM)
110     void load(MediaStreamPrivate&) override;
111 #endif
112     void cancelLoad() override;
113
114     void prepareToPlay() override;
115     PlatformMedia platformMedia() const override;
116     PlatformLayer* platformLayer() const override;
117
118     bool supportsFullscreen() const override { return true; }
119
120     void play() override;
121     void playInternal();
122
123     void pause() override;
124     void pauseInternal();
125
126     bool paused() const override;
127
128     void setVolume(float volume) override;
129     bool supportsMuting() const override { return true; }
130     void setMuted(bool) override;
131
132     bool supportsScanning() const override;
133
134     FloatSize naturalSize() const override;
135
136     bool hasVideo() const override;
137     bool hasAudio() const override;
138
139     void setVisible(bool) override;
140
141     MediaTime durationMediaTime() const override;
142     MediaTime currentMediaTime() const override;
143     MediaTime startTime() const override;
144     MediaTime initialTime() const override;
145
146     void seekWithTolerance(const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold) override;
147     bool seeking() const override;
148     void setRateDouble(double) override;
149
150     void setPreservesPitch(bool) override;
151
152     std::unique_ptr<PlatformTimeRanges> seekable() const override;
153     MediaTime maxMediaTimeSeekable() const override;
154     MediaTime minMediaTimeSeekable() const override;
155     std::unique_ptr<PlatformTimeRanges> buffered() const override;
156
157     bool didLoadingProgress() const override;
158
159     void setSize(const IntSize&) override;
160
161     void paint(GraphicsContext&, const FloatRect&) override;
162     void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&) override;
163
164     bool hasAvailableVideoFrame() const override;
165
166     bool supportsAcceleratedRendering() const override;
167     // called when the rendering system flips the into or out of accelerated rendering mode.
168     void acceleratedRenderingStateChanged() override;
169     void notifyActiveSourceBuffersChanged() override;
170
171     MediaPlayer::MovieLoadType movieLoadType() const override;
172
173     void prepareForRendering() override;
174
175     String engineDescription() const override;
176
177     String languageOfPrimaryAudioTrack() const override;
178
179     size_t extraMemoryCost() const override;
180
181     unsigned long totalVideoFrames() override;
182     unsigned long droppedVideoFrames() override;
183     unsigned long corruptedVideoFrames() override;
184     MediaTime totalFrameDelay() override;
185
186 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
187     bool isCurrentPlaybackTargetWireless() const override;
188     void setWirelessPlaybackTarget(Ref<MediaPlaybackTarget>&&) override;
189     void setShouldPlayToPlaybackTarget(bool) override;
190     bool wirelessVideoPlaybackDisabled() const override { return false; }
191 #endif
192
193     void ensureLayer();
194     void destroyLayer();
195     bool shouldBePlaying() const;
196
197     friend class MediaSourcePrivateAVFObjC;
198
199     struct PendingSeek {
200         PendingSeek(const MediaTime& targetTime, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold)
201             : targetTime(targetTime)
202             , negativeThreshold(negativeThreshold)
203             , positiveThreshold(positiveThreshold)
204         {
205         }
206         MediaTime targetTime;
207         MediaTime negativeThreshold;
208         MediaTime positiveThreshold;
209     };
210     std::unique_ptr<PendingSeek> m_pendingSeek;
211
212     MediaPlayer* m_player;
213     WeakPtrFactory<MediaPlayerPrivateMediaSourceAVFObjC> m_weakPtrFactory;
214     WeakPtrFactory<MediaPlayerPrivateMediaSourceAVFObjC> m_sizeChangeObserverWeakPtrFactory;
215     RefPtr<MediaSourcePrivateAVFObjC> m_mediaSourcePrivate;
216     RetainPtr<AVAsset> m_asset;
217     RetainPtr<AVSampleBufferDisplayLayer> m_sampleBufferDisplayLayer;
218     Vector<RetainPtr<AVSampleBufferAudioRenderer>> m_sampleBufferAudioRenderers;
219     RetainPtr<AVSampleBufferRenderSynchronizer> m_synchronizer;
220     RetainPtr<id> m_timeJumpedObserver;
221     RetainPtr<id> m_durationObserver;
222     RetainPtr<AVStreamSession> m_streamSession;
223     Deque<RetainPtr<id>> m_sizeChangeObservers;
224     Timer m_seekTimer;
225     CDMSessionMediaSourceAVFObjC* m_session;
226     MediaPlayer::NetworkState m_networkState;
227     MediaPlayer::ReadyState m_readyState;
228     MediaTime m_lastSeekTime;
229     FloatSize m_naturalSize;
230     double m_rate;
231     bool m_playing;
232     bool m_seeking;
233     bool m_seekCompleted;
234     mutable bool m_loadingProgressed;
235     bool m_hasAvailableVideoFrame;
236 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
237     RefPtr<MediaPlaybackTarget> m_playbackTarget;
238     bool m_shouldPlayToTarget { false };
239 #endif
240 #if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
241     std::unique_ptr<VideoFullscreenLayerManager> m_videoFullscreenLayerManager;
242 #endif
243 };
244
245 }
246
247 #endif // ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
248
249 #endif // MediaPlayerPrivateMediaSourceAVFObjC_h
250