6c6a39ca12aad4621427dc4646a6adb0b00f7915
[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 #include "Timer.h"
32
33 #include <glib.h>
34 #include <gst/gst.h>
35 #include <gst/pbutils/install-plugins.h>
36 #include <wtf/Forward.h>
37 #include <wtf/RunLoop.h>
38 #include <wtf/WeakPtr.h>
39
40 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
41 #include <wtf/text/AtomicStringHash.h>
42 #endif
43
44 typedef struct _GstBuffer GstBuffer;
45 typedef struct _GstMessage GstMessage;
46 typedef struct _GstElement GstElement;
47 typedef struct _GstMpegtsSection GstMpegtsSection;
48
49 namespace WebCore {
50
51 #if ENABLE(WEB_AUDIO)
52 class AudioSourceProvider;
53 class AudioSourceProviderGStreamer;
54 #endif
55
56 class AudioTrackPrivateGStreamer;
57 class InbandMetadataTextTrackPrivateGStreamer;
58 class InbandTextTrackPrivateGStreamer;
59 class MediaPlayerRequestInstallMissingPluginsCallback;
60 class VideoTrackPrivateGStreamer;
61
62 #if ENABLE(MEDIA_SOURCE)
63 class MediaSourcePrivateClient;
64 #endif
65
66 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
67 public:
68     explicit MediaPlayerPrivateGStreamer(MediaPlayer*);
69     virtual ~MediaPlayerPrivateGStreamer();
70
71     static void registerMediaEngine(MediaEngineRegistrar);
72     void handleMessage(GstMessage*);
73     void handlePluginInstallerResult(GstInstallPluginsReturn);
74
75     bool hasVideo() const override { return m_hasVideo; }
76     bool hasAudio() const override { return m_hasAudio; }
77
78     void load(const String &url) override;
79 #if ENABLE(MEDIA_SOURCE)
80     void load(const String& url, MediaSourcePrivateClient*) override;
81 #endif
82 #if ENABLE(MEDIA_STREAM)
83     void load(MediaStreamPrivate&) override;
84 #endif
85     void commitLoad();
86     void cancelLoad() override;
87
88     void prepareToPlay() override;
89     void play() override;
90     void pause() override;
91
92     bool paused() const override;
93     bool seeking() const override;
94
95     MediaTime durationMediaTime() const override;
96     MediaTime currentMediaTime() const override;
97     void seek(float) override;
98
99     void setRate(float) override;
100     double rate() const override;
101     void setPreservesPitch(bool) override;
102
103     void setPreload(MediaPlayer::Preload) override;
104     void fillTimerFired();
105
106     std::unique_ptr<PlatformTimeRanges> buffered() const override;
107     float maxTimeSeekable() const override;
108     bool didLoadingProgress() const override;
109     unsigned long long totalBytes() const override;
110     float maxTimeLoaded() const override;
111
112     bool hasSingleSecurityOrigin() const override;
113
114     void loadStateChanged();
115     void timeChanged();
116     void didEnd();
117     virtual void durationChanged();
118     void loadingFailed(MediaPlayer::NetworkState);
119
120     virtual void sourceChanged();
121
122     GstElement* audioSink() const override;
123     virtual void configurePlaySink() { }
124
125     void simulateAudioInterruption() override;
126
127     virtual bool changePipelineState(GstState);
128
129 #if ENABLE(WEB_AUDIO)
130     AudioSourceProvider* audioSourceProvider() override;
131 #endif
132
133     bool isLiveStream() const override { return m_isStreaming; }
134
135     bool handleSyncMessage(GstMessage*) override;
136
137 private:
138     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>&);
139     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
140
141     static bool isAvailable();
142
143     WeakPtr<MediaPlayerPrivateGStreamer> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
144
145     GstElement* createAudioSink() override;
146
147     double playbackPosition() const;
148
149     virtual void updateStates();
150     virtual void asyncStateChangeDone();
151
152     void createGSTPlayBin();
153
154     bool loadNextLocation();
155     void mediaLocationChanged(GstMessage*);
156
157     virtual void setDownloadBuffering();
158     void processBufferingStats(GstMessage*);
159 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
160     void processMpegTsSection(GstMpegtsSection*);
161 #endif
162 #if ENABLE(VIDEO_TRACK)
163     void processTableOfContents(GstMessage*);
164     void processTableOfContentsEntry(GstTocEntry*, GstTocEntry* parent);
165 #endif
166     virtual bool doSeek(gint64 position, float rate, GstSeekFlags seekType);
167     virtual void updatePlaybackRate();
168
169     String engineDescription() const override { return "GStreamer"; }
170     bool didPassCORSAccessCheck() const override;
171     bool canSaveMediaData() const override;
172
173     void purgeOldDownloadFiles(const char*);
174     static void uriDecodeBinElementAddedCallback(GstBin*, GstElement*, MediaPlayerPrivateGStreamer*);
175     static void downloadBufferFileCreatedCallback(MediaPlayerPrivateGStreamer*);
176
177 protected:
178     void cacheDuration();
179
180     bool m_buffering;
181     int m_bufferingPercentage;
182     mutable float m_cachedPosition;
183     bool m_canFallBackToLastFinishedSeekPosition;
184     bool m_changingRate;
185     bool m_downloadFinished;
186     bool m_errorOccured;
187     mutable bool m_isEndReached;
188     mutable bool m_isStreaming;
189     mutable gdouble m_durationAtEOS;
190     bool m_paused;
191     float m_playbackRate;
192     GstState m_requestedState;
193     bool m_resetPipeline;
194     bool m_seeking;
195     bool m_seekIsPending;
196     float m_seekTime;
197     GRefPtr<GstElement> m_source;
198     bool m_volumeAndMuteInitialized;
199
200     void readyTimerFired();
201
202     void notifyPlayerOfVideo();
203     void notifyPlayerOfVideoCaps();
204     void notifyPlayerOfAudio();
205
206 #if ENABLE(VIDEO_TRACK)
207     void notifyPlayerOfText();
208     void newTextSample();
209 #endif
210
211     void ensureAudioSourceProvider();
212     void setAudioStreamProperties(GObject*);
213
214     static void setAudioStreamPropertiesCallback(MediaPlayerPrivateGStreamer*, GObject*);
215
216     static void sourceChangedCallback(MediaPlayerPrivateGStreamer*);
217     static void videoChangedCallback(MediaPlayerPrivateGStreamer*);
218     static void videoSinkCapsChangedCallback(MediaPlayerPrivateGStreamer*);
219     static void audioChangedCallback(MediaPlayerPrivateGStreamer*);
220 #if ENABLE(VIDEO_TRACK)
221     static void textChangedCallback(MediaPlayerPrivateGStreamer*);
222     static GstFlowReturn newTextSampleCallback(MediaPlayerPrivateGStreamer*);
223 #endif
224
225 private:
226     WeakPtrFactory<MediaPlayerPrivateGStreamer> m_weakPtrFactory;
227
228 #if ENABLE(VIDEO_TRACK)
229     GRefPtr<GstElement> m_textAppSink;
230     GRefPtr<GstPad> m_textAppSinkPad;
231 #endif
232     GstStructure* m_mediaLocations;
233     int m_mediaLocationCurrentIndex;
234     bool m_playbackRatePause;
235     float m_timeOfOverlappingSeek;
236     float m_lastPlaybackRate;
237     Timer m_fillTimer;
238     float m_maxTimeLoaded;
239     MediaPlayer::Preload m_preload;
240     bool m_delayingLoad;
241     mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
242     bool m_hasVideo;
243     bool m_hasAudio;
244     RunLoop::Timer<MediaPlayerPrivateGStreamer> m_readyTimerHandler;
245     mutable unsigned long long m_totalBytes;
246     URL m_url;
247     bool m_preservesPitch;
248 #if ENABLE(WEB_AUDIO)
249     std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider;
250 #endif
251     GRefPtr<GstElement> m_autoAudioSink;
252     GRefPtr<GstElement> m_downloadBuffer;
253     RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback;
254 #if ENABLE(VIDEO_TRACK)
255     Vector<RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks;
256     Vector<RefPtr<InbandTextTrackPrivateGStreamer>> m_textTracks;
257     Vector<RefPtr<VideoTrackPrivateGStreamer>> m_videoTracks;
258     RefPtr<InbandMetadataTextTrackPrivateGStreamer> m_chaptersTrack;
259 #endif
260 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
261     HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks;
262 #endif
263     virtual bool isMediaSource() const { return false; }
264 };
265 }
266
267 #endif // USE(GSTREAMER)
268 #endif