Add support for reporting "display composited video frames" through the VideoPlayback...
[WebKit-https.git] / Source / WebCore / platform / graphics / MediaPlayerPrivate.h
1 /*
2  * Copyright (C) 2009-2018 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 #pragma once
27
28 #if ENABLE(VIDEO)
29
30 #include "MediaPlayer.h"
31 #include "PlatformTimeRanges.h"
32
33 namespace WebCore {
34
35 class MediaPlayerPrivateInterface {
36     WTF_MAKE_NONCOPYABLE(MediaPlayerPrivateInterface); WTF_MAKE_FAST_ALLOCATED;
37 public:
38     MediaPlayerPrivateInterface() = default;
39     virtual ~MediaPlayerPrivateInterface() = default;
40
41     virtual void load(const String& url) = 0;
42 #if ENABLE(MEDIA_SOURCE)
43     virtual void load(const String& url, MediaSourcePrivateClient*) = 0;
44 #endif
45 #if ENABLE(MEDIA_STREAM)
46     virtual void load(MediaStreamPrivate&) = 0;
47 #endif
48     virtual void cancelLoad() = 0;
49     
50     virtual void prepareToPlay() { }
51     virtual PlatformLayer* platformLayer() const { return 0; }
52
53 #if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
54     virtual void setVideoFullscreenLayer(PlatformLayer*, WTF::Function<void()>&& completionHandler) { completionHandler(); }
55     virtual void updateVideoFullscreenInlineImage() { }
56     virtual void setVideoFullscreenFrame(FloatRect) { }
57     virtual void setVideoFullscreenGravity(MediaPlayer::VideoGravity) { }
58     virtual void setVideoFullscreenMode(MediaPlayer::VideoFullscreenMode) { }
59 #endif
60
61 #if PLATFORM(IOS)
62     virtual NSArray *timedMetadata() const { return 0; }
63     virtual String accessLog() const { return emptyString(); }
64     virtual String errorLog() const { return emptyString(); }
65 #endif
66     virtual long platformErrorCode() const { return 0; }
67
68     virtual void play() = 0;
69     virtual void pause() = 0;    
70     virtual void setShouldBufferData(bool) { }
71
72     virtual bool supportsPictureInPicture() const { return false; }
73     virtual bool supportsFullscreen() const { return false; }
74     virtual bool supportsScanning() const { return false; }
75     virtual bool requiresImmediateCompositing() const { return false; }
76
77     virtual bool canSaveMediaData() const { return false; }
78
79     virtual FloatSize naturalSize() const = 0;
80
81     virtual bool hasVideo() const = 0;
82     virtual bool hasAudio() const = 0;
83
84     virtual void setVisible(bool) = 0;
85
86     virtual float duration() const { return 0; }
87     virtual double durationDouble() const { return duration(); }
88     virtual MediaTime durationMediaTime() const { return MediaTime::createWithDouble(durationDouble()); }
89
90     virtual float currentTime() const { return 0; }
91     virtual double currentTimeDouble() const { return currentTime(); }
92     virtual MediaTime currentMediaTime() const { return MediaTime::createWithDouble(currentTimeDouble()); }
93
94     virtual MediaTime getStartDate() const { return MediaTime::createWithDouble(std::numeric_limits<double>::quiet_NaN()); }
95
96     virtual void seek(float) { }
97     virtual void seekDouble(double time) { seek(time); }
98     virtual void seek(const MediaTime& time) { seekDouble(time.toDouble()); }
99     virtual void seekWithTolerance(const MediaTime& time, const MediaTime&, const MediaTime&) { seek(time); }
100
101     virtual bool seeking() const = 0;
102
103     virtual MediaTime startTime() const { return MediaTime::zeroTime(); }
104     virtual MediaTime initialTime() const { return MediaTime::zeroTime(); }
105
106     virtual void setRate(float) { }
107     virtual void setRateDouble(double rate) { setRate(rate); }
108     virtual double rate() const { return 0; }
109
110     virtual void setPreservesPitch(bool) { }
111
112     virtual bool paused() const = 0;
113
114     virtual void setVolume(float) { }
115     virtual void setVolumeDouble(double volume) { return setVolume(volume); }
116 #if PLATFORM(IOS) || USE(GSTREAMER)
117     virtual float volume() const { return 1; }
118 #endif
119
120     virtual bool supportsMuting() const { return false; }
121     virtual void setMuted(bool) { }
122
123     virtual bool hasClosedCaptions() const { return false; }    
124     virtual void setClosedCaptionsVisible(bool) { }
125
126     virtual double maxFastForwardRate() const { return std::numeric_limits<double>::infinity(); }
127     virtual double minFastReverseRate() const { return -std::numeric_limits<double>::infinity(); }
128
129     virtual MediaPlayer::NetworkState networkState() const = 0;
130     virtual MediaPlayer::ReadyState readyState() const = 0;
131
132     virtual std::unique_ptr<PlatformTimeRanges> seekable() const { return maxMediaTimeSeekable() == MediaTime::zeroTime() ? std::make_unique<PlatformTimeRanges>() : std::make_unique<PlatformTimeRanges>(minMediaTimeSeekable(), maxMediaTimeSeekable()); }
133     virtual float maxTimeSeekable() const { return 0; }
134     virtual MediaTime maxMediaTimeSeekable() const { return MediaTime::createWithDouble(maxTimeSeekable()); }
135     virtual double minTimeSeekable() const { return 0; }
136     virtual MediaTime minMediaTimeSeekable() const { return MediaTime::createWithDouble(minTimeSeekable()); }
137     virtual std::unique_ptr<PlatformTimeRanges> buffered() const = 0;
138     virtual double seekableTimeRangesLastModifiedTime() const { return 0; }
139     virtual double liveUpdateInterval() const { return 0; }
140
141     virtual unsigned long long totalBytes() const { return 0; }
142     virtual bool didLoadingProgress() const = 0;
143
144     virtual void setSize(const IntSize&) = 0;
145
146     virtual void paint(GraphicsContext&, const FloatRect&) = 0;
147
148     virtual void paintCurrentFrameInContext(GraphicsContext& c, const FloatRect& r) { paint(c, r); }
149     virtual bool copyVideoTextureToPlatformTexture(GraphicsContext3D*, Platform3DObject, GC3Denum, GC3Dint, GC3Denum, GC3Denum, GC3Denum, bool, bool) { return false; }
150     virtual NativeImagePtr nativeImageForCurrentTime() { return nullptr; }
151
152     virtual void setPreload(MediaPlayer::Preload) { }
153
154     virtual bool hasAvailableVideoFrame() const { return readyState() >= MediaPlayer::HaveCurrentData; }
155
156     virtual bool canLoadPoster() const { return false; }
157     virtual void setPoster(const String&) { }
158
159 #if USE(NATIVE_FULLSCREEN_VIDEO)
160     virtual void enterFullscreen() { }
161     virtual void exitFullscreen() { }
162 #endif
163
164 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
165
166     virtual String wirelessPlaybackTargetName() const { return emptyString(); }
167     virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const { return MediaPlayer::TargetTypeNone; }
168
169     virtual bool wirelessVideoPlaybackDisabled() const { return true; }
170     virtual void setWirelessVideoPlaybackDisabled(bool) { }
171
172     virtual bool canPlayToWirelessPlaybackTarget() const { return false; }
173     virtual bool isCurrentPlaybackTargetWireless() const { return false; }
174     virtual void setWirelessPlaybackTarget(Ref<MediaPlaybackTarget>&&) { }
175
176     virtual void setShouldPlayToPlaybackTarget(bool) { }
177 #endif
178
179 #if USE(NATIVE_FULLSCREEN_VIDEO)
180     virtual bool canEnterFullscreen() const { return false; }
181 #endif
182
183     // whether accelerated rendering is supported by the media engine for the current media.
184     virtual bool supportsAcceleratedRendering() const { return false; }
185     // called when the rendering system flips the into or out of accelerated rendering mode.
186     virtual void acceleratedRenderingStateChanged() { }
187
188     virtual bool shouldMaintainAspectRatio() const { return true; }
189     virtual void setShouldMaintainAspectRatio(bool) { }
190
191     virtual bool hasSingleSecurityOrigin() const { return false; }
192     virtual bool didPassCORSAccessCheck() const { return false; }
193     virtual std::optional<bool> wouldTaintOrigin(const SecurityOrigin&) const { return std::nullopt; }
194
195     virtual MediaPlayer::MovieLoadType movieLoadType() const { return MediaPlayer::Unknown; }
196
197     virtual void prepareForRendering() { }
198
199     // Time value in the movie's time scale. It is only necessary to override this if the media
200     // engine uses rational numbers to represent media time.
201     virtual MediaTime mediaTimeForTimeValue(const MediaTime& timeValue) const { return timeValue; }
202
203     // Overide this if it is safe for HTMLMediaElement to cache movie time and report
204     // 'currentTime' as [cached time + elapsed wall time]. Returns the maximum wall time
205     // it is OK to calculate movie time before refreshing the cached time.
206     virtual double maximumDurationToCacheMediaTime() const { return 0; }
207
208     virtual unsigned decodedFrameCount() const { return 0; }
209     virtual unsigned droppedFrameCount() const { return 0; }
210     virtual unsigned audioDecodedByteCount() const { return 0; }
211     virtual unsigned videoDecodedByteCount() const { return 0; }
212
213     HashSet<RefPtr<SecurityOrigin>> originsInMediaCache(const String&) { return { }; }
214     void clearMediaCache(const String&, WallTime) { }
215     void clearMediaCacheForOrigins(const String&, const HashSet<RefPtr<SecurityOrigin>>&) { }
216
217     virtual void setPrivateBrowsingMode(bool) { }
218
219     virtual String engineDescription() const { return emptyString(); }
220
221 #if ENABLE(WEB_AUDIO)
222     virtual AudioSourceProvider* audioSourceProvider() { return 0; }
223 #endif
224
225 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
226     virtual std::unique_ptr<LegacyCDMSession> createSession(const String&, LegacyCDMSessionClient*) { return nullptr; }
227     virtual void setCDMSession(LegacyCDMSession*) { }
228     virtual void keyAdded() { }
229 #endif
230
231 #if ENABLE(ENCRYPTED_MEDIA)
232     virtual void cdmInstanceAttached(CDMInstance&) { }
233     virtual void cdmInstanceDetached(CDMInstance&) { }
234     virtual void attemptToDecryptWithInstance(CDMInstance&) { }
235     virtual bool waitingForKey() const { return false; }
236 #endif
237
238 #if ENABLE(VIDEO_TRACK)
239     virtual bool requiresTextTrackRepresentation() const { return false; }
240     virtual void setTextTrackRepresentation(TextTrackRepresentation*) { }
241     virtual void syncTextTrackBounds() { };
242     virtual void tracksChanged() { };
243 #endif
244
245 #if USE(GSTREAMER)
246     virtual void simulateAudioInterruption() { }
247 #endif
248
249     virtual void beginSimulatedHDCPError() { }
250     virtual void endSimulatedHDCPError() { }
251
252     virtual String languageOfPrimaryAudioTrack() const { return emptyString(); }
253
254     virtual size_t extraMemoryCost() const
255     {
256         MediaTime duration = this->durationMediaTime();
257         if (!duration)
258             return 0;
259
260         unsigned long long extra = totalBytes() * buffered()->totalDuration().toDouble() / duration.toDouble();
261         return static_cast<unsigned>(extra);
262     }
263
264     virtual unsigned long long fileSize() const { return 0; }
265
266     virtual bool ended() const { return false; }
267
268     virtual std::optional<VideoPlaybackQualityMetrics> videoPlaybackQualityMetrics() { return std::nullopt; }
269
270 #if ENABLE(AVF_CAPTIONS)
271     virtual void notifyTrackModeChanged() { }
272 #endif
273
274     virtual void notifyActiveSourceBuffersChanged() { }
275
276     virtual void setShouldDisableSleep(bool) { }
277
278     virtual void applicationWillResignActive() { }
279     virtual void applicationDidBecomeActive() { }
280
281 #if ENABLE(VIDEO) && USE(AVFOUNDATION)
282     virtual AVPlayer *objCAVFoundationAVPlayer() const { return nullptr; }
283 #endif
284 };
285
286 }
287
288 #endif