source: trunk/src/3rdparty/phonon/gstreamer/mediaobject.h@ 757

Last change on this file since 757 was 2, checked in by Dmitry A. Kuminov, 17 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 7.3 KB
Line 
1/* This file is part of the KDE project.
2
3 Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
5 This library is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation, either version 2.1 or 3 of the License.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public License
15 along with this library. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#ifndef Phonon_GSTREAMER_MEDIAOBJECT_H
19#define Phonon_GSTREAMER_MEDIAOBJECT_H
20
21#include "backend.h"
22#include "common.h"
23#include "medianode.h"
24#include <phonon/mediaobjectinterface.h>
25#include <phonon/addoninterface.h>
26
27#include <QtCore/QHash>
28#include <QtCore/QString>
29#include <QtCore/QVariant>
30#include <QtCore/QObject>
31#include <QtCore/QDate>
32#include <QtCore/QEvent>
33#include <QtCore/QUrl>
34#include <gst/gst.h>
35
36QT_BEGIN_NAMESPACE
37
38class QTimer;
39typedef QMultiMap<QString, QString> TagMap;
40
41namespace Phonon
42{
43namespace Gstreamer
44{
45
46class VideoWidget;
47class AudioPath;
48class VideoPath;
49class AudioOutput;
50
51class MediaObject : public QObject, public MediaObjectInterface
52#ifndef QT_NO_PHONON_MEDIACONTROLLER
53 , public AddonInterface
54#endif
55 , public MediaNode
56{
57 friend class Stream;
58 Q_OBJECT
59 Q_INTERFACES(Phonon::MediaObjectInterface
60#ifndef QT_NO_PHONON_MEDIACONTROLLER
61 Phonon::AddonInterface
62#endif
63 Phonon::Gstreamer::MediaNode
64 )
65
66public:
67
68 MediaObject(Backend *backend, QObject *parent);
69 ~MediaObject();
70 Phonon::State state() const;
71
72 bool hasVideo() const;
73 bool isSeekable() const;
74
75 qint64 currentTime() const;
76 qint32 tickInterval() const;
77
78 void setTickInterval(qint32 newTickInterval);
79
80 void play();
81 void pause();
82 void stop();
83 void seek(qint64 time);
84
85 QString errorString() const;
86 Phonon::ErrorType errorType() const;
87
88 QUrl url() const;
89 qint64 totalTime() const;
90
91 qint32 prefinishMark() const;
92 void setPrefinishMark(qint32 newPrefinishMark);
93
94 qint32 transitionTime() const;
95 void setTransitionTime(qint32);
96 qint64 remainingTime() const;
97
98 void setSource(const MediaSource &source);
99 void setNextSource(const MediaSource &source);
100 MediaSource source() const;
101
102 // No additional interfaces currently supported
103#ifndef QT_NO_PHONON_MEDIACONTROLLER
104 bool hasInterface(Interface) const;
105 QVariant interfaceCall(Interface, int, const QList<QVariant> &);
106#endif
107 bool isLoading()
108 {
109 return m_loading;
110 }
111
112 bool audioAvailable()
113 {
114 return m_hasAudio;
115 }
116
117 bool videoAvailable()
118 {
119 return m_hasVideo;
120 }
121
122 GstElement *audioGraph()
123 {
124 return m_audioGraph;
125 }
126
127 GstElement *videoGraph()
128 {
129 return m_videoGraph;
130 }
131
132 GstElement *pipeline()
133 {
134 return m_pipeline;
135 };
136
137 gulong capsHandler()
138 {
139 return m_capsHandler;
140 };
141
142 void connectVideo(GstPad *videoPad);
143 void connectAudio(GstPad *audioPad);
144 void handleBusMessage(const Message &msg);
145 void handleEndOfStream();
146 void addMissingCodecName(const QString &codec) { m_missingCodecs.append(codec); }
147 void invalidateGraph() {
148 m_resetNeeded = true;
149 if (m_state == Phonon::PlayingState || m_state == Phonon::PausedState) {
150 changeState(Phonon::StoppedState);
151 }
152 }
153 static void cb_newpad (GstElement *decodebin, GstPad *pad, gboolean last, gpointer data);
154 static void cb_pad_added (GstElement *decodebin, GstPad *pad, gpointer data);
155 static void cb_unknown_type (GstElement *decodebin, GstPad *pad, GstCaps *caps, gpointer data);
156 static void cb_no_more_pads (GstElement * decodebin, gpointer data);
157 void saveState();
158 void resumeState();
159
160public Q_SLOTS:
161 void setState(State);
162
163Q_SIGNALS:
164 void currentSourceChanged(const MediaSource &newSource);
165 void stateChanged(Phonon::State newstate, Phonon::State oldstate);
166 void tick(qint64 time);
167 void metaDataChanged(QMultiMap<QString, QString>);
168 void seekableChanged(bool);
169 void hasVideoChanged(bool);
170
171 void finished();
172 void prefinishMarkReached(qint32);
173 void aboutToFinish();
174 void totalTimeChanged(qint64 length);
175 void bufferStatus(int percentFilled);
176
177 QMultiMap<QString, QString> metaData();
178 void setMetaData(QMultiMap<QString, QString> newData);
179
180 // AddonInterface:
181 void titleChanged(int);
182 void availableTitlesChanged(int);
183
184 // Not implemented
185 void chapterChanged(int);
186 void availableChaptersChanged(int);
187 void angleChanged(int);
188 void availableAnglesChanged(int);
189
190 void availableSubtitlesChanged();
191 void availableAudioChannelsChanged();
192
193protected:
194 void beginLoad();
195 void loadingComplete();
196 void newPadAvailable (GstPad *pad);
197 void changeState(State);
198 void setError(const QString &errorString, Phonon::ErrorType error = NormalError);
199 /*
200 * @param encodedUrl percent-encoded QString for source compat reasons. Should change to QUrl
201 */
202 bool createPipefromURL(const QUrl &url);
203 bool createPipefromStream(const MediaSource &);
204
205private Q_SLOTS:
206 void noMorePadsAvailable();
207 void getStreamInfo();
208 void emitTick();
209 void beginPlay();
210 void setVideoCaps(GstCaps *caps);
211 void notifyStateChange(Phonon::State newstate, Phonon::State oldstate);
212protected:
213 GstElement *audioElement()
214 {
215 Q_ASSERT(m_audioPipe);
216 return m_audioPipe;
217 }
218
219 GstElement *videoElement()
220 {
221 Q_ASSERT(m_videoPipe);
222 return m_videoPipe;
223 }
224
225private:
226
227 // GStreamer specific :
228 void createPipeline();
229 bool addToPipeline(GstElement *elem);
230 void setTotalTime(qint64 newTime);
231 void getStreamsInfo();
232 bool updateTotalTime();
233 void updateSeekable();
234 qint64 getPipelinePos() const;
235
236 int _iface_availableTitles() const;
237 int _iface_currentTitle() const;
238 void _iface_setCurrentTitle(int title);
239
240 bool m_resumeState;
241 State m_oldState;
242 quint64 m_oldPos;
243
244 State m_state;
245 State m_pendingState;
246 QTimer *m_tickTimer;
247 qint32 m_tickInterval;
248
249 MediaSource m_source;
250 MediaSource m_nextSource;
251 qint32 m_prefinishMark;
252 qint32 m_transitionTime;
253
254 qint64 m_posAtSeek;
255
256 bool m_prefinishMarkReachedNotEmitted;
257 bool m_aboutToFinishEmitted;
258 bool m_loading;
259 gulong m_capsHandler;
260
261 GstElement *m_datasource;
262 GstElement *m_decodebin;
263
264 GstElement *m_audioPipe;
265 GstElement *m_videoPipe;
266
267 qint64 m_totalTime;
268 int m_bufferPercent;
269 bool m_hasVideo;
270 bool m_videoStreamFound;
271 bool m_hasAudio;
272 bool m_seekable;
273 bool m_atEndOfStream;
274 bool m_atStartOfStream;
275 Phonon::ErrorType m_error;
276 QString m_errorString;
277
278 GstElement *m_pipeline;
279 GstElement *m_audioGraph;
280 GstElement *m_videoGraph;
281 int m_previousTickTime;
282 bool m_resetNeeded;
283 QStringList m_missingCodecs;
284 QMultiMap<QString, QString> m_metaData;
285 bool m_autoplayTitles;
286 int m_availableTitles;
287 int m_currentTitle;
288};
289}
290} //namespace Phonon::Gstreamer
291
292QT_END_NAMESPACE
293
294#endif // Phonon_GSTREAMER_MEDIAOBJECT_H
Note: See TracBrowser for help on using the repository browser.