summaryrefslogtreecommitdiff
path: root/playback/player/qt/qgstplayer.h
diff options
context:
space:
mode:
Diffstat (limited to 'playback/player/qt/qgstplayer.h')
-rw-r--r--playback/player/qt/qgstplayer.h316
1 files changed, 316 insertions, 0 deletions
diff --git a/playback/player/qt/qgstplayer.h b/playback/player/qt/qgstplayer.h
new file mode 100644
index 0000000..8ff87d1
--- /dev/null
+++ b/playback/player/qt/qgstplayer.h
@@ -0,0 +1,316 @@
+/* GStreamer
+ *
+ * Copyright (C) 2015 Alexandre Moreno <alexmorenocano@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef QGSTPLAYER_H
+#define QGSTPLAYER_H
+
+#include <QObject>
+#include <QUrl>
+#include <QSize>
+//#include <QtGui/qwindowdefs.h>
+#include <QVariant>
+#include <QList>
+#include <QImage>
+#include <gst/player/player.h>
+
+namespace QGstPlayer {
+
+class VideoRenderer;
+class MediaInfo;
+class StreamInfo;
+class VideInfo;
+class AudioInfo;
+class SubtitleInfo;
+
+class Player : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
+ Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged)
+ Q_PROPERTY(qint64 position READ position NOTIFY positionUpdated)
+ Q_PROPERTY(quint32 positionUpdateInterval READ positionUpdateInterval
+ WRITE setPositionUpdateInterval)
+ Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged)
+ Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
+ Q_PROPERTY(int buffering READ buffering NOTIFY bufferingChanged)
+ Q_PROPERTY(QSize resolution READ resolution WRITE setResolution NOTIFY resolutionChanged)
+ Q_PROPERTY(State state READ state NOTIFY stateChanged)
+ Q_PROPERTY(QObject *mediaInfo READ mediaInfo NOTIFY mediaInfoChanged)
+ Q_PROPERTY(bool videoAvailable READ isVideoAvailable NOTIFY videoAvailableChanged)
+ Q_PROPERTY(QVariant currentVideo READ currentVideo WRITE setCurrentVideo)
+ Q_PROPERTY(QVariant currentAudio READ currentAudio WRITE setCurrentAudio)
+ Q_PROPERTY(QVariant currentSubtitle READ currentSubtitle WRITE setCurrentSubtitle)
+ Q_PROPERTY(bool subtitleEnabled READ isSubtitleEnabled WRITE setSubtitleEnabled
+ NOTIFY subtitleEnabledChanged)
+ Q_PROPERTY(bool autoPlay READ autoPlay WRITE setAutoPlay)
+ Q_PROPERTY(QList<QUrl> playlist READ playlist WRITE setPlaylist)
+
+ Q_ENUMS(State)
+
+public:
+ explicit Player(QObject *parent = 0, VideoRenderer *renderer = 0);
+ virtual ~Player();
+
+ typedef GstPlayerError Error;
+ enum State {
+ STOPPED = GST_PLAYER_STATE_STOPPED,
+ BUFFERING = GST_PLAYER_STATE_BUFFERING,
+ PAUSED = GST_PLAYER_STATE_PAUSED,
+ PLAYING = GST_PLAYER_STATE_PLAYING
+ };
+
+ QUrl source() const;
+ qint64 duration() const;
+ qint64 position() const;
+ qreal volume() const;
+ bool isMuted() const;
+ int buffering() const;
+ State state() const;
+ GstElement *pipeline() const;
+ QSize resolution() const;
+ void setResolution(QSize size);
+ bool isVideoAvailable() const;
+ MediaInfo *mediaInfo() const;
+ QVariant currentVideo() const;
+ QVariant currentAudio() const;
+ QVariant currentSubtitle() const;
+ bool isSubtitleEnabled() const;
+ quint32 positionUpdateInterval() const;
+ bool autoPlay() const;
+ QList<QUrl> playlist() const;
+
+signals:
+ void stateChanged(State new_state);
+ void bufferingChanged(int percent);
+ void endOfStream();
+ void positionUpdated(qint64 new_position);
+ void durationChanged(qint64 duration);
+ void resolutionChanged(QSize resolution);
+ void volumeChanged(qreal volume);
+ void mutedChanged(bool muted);
+ void mediaInfoChanged();
+ void sourceChanged(QUrl new_url);
+ void videoAvailableChanged(bool videoAvailable);
+ void subtitleEnabledChanged(bool enabled);
+
+public slots:
+ void play();
+ void pause();
+ void stop();
+ void seek(qint64 position);
+ void setSource(QUrl const& url);
+ void setVolume(qreal val);
+ void setMuted(bool val);
+ void setPosition(qint64 pos);
+ void setCurrentVideo(QVariant track);
+ void setCurrentAudio(QVariant track);
+ void setCurrentSubtitle(QVariant track);
+ void setSubtitleEnabled(bool enabled);
+ void setPositionUpdateInterval(quint32 interval);
+ void setPlaylist(const QList<QUrl> &playlist);
+ void next();
+ void previous();
+ void setAutoPlay(bool auto_play);
+
+private:
+ Q_DISABLE_COPY(Player)
+ static void onStateChanged(Player *, GstPlayerState state);
+ static void onPositionUpdated(Player *, GstClockTime position);
+ static void onDurationChanged(Player *, GstClockTime duration);
+ static void onBufferingChanged(Player *, int percent);
+ static void onVideoDimensionsChanged(Player *, int w, int h);
+ static void onVolumeChanged(Player *);
+ static void onMuteChanged(Player *);
+ static void onMediaInfoUpdated(Player *, GstPlayerMediaInfo *media_info);
+ static void onEndOfStreamReached(Player *);
+
+ void setUri(QUrl url);
+
+ GstPlayer *player_;
+ State state_;
+ QSize videoDimensions_;
+ MediaInfo *mediaInfo_;
+ bool videoAvailable_;
+ bool subtitleEnabled_;
+ bool autoPlay_;
+ QList<QUrl> playlist_;
+ QList<QUrl>::iterator iter_;
+};
+
+class VideoRenderer
+{
+public:
+ GstPlayerVideoRenderer *renderer();
+ virtual GstElement *createVideoSink() = 0;
+protected:
+ VideoRenderer();
+ virtual ~VideoRenderer();
+private:
+ GstPlayerVideoRenderer *renderer_;
+};
+
+class MediaInfo : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString uri READ uri NOTIFY uriChanged)
+ Q_PROPERTY(bool seekable READ isSeekable NOTIFY seekableChanged)
+ Q_PROPERTY(QString title READ title NOTIFY titleChanged)
+ Q_PROPERTY(QList<QObject*> videoStreams READ videoStreams CONSTANT)
+ Q_PROPERTY(QList<QObject*> audioStreams READ audioStreams CONSTANT)
+ Q_PROPERTY(QList<QObject*> subtitleStreams READ subtitleStreams CONSTANT)
+ Q_PROPERTY(QImage sample READ sample NOTIFY sampleChanged)
+
+public:
+ explicit MediaInfo(Player *player = 0);
+ QString uri() const;
+ QString title() const;
+ bool isSeekable() const;
+ const QList<QObject*> &videoStreams() const;
+ const QList<QObject*> &audioStreams() const;
+ const QList<QObject*> &subtitleStreams() const;
+ const QImage &sample();
+
+signals:
+ void uriChanged();
+ void seekableChanged();
+ void titleChanged();
+ void sampleChanged();
+
+public Q_SLOTS:
+ void update(GstPlayerMediaInfo *info);
+private:
+ QString uri_;
+ QString title_;
+ bool isSeekable_;
+ QList<QObject*> videoStreams_;
+ QList<QObject*> audioStreams_;
+ QList<QObject*> subtitleStreams_;
+ QImage sample_;
+};
+
+class StreamInfo : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int index READ index CONSTANT)
+public:
+ int index() const;
+
+protected:
+ StreamInfo(GstPlayerStreamInfo* info);
+private:
+ GstPlayerStreamInfo *stream_;
+ int index_;
+};
+
+class VideoInfo : public StreamInfo
+{
+ Q_OBJECT
+ Q_PROPERTY(QSize resolution READ resolution CONSTANT)
+public:
+ VideoInfo(GstPlayerVideoInfo *info);
+ QSize resolution() const;
+
+private:
+ GstPlayerVideoInfo *video_;
+ QSize resolution_;
+};
+
+class AudioInfo : public StreamInfo
+{
+ Q_OBJECT
+ Q_PROPERTY(QString language READ language CONSTANT)
+ Q_PROPERTY(int channels READ channels CONSTANT)
+ Q_PROPERTY(int bitRate READ bitRate CONSTANT)
+ Q_PROPERTY(int sampleRate READ sampleRate CONSTANT)
+
+public:
+ AudioInfo(GstPlayerAudioInfo *info);
+ QString const& language() const;
+ int channels() const;
+ int bitRate() const;
+ int sampleRate() const;
+
+private:
+ GstPlayerAudioInfo *audio_;
+ QString language_;
+ int channels_;
+ int bitRate_;
+ int sampleRate_;
+};
+
+class SubtitleInfo : public StreamInfo
+{
+ Q_OBJECT
+ Q_PROPERTY(QString language READ language CONSTANT)
+public:
+ SubtitleInfo(GstPlayerSubtitleInfo *info);
+ QString const& language() const;
+
+private:
+ GstPlayerSubtitleInfo *subtitle_;
+ QString language_;
+};
+
+}
+
+Q_DECLARE_METATYPE(QGstPlayer::Player*)
+Q_DECLARE_METATYPE(QGstPlayer::Player::State)
+Q_DECLARE_METATYPE(QGstPlayer::MediaInfo*)
+
+extern "C" {
+
+typedef struct _GstPlayerQtVideoRenderer
+ GstPlayerQtVideoRenderer;
+
+typedef struct _GstPlayerQtVideoRendererClass
+ GstPlayerQtVideoRendererClass;
+
+#define GST_TYPE_PLAYER_QT_VIDEO_RENDERER (gst_player_qt_video_renderer_get_type ())
+#define GST_IS_PLAYER_QT_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_QT_VIDEO_RENDERER))
+#define GST_IS_PLAYER_QT_VIDEO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_QT_VIDEO_RENDERER))
+#define GST_PLAYER_QT_VIDEO_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_QT_VIDEO_RENDERER, GstPlayerQtVideoRendererClass))
+#define GST_PLAYER_QT_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_QT_VIDEO_RENDERER, GstPlayerQtVideoRenderer))
+#define GST_PLAYER_QT_VIDEO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_QT_VIDEO_RENDERER, GstPlayerQtVideoRendererClass))
+#define GST_PLAYER_QT_VIDEO_RENDERER_CAST(obj) ((GstPlayerQtVideoRenderer*)(obj))
+
+GType gst_player_qt_video_renderer_get_type (void);
+
+typedef struct _GstPlayerQtSignalDispatcher
+ GstPlayerQtSignalDispatcher;
+
+typedef struct _GstPlayerQtSignalDispatcherClass
+ GstPlayerQtSignalDispatcherClass;
+
+#define GST_TYPE_PLAYER_QT_SIGNAL_DISPATCHER (gst_player_qt_signal_dispatcher_get_type ())
+#define GST_IS_PLAYER_QT_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_QT_SIGNAL_DISPATCHER))
+#define GST_IS_PLAYER_QT_SIGNAL_DISPATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_QT_SIGNAL_DISPATCHER))
+#define GST_PLAYER_QT_SIGNAL_DISPATCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_QT_SIGNAL_DISPATCHER, GstPlayerQtSignalDispatcherClass))
+#define GST_PLAYER_QT_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_QT_SIGNAL_DISPATCHER, GstPlayerQtSignalDispatcher))
+#define GST_PLAYER_QT_SIGNAL_DISPATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_QT_SIGNAL_DISPATCHER, GstPlayerQtSignalDispatcherClass))
+#define GST_PLAYER_QT_SIGNAL_DISPATCHER_CAST(obj) ((GstPlayerQtSignalDispatcher*)(obj))
+
+GType gst_player_qt_video_renderer_get_type (void);
+
+GstPlayerSignalDispatcher *
+gst_player_qt_signal_dispatcher_new (gpointer player);
+
+}
+
+#endif // QGSTPLAYER_H