[GStreamer] Refactor media player to use MediaTime consistently
[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 "GRefPtrGStreamer.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 #include "TextureMapperPlatformLayerProxyProvider.h"
41 #endif
42
43 typedef struct _GstStreamVolume GstStreamVolume;
44 typedef struct _GstVideoInfo GstVideoInfo;
45 typedef struct _GstGLContext GstGLContext;
46 typedef struct _GstGLDisplay GstGLDisplay;
47
48 namespace WebCore {
49
50 class BitmapTextureGL;
51 class GLContext;
52 class GraphicsContext;
53 class GraphicsContext3D;
54 class IntSize;
55 class IntRect;
56 class VideoTextureCopierGStreamer;
57
58 #if USE(TEXTURE_MAPPER_GL)
59 class TextureMapperPlatformLayerProxy;
60 #endif
61
62 void registerWebKitGStreamerElements();
63
64 class MediaPlayerPrivateGStreamerBase : public MediaPlayerPrivateInterface
65 #if USE(TEXTURE_MAPPER_GL)
66     , public PlatformLayer
67 #endif
68 {
69
70 public:
71     virtual ~MediaPlayerPrivateGStreamerBase();
72
73     FloatSize naturalSize() const override;
74
75     void setVolume(float) override;
76     float volume() const override;
77
78 #if USE(GSTREAMER_GL)
79     bool ensureGstGLContext();
80     static GstContext* requestGLContext(const gchar* contextType, MediaPlayerPrivateGStreamerBase*);
81 #endif
82     static bool initializeGStreamerAndRegisterWebKitElements();
83     bool supportsMuting() const override { return true; }
84     void setMuted(bool) override;
85     bool muted() const;
86
87     MediaPlayer::NetworkState networkState() const override;
88     MediaPlayer::ReadyState readyState() const override;
89
90     void setVisible(bool) override { }
91     void setSize(const IntSize&) override;
92     void sizeChanged();
93
94     // Prefer MediaTime based methods over float based.
95     float duration() const override { return durationMediaTime().toFloat(); }
96     double durationDouble() const override { return durationMediaTime().toDouble(); }
97     MediaTime durationMediaTime() const override { return MediaTime::zeroTime(); }
98     float currentTime() const override { return currentMediaTime().toFloat(); }
99     double currentTimeDouble() const override { return currentMediaTime().toDouble(); }
100     MediaTime currentMediaTime() const override { return MediaTime::zeroTime(); }
101     void seek(float time) override { seek(MediaTime::createWithFloat(time)); }
102     void seekDouble(double time) override { seek(MediaTime::createWithDouble(time)); }
103     void seek(const MediaTime&) override { }
104     float maxTimeSeekable() const override { return maxMediaTimeSeekable().toFloat(); }
105     MediaTime maxMediaTimeSeekable() const override { return MediaTime::zeroTime(); }
106     double minTimeSeekable() const override { return minMediaTimeSeekable().toFloat(); }
107     MediaTime minMediaTimeSeekable() const override { return MediaTime::zeroTime(); }
108
109     void paint(GraphicsContext&, const FloatRect&) override;
110
111     bool hasSingleSecurityOrigin() const override { return true; }
112     virtual MediaTime maxTimeLoaded() const { return MediaTime::zeroTime(); }
113
114     bool supportsFullscreen() const override;
115     PlatformMedia platformMedia() const override;
116
117     MediaPlayer::MovieLoadType movieLoadType() const override;
118     virtual bool isLiveStream() const = 0;
119
120     MediaPlayer* mediaPlayer() const { return m_player; }
121
122     unsigned decodedFrameCount() const override;
123     unsigned droppedFrameCount() const override;
124     unsigned audioDecodedByteCount() const override;
125     unsigned videoDecodedByteCount() const override;
126
127     void acceleratedRenderingStateChanged() override;
128
129 #if USE(TEXTURE_MAPPER_GL)
130     PlatformLayer* platformLayer() const override { return const_cast<MediaPlayerPrivateGStreamerBase*>(this); }
131 #if PLATFORM(WIN_CAIRO)
132     // FIXME: Accelerated rendering has not been implemented for WinCairo yet.
133     bool supportsAcceleratedRendering() const override { return false; }
134 #else
135     bool supportsAcceleratedRendering() const override { return true; }
136 #endif
137 #endif
138
139 #if ENABLE(ENCRYPTED_MEDIA)
140     void cdmInstanceAttached(const CDMInstance&) override;
141     void cdmInstanceDetached(const CDMInstance&) override;
142     void dispatchDecryptionKey(GstBuffer*);
143     void handleProtectionEvent(GstEvent*);
144     void attemptToDecryptWithLocalInstance();
145     void attemptToDecryptWithInstance(const CDMInstance&) override;
146 #endif
147
148     static bool supportsKeySystem(const String& keySystem, const String& mimeType);
149     static MediaPlayer::SupportsType extendedSupportsType(const MediaEngineSupportParameters&, MediaPlayer::SupportsType);
150
151 #if USE(GSTREAMER_GL)
152     bool copyVideoTextureToPlatformTexture(GraphicsContext3D*, Platform3DObject, GC3Denum, GC3Dint, GC3Denum, GC3Denum, GC3Denum, bool, bool) override;
153     NativeImagePtr nativeImageForCurrentTime() override;
154 #endif
155
156     void setVideoSourceOrientation(const ImageOrientation&);
157     GstElement* pipeline() const { return m_pipeline.get(); }
158
159     virtual bool handleSyncMessage(GstMessage*);
160
161 protected:
162     MediaPlayerPrivateGStreamerBase(MediaPlayer*);
163     virtual GstElement* createVideoSink();
164
165 #if USE(GSTREAMER_GL)
166     static GstFlowReturn newSampleCallback(GstElement*, MediaPlayerPrivateGStreamerBase*);
167     static GstFlowReturn newPrerollCallback(GstElement*, MediaPlayerPrivateGStreamerBase*);
168     void flushCurrentBuffer();
169     GstElement* createGLAppSink();
170     GstElement* createVideoSinkGL();
171     GstGLContext* gstGLContext() const { return m_glContext.get(); }
172     GstGLDisplay* gstGLDisplay() const { return m_glDisplay.get(); }
173 #endif
174
175 #if USE(TEXTURE_MAPPER_GL)
176     void updateTexture(BitmapTextureGL&, GstVideoInfo&);
177     RefPtr<TextureMapperPlatformLayerProxy> proxy() const override;
178     void swapBuffersIfNeeded() override;
179     void pushTextureToCompositor();
180 #endif
181
182     GstElement* videoSink() const { return m_videoSink.get(); }
183
184     void setStreamVolumeElement(GstStreamVolume*);
185     virtual GstElement* createAudioSink() { return 0; }
186     virtual GstElement* audioSink() const { return 0; }
187
188     void setPipeline(GstElement*);
189
190     void triggerRepaint(GstSample*);
191     void repaint();
192     void cancelRepaint();
193
194     static void repaintCallback(MediaPlayerPrivateGStreamerBase*, GstSample*);
195     static void repaintCancelledCallback(MediaPlayerPrivateGStreamerBase*);
196
197     void notifyPlayerOfVolumeChange();
198     void notifyPlayerOfMute();
199
200     static void volumeChangedCallback(MediaPlayerPrivateGStreamerBase*);
201     static void muteChangedCallback(MediaPlayerPrivateGStreamerBase*);
202
203     enum MainThreadNotification {
204         VideoChanged = 1 << 0,
205         VideoCapsChanged = 1 << 1,
206         AudioChanged = 1 << 2,
207         VolumeChanged = 1 << 3,
208         MuteChanged = 1 << 4,
209 #if ENABLE(VIDEO_TRACK)
210         TextChanged = 1 << 5,
211 #endif
212         SizeChanged = 1 << 6
213     };
214
215     WeakPtrFactory<MediaPlayerPrivateGStreamerBase> m_weakPtrFactory;
216     Ref<MainThreadNotifier<MainThreadNotification>> m_notifier;
217     MediaPlayer* m_player;
218     GRefPtr<GstElement> m_pipeline;
219     GRefPtr<GstStreamVolume> m_volumeElement;
220     GRefPtr<GstElement> m_videoSink;
221     GRefPtr<GstElement> m_fpsSink;
222     MediaPlayer::ReadyState m_readyState;
223     mutable MediaPlayer::NetworkState m_networkState;
224     IntSize m_size;
225     mutable GMutex m_sampleMutex;
226     GRefPtr<GstSample> m_sample;
227
228     mutable FloatSize m_videoSize;
229     bool m_usingFallbackVideoSink { false };
230     bool m_renderingCanBeAccelerated { false };
231
232     Condition m_drawCondition;
233     Lock m_drawMutex;
234     RunLoop::Timer<MediaPlayerPrivateGStreamerBase> m_drawTimer;
235
236 #if USE(TEXTURE_MAPPER_GL)
237     RefPtr<GraphicsContext3D> m_context3D;
238     RefPtr<TextureMapperPlatformLayerProxy> m_platformLayerProxy;
239 #endif
240
241 #if USE(GSTREAMER_GL)
242     GRefPtr<GstGLContext> m_glContext;
243     GRefPtr<GstGLDisplay> m_glDisplay;
244     std::unique_ptr<VideoTextureCopierGStreamer> m_videoTextureCopier;
245 #endif
246
247     ImageOrientation m_videoSourceOrientation;
248
249 #if ENABLE(ENCRYPTED_MEDIA)
250     Lock m_protectionMutex;
251     Condition m_protectionCondition;
252     RefPtr<const CDMInstance> m_cdmInstance;
253     HashSet<uint32_t> m_handledProtectionEvents;
254     bool m_needToResendCredentials { false };
255 #endif
256 };
257
258 }
259
260 #endif // USE(GSTREAMER)
261 #endif