[GStreamer][EME] waitingforkey event should consider decryptors' waiting status
[WebKit-https.git] / Source / WebCore / platform / graphics / gstreamer / MediaPlayerPrivateGStreamerBase.h
1 /*
2  * Copyright (C) 2007, 2009 Apple Inc.  All rights reserved.
3  * Copyright (C) 2007 Collabora Ltd. All rights reserved.
4  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
5  * Copyright (C) 2009, 2010, 2015, 2016 Igalia S.L
6  * Copyright (C) 2015, 2016 Metrological Group B.V.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * aint with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  */
23
24 #ifndef MediaPlayerPrivateGStreamerBase_h
25 #define MediaPlayerPrivateGStreamerBase_h
26 #if ENABLE(VIDEO) && USE(GSTREAMER)
27
28 #include "GStreamerCommon.h"
29 #include "MainThreadNotifier.h"
30 #include "MediaPlayerPrivate.h"
31 #include "PlatformLayer.h"
32 #include <glib.h>
33 #include <gst/gst.h>
34 #include <wtf/Condition.h>
35 #include <wtf/Forward.h>
36 #include <wtf/RunLoop.h>
37 #include <wtf/WeakPtr.h>
38
39 #if USE(TEXTURE_MAPPER_GL)
40 #if USE(NICOSIA)
41 #include "NicosiaContentLayerTextureMapperImpl.h"
42 #else
43 #include "TextureMapperPlatformLayerProxyProvider.h"
44 #endif
45 #endif
46
47 typedef struct _GstStreamVolume GstStreamVolume;
48 typedef struct _GstVideoInfo GstVideoInfo;
49 typedef struct _GstGLContext GstGLContext;
50 typedef struct _GstGLDisplay GstGLDisplay;
51
52 namespace WebCore {
53
54 class BitmapTextureGL;
55 class GLContext;
56 class GraphicsContext;
57 class GraphicsContext3D;
58 class IntSize;
59 class IntRect;
60 class VideoTextureCopierGStreamer;
61
62 #if USE(TEXTURE_MAPPER_GL)
63 class TextureMapperPlatformLayerProxy;
64 #endif
65
66 void registerWebKitGStreamerElements();
67
68 class MediaPlayerPrivateGStreamerBase : public MediaPlayerPrivateInterface, public CanMakeWeakPtr<MediaPlayerPrivateGStreamerBase>
69 #if USE(TEXTURE_MAPPER_GL)
70 #if USE(NICOSIA)
71     , public Nicosia::ContentLayerTextureMapperImpl::Client
72 #else
73     , public PlatformLayer
74 #endif
75 #endif
76 {
77
78 public:
79     static void initializeDebugCategory();
80
81     virtual ~MediaPlayerPrivateGStreamerBase();
82
83     FloatSize naturalSize() const override;
84
85     void setVolume(float) override;
86     float volume() const override;
87
88 #if USE(GSTREAMER_GL)
89     bool ensureGstGLContext();
90     GstContext* requestGLContext(const char* contextType);
91 #endif
92     bool supportsMuting() const override { return true; }
93     void setMuted(bool) override;
94     bool muted() const;
95
96     MediaPlayer::NetworkState networkState() const override;
97     MediaPlayer::ReadyState readyState() const override;
98
99     void setVisible(bool) override { }
100     void setSize(const IntSize&) override;
101     void sizeChanged();
102
103     // Prefer MediaTime based methods over float based.
104     float duration() const override { return durationMediaTime().toFloat(); }
105     double durationDouble() const override { return durationMediaTime().toDouble(); }
106     MediaTime durationMediaTime() const override { return MediaTime::zeroTime(); }
107     float currentTime() const override { return currentMediaTime().toFloat(); }
108     double currentTimeDouble() const override { return currentMediaTime().toDouble(); }
109     MediaTime currentMediaTime() const override { return MediaTime::zeroTime(); }
110     void seek(float time) override { seek(MediaTime::createWithFloat(time)); }
111     void seekDouble(double time) override { seek(MediaTime::createWithDouble(time)); }
112     void seek(const MediaTime&) override { }
113     float maxTimeSeekable() const override { return maxMediaTimeSeekable().toFloat(); }
114     MediaTime maxMediaTimeSeekable() const override { return MediaTime::zeroTime(); }
115     double minTimeSeekable() const override { return minMediaTimeSeekable().toFloat(); }
116     MediaTime minMediaTimeSeekable() const override { return MediaTime::zeroTime(); }
117
118     void paint(GraphicsContext&, const FloatRect&) override;
119
120     bool hasSingleSecurityOrigin() const override { return true; }
121     virtual MediaTime maxTimeLoaded() const { return MediaTime::zeroTime(); }
122
123     bool supportsFullscreen() const override;
124
125     MediaPlayer::MovieLoadType movieLoadType() const override;
126     virtual bool isLiveStream() const = 0;
127
128     MediaPlayer* mediaPlayer() const { return m_player; }
129
130     unsigned decodedFrameCount() const override;
131     unsigned droppedFrameCount() const override;
132     unsigned audioDecodedByteCount() const override;
133     unsigned videoDecodedByteCount() const override;
134
135     void acceleratedRenderingStateChanged() override;
136
137 #if USE(TEXTURE_MAPPER_GL)
138     PlatformLayer* platformLayer() const override;
139 #if PLATFORM(WIN_CAIRO)
140     // FIXME: Accelerated rendering has not been implemented for WinCairo yet.
141     bool supportsAcceleratedRendering() const override { return false; }
142 #else
143     bool supportsAcceleratedRendering() const override { return true; }
144 #endif
145 #endif
146
147 #if ENABLE(ENCRYPTED_MEDIA)
148     void cdmInstanceAttached(CDMInstance&) override;
149     void cdmInstanceDetached(CDMInstance&) override;
150     void dispatchDecryptionKey(GstBuffer*);
151     void handleProtectionEvent(GstEvent*);
152     void attemptToDecryptWithLocalInstance();
153     void attemptToDecryptWithInstance(CDMInstance&) override;
154     void dispatchCDMInstance();
155     void initializationDataEncountered(GstEvent*);
156     void setWaitingForKey(bool);
157     bool waitingForKey() const override;
158 #endif
159
160     static bool supportsKeySystem(const String& keySystem, const String& mimeType);
161     static MediaPlayer::SupportsType extendedSupportsType(const MediaEngineSupportParameters&, MediaPlayer::SupportsType);
162
163 #if USE(GSTREAMER_GL)
164     bool copyVideoTextureToPlatformTexture(GraphicsContext3D*, Platform3DObject, GC3Denum, GC3Dint, GC3Denum, GC3Denum, GC3Denum, bool, bool) override;
165     NativeImagePtr nativeImageForCurrentTime() override;
166 #endif
167
168     void setVideoSourceOrientation(const ImageOrientation&);
169     GstElement* pipeline() const { return m_pipeline.get(); }
170
171     virtual bool handleSyncMessage(GstMessage*);
172
173 protected:
174     MediaPlayerPrivateGStreamerBase(MediaPlayer*);
175     virtual GstElement* createVideoSink();
176
177 #if USE(GSTREAMER_GL)
178     static GstFlowReturn newSampleCallback(GstElement*, MediaPlayerPrivateGStreamerBase*);
179     static GstFlowReturn newPrerollCallback(GstElement*, MediaPlayerPrivateGStreamerBase*);
180     void flushCurrentBuffer();
181     GstElement* createGLAppSink();
182     GstElement* createVideoSinkGL();
183     GstGLContext* gstGLContext() const { return m_glContext.get(); }
184     GstGLDisplay* gstGLDisplay() const { return m_glDisplay.get(); }
185     void ensureGLVideoSinkContext();
186 #endif
187
188 #if USE(TEXTURE_MAPPER_GL)
189     void pushTextureToCompositor();
190 #if USE(NICOSIA)
191     void swapBuffersIfNeeded() override;
192 #else
193     RefPtr<TextureMapperPlatformLayerProxy> proxy() const override;
194     void swapBuffersIfNeeded() override;
195 #endif
196 #endif
197
198     GstElement* videoSink() const { return m_videoSink.get(); }
199
200     void setStreamVolumeElement(GstStreamVolume*);
201     virtual GstElement* createAudioSink() { return 0; }
202     virtual GstElement* audioSink() const { return 0; }
203
204     void setPipeline(GstElement*);
205
206     void triggerRepaint(GstSample*);
207     void repaint();
208     void cancelRepaint(bool destroying = false);
209
210     static void repaintCallback(MediaPlayerPrivateGStreamerBase*, GstSample*);
211     static void repaintCancelledCallback(MediaPlayerPrivateGStreamerBase*);
212
213     void notifyPlayerOfVolumeChange();
214     void notifyPlayerOfMute();
215
216     static void volumeChangedCallback(MediaPlayerPrivateGStreamerBase*);
217     static void muteChangedCallback(MediaPlayerPrivateGStreamerBase*);
218
219     enum MainThreadNotification {
220         VideoChanged = 1 << 0,
221         VideoCapsChanged = 1 << 1,
222         AudioChanged = 1 << 2,
223         VolumeChanged = 1 << 3,
224         MuteChanged = 1 << 4,
225 #if ENABLE(VIDEO_TRACK)
226         TextChanged = 1 << 5,
227 #endif
228         SizeChanged = 1 << 6,
229 #if GST_CHECK_VERSION(1, 10, 0)
230         StreamCollectionChanged = 1 << 7
231 #endif
232     };
233
234     Ref<MainThreadNotifier<MainThreadNotification>> m_notifier;
235     MediaPlayer* m_player;
236     GRefPtr<GstElement> m_pipeline;
237     GRefPtr<GstStreamVolume> m_volumeElement;
238     GRefPtr<GstElement> m_videoSink;
239     GRefPtr<GstElement> m_fpsSink;
240     MediaPlayer::ReadyState m_readyState;
241     mutable MediaPlayer::NetworkState m_networkState;
242     IntSize m_size;
243     mutable Lock m_sampleMutex;
244     GRefPtr<GstSample> m_sample;
245
246     mutable FloatSize m_videoSize;
247     bool m_usingFallbackVideoSink { false };
248     bool m_renderingCanBeAccelerated { false };
249
250     Condition m_drawCondition;
251     Lock m_drawMutex;
252     bool m_destroying { false };
253     RunLoop::Timer<MediaPlayerPrivateGStreamerBase> m_drawTimer;
254
255 #if USE(TEXTURE_MAPPER_GL)
256 #if USE(NICOSIA)
257     Ref<Nicosia::ContentLayer> m_nicosiaLayer;
258 #else
259     RefPtr<TextureMapperPlatformLayerProxy> m_platformLayerProxy;
260 #endif
261 #endif
262
263 #if USE(GSTREAMER_GL)
264     GRefPtr<GstGLContext> m_glContext;
265     GRefPtr<GstGLDisplay> m_glDisplay;
266     GRefPtr<GstContext> m_glDisplayElementContext;
267     GRefPtr<GstContext> m_glAppElementContext;
268     std::unique_ptr<VideoTextureCopierGStreamer> m_videoTextureCopier;
269 #endif
270
271     ImageOrientation m_videoSourceOrientation;
272
273 #if ENABLE(ENCRYPTED_MEDIA)
274     Lock m_protectionMutex;
275     Condition m_protectionCondition;
276     RefPtr<const CDMInstance> m_cdmInstance;
277     HashSet<uint32_t> m_handledProtectionEvents;
278     bool m_needToResendCredentials { false };
279     bool m_waitingForKey { false };
280 #endif
281 };
282
283 }
284
285 #endif // USE(GSTREAMER)
286 #endif