Added metaDataChanged(key,value) signal to metadata controls.
authorDmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
Fri, 3 Feb 2012 04:23:56 +0000 (14:23 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 6 Feb 2012 04:35:11 +0000 (05:35 +0100)
It may be more efficient and convenient for application to use this
signal instead of metaDataChanged().

metaDataChanged() signal is emitted for compatibility,
backends should emit both signals.

Signal added QMetadataReader/WritterControl,
QMediaObject and QMediaRecorder.

Change-Id: I5ca34a40e64b22034e6fde8cd7f9735cc3f72c68
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
15 files changed:
src/multimedia/controls/qmetadatareadercontrol.cpp
src/multimedia/controls/qmetadatareadercontrol.h
src/multimedia/controls/qmetadatawritercontrol.cpp
src/multimedia/controls/qmetadatawritercontrol.h
src/multimedia/qmediaobject.cpp
src/multimedia/qmediaobject.h
src/multimedia/recording/qmediarecorder.cpp
src/multimedia/recording/qmediarecorder.h
src/plugins/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp
src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp
src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h
tests/auto/unit/qmediaobject/tst_qmediaobject.cpp
tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp
tests/auto/unit/qmultimedia_common/mockmetadatareadercontrol.h
tests/auto/unit/qmultimedia_common/mockmetadatawritercontrol.h

index 9ff297aa927315ab001c04e2d13eeb2996abde8a..a173a933fbf615141bec008d5f3475ed6dd47b14 100644 (file)
@@ -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.
 */
 
 /*!
index fe5b0418ae8a139ecc9155629a208060d0e61ded..331bd90a63b87e8c73ed7396e0e8a2ac69a0a83b 100644 (file)
@@ -71,6 +71,7 @@ public:
 
 Q_SIGNALS:
     void metaDataChanged();
+    void metaDataChanged(const QString &key, const QVariant &value);
 
     void metaDataAvailableChanged(bool available);
 
index 2ac727f6d3bec7e9fac176523f4c8d4f9dd2f7fe..06439626fcb7394f23d0a3c6acd0c23b2795dc72 100644 (file)
@@ -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.
 */
 
 /*!
index d642759fe02d44acd35aa140f5c6380a3717fbca..fe451d52b1ea4343e239a703bbfe5b3c3baea38c 100644 (file)
@@ -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);
index cad9628f3eaf8fd1a4d8f3fffe5c91ca3a93fe11..b957e95733ae5d5d084d46522ec23db6c165564d 100644 (file)
@@ -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);
@@ -359,6 +370,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)));
index 7efb2572f5e24839d19dd8bbb2f1e7eed16d7c82..f1805da174dee61b1a2b0f8f1de2bbf356a0db9c 100644 (file)
@@ -87,6 +87,7 @@ Q_SIGNALS:
 
     void metaDataAvailableChanged(bool available);
     void metaDataChanged();
+    void metaDataChanged(const QString &key, const QVariant &value);
 
     void availabilityChanged(bool available);
 
index 2bdb50b7466ea02eef8e212890925d1a7aa1baeb..0360fe1551aef17a39a47f00f6a2a00c37f97b78 100644 (file)
@@ -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"
index 3b210ddc6c0dead7509d47ef11e1dfd589dda5ff..1aac73cf28aac41249cc6a38913497aea43ce8ec 100644 (file)
@@ -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);
index d9a4cd2b69e0591cd00c07a55f6806ee3ff9f84e..c370563fc3594d3798be860ba05e8198b1fb7f74 100644 (file)
@@ -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;
index eebe03f7409ec217943988f17a47ebdd18fefc4e..3a3a601c65006c1fb5746297b5aab61fba272446 100644 (file)
@@ -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
index 03bf2a914a1e858ec0f55c422ae1f07c8dc3c5ff..10a9ebb574c726e724f9e98e6e32ae03c8117c19 100644 (file)
@@ -66,6 +66,8 @@ private slots:
 
 private:
     QGstreamerPlayerSession *m_session;
+    QVariantMap m_tags;
+    QMap<QByteArray, QString> m_keysMap;
 };
 
 QT_END_NAMESPACE
index 2bbcca0f6b5ee5c29379b4a5daf2a1d81e2d0999..3887463c092421cce81ae5b8c7d1c0cf396cb108 100644 (file)
@@ -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()
index c9930863115732fc6cc95a69bcb902b876ab452e..713159538f05164097a9c6b54052f0350bfffad4 100644 (file)
@@ -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()
index 9c3af9b6417bb3b0663b94c67df8916a5b67d25e..0afb9ce4f5a4ec515b98b8fefb4471bde40a13cd 100644 (file)
@@ -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()
index 6d49f67a9636dbf1c59bbd41a52459b006da8f7d..e380cd038f00a601edca185f8cacca8b0f75a8d2 100644 (file)
@@ -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;