[GStreamer] Stopping playback of html5 media when receiving a higher priority audio...
[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     void setAudioStreamProperties(GObject*);
92
93     void simulateAudioInterruption();
94
95 private:
96     MediaPlayerPrivateGStreamer(MediaPlayer*);
97
98     static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
99
100     static void getSupportedTypes(HashSet<String>&);
101     static MediaPlayer::SupportsType supportsType(const String& type, const String& codecs, const KURL&);
102
103     static bool isAvailable();
104
105     void updateAudioSink();
106     void createAudioSink();
107
108     float playbackPosition() const;
109
110     void cacheDuration();
111     void updateStates();
112
113     void createGSTPlayBin();
114     bool changePipelineState(GstState);
115
116     bool loadNextLocation();
117     void mediaLocationChanged(GstMessage*);
118
119     void setDownloadBuffering();
120     void processBufferingStats(GstMessage*);
121
122     virtual String engineDescription() const { return "GStreamer"; }
123     virtual bool isLiveStream() const { return m_isStreaming; }
124
125 private:
126     GRefPtr<GstElement> m_playBin;
127     GRefPtr<GstElement> m_source;
128     float m_seekTime;
129     bool m_changingRate;
130     float m_endTime;
131     bool m_isEndReached;
132     mutable bool m_isStreaming;
133     GstStructure* m_mediaLocations;
134     int m_mediaLocationCurrentIndex;
135     bool m_resetPipeline;
136     bool m_paused;
137     bool m_seeking;
138     bool m_buffering;
139     float m_playbackRate;
140     bool m_errorOccured;
141     gfloat m_mediaDuration;
142     bool m_startedBuffering;
143     Timer<MediaPlayerPrivateGStreamer> m_fillTimer;
144     float m_maxTimeLoaded;
145     int m_bufferingPercentage;
146     MediaPlayer::Preload m_preload;
147     bool m_delayingLoad;
148     bool m_mediaDurationKnown;
149     mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
150     bool m_volumeAndMuteInitialized;
151     bool m_hasVideo;
152     bool m_hasAudio;
153     guint m_audioTimerHandler;
154     guint m_videoTimerHandler;
155     GRefPtr<GstElement> m_webkitAudioSink;
156     mutable long m_totalBytes;
157     KURL m_url;
158     bool m_originalPreloadWasAutoAndWasOverridden;
159     bool m_preservesPitch;
160     GstState m_requestedState;
161     GRefPtr<GstElement> m_autoAudioSink;
162 };
163 }
164
165 #endif // USE(GSTREAMER)
166 #endif