summaryrefslogtreecommitdiff
path: root/qt
diff options
context:
space:
mode:
authorAlexandre Moreno <alexmorenocano@gmail.com>2015-11-02 01:48:08 +0800
committerSebastian Dröge <sebastian@centricular.com>2015-11-02 09:28:51 +0200
commit3223f782d892d8a7840eabee041fcf356320939a (patch)
tree07485355139a0805b82a5cdd364b9feface412a3 /qt
parent42078e5faeee0c6d3925f55d369546dd1c9d3dc5 (diff)
qt: add new qml item to render media info sample
when video is not available it will try to display the sample image returned by media info object.
Diffstat (limited to 'qt')
-rw-r--r--qt/imagesample.cpp61
-rw-r--r--qt/imagesample.h46
-rw-r--r--qt/main.cpp2
-rw-r--r--qt/main.qml12
-rw-r--r--qt/play.pro6
-rw-r--r--qt/qgstplayer.cpp54
-rw-r--r--qt/qgstplayer.h6
7 files changed, 185 insertions, 2 deletions
diff --git a/qt/imagesample.cpp b/qt/imagesample.cpp
new file mode 100644
index 0000000..94c07d4
--- /dev/null
+++ b/qt/imagesample.cpp
@@ -0,0 +1,61 @@
+/* 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.
+ */
+
+#include <QPainter>
+#include "imagesample.h"
+
+ImageSample::ImageSample()
+ : QQuickPaintedItem()
+ , sample_()
+{
+
+}
+
+ImageSample::~ImageSample()
+{
+
+}
+
+void ImageSample::paint(QPainter *painter)
+{
+ if (sample_.size().isEmpty())
+ return;
+
+ float aspect_ratio = sample_.width() / sample_.height();
+ int w = height() * aspect_ratio;
+ int x = (width() - w) / 2;
+
+ painter->setViewport(x, 0, w, height());
+ painter->drawImage(QRectF(0, 0, width(), height()), sample_);
+}
+
+const QImage &ImageSample::sample() const
+{
+ return sample_;
+}
+
+void ImageSample::setSample(const QImage &sample)
+{
+ sample_ = sample;
+ update();
+}
+
+
+
diff --git a/qt/imagesample.h b/qt/imagesample.h
new file mode 100644
index 0000000..917bb24
--- /dev/null
+++ b/qt/imagesample.h
@@ -0,0 +1,46 @@
+/* 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 IMAGESAMPLE_H
+#define IMAGESAMPLE_H
+
+#include <QObject>
+#include <QQuickPaintedItem>
+#include <QImage>
+#include <QPainter>
+#include "player.h"
+
+class ImageSample : public QQuickPaintedItem
+{
+ Q_OBJECT
+ Q_PROPERTY(QImage sample READ sample WRITE setSample)
+public:
+ ImageSample();
+ ~ImageSample();
+ void paint(QPainter *painter);
+
+ const QImage &sample() const;
+ void setSample(const QImage &sample);
+
+private:
+ QImage sample_;
+};
+
+#endif // IMAGESAMPLE_H
diff --git a/qt/main.cpp b/qt/main.cpp
index 999ddcb..4ef6b64 100644
--- a/qt/main.cpp
+++ b/qt/main.cpp
@@ -25,6 +25,7 @@
#include <QUrl>
#include "player.h"
+#include "imagesample.h"
int main(int argc, char *argv[])
{
@@ -45,6 +46,7 @@ int main(int argc, char *argv[])
}
qmlRegisterType<Player>("Player", 1, 0, "Player");
+ qmlRegisterType<ImageSample>("ImageSample", 1, 0, "ImageSample");
/* the plugin must be loaded before loading the qml file to register the
* GstGLVideoItem qml item
diff --git a/qt/main.qml b/qt/main.qml
index 15a8292..ce1cf8f 100644
--- a/qt/main.qml
+++ b/qt/main.qml
@@ -25,6 +25,7 @@ import QtQuick.Dialogs 1.2
import QtQuick.Window 2.1
import Player 1.0
import org.freedesktop.gstreamer.GLVideoItem 1.0
+import ImageSample 1.0
import "fontawesome.js" as FontAwesome
@@ -50,6 +51,7 @@ ApplicationWindow {
playbutton.state = "play"
}
}
+
onResolutionChanged: {
if (player.videoAvailable) {
window.width = resolution.width
@@ -64,6 +66,16 @@ ApplicationWindow {
anchors.centerIn: parent
width: parent.width
height: parent.height
+ visible: player.videoAvailable
+ }
+
+ ImageSample {
+ id: sample
+ anchors.centerIn: parent
+ sample: player.mediaInfo.sample
+ width: parent.width
+ height: parent.height
+ visible: !player.videoAvailable
}
MouseArea {
diff --git a/qt/play.pro b/qt/play.pro
index c8b2954..d16440c 100644
--- a/qt/play.pro
+++ b/qt/play.pro
@@ -41,13 +41,15 @@ macx {
HEADERS += \
qgstplayer.h \
player.h \
- quickrenderer.h
+ quickrenderer.h \
+ imagesample.h
SOURCES += main.cpp \
qgstplayer.cpp \
../lib/gst/player/gstplayer.c \
../lib/gst/player/gstplayer-media-info.c \
player.cpp \
- quickrenderer.cpp
+ quickrenderer.cpp \
+ imagesample.cpp
DISTFILES +=
diff --git a/qt/qgstplayer.cpp b/qt/qgstplayer.cpp
index 8c350d5..b15347f 100644
--- a/qt/qgstplayer.cpp
+++ b/qt/qgstplayer.cpp
@@ -25,6 +25,10 @@
#include <functional>
#include <QThread>
#include <QtAlgorithms>
+#include <QImage>
+
+#include <gst/gst.h>
+#include <gst/tag/tag.h>
namespace QGstPlayer {
@@ -43,6 +47,10 @@ MediaInfo::MediaInfo(Player *player)
, uri_()
, title_()
, isSeekable_(false)
+ , videoStreams_()
+ , audioStreams_()
+ , subtitleStreams_()
+ , sample_()
{
}
@@ -77,6 +85,11 @@ const QList<QObject*> &MediaInfo::subtitleStreams() const
return subtitleStreams_;
}
+const QImage &MediaInfo::sample()
+{
+ return sample_;
+}
+
void MediaInfo::update(GstPlayerMediaInfo *info)
{
Q_ASSERT(info != 0);
@@ -146,6 +159,47 @@ void MediaInfo::update(GstPlayerMediaInfo *info)
audios->append(new AudioInfo(info));
}, &audioStreams_);
+
+ GstSample *sample;
+ GstMapInfo map_info;
+ GstBuffer *buffer;
+ const GstStructure *caps_struct;
+ GstTagImageType type = GST_TAG_IMAGE_TYPE_UNDEFINED;
+
+ /* get image sample buffer from media */
+ sample = gst_player_media_info_get_image_sample (info);
+ if (!sample)
+ return;
+
+ buffer = gst_sample_get_buffer (sample);
+ caps_struct = gst_sample_get_info (sample);
+
+ /* if sample is retrieved from preview-image tag then caps struct
+ * will not be defined. */
+ if (caps_struct)
+ gst_structure_get_enum (caps_struct, "image-type",
+ GST_TYPE_TAG_IMAGE_TYPE, reinterpret_cast<gint*>(&type));
+
+ /* FIXME: Should we check more type ?? */
+ if ((type != GST_TAG_IMAGE_TYPE_FRONT_COVER) &&
+ (type != GST_TAG_IMAGE_TYPE_UNDEFINED) &&
+ (type != GST_TAG_IMAGE_TYPE_NONE)) {
+ g_print ("unsupport type ... %d \n", type);
+ return;
+ }
+
+ if (!gst_buffer_map (buffer, &map_info, GST_MAP_READ)) {
+ g_print ("failed to map gst buffer \n");
+ return;
+ }
+
+ sample_ = QImage::fromData(map_info.data, map_info.size);
+ if (sample_.isNull())
+ qWarning() << "failed to load media info sample image";
+
+ emit sampleChanged();
+
+ gst_buffer_unmap (buffer, &map_info);
}
VideoInfo::VideoInfo(GstPlayerVideoInfo *info)
diff --git a/qt/qgstplayer.h b/qt/qgstplayer.h
index c41f66c..8ff87d1 100644
--- a/qt/qgstplayer.h
+++ b/qt/qgstplayer.h
@@ -27,6 +27,7 @@
//#include <QtGui/qwindowdefs.h>
#include <QVariant>
#include <QList>
+#include <QImage>
#include <gst/player/player.h>
namespace QGstPlayer {
@@ -174,6 +175,7 @@ class MediaInfo : public QObject
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);
@@ -183,11 +185,13 @@ public:
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);
@@ -198,6 +202,7 @@ private:
QList<QObject*> videoStreams_;
QList<QObject*> audioStreams_;
QList<QObject*> subtitleStreams_;
+ QImage sample_;
};
class StreamInfo : public QObject
@@ -267,6 +272,7 @@ private:
Q_DECLARE_METATYPE(QGstPlayer::Player*)
Q_DECLARE_METATYPE(QGstPlayer::Player::State)
+Q_DECLARE_METATYPE(QGstPlayer::MediaInfo*)
extern "C" {