WeakPtrFactory should populate m_ref lazily.
[WebKit-https.git] / Source / WebCore / platform / graphics / gstreamer / MediaPlayerPrivateGStreamer.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, 2011, 2012, 2013, 2015, 2016 Igalia S.L
6  * Copyright (C) 2014 Cable Television Laboratories, Inc.
7  * Copyright (C) 2015, 2016 Metrological Group B.V.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * aint with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  */
24
25 #ifndef MediaPlayerPrivateGStreamer_h
26 #define MediaPlayerPrivateGStreamer_h
27 #if ENABLE(VIDEO) && USE(GSTREAMER)
28
29 #include "GRefPtrGStreamer.h"
30 #include "MediaPlayerPrivateGStreamerBase.h"
31
32 #include <glib.h>
33 #include <gst/gst.h>
34 #include <gst/pbutils/install-plugins.h>
35 #include <wtf/Forward.h>
36 #include <wtf/RunLoop.h>
37 #include <wtf/WeakPtr.h>
38
39 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
40 #include <wtf/text/AtomicStringHash.h>
41 #endif
42
43 typedef struct _GstBuffer GstBuffer;
44 typedef struct _GstMessage GstMessage;
45 typedef struct _GstElement GstElement;
46 typedef struct _GstMpegtsSection GstMpegtsSection;
47
48 namespace WebCore {
49
50 #if ENABLE(WEB_AUDIO)
51 class AudioSourceProvider;
52 class AudioSourceProviderGStreamer;
53 #endif
54
55 class AudioTrackPrivateGStreamer;
56 class InbandMetadataTextTrackPrivateGStreamer;
57 class InbandTextTrackPrivateGStreamer;
58 class MediaPlayerRequestInstallMissingPluginsCallback;
59 class VideoTrackPrivateGStreamer;
60
61 #if ENABLE(MEDIA_SOURCE)
62 class MediaSourcePrivateClient;
63 #endif
64
65 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
66 public:
67     explicit MediaPlayerPrivateGStreamer(MediaPlayer*);
68     virtual ~MediaPlayerPrivateGStreamer();
69
70     static void registerMediaEngine(MediaEngineRegistrar);
71     void handleMessage(GstMessage*);
72     void handlePluginInstallerResult(GstInstallPluginsReturn);
73
74     bool hasVideo() const override { return m_hasVideo; }
75     bool hasAudio() const override { return m_hasAudio; }
76
77     void load(const String &url) override;
78 #if ENABLE(MEDIA_SOURCE)
79     void load(const String& url, MediaSourcePrivateClient*) override;
80 #endif
81 #if ENABLE(MEDIA_STREAM)
82     void load(MediaStreamPrivate&) override;
83 #endif
84     void commitLoad();
85     void cancelLoad() override;
86
87     void prepareToPlay() override;
88     void play() override;
89     void pause() override;
90
91     bool paused() const override;
92     bool seeking() const override;
93
94     MediaTime durationMediaTime() const override;
95     MediaTime currentMediaTime() const override;
96     void seek(float) override;
97
98     void setRate(float) override;
99     double rate() const override;
100     void setPreservesPitch(bool) override;
101
102     void setPreload(MediaPlayer::Preload) override;
103     void fillTimerFired();
104
105     std::unique_ptr<PlatformTimeRanges> buffered() const override;
106     float maxTimeSeekable() const override;
107     bool didLoadingProgress() const override;
108     unsigned long long totalBytes() const override;
109     float maxTimeLoaded() const override;
110
111     bool hasSingleSecurityOrigin() const override;
112
113     void loadStateChanged();
114     void timeChanged();
115     void didEnd();
116     virtual void durationChanged();
117     void loadingFailed(MediaPlayer::NetworkState);
118
119     virtual void sourceChanged();
120
121     GstElement* audioSink() const override;
122     virtual void configurePlaySink() { }
123
124     void simulateAudioInterruption() override;
125
126     virtual bool changePipelineState(GstState);
127
128 #if ENABLE(WEB_AUDIO)
129     AudioSourceProvider* audioSourceProvider() override;
130 #endif
131
132     bool isLiveStream() const override { return m_isStreaming; }
133
134     bool handleSyncMessage(GstMessage*) override;
135
136 private:
137     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>&);
138     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
139
140     static bool isAvailable();
141
142     WeakPtr<MediaPlayerPrivateGStreamer> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(*this); }
143
144     GstElement* createAudioSink() override;
145
146     double playbackPosition() const;
147
148     virtual void updateStates();
149     virtual void asyncStateChangeDone();
150
151     void createGSTPlayBin();
152
153     bool loadNextLocation();
154     void mediaLocationChanged(GstMessage*);
155
156     virtual void setDownloadBuffering();
157     void processBufferingStats(GstMessage*);
158 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
159     void processMpegTsSection(GstMpegtsSection*);
160 #endif
161 #if ENABLE(VIDEO_TRACK)
162     void processTableOfContents(GstMessage*);
163     void processTableOfContentsEntry(GstTocEntry*);
164 #endif
165     virtual bool doSeek(gint64 position, float rate, GstSeekFlags seekType);
166     virtual void updatePlaybackRate();
167
168     String engineDescription() const override { return "GStreamer"; }
169     bool didPassCORSAccessCheck() const override;
170     bool canSaveMediaData() const override;
171
172     void purgeOldDownloadFiles(const char*);
173     static void uriDecodeBinElementAddedCallback(GstBin*, GstElement*, MediaPlayerPrivateGStreamer*);
174     static void downloadBufferFileCreatedCallback(MediaPlayerPrivateGStreamer*);
175
176     void setPlaybinURL(const URL& urlString);
177
178 protected:
179     void cacheDuration();
180
181     bool m_buffering;
182     int m_bufferingPercentage;
183     mutable float m_cachedPosition;
184     bool m_canFallBackToLastFinishedSeekPosition;
185     bool m_changingRate;
186     bool m_downloadFinished;
187     bool m_errorOccured;
188     mutable bool m_isEndReached;
189     mutable bool m_isStreaming;
190     mutable gdouble m_durationAtEOS;
191     bool m_paused;
192     float m_playbackRate;
193     GstState m_requestedState;
194     bool m_resetPipeline;
195     bool m_seeking;
196     bool m_seekIsPending;
197     float m_seekTime;
198     GRefPtr<GstElement> m_source;
199     bool m_volumeAndMuteInitialized;
200
201     void readyTimerFired();
202
203     void notifyPlayerOfVideo();
204     void notifyPlayerOfVideoCaps();
205     void notifyPlayerOfAudio();
206
207 #if ENABLE(VIDEO_TRACK)
208     void notifyPlayerOfText();
209     void newTextSample();
210 #endif
211
212     void ensureAudioSourceProvider();
213     void setAudioStreamProperties(GObject*);
214
215     static void setAudioStreamPropertiesCallback(MediaPlayerPrivateGStreamer*, GObject*);
216
217     static void sourceChangedCallback(MediaPlayerPrivateGStreamer*);
218     static void videoChangedCallback(MediaPlayerPrivateGStreamer*);
219     static void videoSinkCapsChangedCallback(MediaPlayerPrivateGStreamer*);
220     static void audioChangedCallback(MediaPlayerPrivateGStreamer*);
221 #if ENABLE(VIDEO_TRACK)
222     static void textChangedCallback(MediaPlayerPrivateGStreamer*);
223     static GstFlowReturn newTextSampleCallback(MediaPlayerPrivateGStreamer*);
224 #endif
225
226 private:
227     WeakPtrFactory<MediaPlayerPrivateGStreamer> m_weakPtrFactory;
228
229 #if ENABLE(VIDEO_TRACK)
230     GRefPtr<GstElement> m_textAppSink;
231     GRefPtr<GstPad> m_textAppSinkPad;
232 #endif
233     GstStructure* m_mediaLocations;
234     int m_mediaLocationCurrentIndex;
235     bool m_playbackRatePause;
236     float m_timeOfOverlappingSeek;
237     float m_lastPlaybackRate;
238     Timer m_fillTimer;
239     float m_maxTimeLoaded;
240     MediaPlayer::Preload m_preload;
241     bool m_delayingLoad;
242     mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
243     bool m_hasVideo;
244     bool m_hasAudio;
245     RunLoop::Timer<MediaPlayerPrivateGStreamer> m_readyTimerHandler;
246     mutable unsigned long long m_totalBytes;
247     URL m_url;
248     bool m_preservesPitch;
249 #if ENABLE(WEB_AUDIO)
250     std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider;
251 #endif
252     GRefPtr<GstElement> m_autoAudioSink;
253     GRefPtr<GstElement> m_downloadBuffer;
254     RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback;
255 #if ENABLE(VIDEO_TRACK)
256     Vector<RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks;
257     Vector<RefPtr<InbandTextTrackPrivateGStreamer>> m_textTracks;
258     Vector<RefPtr<VideoTrackPrivateGStreamer>> m_videoTracks;
259     RefPtr<InbandMetadataTextTrackPrivateGStreamer> m_chaptersTrack;
260 #endif
261 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
262     HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks;
263 #endif
264     virtual bool isMediaSource() const { return false; }
265 };
266 }
267
268 #endif // USE(GSTREAMER)
269 #endif