[MediaStream] A stream's first video frame should be rendered
[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         WaitingForFirstImage,
193         PausedImage,
194         LivePreview,
195     };
196     DisplayMode currentDisplayMode() const;
197     bool updateDisplayMode();
198     void updateCurrentFrameImage();
199
200     enum class PlaybackState {
201         None,
202         Playing,
203         Paused,
204     };
205     bool playing() const { return m_playbackState == PlaybackState::Playing; }
206
207     // MediaStreamPrivate::Observer
208     void activeStatusChanged() override;
209     void characteristicsChanged() override;
210     void didAddTrack(MediaStreamTrackPrivate&) override;
211     void didRemoveTrack(MediaStreamTrackPrivate&) override;
212
213     // MediaStreamPrivateTrack::Observer
214     void trackStarted(MediaStreamTrackPrivate&) override { };
215     void trackEnded(MediaStreamTrackPrivate&) override { };
216     void trackMutedChanged(MediaStreamTrackPrivate&) override { };
217     void trackSettingsChanged(MediaStreamTrackPrivate&) override { };
218     void trackEnabledChanged(MediaStreamTrackPrivate&) override { };
219     void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) override;
220     void readyStateChanged(MediaStreamTrackPrivate&) override;
221
222     void setVideoFullscreenLayer(PlatformLayer*, WTF::Function<void()>&& completionHandler) override;
223     void setVideoFullscreenFrame(FloatRect) override;
224
225     MediaTime streamTime() const;
226
227     AudioSourceProvider* audioSourceProvider() final;
228
229     CGAffineTransform videoTransformationMatrix(MediaSample&, bool forceUpdate = false);
230
231     void applicationDidBecomeActive() final;
232
233     bool hideBackgroundLayer() const { return (!m_activeVideoTrack || m_waitingForFirstImage) && m_displayMode != PaintItBlack; }
234
235     MediaPlayer* m_player { nullptr };
236     RefPtr<MediaStreamPrivate> m_mediaStreamPrivate;
237     RefPtr<MediaStreamTrackPrivate> m_activeVideoTrack;
238     RetainPtr<WebAVSampleBufferStatusChangeListener> m_statusChangeListener;
239     RetainPtr<AVSampleBufferDisplayLayer> m_sampleBufferDisplayLayer;
240     RetainPtr<PlatformLayer> m_backgroundLayer;
241     std::unique_ptr<PAL::Clock> m_clock;
242
243     MediaTime m_pausedTime;
244
245     struct CurrentFramePainter {
246         CurrentFramePainter() = default;
247         void reset();
248
249         RetainPtr<CGImageRef> cgImage;
250         RefPtr<MediaSample> mediaSample;
251         std::unique_ptr<PixelBufferConformerCV> pixelBufferConformer;
252     };
253     CurrentFramePainter m_imagePainter;
254
255     HashMap<String, RefPtr<AudioTrackPrivateMediaStreamCocoa>> m_audioTrackMap;
256     HashMap<String, RefPtr<VideoTrackPrivateMediaStream>> m_videoTrackMap;
257     PendingSampleQueue m_pendingVideoSampleQueue;
258
259     MediaPlayer::NetworkState m_networkState { MediaPlayer::Empty };
260     MediaPlayer::ReadyState m_readyState { MediaPlayer::HaveNothing };
261     FloatSize m_intrinsicSize;
262     float m_volume { 1 };
263     DisplayMode m_displayMode { None };
264     PlaybackState m_playbackState { PlaybackState::None };
265     MediaSample::VideoRotation m_videoRotation { MediaSample::VideoRotation::None };
266     CGAffineTransform m_videoTransform;
267     std::unique_ptr<VideoFullscreenLayerManagerObjC> m_videoFullscreenLayerManager;
268
269 #if !RELEASE_LOG_DISABLED
270     Ref<const Logger> m_logger;
271     const void* m_logIdentifier;
272 #endif
273
274     bool m_videoMirrored { false };
275     bool m_playing { false };
276     bool m_muted { false };
277     bool m_ended { false };
278     bool m_hasEverEnqueuedVideoFrame { false };
279     bool m_pendingSelectedTrackCheck { false };
280     bool m_transformIsValid { false };
281     bool m_visible { false };
282     bool m_haveSeenMetadata { false };
283     bool m_waitingForFirstImage { false };
284 };
285     
286 }
287
288 #endif // ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
289
290 #endif // MediaPlayerPrivateMediaStreamAVFObjC_h