6bb1016603c96bea861a2cc15d7bb6e3f0b7121d
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / objc / MediaPlayerPrivateMediaStreamAVFObjC.h
1 /*
2  * Copyright (C) 2015-2017 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 MediaPlayerPrivateMediaStreamAVFObjC_h
27 #define MediaPlayerPrivateMediaStreamAVFObjC_h
28
29 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
30
31 #include "MediaPlayerPrivate.h"
32 #include "MediaSample.h"
33 #include "MediaStreamPrivate.h"
34 #include <CoreGraphics/CGAffineTransform.h>
35 #include <wtf/Function.h>
36 #include <wtf/LoggerHelper.h>
37 #include <wtf/MediaTime.h>
38 #include <wtf/WeakPtr.h>
39
40 OBJC_CLASS AVSampleBufferAudioRenderer;
41 OBJC_CLASS AVSampleBufferDisplayLayer;
42 OBJC_CLASS AVSampleBufferRenderSynchronizer;
43 OBJC_CLASS AVStreamSession;
44 OBJC_CLASS NSNumber;
45 OBJC_CLASS WebAVSampleBufferStatusChangeListener;
46
47 namespace PAL {
48 class Clock;
49 }
50
51 namespace WebCore {
52
53 class AudioTrackPrivateMediaStreamCocoa;
54 class AVVideoCaptureSource;
55 class MediaSourcePrivateClient;
56 class PixelBufferConformerCV;
57 class VideoFullscreenLayerManagerObjC;
58 class VideoTrackPrivateMediaStream;
59
60 class MediaPlayerPrivateMediaStreamAVFObjC final : public CanMakeWeakPtr<MediaPlayerPrivateMediaStreamAVFObjC>, public MediaPlayerPrivateInterface, private MediaStreamPrivate::Observer, private MediaStreamTrackPrivate::Observer
61 #if !RELEASE_LOG_DISABLED
62     , private LoggerHelper
63 #endif
64 {
65 public:
66     explicit MediaPlayerPrivateMediaStreamAVFObjC(MediaPlayer*);
67     virtual ~MediaPlayerPrivateMediaStreamAVFObjC();
68
69     static void registerMediaEngine(MediaEngineRegistrar);
70
71     // MediaPlayer Factory Methods
72     static bool isAvailable();
73     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>& types);
74     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
75
76     MediaPlayer::NetworkState networkState() const override;
77     void setNetworkState(MediaPlayer::NetworkState);
78     MediaPlayer::ReadyState readyState() const override;
79     void setReadyState(MediaPlayer::ReadyState);
80
81     void ensureLayers();
82     void destroyLayers();
83
84     void layerStatusDidChange(AVSampleBufferDisplayLayer*);
85     void layerErrorDidChange(AVSampleBufferDisplayLayer*);
86     void backgroundLayerBoundsChanged();
87
88     PlatformLayer* displayLayer();
89     PlatformLayer* backgroundLayer();
90
91 #if !RELEASE_LOG_DISABLED
92     const Logger& logger() const final { return m_logger.get(); }
93     const char* logClassName() const override { return "MediaPlayerPrivateMediaStreamAVFObjC"; }
94     const void* logIdentifier() const final { return reinterpret_cast<const void*>(m_logIdentifier); }
95     WTFLogChannel& logChannel() const final;
96 #endif
97
98 private:
99     // MediaPlayerPrivateInterface
100
101     // FIXME(146853): Implement necessary conformations to standard in HTMLMediaElement for MediaStream
102
103     bool didPassCORSAccessCheck() const final;
104
105     void load(const String&) override;
106 #if ENABLE(MEDIA_SOURCE)
107     void load(const String&, MediaSourcePrivateClient*) override;
108 #endif
109     void load(MediaStreamPrivate&) override;
110     void cancelLoad() override;
111
112     void prepareToPlay() override;
113     PlatformLayer* platformLayer() const override;
114     
115     bool supportsPictureInPicture() const override;
116     bool supportsFullscreen() const override { return true; }
117
118     void play() override;
119     void pause() override;
120     bool paused() const override { return !playing(); }
121
122     void setVolume(float) override;
123     void setMuted(bool) override;
124     bool supportsMuting() const override { return true; }
125
126     bool supportsScanning() const override { return false; }
127
128     FloatSize naturalSize() const override { return m_intrinsicSize; }
129
130     bool hasVideo() const override;
131     bool hasAudio() const override;
132
133     void setVisible(bool) final;
134
135     MediaTime durationMediaTime() const override;
136     MediaTime currentMediaTime() const override;
137
138     bool seeking() const override { return false; }
139
140     std::unique_ptr<PlatformTimeRanges> seekable() const override;
141     std::unique_ptr<PlatformTimeRanges> buffered() const override;
142
143     bool didLoadingProgress() const override { return m_playing; }
144
145     void setSize(const IntSize&) override { /* No-op */ }
146
147     void flushRenderers();
148
149     using PendingSampleQueue = Deque<Ref<MediaSample>>;
150     void addSampleToPendingQueue(PendingSampleQueue&, MediaSample&);
151     void removeOldSamplesFromPendingQueue(PendingSampleQueue&);
152
153     MediaTime calculateTimelineOffset(const MediaSample&, double);
154     
155     void enqueueVideoSample(MediaStreamTrackPrivate&, MediaSample&);
156     void enqueueCorrectedVideoSample(MediaSample&);
157     void flushAndRemoveVideoSampleBuffers();
158     void requestNotificationWhenReadyForVideoData();
159
160     void paint(GraphicsContext&, const FloatRect&) override;
161     void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&) override;
162     bool metaDataAvailable() const { return m_mediaStreamPrivate && m_readyState >= MediaPlayer::HaveMetadata; }
163
164     void acceleratedRenderingStateChanged() override;
165     bool supportsAcceleratedRendering() const override { return true; }
166
167     bool hasSingleSecurityOrigin() const override { return true; }
168
169     MediaPlayer::MovieLoadType movieLoadType() const override { return MediaPlayer::LiveStream; }
170
171     String engineDescription() const override;
172
173     size_t extraMemoryCost() const override { return 0; }
174
175     bool ended() const override { return m_ended; }
176
177     void setShouldBufferData(bool) override;
178
179     MediaPlayer::ReadyState currentReadyState();
180     void updateReadyState();
181
182     void updateTracks();
183     void updateRenderingMode();
184     void checkSelectedVideoTrack();
185     void updateDisplayLayer();
186
187     void scheduleDeferredTask(Function<void ()>&&);
188
189     enum DisplayMode {
190         None,
191         PaintItBlack,
192         PausedImage,
193         LivePreview,
194     };
195     DisplayMode currentDisplayMode() const;
196     bool updateDisplayMode();
197     void updateCurrentFrameImage();
198
199     enum class PlaybackState {
200         None,
201         Playing,
202         Paused,
203     };
204     bool playing() const { return m_playbackState == PlaybackState::Playing; }
205
206     // MediaStreamPrivate::Observer
207     void activeStatusChanged() override;
208     void characteristicsChanged() override;
209     void didAddTrack(MediaStreamTrackPrivate&) override;
210     void didRemoveTrack(MediaStreamTrackPrivate&) override;
211
212     // MediaStreamPrivateTrack::Observer
213     void trackStarted(MediaStreamTrackPrivate&) override { };
214     void trackEnded(MediaStreamTrackPrivate&) override { };
215     void trackMutedChanged(MediaStreamTrackPrivate&) override { };
216     void trackSettingsChanged(MediaStreamTrackPrivate&) override { };
217     void trackEnabledChanged(MediaStreamTrackPrivate&) override { };
218     void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) override;
219     void readyStateChanged(MediaStreamTrackPrivate&) override;
220
221     void setVideoFullscreenLayer(PlatformLayer*, WTF::Function<void()>&& completionHandler) override;
222     void setVideoFullscreenFrame(FloatRect) override;
223
224     MediaTime streamTime() const;
225
226     AudioSourceProvider* audioSourceProvider() final;
227
228     CGAffineTransform videoTransformationMatrix(MediaSample&, bool forceUpdate = false);
229
230     void applicationDidBecomeActive() final;
231
232     MediaPlayer* m_player { nullptr };
233     RefPtr<MediaStreamPrivate> m_mediaStreamPrivate;
234     RefPtr<MediaStreamTrackPrivate> m_activeVideoTrack;
235     RetainPtr<WebAVSampleBufferStatusChangeListener> m_statusChangeListener;
236     RetainPtr<AVSampleBufferDisplayLayer> m_sampleBufferDisplayLayer;
237     RetainPtr<PlatformLayer> m_backgroundLayer;
238     std::unique_ptr<PAL::Clock> m_clock;
239
240     MediaTime m_pausedTime;
241
242     struct CurrentFramePainter {
243         CurrentFramePainter() = default;
244         void reset();
245
246         RetainPtr<CGImageRef> cgImage;
247         RefPtr<MediaSample> mediaSample;
248         std::unique_ptr<PixelBufferConformerCV> pixelBufferConformer;
249     };
250     CurrentFramePainter m_imagePainter;
251
252     HashMap<String, RefPtr<AudioTrackPrivateMediaStreamCocoa>> m_audioTrackMap;
253     HashMap<String, RefPtr<VideoTrackPrivateMediaStream>> m_videoTrackMap;
254     PendingSampleQueue m_pendingVideoSampleQueue;
255
256     MediaPlayer::NetworkState m_networkState { MediaPlayer::Empty };
257     MediaPlayer::ReadyState m_readyState { MediaPlayer::HaveNothing };
258     FloatSize m_intrinsicSize;
259     float m_volume { 1 };
260     DisplayMode m_displayMode { None };
261     PlaybackState m_playbackState { PlaybackState::None };
262     MediaSample::VideoRotation m_videoRotation { MediaSample::VideoRotation::None };
263     CGAffineTransform m_videoTransform;
264     std::unique_ptr<VideoFullscreenLayerManagerObjC> m_videoFullscreenLayerManager;
265
266 #if !RELEASE_LOG_DISABLED
267     Ref<const Logger> m_logger;
268     const void* m_logIdentifier;
269 #endif
270
271     bool m_videoMirrored { false };
272     bool m_playing { false };
273     bool m_muted { false };
274     bool m_ended { false };
275     bool m_hasEverEnqueuedVideoFrame { false };
276     bool m_pendingSelectedTrackCheck { false };
277     bool m_shouldDisplayFirstVideoFrame { false };
278     bool m_transformIsValid { false };
279     bool m_visible { false };
280     bool m_haveSeenMetadata { false };
281 };
282     
283 }
284
285 #endif // ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
286
287 #endif // MediaPlayerPrivateMediaStreamAVFObjC_h