tags: try ISO-8859-1 as second fallback in case WINDOWS-1252 is not supported
[platform/upstream/gstreamer.git] / gst-libs / gst / tag / tags.c
index 6b4c7da..410b3e4 100644 (file)
@@ -144,6 +144,14 @@ gst_tag_register_tags_internal (gpointer unused)
       G_TYPE_STRING, _("capturing flash mode"),
       _("The selected flash mode while capturing and image"), NULL);
 
+  gst_tag_register (GST_TAG_IMAGE_HORIZONTAL_PPI, GST_TAG_FLAG_META,
+      G_TYPE_DOUBLE, _("image horizontal ppi"),
+      _("Media (image/video) intended horizontal pixel density in ppi"), NULL);
+
+  gst_tag_register (GST_TAG_IMAGE_VERTICAL_PPI, GST_TAG_FLAG_META,
+      G_TYPE_DOUBLE, _("image vertical ppi"),
+      _("Media (image/video) intended vertical pixel density in ppi"), NULL);
+
   return NULL;
 }
 
@@ -314,7 +322,7 @@ gst_tag_parse_extended_comment (const gchar * ext_comment, gchar ** key,
  * variables (whose names are specified in the NULL-terminated string array
  * @env_vars) containing a list of character encodings to try/use. If none
  * are specified, the current locale will be tried. If that also doesn't work,
- * ISO-8859-1 is assumed (which will almost always succeed).
+ * WINDOWS-1252/ISO-8859-1 is assumed (which will almost always succeed).
  *
  * Returns: a newly-allocated string in UTF-8 encoding, or NULL
  *
@@ -434,11 +442,27 @@ gst_tag_freeform_string_to_utf8 (const gchar * data, gint size,
     }
   }
 
-  /* Try ISO-8859-1 */
-  GST_LOG ("Trying to convert freeform string using ISO-8859-1 fallback");
-  utf8 = g_convert (data, size, "UTF-8", "ISO-8859-1", &bytes_read, NULL, NULL);
-  if (utf8 != NULL && bytes_read == size) {
-    goto beach;
+  /* Try Windows-1252 (which is a superset of ISO 8859-1 that uses a control
+   * character range in ISO 8859-1 for more printable characters) */
+  {
+    GError *err = NULL;
+
+    GST_LOG ("Trying to convert freeform string using Windows-1252/ISO-8859-1 "
+        "fallback");
+    utf8 = g_convert (data, size, "UTF-8", "WINDOWS-1252", &bytes_read, NULL,
+        &err);
+    if (err != NULL) {
+      /* fallback in case iconv implementation doesn't support windows-1252
+       * for some reason */
+      if (err->code == G_CONVERT_ERROR_NO_CONVERSION) {
+        utf8 = g_convert (data, size, "UTF-8", "ISO-8859-1", &bytes_read,
+            NULL, NULL);
+      }
+      g_error_free (err);
+    }
+
+    if (utf8 != NULL && bytes_read == size)
+      goto beach;
   }
 
   g_free (utf8);