ae9abb7e2570c44477661f279b5f5b5b5903ac2c
[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 Igalia S.L
6  * Copyright (C) 2014 Cable Television Laboratories, Inc.
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 MediaPlayerPrivateGStreamer_h
25 #define MediaPlayerPrivateGStreamer_h
26 #if ENABLE(VIDEO) && USE(GSTREAMER)
27
28 #include "GRefPtrGStreamer.h"
29 #include "MediaPlayerPrivateGStreamerBase.h"
30 #include "Timer.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 #include <wtf/glib/GThreadSafeMainLoopSource.h>
39
40 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
41 #include <wtf/text/AtomicStringHash.h>
42 #endif
43
44 #if ENABLE(MEDIA_SOURCE)
45 #include "MediaSourceGStreamer.h"
46 #endif
47
48 typedef struct _GstBuffer GstBuffer;
49 typedef struct _GstMessage GstMessage;
50 typedef struct _GstElement GstElement;
51 typedef struct _GstMpegtsSection GstMpegtsSection;
52
53 namespace WebCore {
54
55 #if ENABLE(WEB_AUDIO)
56 class AudioSourceProvider;
57 class AudioSourceProviderGStreamer;
58 #endif
59
60 class AudioTrackPrivateGStreamer;
61 class InbandMetadataTextTrackPrivateGStreamer;
62 class InbandTextTrackPrivateGStreamer;
63 class MediaPlayerRequestInstallMissingPluginsCallback;
64 class VideoTrackPrivateGStreamer;
65
66 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
67 public:
68     explicit MediaPlayerPrivateGStreamer(MediaPlayer*);
69     ~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     float duration() const override;
96     float currentTime() 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     void loadStateChanged();
113     void timeChanged();
114     void didEnd();
115     void durationChanged();
116     void loadingFailed(MediaPlayer::NetworkState);
117
118     void videoChanged();
119     void videoCapsChanged();
120     void audioChanged();
121     void notifyPlayerOfVideo();
122     void notifyPlayerOfVideoCaps();
123     void notifyPlayerOfAudio();
124
125 #if ENABLE(VIDEO_TRACK)
126     void textChanged();
127     void notifyPlayerOfText();
128
129     void newTextSample();
130     void notifyPlayerOfNewTextSample();
131 #endif
132
133     void sourceChanged();
134     GstElement* audioSink() const override;
135
136     void setAudioStreamProperties(GObject*);
137
138     void simulateAudioInterruption() override;
139
140     bool changePipelineState(GstState);
141
142 #if ENABLE(WEB_AUDIO)
143     AudioSourceProvider* audioSourceProvider() override { return reinterpret_cast<AudioSourceProvider*>(m_audioSourceProvider.get()); }
144 #endif
145
146 private:
147     static void getSupportedTypes(HashSet<String>&);
148     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
149
150     static bool isAvailable();
151
152     WeakPtr<MediaPlayerPrivateGStreamer> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
153
154     GstElement* createAudioSink() override;
155
156     float playbackPosition() const;
157
158     void cacheDuration();
159     void updateStates();
160     void asyncStateChangeDone();
161
162     void createGSTPlayBin();
163
164     bool loadNextLocation();
165     void mediaLocationChanged(GstMessage*);
166
167     void setDownloadBuffering();
168     void processBufferingStats(GstMessage*);
169 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
170     void processMpegTsSection(GstMpegtsSection*);
171 #endif
172 #if ENABLE(VIDEO_TRACK)
173     void processTableOfContents(GstMessage*);
174     void processTableOfContentsEntry(GstTocEntry*, GstTocEntry* parent);
175 #endif
176     bool doSeek(gint64 position, float rate, GstSeekFlags seekType);
177     void updatePlaybackRate();
178
179     String engineDescription() const override { return "GStreamer"; }
180     bool isLiveStream() const override { return m_isStreaming; }
181     bool didPassCORSAccessCheck() const override;
182     bool canSaveMediaData() const override;
183
184 #if ENABLE(MEDIA_SOURCE)
185     // TODO: Implement
186     unsigned long totalVideoFrames() override { return 0; }
187     unsigned long droppedVideoFrames() override { return 0; }
188     unsigned long corruptedVideoFrames() override { return 0; }
189     MediaTime totalFrameDelay() override { return MediaTime::zeroTime(); }
190 #endif
191
192     void readyTimerFired();
193
194     WeakPtrFactory<MediaPlayerPrivateGStreamer> m_weakPtrFactory;
195
196     GRefPtr<GstElement> m_source;
197 #if ENABLE(VIDEO_TRACK)
198     GRefPtr<GstElement> m_textAppSink;
199     GRefPtr<GstPad> m_textAppSinkPad;
200 #endif
201     float m_seekTime;
202     bool m_changingRate;
203     float m_endTime;
204     bool m_isEndReached;
205     mutable bool m_isStreaming;
206     GstStructure* m_mediaLocations;
207     int m_mediaLocationCurrentIndex;
208     bool m_resetPipeline;
209     bool m_paused;
210     bool m_playbackRatePause;
211     bool m_seeking;
212     bool m_seekIsPending;
213     float m_timeOfOverlappingSeek;
214     bool m_canFallBackToLastFinishedSeekPosition;
215     bool m_buffering;
216     float m_playbackRate;
217     float m_lastPlaybackRate;
218     bool m_errorOccured;
219     mutable gfloat m_mediaDuration;
220     bool m_downloadFinished;
221     Timer m_fillTimer;
222     float m_maxTimeLoaded;
223     int m_bufferingPercentage;
224     MediaPlayer::Preload m_preload;
225     bool m_delayingLoad;
226     bool m_mediaDurationKnown;
227     mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
228     bool m_volumeAndMuteInitialized;
229     bool m_hasVideo;
230     bool m_hasAudio;
231     GThreadSafeMainLoopSource m_audioTimerHandler;
232     GThreadSafeMainLoopSource m_textTimerHandler;
233     GThreadSafeMainLoopSource m_videoTimerHandler;
234     GThreadSafeMainLoopSource m_videoCapsTimerHandler;
235     RunLoop::Timer<MediaPlayerPrivateGStreamer> m_readyTimerHandler;
236     mutable unsigned long long m_totalBytes;
237     URL m_url;
238     bool m_preservesPitch;
239 #if ENABLE(WEB_AUDIO)
240     std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider;
241 #endif
242     GstState m_requestedState;
243     GRefPtr<GstElement> m_autoAudioSink;
244     RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback;
245 #if ENABLE(VIDEO_TRACK)
246     Vector<RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks;
247     Vector<RefPtr<InbandTextTrackPrivateGStreamer>> m_textTracks;
248     Vector<RefPtr<VideoTrackPrivateGStreamer>> m_videoTracks;
249     RefPtr<InbandMetadataTextTrackPrivateGStreamer> m_chaptersTrack;
250 #endif
251 #if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
252     HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks;
253 #endif
254 #if ENABLE(MEDIA_SOURCE)
255     RefPtr<MediaSourcePrivateClient> m_mediaSource;
256     bool isMediaSource() const { return m_mediaSource; }
257 #else
258     bool isMediaSource() const { return false; }
259 #endif
260 };
261 }
262
263 #endif // USE(GSTREAMER)
264 #endif