diff options
author | Mathias Hasselmann <mathias.hasselmann@kdab.com> | 2013-11-01 09:54:34 +0100 |
---|---|---|
committer | Mathias Hasselmann <mathias.hasselmann@kdab.com> | 2013-11-01 09:54:34 +0100 |
commit | 95ebba5e0edd06d38d102665e218bf4a4816bc51 (patch) | |
tree | 7bf1e8173537d8b2b824db0a23bc5a446706f0b7 | |
parent | 2b291759186876e189de36d4404b40f7b696e013 (diff) | |
download | qtquickstreamer-95ebba5e0edd06d38d102665e218bf4a4816bc51.tar.gz qtquickstreamer-95ebba5e0edd06d38d102665e218bf4a4816bc51.tar.xz |
Rearrange file and make QML registration work
-rwxr-xr-x | configure.sh | 12 | ||||
-rw-r--r-- | quickstreamer.pro | 3 | ||||
-rw-r--r-- | src/QuickStreamer/QuickStreamer.pro | 32 | ||||
-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.cpp | 41 | ||||
-rw-r--r-- | src/QuickStreamer/plugin.h (renamed from src/plugin.h) | 2 | ||||
-rw-r--r-- | src/QuickStreamer/qmldir | 2 | ||||
-rw-r--r-- | src/QuickStreamer/quickstreamerplugin.json | 2 | ||||
-rw-r--r-- | src/Tools/Tools.pro | 4 | ||||
-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.cpp | 73 | ||||
-rw-r--r-- | src/qmldir | 2 | ||||
-rw-r--r-- | src/qquickstreamerplugin.json | 1 | ||||
-rw-r--r-- | src/qtquickstreamerplugin.pro | 37 | ||||
-rw-r--r-- | src/src.pro | 9 | ||||
-rw-r--r-- | tests/tst_qml/tst_qml.pro | 18 | ||||
-rw-r--r-- | tests/tst_qml/tst_qmltest.cpp | 41 | ||||
-rw-r--r-- | tests/tst_qml/tst_quickstreamer.qml | 23 |
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") + } +} |