diff options
15 files changed, 145 insertions, 40 deletions
diff --git a/src/multimedia/controls/qmetadatareadercontrol.cpp b/src/multimedia/controls/qmetadatareadercontrol.cpp index 9ff297aa9..a173a933f 100644 --- a/src/multimedia/controls/qmetadatareadercontrol.cpp +++ b/src/multimedia/controls/qmetadatareadercontrol.cpp @@ -126,6 +126,16 @@ QMetaDataReaderControl::~QMetaDataReaderControl() \fn void QMetaDataReaderControl::metaDataChanged() Signal the changes of meta-data. + + If multiple meta-data elements are changed, + metaDataChanged(const QString &key, const QVariant &value) signal is emitted + for each of them with metaDataChanged() changed emitted once. +*/ + +/*! + \fn void QMetaDataReaderControl::metaDataChanged(const QString &key, const QVariant &value) + + Signal the changes of one meta-data element \a value with the given \a key. */ /*! diff --git a/src/multimedia/controls/qmetadatareadercontrol.h b/src/multimedia/controls/qmetadatareadercontrol.h index fe5b0418a..331bd90a6 100644 --- a/src/multimedia/controls/qmetadatareadercontrol.h +++ b/src/multimedia/controls/qmetadatareadercontrol.h @@ -71,6 +71,7 @@ public: Q_SIGNALS: void metaDataChanged(); + void metaDataChanged(const QString &key, const QVariant &value); void metaDataAvailableChanged(bool available); diff --git a/src/multimedia/controls/qmetadatawritercontrol.cpp b/src/multimedia/controls/qmetadatawritercontrol.cpp index 2ac727f6d..06439626f 100644 --- a/src/multimedia/controls/qmetadatawritercontrol.cpp +++ b/src/multimedia/controls/qmetadatawritercontrol.cpp @@ -139,6 +139,16 @@ QMetaDataWriterControl::~QMetaDataWriterControl() \fn void QMetaDataWriterControl::metaDataChanged() Signal the changes of meta-data. + + If multiple meta-data elements are changed, + metaDataChanged(const QString &key, const QVariant &value) signal is emitted + for each of them with metaDataChanged() changed emitted once. +*/ + +/*! + \fn void QMetaDataWriterControl::metaDataChanged(const QString &key, const QVariant &value) + + Signal the changes of one meta-data element \a value with the given \a key. */ /*! diff --git a/src/multimedia/controls/qmetadatawritercontrol.h b/src/multimedia/controls/qmetadatawritercontrol.h index d642759fe..fe451d52b 100644 --- a/src/multimedia/controls/qmetadatawritercontrol.h +++ b/src/multimedia/controls/qmetadatawritercontrol.h @@ -73,6 +73,7 @@ public: Q_SIGNALS: void metaDataChanged(); + void metaDataChanged(const QString &key, const QVariant &value); void writableChanged(bool writable); void metaDataAvailableChanged(bool available); diff --git a/src/multimedia/qmediaobject.cpp b/src/multimedia/qmediaobject.cpp index cad9628f3..b957e9573 100644 --- a/src/multimedia/qmediaobject.cpp +++ b/src/multimedia/qmediaobject.cpp @@ -347,8 +347,19 @@ QStringList QMediaObject::availableMetaData() const \fn QMediaObject::metaDataChanged() Signals that this media object's meta-data has changed. + + If multiple meta-data elements are changed, + metaDataChanged(const QString &key, const QVariant &value) signal is emitted + for each of them with metaDataChanged() changed emitted once. */ +/*! + \fn QMediaObject::metaDataChanged(const QString &key, const QVariant &value) + + Signal the changes of one meta-data element \a value with the given \a key. +*/ + + void QMediaObject::setupMetaData() { Q_D(QMediaObject); @@ -360,6 +371,9 @@ void QMediaObject::setupMetaData() if (d->metaDataControl) { connect(d->metaDataControl, SIGNAL(metaDataChanged()), SIGNAL(metaDataChanged())); connect(d->metaDataControl, + SIGNAL(metaDataChanged(QString,QVariant)), + SIGNAL(metaDataChanged(QString,QVariant))); + connect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)), SIGNAL(metaDataAvailableChanged(bool))); } diff --git a/src/multimedia/qmediaobject.h b/src/multimedia/qmediaobject.h index 7efb2572f..f1805da17 100644 --- a/src/multimedia/qmediaobject.h +++ b/src/multimedia/qmediaobject.h @@ -87,6 +87,7 @@ Q_SIGNALS: void metaDataAvailableChanged(bool available); void metaDataChanged(); + void metaDataChanged(const QString &key, const QVariant &value); void availabilityChanged(bool available); diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp index 2bdb50b74..0360fe155 100644 --- a/src/multimedia/recording/qmediarecorder.cpp +++ b/src/multimedia/recording/qmediarecorder.cpp @@ -290,6 +290,8 @@ bool QMediaRecorder::setMediaObject(QMediaObject *object) if (d->metaDataControl) { disconnect(d->metaDataControl, SIGNAL(metaDataChanged()), this, SIGNAL(metaDataChanged())); + disconnect(d->metaDataControl, SIGNAL(metaDataChanged(QString,QVariant)), + this, SIGNAL(metaDataChanged(QString,QVariant))); disconnect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)), this, SIGNAL(metaDataAvailableChanged(bool))); disconnect(d->metaDataControl, SIGNAL(writableChanged(bool)), @@ -331,6 +333,8 @@ bool QMediaRecorder::setMediaObject(QMediaObject *object) connect(d->metaDataControl, SIGNAL(metaDataChanged()), SIGNAL(metaDataChanged())); + connect(d->metaDataControl, SIGNAL(metaDataChanged(QString,QVariant)), + this, SIGNAL(metaDataChanged(QString,QVariant))); connect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)), SIGNAL(metaDataAvailableChanged(bool))); @@ -939,6 +943,16 @@ QStringList QMediaRecorder::availableMetaData() const \fn QMediaRecorder::metaDataChanged() Signals that a media object's meta-data has changed. + + If multiple meta-data elements are changed, + metaDataChanged(const QString &key, const QVariant &value) signal is emitted + for each of them with metaDataChanged() changed emitted once. +*/ + +/*! + \fn QMediaRecorder::metaDataChanged(const QString &key, const QVariant &value) + + Signal the changes of one meta-data element \a value with the given \a key. */ #include "moc_qmediarecorder.cpp" diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h index 3b210ddc6..1aac73cf2 100644 --- a/src/multimedia/recording/qmediarecorder.h +++ b/src/multimedia/recording/qmediarecorder.h @@ -171,6 +171,7 @@ Q_SIGNALS: void metaDataAvailableChanged(bool available); void metaDataWritableChanged(bool writable); void metaDataChanged(); + void metaDataChanged(const QString &key, const QVariant &value); protected: QMediaRecorder(QMediaRecorderPrivate &dd, QMediaObject *mediaObject, QObject *parent = 0); diff --git a/src/plugins/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp index d9a4cd2b6..c370563fc 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp @@ -149,6 +149,7 @@ void QGstreamerCaptureMetaDataControl::setMetaData(const QString &key, const QVa m_values.insert(QByteArray::fromRawData(name, qstrlen(name)), value); emit QMetaDataWriterControl::metaDataChanged(); + emit QMetaDataWriterControl::metaDataChanged(key, value); emit metaDataChanged(m_values); return; diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp index eebe03f74..3a3a601c6 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp @@ -126,6 +126,11 @@ QGstreamerMetaDataProvider::QGstreamerMetaDataProvider(QGstreamerPlayerSession * :QMetaDataReaderControl(parent), m_session(session) { connect(m_session, SIGNAL(tagsChanged()), SLOT(updateTags())); + + const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup); + for (int i = 0; i < count; ++i) { + m_keysMap[QByteArray(qt_gstreamerMetaDataKeys[i].token)] = qt_gstreamerMetaDataKeys[i].key; + } } QGstreamerMetaDataProvider::~QGstreamerMetaDataProvider() @@ -144,39 +149,41 @@ bool QGstreamerMetaDataProvider::isWritable() const QVariant QGstreamerMetaDataProvider::metaData(const QString &key) const { - static const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup); - - for (int i = 0; i < count; ++i) { - if (qt_gstreamerMetaDataKeys[i].key == key) { - return m_session->tags().value(QByteArray(qt_gstreamerMetaDataKeys[i].token)); - } - } - return QVariant(); + return m_tags.value(key); } QStringList QGstreamerMetaDataProvider::availableMetaData() const { - static QMap<QByteArray, QString> keysMap; - if (keysMap.isEmpty()) { - const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup); - for (int i = 0; i < count; ++i) { - keysMap[QByteArray(qt_gstreamerMetaDataKeys[i].token)] = qt_gstreamerMetaDataKeys[i].key; - } - } - - QStringList res; - foreach (const QByteArray &key, m_session->tags().keys()) { - QString tag = keysMap.value(key); - if (!tag.isEmpty()) - res.append(tag); - } - - return res; + return m_tags.keys(); } void QGstreamerMetaDataProvider::updateTags() { - emit metaDataChanged(); + QVariantMap oldTags = m_tags; + m_tags.clear(); + + QSet<QString> allTags = QSet<QString>::fromList(m_tags.keys()); + + QMapIterator<QByteArray ,QVariant> i(m_session->tags()); + while (i.hasNext()) { + i.next(); + //use gstreamer native keys for elements not in m_keysMap + QString key = m_keysMap.value(i.key(), i.key()); + m_tags[key] = i.value(); + allTags.insert(i.key()); + } + + bool changed = false; + foreach (const QString &key, allTags) { + const QVariant value = m_tags.value(key); + if (value != oldTags.value(key)) { + changed = true; + emit metaDataChanged(key, value); + } + } + + if (changed) + emit metaDataChanged(); } QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h index 03bf2a914..10a9ebb57 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h @@ -66,6 +66,8 @@ private slots: private: QGstreamerPlayerSession *m_session; + QVariantMap m_tags; + QMap<QByteArray, QString> m_keysMap; }; QT_END_NAMESPACE diff --git a/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp b/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp index 2bbcca0f6..3887463c0 100644 --- a/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp +++ b/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp @@ -370,13 +370,24 @@ void tst_QMediaObject::metaDataChanged() QtTestMetaDataService service; QtTestMediaObject object(&service); - QSignalSpy spy(&object, SIGNAL(metaDataChanged())); - - service.metaData.metaDataChanged(); - QCOMPARE(spy.count(), 1); - - service.metaData.metaDataChanged(); - QCOMPARE(spy.count(), 2); + QSignalSpy changedSpy(&object, SIGNAL(metaDataChanged())); + QSignalSpy changedWithValueSpy(&object, SIGNAL(metaDataChanged(QString, QVariant))); + + service.metaData.setMetaData("key", "Value"); + QCOMPARE(changedSpy.count(), 1); + QCOMPARE(changedWithValueSpy.count(), 1); + QCOMPARE(changedWithValueSpy.last()[0], QVariant("key")); + QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value")); + + service.metaData.setMetaData("key", "Value"); + QCOMPARE(changedSpy.count(), 1); + QCOMPARE(changedWithValueSpy.count(), 1); + + service.metaData.setMetaData("key2", "Value"); + QCOMPARE(changedSpy.count(), 2); + QCOMPARE(changedWithValueSpy.count(), 2); + QCOMPARE(changedWithValueSpy.last()[0], QVariant("key2")); + QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value")); } void tst_QMediaObject::metaData_data() diff --git a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp index c99308631..713159538 100644 --- a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp +++ b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp @@ -833,13 +833,24 @@ void tst_QMediaRecorder::metaDataChanged() QMediaRecorder recorder(&object); - QSignalSpy spy(&recorder, SIGNAL(metaDataChanged())); - - service.mockMetaDataControl->metaDataChanged(); - QCOMPARE(spy.count(), 1); - - service.mockMetaDataControl->metaDataChanged(); - QCOMPARE(spy.count(), 2); + QSignalSpy changedSpy(&recorder, SIGNAL(metaDataChanged())); + QSignalSpy changedWithValueSpy(&recorder, SIGNAL(metaDataChanged(QString,QVariant))); + + service.mockMetaDataControl->setMetaData("key", "Value"); + QCOMPARE(changedSpy.count(), 1); + QCOMPARE(changedWithValueSpy.count(), 1); + QCOMPARE(changedWithValueSpy.last()[0], QVariant("key")); + QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value")); + + service.mockMetaDataControl->setMetaData("key", "Value"); + QCOMPARE(changedSpy.count(), 1); + QCOMPARE(changedWithValueSpy.count(), 1); + + service.mockMetaDataControl->setMetaData("key2", "Value"); + QCOMPARE(changedSpy.count(), 2); + QCOMPARE(changedWithValueSpy.count(), 2); + QCOMPARE(changedWithValueSpy.last()[0], QVariant("key2")); + QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value")); } void tst_QMediaRecorder::metaData_data() diff --git a/tests/auto/unit/qmultimedia_common/mockmetadatareadercontrol.h b/tests/auto/unit/qmultimedia_common/mockmetadatareadercontrol.h index 9c3af9b64..0afb9ce4f 100644 --- a/tests/auto/unit/qmultimedia_common/mockmetadatareadercontrol.h +++ b/tests/auto/unit/qmultimedia_common/mockmetadatareadercontrol.h @@ -73,6 +73,19 @@ public: return m_data.value(key); } + void setMetaData(const QString &key, const QVariant &value) + { + if (m_data[key] != value) { + if (value.isNull()) + m_data.remove(key); + else + m_data[key] = value; + + emit metaDataChanged(key, value); + emit metaDataChanged(); + } + } + using QMetaDataReaderControl::metaDataChanged; void populateMetaData() diff --git a/tests/auto/unit/qmultimedia_common/mockmetadatawritercontrol.h b/tests/auto/unit/qmultimedia_common/mockmetadatawritercontrol.h index 6d49f67a9..e380cd038 100644 --- a/tests/auto/unit/qmultimedia_common/mockmetadatawritercontrol.h +++ b/tests/auto/unit/qmultimedia_common/mockmetadatawritercontrol.h @@ -72,7 +72,15 @@ public: QVariant metaData(const QString &key) const { return m_data.value(key); }//Getting the metadata from Multimediakit void setMetaData(const QString &key, const QVariant &value) { - m_data.insert(key, value); + if (m_data[key] != value) { + if (value.isNull()) + m_data.remove(key); + else + m_data[key] = value; + + emit metaDataChanged(key, value); + emit metaDataChanged(); + } } using QMetaDataWriterControl::metaDataChanged; |