summaryrefslogtreecommitdiffstats
path: root/src/plugins/gstreamer/mediaplayer
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 /src/plugins/gstreamer/mediaplayer
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>
Diffstat (limited to 'src/plugins/gstreamer/mediaplayer')
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp57
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h2
2 files changed, 34 insertions, 25 deletions
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