summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmytro Poplavskiy <dmytro.poplavskiy@nokia.com>2012-02-03 14:23:56 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-06 05:35:11 +0100
commitfd3a3a72921fa1e55f265f2d30e94615e388505e (patch)
tree11c179aa53cf546dec3b0cc128132c833c5000d7
parentfb73a565747d06faec7c47490c0c509a74ff08e3 (diff)
Added metaDataChanged(key,value) signal to metadata controls.
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>
-rw-r--r--src/multimedia/controls/qmetadatareadercontrol.cpp10
-rw-r--r--src/multimedia/controls/qmetadatareadercontrol.h1
-rw-r--r--src/multimedia/controls/qmetadatawritercontrol.cpp10
-rw-r--r--src/multimedia/controls/qmetadatawritercontrol.h1
-rw-r--r--src/multimedia/qmediaobject.cpp14
-rw-r--r--src/multimedia/qmediaobject.h1
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp14
-rw-r--r--src/multimedia/recording/qmediarecorder.h1
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp1
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp57
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h2
-rw-r--r--tests/auto/unit/qmediaobject/tst_qmediaobject.cpp25
-rw-r--r--tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp25
-rw-r--r--tests/auto/unit/qmultimedia_common/mockmetadatareadercontrol.h13
-rw-r--r--tests/auto/unit/qmultimedia_common/mockmetadatawritercontrol.h10
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;