\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.
*/
/*!
Q_SIGNALS:
void metaDataChanged();
+ void metaDataChanged(const QString &key, const QVariant &value);
void metaDataAvailableChanged(bool available);
\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.
*/
/*!
Q_SIGNALS:
void metaDataChanged();
+ void metaDataChanged(const QString &key, const QVariant &value);
void writableChanged(bool writable);
void metaDataAvailableChanged(bool available);
\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);
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)));
void metaDataAvailableChanged(bool available);
void metaDataChanged();
+ void metaDataChanged(const QString &key, const QVariant &value);
void availabilityChanged(bool available);
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)),
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)));
\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"
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);
m_values.insert(QByteArray::fromRawData(name, qstrlen(name)), value);
emit QMetaDataWriterControl::metaDataChanged();
+ emit QMetaDataWriterControl::metaDataChanged(key, value);
emit metaDataChanged(m_values);
return;
: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()
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
private:
QGstreamerPlayerSession *m_session;
+ QVariantMap m_tags;
+ QMap<QByteArray, QString> m_keysMap;
};
QT_END_NAMESPACE
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()
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()
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()
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;