[GStreamer] Use of playbin3 when USE_PLAYBIN3 environment variable is set
[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 #pragma once
26
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)
40 #include "TrackPrivateBaseGStreamer.h"
41 #include <wtf/text/AtomicStringHash.h>
42 #endif
43
44 typedef struct _GstMpegtsSection GstMpegtsSection;
45
46 namespace WebCore {
47
48 #if ENABLE(WEB_AUDIO)
49 class AudioSourceProvider;
50 class AudioSourceProviderGStreamer;
51 #endif
52
53 class AudioTrackPrivateGStreamer;
54 class InbandMetadataTextTrackPrivateGStreamer;
55 class InbandTextTrackPrivateGStreamer;
56 class MediaPlayerRequestInstallMissingPluginsCallback;
57 class VideoTrackPrivateGStreamer;
58
59 #if ENABLE(MEDIA_SOURCE)
60 class MediaSourcePrivateClient;
61 #endif
62
63 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
64 public:
65     explicit MediaPlayerPrivateGStreamer(MediaPlayer*);
66     virtual ~MediaPlayerPrivateGStreamer();
67
68     WeakPtr<MediaPlayerPrivateGStreamer> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(*this); }
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(const MediaTime&) 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     MediaTime maxMediaTimeSeekable() const override;
107     bool didLoadingProgress() const override;
108     unsigned long long totalBytes() const override;
109     MediaTime 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 sourceSetup(GstElement*);
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     void enableTrack(TrackPrivateBaseGStreamer::TrackType, unsigned index);
135
136 private:
137     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>&);
138     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
139
140     static bool isAvailable();
141
142     GstElement* createAudioSink() override;
143
144     MediaTime playbackPosition() const;
145
146     virtual void updateStates();
147     virtual void asyncStateChangeDone();
148
149     void createGSTPlayBin(const gchar* playbinName);
150
151     bool loadNextLocation();
152     void mediaLocationChanged(GstMessage*);
153
154     virtual void setDownloadBuffering();
155     void processBufferingStats(GstMessage*);
156 #if ENABLE(VIDEO_TRACK)
157 #if USE(GSTREAMER_MPEGTS)
158     void processMpegTsSection(GstMpegtsSection*);
159 #endif
160
161     void processTableOfContents(GstMessage*);
162     void processTableOfContentsEntry(GstTocEntry*);
163
164     void purgeInvalidAudioTracks(Vector<String> validTrackIds);
165     void purgeInvalidVideoTracks(Vector<String> validTrackIds);
166     void purgeInvalidTextTracks(Vector<String> validTrackIds);
167 #endif
168     virtual bool doSeek(const MediaTime& position, float rate, GstSeekFlags seekType);
169     virtual void updatePlaybackRate();
170
171     String engineDescription() const override { return "GStreamer"; }
172     bool didPassCORSAccessCheck() const override;
173     bool canSaveMediaData() const override;
174
175     void purgeOldDownloadFiles(const char*);
176     static void uriDecodeBinElementAddedCallback(GstBin*, GstElement*, MediaPlayerPrivateGStreamer*);
177     static void downloadBufferFileCreatedCallback(MediaPlayerPrivateGStreamer*);
178
179     void setPlaybinURL(const URL& urlString);
180
181 #if GST_CHECK_VERSION(1, 10, 0)
182     void updateTracks();
183 #endif
184
185 protected:
186     void cacheDuration();
187
188     bool m_buffering;
189     int m_bufferingPercentage;
190     mutable MediaTime m_cachedPosition;
191     bool m_canFallBackToLastFinishedSeekPosition;
192     bool m_changingRate;
193     bool m_downloadFinished;
194     bool m_errorOccured;
195     mutable bool m_isEndReached;
196     mutable bool m_isStreaming;
197     mutable MediaTime m_durationAtEOS;
198     bool m_paused;
199     float m_playbackRate;
200     GstState m_currentState;
201     GstState m_oldState;
202     GstState m_requestedState;
203     bool m_resetPipeline;
204     bool m_seeking;
205     bool m_seekIsPending;
206     MediaTime m_seekTime;
207     GRefPtr<GstElement> m_source;
208     bool m_volumeAndMuteInitialized;
209
210     void readyTimerFired();
211
212     void notifyPlayerOfVideo();
213     void notifyPlayerOfVideoCaps();
214     void notifyPlayerOfAudio();
215
216 #if ENABLE(VIDEO_TRACK)
217     void notifyPlayerOfText();
218     void newTextSample();
219 #endif
220
221     void ensureAudioSourceProvider();
222     void setAudioStreamProperties(GObject*);
223
224     static void setAudioStreamPropertiesCallback(MediaPlayerPrivateGStreamer*, GObject*);
225
226     static void sourceSetupCallback(MediaPlayerPrivateGStreamer*, GstElement*);
227     static void videoChangedCallback(MediaPlayerPrivateGStreamer*);
228     static void videoSinkCapsChangedCallback(MediaPlayerPrivateGStreamer*);
229     static void audioChangedCallback(MediaPlayerPrivateGStreamer*);
230 #if ENABLE(VIDEO_TRACK)
231     static void textChangedCallback(MediaPlayerPrivateGStreamer*);
232     static GstFlowReturn newTextSampleCallback(MediaPlayerPrivateGStreamer*);
233 #endif
234
235 private:
236     WeakPtrFactory<MediaPlayerPrivateGStreamer> m_weakPtrFactory;
237
238 #if ENABLE(VIDEO_TRACK)
239     GRefPtr<GstElement> m_textAppSink;
240     GRefPtr<GstPad> m_textAppSinkPad;
241 #endif
242     GstStructure* m_mediaLocations;
243     int m_mediaLocationCurrentIndex;
244     bool m_playbackRatePause;
245     MediaTime m_timeOfOverlappingSeek;
246     float m_lastPlaybackRate;
247     Timer m_fillTimer;
248     MediaTime m_maxTimeLoaded;
249     bool m_loadingStalled { false };
250     MediaPlayer::Preload m_preload;
251     bool m_delayingLoad;
252     mutable MediaTime m_maxTimeLoadedAtLastDidLoadingProgress;
253     bool m_hasVideo;
254     bool m_hasAudio;
255     RunLoop::Timer<MediaPlayerPrivateGStreamer> m_readyTimerHandler;
256     mutable unsigned long long m_totalBytes;
257     URL m_url;
258     bool m_preservesPitch;
259     bool m_isLegacyPlaybin;
260 #if GST_CHECK_VERSION(1, 10, 0)
261     GRefPtr<GstStreamCollection> m_streamCollection;
262 #endif
263     String m_currentAudioStreamId;
264     String m_currentVideoStreamId;
265     String m_currentTextStreamId;
266 #if ENABLE(WEB_AUDIO)
267     std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider;
268 #endif
269     GRefPtr<GstElement> m_autoAudioSink;
270     GRefPtr<GstElement> m_downloadBuffer;
271     Vector<RefPtr<MediaPlayerRequestInstallMissingPluginsCallback>> m_missingPluginCallbacks;
272 #if ENABLE(VIDEO_TRACK)
273     HashMap<AtomicString, RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks;
274     HashMap<AtomicString, RefPtr<InbandTextTrackPrivateGStreamer>> m_textTracks;
275     HashMap<AtomicString, RefPtr<VideoTrackPrivateGStreamer>> m_videoTracks;
276     RefPtr<InbandMetadataTextTrackPrivateGStreamer> m_chaptersTrack;
277 #if USE(GSTREAMER_MPEGTS)
278     HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks;
279 #endif
280 #endif
281     virtual bool isMediaSource() const { return false; }
282 };
283 }
284
285 #endif // USE(GSTREAMER)