summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Hasselmann <mathias.hasselmann@kdab.com>2013-11-01 09:54:34 +0100
committerMathias Hasselmann <mathias.hasselmann@kdab.com>2013-11-01 09:54:34 +0100
commit95ebba5e0edd06d38d102665e218bf4a4816bc51 (patch)
tree7bf1e8173537d8b2b824db0a23bc5a446706f0b7
parent2b291759186876e189de36d4404b40f7b696e013 (diff)
downloadqtquickstreamer-95ebba5e0edd06d38d102665e218bf4a4816bc51.tar.gz
qtquickstreamer-95ebba5e0edd06d38d102665e218bf4a4816bc51.tar.xz
Rearrange file and make QML registration work
-rwxr-xr-xconfigure.sh12
-rw-r--r--quickstreamer.pro3
-rw-r--r--src/QuickStreamer/QuickStreamer.pro32
-rw-r--r--src/QuickStreamer/metapads.h (renamed from src/metapads.h)2
-rw-r--r--src/QuickStreamer/object.cpp (renamed from src/object.cpp)185
-rw-r--r--src/QuickStreamer/object.h (renamed from src/object.h)6
-rw-r--r--src/QuickStreamer/plugin.cpp41
-rw-r--r--src/QuickStreamer/plugin.h (renamed from src/plugin.h)2
-rw-r--r--src/QuickStreamer/qmldir2
-rw-r--r--src/QuickStreamer/quickstreamerplugin.json2
-rw-r--r--src/Tools/Tools.pro4
-rw-r--r--src/Tools/makemetapads.cpp (renamed from src/makemetapads.cpp)18
-rw-r--r--src/Tools/makemetapads.pro (renamed from src/makemetapads.pro)0
-rw-r--r--src/plugin.cpp73
-rw-r--r--src/qmldir2
-rw-r--r--src/qquickstreamerplugin.json1
-rw-r--r--src/qtquickstreamerplugin.pro37
-rw-r--r--src/src.pro9
-rw-r--r--tests/tst_qml/tst_qml.pro18
-rw-r--r--tests/tst_qml/tst_qmltest.cpp41
-rw-r--r--tests/tst_qml/tst_quickstreamer.qml23
21 files changed, 282 insertions, 231 deletions
diff --git a/configure.sh b/configure.sh
new file mode 100755
index 0000000..db4dc27
--- /dev/null
+++ b/configure.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+tmpfile=.qmake.cache.$$
+trap "rm -f $tmpfile" EXIT
+
+cat > $tmpfile << EOF
+TOP_OUTDIR = \$\$quote(`pwd`)
+TOP_SRCDIR = \$\$quote(`dirname "$0"`)
+EOF
+
+cmp -s $tmpfile .qmake.cache || mv $tmpfile .qmake.cache
+
diff --git a/quickstreamer.pro b/quickstreamer.pro
index 3ca2c54..77d7cc3 100644
--- a/quickstreamer.pro
+++ b/quickstreamer.pro
@@ -1,3 +1,6 @@
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = src tests
+
+OTHER_FILES += configure.sh
+system(cd $$OUT_PWD && $$PWD/configure.sh)
diff --git a/src/QuickStreamer/QuickStreamer.pro b/src/QuickStreamer/QuickStreamer.pro
new file mode 100644
index 0000000..f96b2c9
--- /dev/null
+++ b/src/QuickStreamer/QuickStreamer.pro
@@ -0,0 +1,32 @@
+TEMPLATE = lib
+TARGET = quickstreamerplugin
+
+CONFIG += plugin c++11
+QT += core-private qml
+
+CONFIG += link_pkgconfig
+PKGCONFIG += gstreamer-1.0
+
+SOURCES = \
+ metapads.cpp \
+ plugin.cpp \
+ object.cpp
+
+HEADERS = \
+ metapads.h \
+ plugin.h \
+ object.h
+
+DEPLOY_FILES = \
+ qmldir
+
+OTHER_FILES = \
+ $$DEPLOY_FILES \
+ quickstreamerplugin.json
+
+metapads.target = metapads.cpp
+metapads.depends = $$OUT_PWD/../Tools/makemetapads
+metapads.commands = $$OUT_PWD/../Tools/makemetapads 256 4096 > $$metapads.target || rm -f $$metapads.target
+QMAKE_EXTRA_TARGETS += metapads
+
+for(FILE, DEPLOY_FILES):QMAKE_POST_LINK += $$quote($$QMAKE_COPY $$PWD/$$FILE $$FILE$$escape_expand(\n\t))
diff --git a/src/metapads.h b/src/QuickStreamer/metapads.h
index 32fbec2..b6cf3f3 100644
--- a/src/metapads.h
+++ b/src/QuickStreamer/metapads.h
@@ -8,6 +8,8 @@ struct MetaTypePads
QMetaType::Creator create;
QMetaType::Constructor construct;
+ void (*createInto)(void *);
+
static const MetaTypePads &forElementFactory(GstElementFactory *factory) Q_DECL_NOEXCEPT;
static const MetaTypePads &forObjectType(GType type) Q_DECL_NOEXCEPT;
};
diff --git a/src/object.cpp b/src/QuickStreamer/object.cpp
index 36a3f99..9ffe6fc 100644
--- a/src/object.cpp
+++ b/src/QuickStreamer/object.cpp
@@ -5,6 +5,7 @@
#include <QtCore/private/qmetaobjectbuilder_p.h>
#include <QtCore/QVector>
+#include <QtQml/QtQml>
#include <functional>
@@ -13,8 +14,8 @@ namespace Private {
struct PropertyInfo
{
- typedef std::function<void(GstObject *target, QVariant *value)> ReadDelegate;
- typedef std::function<void(GstObject *target, const QVariant &value)> WriteDelegate;
+ typedef std::function<void(GstObject *target, void *value)> ReadDelegate;
+ typedef std::function<void(GstObject *target, const void *value)> WriteDelegate;
const char *name;
ReadDelegate read;
@@ -65,6 +66,24 @@ static QByteArray toCamelCase(const QByteArray &input,
return output;
}
+static QByteArray makeClassName(GType type)
+{
+ QByteArray typeName = g_type_name(type);
+
+ // Auto-generating element factories have such bad names...
+ if (std::islower(typeName.at(0))) {
+ typeName = toCamelCase(typeName, std::toupper);
+ qDebug() << "uhm:" << typeName;
+ }
+
+ static const auto CLASS_NAME_PREFIX = QByteArrayLiteral("Gst");
+
+ if (not typeName.startsWith(CLASS_NAME_PREFIX))
+ typeName = CLASS_NAME_PREFIX + typeName;
+
+ return typeName;
+}
+
template<typename T>
static QByteArray metaTypeName()
{
@@ -100,56 +119,56 @@ static QByteArray metaTypeName(GType type)
return {};
}
-static void toVariant(const GValue *value, QVariant *variant)
+static void readValue(const GValue *input, void *value)
{
- switch(G_VALUE_TYPE(value))
+ switch(G_VALUE_TYPE(input))
{
case G_TYPE_CHAR:
- variant->setValue(g_value_get_schar(value));
+ *static_cast<char *>(value) = g_value_get_schar(input);
break;
case G_TYPE_UCHAR:
- variant->setValue(g_value_get_uchar(value));
+ *static_cast<uchar *>(value) = g_value_get_uchar(input);
break;
case G_TYPE_BOOLEAN:
- variant->setValue<bool>(g_value_get_boolean(value));
+ *static_cast<bool *>(value) = g_value_get_boolean(input);
break;
case G_TYPE_INT:
- variant->setValue(g_value_get_int(value));
+ *static_cast<int *>(value) = g_value_get_int(input);
break;
case G_TYPE_UINT:
- variant->setValue(g_value_get_uint(value));
+ *static_cast<uint *>(value) = g_value_get_uint(input);
break;
case G_TYPE_LONG:
- variant->setValue(g_value_get_long(value));
+ *static_cast<long *>(value) = g_value_get_long(input);
break;
case G_TYPE_ULONG:
- variant->setValue(g_value_get_ulong(value));
+ *static_cast<ulong *>(value) = g_value_get_ulong(input);
break;
case G_TYPE_INT64:
- variant->setValue(g_value_get_int64(value));
+ *static_cast<qint64 *>(value) = g_value_get_int64(input);
break;
case G_TYPE_UINT64:
- variant->setValue(g_value_get_uint64(value));
+ *static_cast<quint64 *>(value) = g_value_get_uint64(input);
break;
case G_TYPE_FLOAT:
- variant->setValue(g_value_get_float(value));
+ *static_cast<float *>(value) = g_value_get_float(input);
break;
case G_TYPE_DOUBLE:
- variant->setValue(g_value_get_double(value));
+ *static_cast<double *>(value) = g_value_get_double(input);
break;
case G_TYPE_STRING:
- variant->setValue(QString::fromUtf8(g_value_get_string(value)));
+ *static_cast<QString *>(value) = QString::fromUtf8(g_value_get_string(input));
break;
//case G_TYPE_ENUM G_TYPE_MAKE_FUNDAMENTAL (12)
@@ -161,61 +180,61 @@ static void toVariant(const GValue *value, QVariant *variant)
//case G_TYPE_VARIANT G_TYPE_MAKE_FUNDAMENTAL (21)
default:
- qWarning("Cannot convert unsupported GValue type: %s", G_VALUE_TYPE_NAME(value));
+ qWarning("Cannot convert unsupported GValue type: %s", G_VALUE_TYPE_NAME(input));
break;
}
}
-static void toValue(const QVariant &variant, GValue *value)
+static void writeValue(const void *input, GValue *output)
{
- switch(G_VALUE_TYPE(value))
+ switch(G_VALUE_TYPE(output))
{
case G_TYPE_CHAR:
- g_value_set_schar(value, variant.value<char>());
+ g_value_set_schar(output, *static_cast<const char *>(input));
break;
case G_TYPE_UCHAR:
- g_value_set_uchar(value, variant.value<uchar>());
+ g_value_set_uchar(output, *static_cast<const uchar *>(input));
break;
case G_TYPE_BOOLEAN:
- g_value_set_boolean(value, variant.value<bool>());
+ g_value_set_boolean(output, *static_cast<const bool *>(input));
break;
case G_TYPE_INT:
- g_value_set_int(value, variant.value<int>());
+ g_value_set_int(output, *static_cast<const int *>(input));
break;
case G_TYPE_UINT:
- g_value_set_uint(value, variant.value<uint>());
+ g_value_set_uint(output, *static_cast<const uint *>(input));
break;
case G_TYPE_LONG:
- g_value_set_long(value, variant.value<long>());
+ g_value_set_long(output, *static_cast<const long *>(input));
break;
case G_TYPE_ULONG:
- g_value_set_ulong(value, variant.value<ulong>());
+ g_value_set_ulong(output, *static_cast<const ulong *>(input));
break;
case G_TYPE_INT64:
- g_value_set_int64(value, variant.value<qint64>());
+ g_value_set_int64(output, *static_cast<const qint64 *>(input));
break;
case G_TYPE_UINT64:
- g_value_set_uint64(value, variant.value<quint64>());
+ g_value_set_uint64(output, *static_cast<const quint64 *>(input));
break;
case G_TYPE_FLOAT:
- g_value_set_float(value, variant.value<float>());
+ g_value_set_float(output, *static_cast<const float *>(input));
break;
case G_TYPE_DOUBLE:
- g_value_set_double(value, variant.value<double>());
+ g_value_set_double(output, *static_cast<const double *>(input));
break;
case G_TYPE_STRING:
- g_value_set_string(value, variant.value<QString>().toUtf8().constData());
+ g_value_set_string(output, static_cast<const QString *>(input)->toUtf8().constData());
break;
//case G_TYPE_ENUM G_TYPE_MAKE_FUNDAMENTAL (12)
@@ -227,36 +246,38 @@ static void toValue(const QVariant &variant, GValue *value)
//case G_TYPE_VARIANT G_TYPE_MAKE_FUNDAMENTAL (21)
default:
- qWarning("Cannot convert unsupported GValue type: %s", G_VALUE_TYPE_NAME(value));
+ qWarning("Cannot convert unsupported GValue type: %s", G_VALUE_TYPE_NAME(output));
break;
}
}
-static void readGObjectProperty(GstObject *target, const QByteArray &propertyName, GType propertyType, QVariant *value)
+static void readGObjectProperty(GstObject *target, const QByteArray &propertyName,
+ GType propertyType, void *value)
{
GValue gvalue = G_VALUE_INIT;
g_value_init(&gvalue, propertyType);
g_object_get_property(G_OBJECT(target), propertyName.constData(), &gvalue);
- toVariant(&gvalue, value);
+ readValue(&gvalue, value);
g_value_unset(&gvalue);
}
-static void writeGObjectProperty(GstObject *target, const QByteArray &propertyName, GType propertyType, const QVariant &value)
+static void writeGObjectProperty(GstObject *target, const QByteArray &propertyName,
+ GType propertyType, const void *value)
{
GValue gvalue = G_VALUE_INIT;
g_value_init(&gvalue, propertyType);
- toValue(value, &gvalue);
+ writeValue(value, &gvalue);
g_object_set_property(G_OBJECT(target), propertyName.constData(), &gvalue);
g_value_unset(&gvalue);
}
-static void readNothing(GstObject *target, const QByteArray &name, QVariant *)
+static void readNothing(GstObject *target, const QByteArray &name, void *)
{
qWarning("Cannot read \"%s::%s\" which is not declared readable",
G_OBJECT_TYPE_NAME(target), name.constData());
}
-static void writeNothing(GstObject *target, const QByteArray &name, const QVariant &)
+static void writeNothing(GstObject *target, const QByteArray &name, const void *)
{
qWarning("Cannot write \"%s::%s\" which is not declared writable",
G_OBJECT_TYPE_NAME(target), name.constData());
@@ -287,7 +308,7 @@ struct TypeInfo
QScopedPointer<TypeInfo> typeInfo(new TypeInfo);
QMetaObjectBuilder objectBuilder;
- objectBuilder.setClassName(g_type_name(type));
+ objectBuilder.setClassName(makeClassName(type));
if (type != G_TYPE_OBJECT)
typeInfo->parent = find(g_type_parent(type));
@@ -323,8 +344,6 @@ struct TypeInfo
auto notifier = objectBuilder.addSignal(propertyName + QByteArrayLiteral("Changed()"));
auto property = objectBuilder.addProperty(propertyName, propertyType, notifier.index());
- qDebug("%s %d %d", propertyName.constData(), notifier.index(), property.index());
-
property.setReadable(pSpec->flags & G_PARAM_READABLE);
property.setWritable(pSpec->flags & G_PARAM_WRITABLE);
@@ -349,7 +368,7 @@ struct TypeInfo
GSignalQuery query;
g_signal_query(signalIds[i], &query);
Q_ASSERT(signalIds[i] == query.signal_id);
- qDebug("found signal: %s::%s", g_type_name(type), query.signal_name);
+ qDebug("signal found: %s::%s", g_type_name(type), query.signal_name);
}
g_type_class_unref(gobject_class);
@@ -358,15 +377,50 @@ struct TypeInfo
static const QMetaType::TypeFlags typeFlags(QtPrivate::QMetaTypeTypeFlags<Object>::Flags);
typeInfo->metaObject = objectBuilder.toMetaObject();
- typeInfo->metaTypeId = QMetaType::registerNormalizedType(typeInfo->metaObject->className(),
- MetaTypeHelper::Delete,
- metaTypePads.create,
- MetaTypeHelper::Destruct,
- metaTypePads.construct,
- sizeof(Object),
- typeFlags,
- typeInfo->metaObject);
+ typeInfo->elementName = objectBuilder.className().mid(3);
+
+ const int typeId = QMetaType::registerNormalizedType(typeInfo->metaObject->className(),
+ MetaTypeHelper::Delete,
+ metaTypePads.create,
+ MetaTypeHelper::Destruct,
+ metaTypePads.construct,
+ sizeof(Object),
+ typeFlags,
+ typeInfo->metaObject);
+
+ // FIXME: constants.h or pass by argument
+ static const auto NAMESPACE_URI = QByteArrayLiteral("QuickStreamer");
+ const static int MAJOR_VERSION = 1;
+ const static int MINOR_VERSION = 0;
+
+ auto pointerName = objectBuilder.className() + QByteArrayLiteral(" *");
+
+ QQmlPrivate::RegisterType qmlType = {
+ 1,
+ typeId,
+ 0 /*qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData())*/,
+ sizeof(Object), metaTypePads.createInto,
+ QString(),
+
+ NAMESPACE_URI, MAJOR_VERSION, MINOR_VERSION,
+ typeInfo->elementName,
+ typeInfo->metaObject,
+
+ QQmlPrivate::attachedPropertiesFunc<Object>(),
+ QQmlPrivate::attachedPropertiesMetaObject<Object>(),
+
+ QQmlPrivate::StaticCastSelector<Object, QQmlParserStatus>::cast(),
+ QQmlPrivate::StaticCastSelector<Object, QQmlPropertyValueSource>::cast(),
+ QQmlPrivate::StaticCastSelector<Object, QQmlPropertyValueInterceptor>::cast(),
+
+ 0, 0,
+
+ 0,
+ 0
+ };
+
+ QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &qmlType);
cache.insert(type, typeInfo.data());
return typeInfo.take();
@@ -411,7 +465,7 @@ struct TypeInfo
return id - properties.size();
}
- int writeProperty(GstObject *object, int id, const QVariant &value) const
+ int writeProperty(GstObject *object, int id, const void *value) const
{
if (parent)
id = parent->writeProperty(object, id, value);
@@ -440,8 +494,8 @@ struct TypeInfo
const TypeInfo *parent;
const QMetaObject *metaObject;
- int metaTypeId;
+ QByteArray elementName;
QVector<PropertyInfo> properties;
static QHash<GType, TypeInfo *> cache;
};
@@ -474,29 +528,14 @@ Object::~Object()
g_object_unref(m_target);
}
-/* FIXME
-static QByteArray pointerName(GType type)
-{
- QByteArray typeName = g_type_name(type);
-
- if (std::islower(typeName.at(0)))
- typeName = toCamelCase(typeName, std::toupper);
-
- if (typeName != g_type_name(type))
- qDebug("%s - %s", g_type_name(type), typeName.constData());
-
- typeName += QByteArrayLiteral(" *");
-}
-*/
-
-int Object::registerElementFactory(GstElementFactory *factory)
+bool Object::registerElementFactory(GstElementFactory *factory)
{
- return TypeInfo::find(factory)->metaTypeId;
+ return TypeInfo::find(factory) != Q_NULLPTR;
}
-int Object::registerObjectClass(GType type)
+bool Object::registerObjectClass(GType type)
{
- return TypeInfo::find(type)->metaTypeId;
+ return TypeInfo::find(type) != Q_NULLPTR;
}
const QMetaObject *Object::metaObject() const
@@ -531,7 +570,7 @@ int Object::qt_metacall(QMetaObject::Call call, int id, void **args)
break;
case QMetaObject::WriteProperty:
- id = writeProperty(id, *static_cast<QVariant *>(args[0]));
+ id = writeProperty(id, args[0]);
break;
case QMetaObject::InvokeMetaMethod:
@@ -557,7 +596,7 @@ int Object::readProperty(int id, QVariant *value)
return typeInfo->readProperty(m_target, id, value);
}
-int Object::writeProperty(int id, const QVariant &value)
+int Object::writeProperty(int id, const void *value)
{
const auto *const typeInfo = TypeInfo::find(G_OBJECT_TYPE(m_target));
return typeInfo->writeProperty(m_target, id, value);
diff --git a/src/object.h b/src/QuickStreamer/object.h
index 059d55e..759a589 100644
--- a/src/object.h
+++ b/src/QuickStreamer/object.h
@@ -20,8 +20,8 @@ public:
~Object();
- static int registerElementFactory(GstElementFactory *factory);
- static int registerObjectClass(GType type);
+ static bool registerElementFactory(GstElementFactory *factory);
+ static bool registerObjectClass(GType type);
const QMetaObject *metaObject() const Q_DECL_OVERRIDE;
void *qt_metacast(const char *classname) Q_DECL_OVERRIDE;
@@ -29,7 +29,7 @@ public:
protected:
int readProperty(int id, QVariant *value);
- int writeProperty(int id, const QVariant &value);
+ int writeProperty(int id, const void *value);
static void emitPropertyChanged(Object *self, GParamSpec *pspec);
private:
diff --git a/src/QuickStreamer/plugin.cpp b/src/QuickStreamer/plugin.cpp
new file mode 100644
index 0000000..23307c2
--- /dev/null
+++ b/src/QuickStreamer/plugin.cpp
@@ -0,0 +1,41 @@
+#include "plugin.h"
+#include "object.h"
+
+#include <gst/gst.h>
+
+namespace QQuickStreamer {
+
+static const auto NAMESPACE_URI = QByteArrayLiteral("QuickStreamer");
+
+Plugin::Plugin(QObject *parent)
+ : QQmlExtensionPlugin(parent)
+{
+}
+
+void Plugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(uri == NAMESPACE_URI);
+
+ if (not gst_is_initialized()) {
+ GError *error = Q_NULLPTR;
+
+ if (not gst_init_check(Q_NULLPTR, Q_NULLPTR, &error)) {
+ qWarning("Cannot initialize %s module: %s", NAMESPACE_URI.constData(), error->message);
+ g_error_free(error);
+ return;
+ }
+ }
+
+ auto *const elements = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ANY, GST_RANK_NONE);
+
+ for (auto *l = elements; l; l = l->next) {
+ auto *const feature = GST_PLUGIN_FEATURE(l->data);
+ auto *const factory = GST_ELEMENT_FACTORY(gst_plugin_feature_load(feature));
+ Object::registerElementFactory(factory);
+ g_object_unref(factory);
+ }
+
+ gst_plugin_feature_list_free(elements);
+}
+
+} // namespace QQuickStreamer
diff --git a/src/plugin.h b/src/QuickStreamer/plugin.h
index bf5b747..0e9c305 100644
--- a/src/plugin.h
+++ b/src/QuickStreamer/plugin.h
@@ -8,7 +8,7 @@ namespace QQuickStreamer {
class Plugin : public QQmlExtensionPlugin
{
Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface" FILE "qquickstreamerplugin.json")
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface" FILE "quickstreamerplugin.json")
public:
explicit Plugin(QObject *parent = Q_NULLPTR);
diff --git a/src/QuickStreamer/qmldir b/src/QuickStreamer/qmldir
new file mode 100644
index 0000000..8cec2ec
--- /dev/null
+++ b/src/QuickStreamer/qmldir
@@ -0,0 +1,2 @@
+module QuickStreamer
+plugin quickstreamerplugin
diff --git a/src/QuickStreamer/quickstreamerplugin.json b/src/QuickStreamer/quickstreamerplugin.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/src/QuickStreamer/quickstreamerplugin.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/src/Tools/Tools.pro b/src/Tools/Tools.pro
new file mode 100644
index 0000000..b0fd86c
--- /dev/null
+++ b/src/Tools/Tools.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+
+SUBDIRS = \
+ makemetapads.pro
diff --git a/src/makemetapads.cpp b/src/Tools/makemetapads.cpp
index e669700..75587a0 100644
--- a/src/makemetapads.cpp
+++ b/src/Tools/makemetapads.cpp
@@ -66,6 +66,11 @@ int main(int argc, char **argv)
<< " return createObject(" << i << ", t);" << endl
<< "}" << endl
<< endl
+ << "static void createObjectInto" << i << "(void *where) Q_DECL_NOEXCEPT" << endl
+ << "{" << endl
+ << " constructObject(" << i << ", where, Q_NULLPTR);" << endl
+ << "}" << endl
+ << endl
<< "static void *constructObject" << i << "(void *where, const void *t) Q_DECL_NOEXCEPT" << endl
<< "{" << endl
<< " return constructObject(" << i << ", where, t);" << endl
@@ -99,9 +104,9 @@ int main(int argc, char **argv)
out << "static MetaTypePads objectTypePads[] = {" << endl;
for (int i = 0; i < typeCount; ++i)
- out << " { &createObject" << i << ", &constructObject" << i << " }," << endl;
+ out << " { &createObject" << i << ", &constructObject" << i << ", &createObjectInto" << i << " }," << endl;
- out << " { Q_NULLPTR, Q_NULLPTR }" << endl
+ out << " { Q_NULLPTR, Q_NULLPTR, Q_NULLPTR }" << endl
<< "};" << endl
<< endl;
@@ -146,6 +151,11 @@ int main(int argc, char **argv)
<< " return createElement(" << i << ", t);" << endl
<< "}" << endl
<< endl
+ << "static void createElementInto" << i << "(void *where) Q_DECL_NOEXCEPT" << endl
+ << "{" << endl
+ << " constructElement(" << i << ", where, Q_NULLPTR);" << endl
+ << "}" << endl
+ << endl
<< "static void *constructElement" << i << "(void *where, const void *t) Q_DECL_NOEXCEPT" << endl
<< "{" << endl
<< " return constructElement(" << i << ", where, t);" << endl
@@ -181,9 +191,9 @@ int main(int argc, char **argv)
out << "static MetaTypePads elementFactoryPads[] = {" << endl;
for (int i = 0; i < factoryCount; ++i)
- out << " { &createElement" << i << ", &constructElement" << i << " }," << endl;
+ out << " { &createElement" << i << ", &constructElement" << i << ", &createElementInto" << i << " }," << endl;
- out << " { Q_NULLPTR, Q_NULLPTR }" << endl
+ out << " { Q_NULLPTR, Q_NULLPTR, Q_NULLPTR }" << endl
<< "};" << endl
<< endl;
diff --git a/src/makemetapads.pro b/src/Tools/makemetapads.pro
index d359b6b..d359b6b 100644
--- a/src/makemetapads.pro
+++ b/src/Tools/makemetapads.pro
diff --git a/src/plugin.cpp b/src/plugin.cpp
deleted file mode 100644
index 34aae57..0000000
--- a/src/plugin.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "plugin.h"
-#include "object.h"
-
-#include <QtQml>
-
-#include <gst/gst.h>
-
-namespace QQuickStreamer {
-
-static const auto NAMESPACE_URI = QByteArrayLiteral("QtQuickStreamer");
-
-Plugin::Plugin(QObject *parent)
- : QQmlExtensionPlugin(parent)
-{
-}
-
-void Plugin::registerTypes(const char *uri)
-{
- Q_ASSERT(uri == NAMESPACE_URI);
-
- if (not gst_is_initialized()) {
- GError *error = Q_NULLPTR;
-
- if (not gst_init_check(Q_NULLPTR, Q_NULLPTR, &error)) {
- qWarning("Cannot initialize %s module: %s", NAMESPACE_URI.constData(), error->message);
- g_error_free(error);
- return;
- }
- }
-
- qDebug() << "uri:" << uri;
-
- auto *const elements = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ANY, GST_RANK_NONE);
-
- for (auto *l = elements; l; l = l->next) {
- auto *const feature = GST_PLUGIN_FEATURE(l->data);
- auto *const factory = GST_ELEMENT_FACTORY(gst_plugin_feature_load(feature));
- const int metaTypeId = Object::registerElementFactory(factory);
- g_object_unref(factory);
-
- qDebug() << metaTypeId << QMetaType::typeName(metaTypeId);
-
-/*
- qDebug() << g_type_name(gst_element_factory_get_element_type((GstElementFactory *)l->data)) << gst_element_get_name(l->data);
-
- char *const elementName = gst_element_get_name(l->data);
-
- QByteArray pointerName;
- pointerName.append("Gst");
- pointerName.append(elementName);
- pointerName.append(" *");
- g_free(elementName);
-
- QMetaObject *m;
-
- */
- }
-
- gst_plugin_feature_list_free(elements);
-
- /*
- qmlRegisterType<Object>
- QMetaType::registerNormalizedType()
- */
- /*
- // @uri com.kdab.QtQuickStreamer
- qmlRegisterUncreatableType<QQuickStreamerElement>(uri, 1, 0, "Element", QStringLiteral("This is an abstract type"));
- qmlRegisterType<QQuickStreamerBin>(uri, 1, 0, "Bin");
- qmlRegisterType<QQuickStreamerPipeline>(uri, 1, 0, "Pipeline");
- */
-}
-
-} // namespace QQuickStreamer
diff --git a/src/qmldir b/src/qmldir
deleted file mode 100644
index 3139775..0000000
--- a/src/qmldir
+++ /dev/null
@@ -1,2 +0,0 @@
-module QtQuickStreamer
-plugin qtquickstreamerplugin
diff --git a/src/qquickstreamerplugin.json b/src/qquickstreamerplugin.json
deleted file mode 100644
index 0967ef4..0000000
--- a/src/qquickstreamerplugin.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/src/qtquickstreamerplugin.pro b/src/qtquickstreamerplugin.pro
deleted file mode 100644
index 7c8c9ec..0000000
--- a/src/qtquickstreamerplugin.pro
+++ /dev/null
@@ -1,37 +0,0 @@
-TEMPLATE = lib
-CONFIG += plugin c++11
-#DESTDIR = org/qt-project/QtQuickStreamer
-
-QT += core-private qml
-message($$QT.core.private_includes)
-
-CONFIG += link_pkgconfig
-PKGCONFIG += gstreamer-1.0
-
-SOURCES = \
- metapads.cpp \
- plugin.cpp \
- object.cpp
-
-# qquickstreamerelement.cpp \
-# qquickstreamerbin.cpp \
-# qquickstreamerpipeline.cpp
-
-HEADERS = \
- metapads.h \
- plugin.h \
- object.h
-
-OTHER_FILES = \
- qmldir \
- qquickstreamerplugin.json
-
-# qquickstreamerelement.h \
-# qquickstreamerbin.h \
-# qquickstreamerpipeline.h
-
-metapads.target = metapads.cpp
-metapads.depends = $$OUT_PWD/makemetapads
-metapads.commands = $$OUT_PWD/makemetapads 256 4096 > $$metapads.target || rm -f $$metapads.target
-
-QMAKE_EXTRA_TARGETS += metapads
diff --git a/src/src.pro b/src/src.pro
index f8344ac..28f8436 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -1,10 +1,7 @@
TEMPLATE = subdirs
SUBDIRS = \
- makemetapads \
- qtquickstreamerplugin
+ QuickStreamer \
+ Tools
-makemetapads.file = makemetapads.pro
-
-qtquickstreamerplugin.file = qtquickstreamerplugin.pro
-qtquickstreamerplugin.depends = makemetapads
+QuickStreamer.depends = Tools
diff --git a/tests/tst_qml/tst_qml.pro b/tests/tst_qml/tst_qml.pro
index 9b9c406..b93a194 100644
--- a/tests/tst_qml/tst_qml.pro
+++ b/tests/tst_qml/tst_qml.pro
@@ -1,13 +1,17 @@
-QT += qml testlib
+TEMPLATE = app
+TARGET = tst_qmltest
-QT -= gui
+QT = core qmltest
-TARGET = tst_qmltest
-CONFIG += console
+CONFIG += console testcase
CONFIG -= app_bundle
-TEMPLATE = app
+DEFINES += \
+ TOP_OUTDIR=\\\"$$TOP_OUTDIR/\\\" \
+ SRCDIR=\\\"$$PWD/\\\"
+SOURCES += \
+ tst_qmltest.cpp
-SOURCES += tst_qmltest.cpp
-DEFINES += SRCDIR=\\\"$$PWD/\\\"
+OTHER_FILES += \
+ tst_quickstreamer.qml
diff --git a/tests/tst_qml/tst_qmltest.cpp b/tests/tst_qml/tst_qmltest.cpp
index 38e5411..8d64af8 100644
--- a/tests/tst_qml/tst_qmltest.cpp
+++ b/tests/tst_qml/tst_qmltest.cpp
@@ -1,32 +1,25 @@
-#include <QString>
-#include <QtTest>
-#include <QCoreApplication>
-#include <QtQml>
+#define QUICK_TEST_SOURCE_DIR Context().testSourceDir()
-class QmlTest : public QObject
-{
- Q_OBJECT
+#include <QtQuickTest/QtQuickTest>
-private slots:
- void testCase1()
+class Context
+{
+public:
+ Context()
{
- QQmlEngine engine;
- engine.addImportPath(qApp->applicationDirPath() + "/../../src");
- qDebug() << (qApp->applicationDirPath() + "/../../src");
+ const char importPathVarName[] = "QML2_IMPORT_PATH";
+ QByteArray importPath = qgetenv(importPathVarName);
- QStringListModel modelData;
- QQmlContext *context = new QQmlContext(engine.rootContext());
- context->setContextProperty("myModel", &modelData);
+ if (not importPath.isEmpty())
+ importPath = ':' + importPath;
- QQmlComponent component(&engine);
- component.setData("import QtQuickStreamer 1.0\n"
- "Pipeline { name: 'qmltest' }",
- QUrl());
- qDebug() << component.errors();
- QObject *view = component.create(context);
+ qputenv(importPathVarName, TOP_OUTDIR "/src" + importPath);
}
-};
-QTEST_MAIN(QmlTest)
+ const char *testSourceDir() const
+ {
+ return SRCDIR;
+ }
+};
-#include "tst_qmltest.moc"
+QUICK_TEST_MAIN()
diff --git a/tests/tst_qml/tst_quickstreamer.qml b/tests/tst_qml/tst_quickstreamer.qml
new file mode 100644
index 0000000..e4dac1e
--- /dev/null
+++ b/tests/tst_qml/tst_quickstreamer.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+import QtTest 1.0
+import QuickStreamer 1.0
+
+TestCase {
+ name: "QuickStreamer"
+
+ AppSrc {
+ id: appSource
+ name: "brouhaha"
+ }
+
+ AppSink {
+ id: appSink
+ }
+
+ function test_properties()
+ {
+ console.log([appSink.name, appSource.name])
+ compare(appSink.name, "appsink0")
+ compare(appSource.name, "brouhaha")
+ }
+}