From 2ae2b7fa8010839776f7043f69d68075e66061df Mon Sep 17 00:00:00 2001 From: Haihua Hu Date: Wed, 27 Jul 2016 09:28:23 +0800 Subject: [PATCH] qmlglsrc: Add qmlglsrc unit test example https://bugzilla.gnome.org/show_bug.cgi?id=768160 --- tests/examples/qt/{qml => qmlsink}/.gitignore | 0 tests/examples/qt/{qml => qmlsink}/main.cpp | 11 ++-- tests/examples/qt/{qml => qmlsink}/main.qml | 0 tests/examples/qt/{qml => qmlsink}/play.pro | 0 tests/examples/qt/{qml => qmlsink}/qml.qrc | 0 tests/examples/qt/qmlsrc/.gitignore | 2 + tests/examples/qt/qmlsrc/grabqml.pro | 20 +++++++ tests/examples/qt/qmlsrc/main.cpp | 80 +++++++++++++++++++++++++++ tests/examples/qt/qmlsrc/main.qml | 65 ++++++++++++++++++++++ tests/examples/qt/qmlsrc/qml.qrc | 5 ++ 10 files changed, 176 insertions(+), 7 deletions(-) rename tests/examples/qt/{qml => qmlsink}/.gitignore (100%) rename tests/examples/qt/{qml => qmlsink}/main.cpp (85%) rename tests/examples/qt/{qml => qmlsink}/main.qml (100%) rename tests/examples/qt/{qml => qmlsink}/play.pro (100%) rename tests/examples/qt/{qml => qmlsink}/qml.qrc (100%) create mode 100644 tests/examples/qt/qmlsrc/.gitignore create mode 100644 tests/examples/qt/qmlsrc/grabqml.pro create mode 100644 tests/examples/qt/qmlsrc/main.cpp create mode 100644 tests/examples/qt/qmlsrc/main.qml create mode 100644 tests/examples/qt/qmlsrc/qml.qrc diff --git a/tests/examples/qt/qml/.gitignore b/tests/examples/qt/qmlsink/.gitignore similarity index 100% rename from tests/examples/qt/qml/.gitignore rename to tests/examples/qt/qmlsink/.gitignore diff --git a/tests/examples/qt/qml/main.cpp b/tests/examples/qt/qmlsink/main.cpp similarity index 85% rename from tests/examples/qt/qml/main.cpp rename to tests/examples/qt/qmlsink/main.cpp index bc5d288..2317b05 100644 --- a/tests/examples/qt/qml/main.cpp +++ b/tests/examples/qt/qmlsink/main.cpp @@ -44,18 +44,15 @@ int main(int argc, char *argv[]) GstElement *pipeline = gst_pipeline_new (NULL); GstElement *src = gst_element_factory_make ("videotestsrc", NULL); + GstElement *glupload = gst_element_factory_make ("glupload", NULL); /* the plugin must be loaded before loading the qml file to register the * GstGLVideoItem qml item */ GstElement *sink = gst_element_factory_make ("qmlglsink", NULL); - GstElement *sinkbin = gst_element_factory_make ("glsinkbin", NULL); - g_assert (src && sink && sinkbin); + g_assert (src && glupload && sink); - g_object_set (sinkbin, "sink", sink, NULL); - g_object_unref (sink); - - gst_bin_add_many (GST_BIN (pipeline), src, sinkbin, NULL); - gst_element_link_many (src, sinkbin, NULL); + gst_bin_add_many (GST_BIN (pipeline), src, glupload, sink, NULL); + gst_element_link_many (src, glupload, sink, NULL); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); diff --git a/tests/examples/qt/qml/main.qml b/tests/examples/qt/qmlsink/main.qml similarity index 100% rename from tests/examples/qt/qml/main.qml rename to tests/examples/qt/qmlsink/main.qml diff --git a/tests/examples/qt/qml/play.pro b/tests/examples/qt/qmlsink/play.pro similarity index 100% rename from tests/examples/qt/qml/play.pro rename to tests/examples/qt/qmlsink/play.pro diff --git a/tests/examples/qt/qml/qml.qrc b/tests/examples/qt/qmlsink/qml.qrc similarity index 100% rename from tests/examples/qt/qml/qml.qrc rename to tests/examples/qt/qmlsink/qml.qrc diff --git a/tests/examples/qt/qmlsrc/.gitignore b/tests/examples/qt/qmlsrc/.gitignore new file mode 100644 index 0000000..d2246ae --- /dev/null +++ b/tests/examples/qt/qmlsrc/.gitignore @@ -0,0 +1,2 @@ +grabqml +qrc_qml.cpp diff --git a/tests/examples/qt/qmlsrc/grabqml.pro b/tests/examples/qt/qmlsrc/grabqml.pro new file mode 100644 index 0000000..374e402 --- /dev/null +++ b/tests/examples/qt/qmlsrc/grabqml.pro @@ -0,0 +1,20 @@ +TEMPLATE = app + +QT += qml quick widgets + +QT_CONFIG -= no-pkg-config +CONFIG += link_pkgconfig debug +PKGCONFIG = \ + gstreamer-1.0 \ + gstreamer-video-1.0 + +DEFINES += GST_USE_UNSTABLE_API + +INCLUDEPATH += ../lib + +SOURCES += main.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = diff --git a/tests/examples/qt/qmlsrc/main.cpp b/tests/examples/qt/qmlsrc/main.cpp new file mode 100644 index 0000000..35cedcb --- /dev/null +++ b/tests/examples/qt/qmlsrc/main.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +class SetPlaying : public QRunnable +{ +public: + SetPlaying(GstElement *); + ~SetPlaying(); + + void run (); + +private: + GstElement * pipeline_; +}; + +SetPlaying::SetPlaying (GstElement * pipeline) +{ + this->pipeline_ = pipeline ? static_cast (gst_object_ref (pipeline)) : NULL; +} + +SetPlaying::~SetPlaying () +{ + if (this->pipeline_) + gst_object_unref (this->pipeline_); + +} + +void +SetPlaying::run () +{ + if (this->pipeline_) + gst_element_set_state (this->pipeline_, GST_STATE_PLAYING); +} + +int main(int argc, char *argv[]) +{ + int ret; + + QGuiApplication app(argc, argv); + gst_init (&argc, &argv); + + GstElement *pipeline = gst_pipeline_new (NULL); + GstElement *src = gst_element_factory_make ("qmlglsrc", NULL); + GstElement *sink = gst_element_factory_make ("glimagesink", NULL); + + g_assert (src && sink); + + gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL); + gst_element_link_many (src, sink, NULL); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + QQuickWindow *rootObject; + + /* find and set the QQuickWindow on the src */ + rootObject = static_cast (engine.rootObjects().first()); + g_object_set(src, "window", rootObject, NULL); + g_object_set(src, "use-default-fbo", TRUE, NULL); + /* output buffer of qmlglsrc is vertical flip, get the image orientation tag */ + g_object_set(sink, "rotate-method", 8, NULL); + + rootObject->scheduleRenderJob (new SetPlaying (pipeline), + QQuickWindow::BeforeSynchronizingStage); + + ret = app.exec(); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + gst_deinit (); + + return ret; +} diff --git a/tests/examples/qt/qmlsrc/main.qml b/tests/examples/qt/qmlsrc/main.qml new file mode 100644 index 0000000..18b36e6 --- /dev/null +++ b/tests/examples/qt/qmlsrc/main.qml @@ -0,0 +1,65 @@ +import QtQuick 2.4 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Dialogs 1.1 +import QtQuick.Window 2.1 + +ApplicationWindow { + id: window + visible: true + width: 640 + height: 480 + x: 30 + y: 30 + color: "dodgerblue" + + Item { + anchors.fill: parent + + Rectangle { + color: Qt.rgba(1, 1, 1, 0.7) + border.width: 1 + border.color: "white" + anchors.bottomMargin: 15 + anchors.horizontalCenter: parent.horizontalCenter + width : parent.width - 30 + height: parent.height - 30 + radius: 8 + + Text { + id: text1 + anchors.centerIn: parent + text: "Hello World!" + font.pointSize: 24 + visible: timer.tex1_visible + } + + Text { + id: text2 + anchors.centerIn: parent + text: "This is qmlglsrc demo!" + font.pointSize: 24 + visible: timer.tex2_visible + } + + Timer { + id: timer + property int count: 0 + property int tex1_visible: 1 + property int tex2_visible: 0 + interval: 30; running: true; repeat: true + onTriggered: { + count++; + if (count%2 == 0) { + tex1_visible = 1; + tex2_visible = 0; + } + else { + tex1_visible = 0; + tex2_visible = 1; + } + } + } + } + } +} diff --git a/tests/examples/qt/qmlsrc/qml.qrc b/tests/examples/qt/qmlsrc/qml.qrc new file mode 100644 index 0000000..5f6483a --- /dev/null +++ b/tests/examples/qt/qmlsrc/qml.qrc @@ -0,0 +1,5 @@ + + + main.qml + + -- 2.7.4