[GStreamer] create playbin in ::load(), not in player constructor
[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  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * aint with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #ifndef MediaPlayerPrivateGStreamer_h
24 #define MediaPlayerPrivateGStreamer_h
25 #if ENABLE(VIDEO) && USE(GSTREAMER)
26
27 #include "GRefPtrGStreamer.h"
28 #include "MediaPlayerPrivate.h"
29 #include "Timer.h"
30
31 #include <glib.h>
32 #include <gst/gst.h>
33 #include <wtf/Forward.h>
34
35 typedef struct _WebKitVideoSink WebKitVideoSink;
36 typedef struct _GstBuffer GstBuffer;
37 typedef struct _GstMessage GstMessage;
38 typedef struct _GstElement GstElement;
39
40 namespace WebCore {
41
42 class GraphicsContext;
43 class IntSize;
44 class IntRect;
45 class GStreamerGWorld;
46 class MediaPlayerPrivateGStreamer;
47
48 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface {
49
50         public:
51             ~MediaPlayerPrivateGStreamer();
52             static void registerMediaEngine(MediaEngineRegistrar);
53             gboolean handleMessage(GstMessage*);
54
55             IntSize naturalSize() const;
56             bool hasVideo() const { return m_hasVideo; }
57             bool hasAudio() const { return m_hasAudio; }
58
59             void load(const String &url);
60             void commitLoad();
61             void cancelLoad();
62
63             void prepareToPlay();
64             void play();
65             void pause();
66
67             bool paused() const;
68             bool seeking() const;
69
70             float duration() const;
71             float currentTime() const;
72             void seek(float);
73
74             void setRate(float);
75
76             void setVolume(float);
77             void volumeChanged();
78             void notifyPlayerOfVolumeChange();
79
80             bool supportsMuting() const;
81             void setMuted(bool);
82             void muteChanged();
83             void notifyPlayerOfMute();
84
85             void setPreload(MediaPlayer::Preload);
86             void fillTimerFired(Timer<MediaPlayerPrivateGStreamer>*);
87
88             MediaPlayer::NetworkState networkState() const;
89             MediaPlayer::ReadyState readyState() const;
90
91             PassRefPtr<TimeRanges> buffered() const;
92             float maxTimeSeekable() const;
93             bool didLoadingProgress() const;
94             unsigned totalBytes() const;
95
96             void setVisible(bool);
97             void setSize(const IntSize&);
98
99             void loadStateChanged();
100             void sizeChanged();
101             void timeChanged();
102             void didEnd();
103             void durationChanged();
104             void loadingFailed(MediaPlayer::NetworkState);
105
106             void triggerRepaint(GstBuffer*);
107             void repaint();
108             void paint(GraphicsContext*, const IntRect&);
109
110             bool hasSingleSecurityOrigin() const;
111
112             bool supportsFullscreen() const;
113             PlatformMedia platformMedia() const;
114
115             void videoChanged();
116             void audioChanged();
117             void notifyPlayerOfVideo();
118             void notifyPlayerOfAudio();
119
120             void sourceChanged();
121
122             unsigned decodedFrameCount() const;
123             unsigned droppedFrameCount() const;
124             unsigned audioDecodedByteCount() const;
125             unsigned videoDecodedByteCount() const;
126
127             MediaPlayer::MovieLoadType movieLoadType() const;
128
129         private:
130             MediaPlayerPrivateGStreamer(MediaPlayer*);
131
132             static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
133
134             static void getSupportedTypes(HashSet<String>&);
135             static MediaPlayer::SupportsType supportsType(const String& type, const String& codecs, const KURL&);
136
137             static bool isAvailable();
138
139             void updateAudioSink();
140
141             float playbackPosition() const;
142
143             void cacheDuration();
144             void updateStates();
145             float maxTimeLoaded() const;
146
147             void createGSTPlayBin();
148             bool changePipelineState(GstState state);
149
150             bool loadNextLocation();
151             void mediaLocationChanged(GstMessage*);
152
153             void setDownloadBuffering();
154             void processBufferingStats(GstMessage*);
155
156             virtual String engineDescription() const { return "GStreamer"; }
157             bool isLiveStream() const { return m_isStreaming; }
158
159         private:
160             MediaPlayer* m_player;
161             GstElement* m_playBin;
162             GstElement* m_webkitVideoSink;
163             GstElement* m_videoSinkBin;
164             GstElement* m_fpsSink;
165             GRefPtr<GstElement> m_source;
166             float m_seekTime;
167             bool m_changingRate;
168             float m_endTime;
169             bool m_isEndReached;
170             MediaPlayer::NetworkState m_networkState;
171             MediaPlayer::ReadyState m_readyState;
172             mutable bool m_isStreaming;
173             IntSize m_size;
174             GstBuffer* m_buffer;
175             GstStructure* m_mediaLocations;
176             int m_mediaLocationCurrentIndex;
177             bool m_resetPipeline;
178             bool m_paused;
179             bool m_seeking;
180             bool m_buffering;
181             float m_playbackRate;
182             bool m_errorOccured;
183             gfloat m_mediaDuration;
184             bool m_startedBuffering;
185             Timer<MediaPlayerPrivateGStreamer> m_fillTimer;
186             float m_maxTimeLoaded;
187             int m_bufferingPercentage;
188             MediaPlayer::Preload m_preload;
189             bool m_delayingLoad;
190             bool m_mediaDurationKnown;
191             mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
192 #ifndef GST_API_VERSION_1
193             RefPtr<GStreamerGWorld> m_gstGWorld;
194 #endif
195             guint m_volumeTimerHandler;
196             guint m_muteTimerHandler;
197             bool m_volumeAndMuteInitialized;
198             bool m_hasVideo;
199             bool m_hasAudio;
200             guint m_audioTimerHandler;
201             guint m_videoTimerHandler;
202             GRefPtr<GstElement> m_webkitAudioSink;
203             mutable long m_totalBytes;
204             GRefPtr<GstPad> m_videoSinkPad;
205             mutable IntSize m_videoSize;
206             KURL m_url;
207             bool m_originalPreloadWasAutoAndWasOverridden;
208     };
209 }
210
211 #endif // USE(GSTREAMER)
212 #endif