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>
This commit is contained in:
Dmytro Poplavskiy
2012-02-03 14:23:56 +10:00
committed by Qt by Nokia
parent fb73a56574
commit fd3a3a7292
15 changed files with 141 additions and 36 deletions

View 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.
*/
/*!

View File

@@ -71,6 +71,7 @@ public:
Q_SIGNALS:
void metaDataChanged();
void metaDataChanged(const QString &key, const QVariant &value);
void metaDataAvailableChanged(bool available);

View 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.
*/
/*!

View 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);

View 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)));

View 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);

View 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"

View 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);

View 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;

View 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

View File

@@ -66,6 +66,8 @@ private slots:
private:
QGstreamerPlayerSession *m_session;
QVariantMap m_tags;
QMap<QByteArray, QString> m_keysMap;
};
QT_END_NAMESPACE

View File

@@ -370,13 +370,24 @@ void tst_QMediaObject::metaDataChanged()
QtTestMetaDataService service;
QtTestMediaObject object(&service);
QSignalSpy spy(&object, SIGNAL(metaDataChanged()));
QSignalSpy changedSpy(&object, SIGNAL(metaDataChanged()));
QSignalSpy changedWithValueSpy(&object, SIGNAL(metaDataChanged(QString, QVariant)));
service.metaData.metaDataChanged();
QCOMPARE(spy.count(), 1);
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.metaDataChanged();
QCOMPARE(spy.count(), 2);
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()

View File

@@ -833,13 +833,24 @@ void tst_QMediaRecorder::metaDataChanged()
QMediaRecorder recorder(&object);
QSignalSpy spy(&recorder, SIGNAL(metaDataChanged()));
QSignalSpy changedSpy(&recorder, SIGNAL(metaDataChanged()));
QSignalSpy changedWithValueSpy(&recorder, SIGNAL(metaDataChanged(QString,QVariant)));
service.mockMetaDataControl->metaDataChanged();
QCOMPARE(spy.count(), 1);
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->metaDataChanged();
QCOMPARE(spy.count(), 2);
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()

View 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()

View 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;