8a1fd48605424b5101f049e1fd05c50ec10a640e
[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 "MediaPlayerPrivateGStreamerBase.h"
29 #include "Timer.h"
30
31 #include <glib.h>
32 #include <gst/gst.h>
33 #include <wtf/Forward.h>
34
35 typedef struct _GstBuffer GstBuffer;
36 typedef struct _GstMessage GstMessage;
37 typedef struct _GstElement GstElement;
38
39 namespace WebCore {
40
41 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
42 public:
43     ~MediaPlayerPrivateGStreamer();
44     static void registerMediaEngine(MediaEngineRegistrar);
45     gboolean handleMessage(GstMessage*);
46
47     bool hasVideo() const { return m_hasVideo; }
48     bool hasAudio() const { return m_hasAudio; }
49
50     void load(const String &url);
51     void commitLoad();
52     void cancelLoad();
53
54     void prepareToPlay();
55     void play();
56     void pause();
57
58     bool paused() const;
59     bool seeking() const;
60
61     float duration() const;
62     float currentTime() const;
63     void seek(float);
64
65     void setRate(float);
66     void setPreservesPitch(bool);
67
68     void setPreload(MediaPlayer::Preload);
69     void fillTimerFired(Timer<MediaPlayerPrivateGStreamer>*);
70
71     PassRefPtr<TimeRanges> buffered() const;
72     float maxTimeSeekable() const;
73     bool didLoadingProgress() const;
74     unsigned totalBytes() const;
75     float maxTimeLoaded() const;
76
77     void loadStateChanged();
78     void timeChanged();
79     void didEnd();
80     void durationChanged();
81     void loadingFailed(MediaPlayer::NetworkState);
82
83     void videoChanged();
84     void audioChanged();
85     void notifyPlayerOfVideo();
86     void notifyPlayerOfAudio();
87
88     void sourceChanged();
89     GstElement* audioSink() const;
90
91 private:
92     MediaPlayerPrivateGStreamer(MediaPlayer*);
93
94     static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
95
96     static void getSupportedTypes(HashSet<String>&);
97     static MediaPlayer::SupportsType supportsType(const String& type, const String& codecs, const KURL&);
98
99     static bool isAvailable();
100
101     void updateAudioSink();
102     void createAudioSink();
103
104     float playbackPosition() const;
105
106     void cacheDuration();
107     void updateStates();
108
109     void createGSTPlayBin();
110     bool changePipelineState(GstState);
111
112     bool loadNextLocation();
113     void mediaLocationChanged(GstMessage*);
114
115     void setDownloadBuffering();
116     void processBufferingStats(GstMessage*);
117
118     virtual String engineDescription() const { return "GStreamer"; }
119     virtual bool isLiveStream() const { return m_isStreaming; }
120
121 private:
122     GRefPtr<GstElement> m_playBin;
123     GRefPtr<GstElement> m_source;
124     float m_seekTime;
125     bool m_changingRate;
126     float m_endTime;
127     bool m_isEndReached;
128     mutable bool m_isStreaming;
129     GstStructure* m_mediaLocations;
130     int m_mediaLocationCurrentIndex;
131     bool m_resetPipeline;
132     bool m_paused;
133     bool m_seeking;
134     bool m_buffering;
135     float m_playbackRate;
136     bool m_errorOccured;
137     gfloat m_mediaDuration;
138     bool m_startedBuffering;
139     Timer<MediaPlayerPrivateGStreamer> m_fillTimer;
140     float m_maxTimeLoaded;
141     int m_bufferingPercentage;
142     MediaPlayer::Preload m_preload;
143     bool m_delayingLoad;
144     bool m_mediaDurationKnown;
145     mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
146     bool m_volumeAndMuteInitialized;
147     bool m_hasVideo;
148     bool m_hasAudio;
149     guint m_audioTimerHandler;
150     guint m_videoTimerHandler;
151     GRefPtr<GstElement> m_webkitAudioSink;
152     mutable long m_totalBytes;
153     KURL m_url;
154     bool m_originalPreloadWasAutoAndWasOverridden;
155     bool m_preservesPitch;
156 };
157 }
158
159 #endif // USE(GSTREAMER)
160 #endif