GStreamer: Remove tags when an invalid QVariant is assigned.
authorAndrew den Exter <andrew.den.exter@jollamobile.com>
Tue, 4 Mar 2014 08:03:20 +0000 (18:03 +1000)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 6 Mar 2014 01:36:46 +0000 (02:36 +0100)
Clear the tag list before syncing with reference set so old values
are removed and explicitly remove invalid QVariants from the reference
set so that the type correction doesn't result in invalid values being
written instead.

Change-Id: I7d1bdc95cd2a2d601720db84c9b3ef629477bc99
Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
src/plugins/gstreamer/camerabin/camerabinmetadata.cpp
src/plugins/gstreamer/camerabin/camerabinsession.cpp

index b265fc2..c2b7c33 100644 (file)
@@ -198,11 +198,13 @@ QVariant CameraBinMetaData::metaData(const QString &key) const
 void CameraBinMetaData::setMetaData(const QString &key, const QVariant &value)
 {
     QVariant correctedValue = value;
-    if (key == QMediaMetaData::Orientation) {
-        correctedValue = toGStreamerOrientation(value);
-    } else if (key == QMediaMetaData::GPSSpeed) {
-        // kilometers per hour to meters per second.
-        correctedValue = (value.toDouble() * 1000) / 3600;
+    if (value.isValid()) {
+        if (key == QMediaMetaData::Orientation) {
+            correctedValue = toGStreamerOrientation(value);
+        } else if (key == QMediaMetaData::GPSSpeed) {
+            // kilometers per hour to meters per second.
+            correctedValue = (value.toDouble() * 1000) / 3600;
+        }
     }
 
     static const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
@@ -211,9 +213,12 @@ void CameraBinMetaData::setMetaData(const QString &key, const QVariant &value)
         if (qt_gstreamerMetaDataKeys[i].key == key) {
             const char *name = qt_gstreamerMetaDataKeys[i].token;
 
-            correctedValue.convert(qt_gstreamerMetaDataKeys[i].type);
-
-            m_values.insert(QByteArray::fromRawData(name, qstrlen(name)), correctedValue);
+            if (correctedValue.isValid()) {
+                correctedValue.convert(qt_gstreamerMetaDataKeys[i].type);
+                m_values.insert(QByteArray::fromRawData(name, qstrlen(name)), correctedValue);
+            } else {
+                m_values.remove(QByteArray::fromRawData(name, qstrlen(name)));
+            }
 
             emit QMetaDataWriterControl::metaDataChanged();
             emit metaDataChanged(m_values);
index 28e2377..8ca6bfd 100644 (file)
@@ -756,6 +756,8 @@ void CameraBinSession::setMetaData(const QMap<QByteArray, QVariant> &data)
         GstIterator *elements = gst_bin_iterate_all_by_interface(GST_BIN(m_camerabin), GST_TYPE_TAG_SETTER);
         GstElement *element = 0;
         while (gst_iterator_next(elements, (void**)&element) == GST_ITERATOR_OK) {
+            gst_tag_setter_reset_tags(GST_TAG_SETTER(element));
+
             QMapIterator<QByteArray, QVariant> it(data);
             while (it.hasNext()) {
                 it.next();