summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2013-10-21 16:00:21 +0200
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2013-10-28 13:18:00 +0100
commitc326d554b22a24e2755cf80ebd6a2a3b49caabc2 (patch)
tree25da12ef65d6d505883ebc0106be867f8bd62bbc
parentd272518ef8999970a242d22f225f1f9d016d08d5 (diff)
examples: Add a qtquick2 player example
-rw-r--r--examples/CMakeLists.txt5
-rw-r--r--examples/qmlplayer/CMakeLists.txt2
-rw-r--r--examples/qmlplayer2/CMakeLists.txt30
-rw-r--r--examples/qmlplayer2/main.cpp57
-rw-r--r--examples/qmlplayer2/player.cpp94
-rw-r--r--examples/qmlplayer2/player.h47
-rw-r--r--examples/qmlplayer2/qmlplayer2.pro28
-rw-r--r--examples/qmlplayer2/qmlplayer2.qml79
-rw-r--r--examples/qmlplayer2/qmlplayer2.qrc6
9 files changed, 347 insertions, 1 deletions
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index e983adc..548d84f 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -34,3 +34,8 @@ if (Qt4or5_Quick1_FOUND)
add_subdirectory(qmlplayer)
example_distcheck(qmlplayer)
endif()
+
+if (Qt4or5_Quick2_FOUND)
+ add_subdirectory(qmlplayer2)
+ example_distcheck(qmlplayer2)
+endif()
diff --git a/examples/qmlplayer/CMakeLists.txt b/examples/qmlplayer/CMakeLists.txt
index 7b765b1..7599754 100644
--- a/examples/qmlplayer/CMakeLists.txt
+++ b/examples/qmlplayer/CMakeLists.txt
@@ -18,7 +18,7 @@ else()
# allow the example to run from the build tree without installing QtGStreamer
add_definitions(
-DQTVIDEOSINK_PATH="${QtGStreamer_BINARY_DIR}/elements/gstqtvideosink"
- -DUNINSTALLED_IMPORTS_DIR="${QtGStreamer_BINARY_DIR}/src/qml"
+ -DUNINSTALLED_IMPORTS_DIR="${QtGStreamer_BINARY_DIR}/src/qml/quick1"
)
endif()
diff --git a/examples/qmlplayer2/CMakeLists.txt b/examples/qmlplayer2/CMakeLists.txt
new file mode 100644
index 0000000..cbd58ee
--- /dev/null
+++ b/examples/qmlplayer2/CMakeLists.txt
@@ -0,0 +1,30 @@
+project(qtgst-example-qmlplayer2)
+
+if (NOT BUILDING_QTGSTREAMER)
+ set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/modules)
+ find_package(Qt4or5 COMPONENTS Core Gui Quick2 Qml REQUIRED)
+ find_package(Qt5GStreamer REQUIRED)
+
+ set(CMAKE_AUTOMOC ON)
+ set(CMAKE_INCLUDE_CURRENT_DIR ON)
+else()
+ # allow the example to run from the build tree without installing QtGStreamer
+ add_definitions(
+ -DQTVIDEOSINK_PATH="${QtGStreamer_BINARY_DIR}/elements/gstqtvideosink"
+ -DUNINSTALLED_IMPORTS_DIR="${QtGStreamer_BINARY_DIR}/src/qml/quick2"
+ )
+endif()
+
+include_directories(${QTGSTREAMER_INCLUDES})
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${QTGSTREAMER_FLAGS}")
+add_definitions(${QTGSTREAMER_DEFINITIONS})
+
+set(qmlplayer2_SOURCES main.cpp player.cpp)
+qt4or5_add_resources(qmlplayer2_rcc_SOURCES qmlplayer2.qrc)
+
+add_executable(qmlplayer2
+ ${qmlplayer2_SOURCES}
+ ${qmlplayer2_rcc_SOURCES}
+)
+target_link_libraries(qmlplayer2 ${QTGSTREAMER_QUICK_LIBRARIES})
+qt4or5_use_modules(qmlplayer2 Core Gui Quick2 Qml)
diff --git a/examples/qmlplayer2/main.cpp b/examples/qmlplayer2/main.cpp
new file mode 100644
index 0000000..022cb62
--- /dev/null
+++ b/examples/qmlplayer2/main.cpp
@@ -0,0 +1,57 @@
+/*
+ Copyright (C) 2012-2013 Collabora Ltd. <info@collabora.com>
+ @author George Kiagiadakis <george.kiagiadakis@collabora.com>
+ Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
+ @author Benjamin Federau <benjamin.federau@basyskom.com>
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "player.h"
+#include <QtGui/QGuiApplication>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlContext>
+#include <QtQml/QQmlEngine>
+#include <QGst/Init>
+#include <QGst/Quick/VideoSurface>
+
+int main(int argc, char **argv)
+{
+#if defined(QTVIDEOSINK_PATH)
+ //this allows the example to run from the QtGStreamer build tree without installing QtGStreamer
+ qputenv("GST_PLUGIN_PATH", QTVIDEOSINK_PATH);
+#endif
+
+ QGuiApplication app(argc, argv);
+ QGst::init(&argc, &argv);
+
+ QQuickView view;
+
+ QGst::Quick::VideoSurface *surface = new QGst::Quick::VideoSurface;
+ view.rootContext()->setContextProperty(QLatin1String("videoSurface1"), surface);
+
+ Player *player = new Player(&view);
+ player->setVideoSink(surface->videoSink());
+ player->setUri(QLatin1Literal("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi"));
+ view.rootContext()->setContextProperty(QLatin1String("player"), player);
+
+#if defined(UNINSTALLED_IMPORTS_DIR)
+ //this allows the example to run from the QtGStreamer build tree without installing QtGStreamer
+ view.engine()->addImportPath(QLatin1String(UNINSTALLED_IMPORTS_DIR));
+#endif
+
+ view.setSource(QUrl(QLatin1String("qrc:///qmlplayer2.qml")));
+ view.show();
+
+ return app.exec();
+}
diff --git a/examples/qmlplayer2/player.cpp b/examples/qmlplayer2/player.cpp
new file mode 100644
index 0000000..58863b4
--- /dev/null
+++ b/examples/qmlplayer2/player.cpp
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2010 Marco Ballesio <gibrovacco@gmail.com>
+ Copyright (C) 2011-2013 Collabora Ltd.
+ @author George Kiagiadakis <george.kiagiadakis@collabora.co.uk>
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "player.h"
+#include <QUrl>
+#include <QDebug>
+#include <QGlib/Connect>
+#include <QGlib/Error>
+#include <QGst/ElementFactory>
+#include <QGst/Bus>
+
+Player::Player(QObject *parent)
+ : QObject(parent)
+{
+}
+
+void Player::setVideoSink(const QGst::ElementPtr & sink)
+{
+ m_videoSink = sink;
+}
+
+void Player::play()
+{
+ if (m_pipeline) {
+ m_pipeline->setState(QGst::StatePlaying);
+ }
+}
+
+void Player::pause()
+{
+ if (m_pipeline) {
+ m_pipeline->setState(QGst::StatePaused);
+ }
+}
+
+void Player::stop()
+{
+ if (m_pipeline) {
+ m_pipeline->setState(QGst::StateNull);
+ }
+}
+
+void Player::setUri(const QString & uri)
+{
+ if (!m_pipeline) {
+ m_pipeline = QGst::ElementFactory::make("playbin2").dynamicCast<QGst::Pipeline>();
+ if (m_pipeline) {
+ m_pipeline->setProperty("video-sink", m_videoSink);
+
+ //watch the bus for messages
+ QGst::BusPtr bus = m_pipeline->bus();
+ bus->addSignalWatch();
+ QGlib::connect(bus, "message", this, &Player::onBusMessage);
+ } else {
+ qCritical() << "Failed to create the pipeline";
+ }
+ }
+
+ if (m_pipeline) {
+ m_pipeline->setProperty("uri", uri);
+ }
+}
+
+void Player::onBusMessage(const QGst::MessagePtr & message)
+{
+ switch (message->type()) {
+ case QGst::MessageEos: //End of stream. We reached the end of the file.
+ stop();
+ break;
+ case QGst::MessageError: //Some error occurred.
+ qCritical() << message.staticCast<QGst::ErrorMessage>()->error();
+ stop();
+ break;
+ default:
+ break;
+ }
+}
+
+#include "moc_player.cpp"
diff --git a/examples/qmlplayer2/player.h b/examples/qmlplayer2/player.h
new file mode 100644
index 0000000..a3188e8
--- /dev/null
+++ b/examples/qmlplayer2/player.h
@@ -0,0 +1,47 @@
+/*
+ Copyright (C) 2010 Marco Ballesio <gibrovacco@gmail.com>
+ Copyright (C) 2011-2013 Collabora Ltd.
+ @author George Kiagiadakis <george.kiagiadakis@collabora.co.uk>
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef PLAYER_H
+#define PLAYER_H
+
+#include <QObject>
+#include <QGst/Pipeline>
+#include <QGst/Message>
+
+class Player : public QObject
+{
+ Q_OBJECT
+public:
+ explicit Player(QObject *parent = 0);
+
+ void setVideoSink(const QGst::ElementPtr & sink);
+
+public Q_SLOTS:
+ void play();
+ void pause();
+ void stop();
+ void setUri(const QString & uri);
+
+private:
+ void onBusMessage(const QGst::MessagePtr & message);
+
+ QGst::PipelinePtr m_pipeline;
+ QGst::ElementPtr m_videoSink;
+};
+
+#endif // PLAYER_H
diff --git a/examples/qmlplayer2/qmlplayer2.pro b/examples/qmlplayer2/qmlplayer2.pro
new file mode 100644
index 0000000..ee858c0
--- /dev/null
+++ b/examples/qmlplayer2/qmlplayer2.pro
@@ -0,0 +1,28 @@
+# This is a qmake project file, provided as an example on how to use qmake with QtGStreamer.
+
+TEMPLATE = app
+TARGET = qmlplayer2
+
+# produce nice compilation output
+CONFIG += silent
+
+# Tell qmake to use pkg-config to find QtGStreamer.
+CONFIG += link_pkgconfig
+
+# Now tell qmake to link to QtGStreamer and also use its include path and Cflags.
+PKGCONFIG += QtGStreamer-0.10 QtGStreamerUi-0.10
+
+# Recommended if you are using g++ 4.5 or later. Must be removed for other compilers.
+#QMAKE_CXXFLAGS += -std=c++0x
+
+# Recommended, to avoid possible issues with the "emit" keyword
+# You can otherwise also define QT_NO_EMIT, but notice that this is not a documented Qt macro.
+DEFINES += QT_NO_KEYWORDS
+
+# link against QtDeclarative and QtOpenGL
+QT += declarative opengl
+
+# Input
+HEADERS += player.h
+SOURCES += main.cpp player.cpp
+RESOURCES += qmlplayer2.qrc
diff --git a/examples/qmlplayer2/qmlplayer2.qml b/examples/qmlplayer2/qmlplayer2.qml
new file mode 100644
index 0000000..071096b
--- /dev/null
+++ b/examples/qmlplayer2/qmlplayer2.qml
@@ -0,0 +1,79 @@
+/*
+ Copyright (C) 2012-2013 Collabora Ltd. <info@collabora.com>
+ @author George Kiagiadakis <george.kiagiadakis@collabora.com>
+ Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
+ @author Benjamin Federau <benjamin.federau@basyskom.com>
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+import QtQuick 2.0
+import QtGStreamer 0.10
+
+Rectangle {
+ id: window
+ width: 600
+ height: 300
+
+ Column {
+
+ VideoItem {
+ id: video
+
+ width: window.width
+ height: 260
+ surface: videoSurface1 //bound on the context from main()
+ }
+
+ Row {
+ id: buttons
+
+ width: window.width
+ height: 35
+ spacing: 5
+
+ Rectangle {
+ id: playButton
+ color: "black"
+
+ width: 60
+ height: 30
+
+ Text { text: "Play"; color: "white"; anchors.centerIn: parent }
+ MouseArea { anchors.fill: parent; onClicked: player.play() }
+ }
+
+ Rectangle {
+ id: pauseButton
+ color: "black"
+
+ width: 60
+ height: 30
+
+ Text { text: "Pause"; color: "white"; anchors.centerIn: parent }
+ MouseArea { anchors.fill: parent; onClicked: { player.pause(); } }
+ }
+
+ Rectangle {
+ id: stopButton
+ color: "black"
+
+ width: 60
+ height: 30
+
+ Text { text: "Stop"; color: "white"; anchors.centerIn: parent }
+ MouseArea { anchors.fill: parent; onClicked: player.stop() }
+ }
+ }
+ }
+}
diff --git a/examples/qmlplayer2/qmlplayer2.qrc b/examples/qmlplayer2/qmlplayer2.qrc
new file mode 100644
index 0000000..fa5e55a
--- /dev/null
+++ b/examples/qmlplayer2/qmlplayer2.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource>
+ <file>qmlplayer2.qml</file>
+ </qresource>
+</RCC>