summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;