summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2021-04-05 00:34:21 +0900
committerTim-Philipp Müller <tim@centricular.com>2021-04-13 11:20:09 +0100
commit92afe79be011c182e697a195fd4e92f8b3a6b65b (patch)
tree107266b27fc032fad74bc712081b0fd8907acbfb
parent5eb5bec7b5e3d0a2972784bbe1d28b21257a3734 (diff)
downloadgstreamer-plugins-base-92afe79be011c182e697a195fd4e92f8b3a6b65b.tar.gz
clockoverlay: Fix broken string formatting by strftime() on Windows
Like other foobarA variant APIs on Windows, formatted string by strftime() is ANSI string, not unicode encoded one. It would be problematic for non-english locale systems. We should use unicode version API (wcsftime in this case) whenever it's possible on Windows. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1107>
-rw-r--r--ext/pango/gstclockoverlay.c29
-rw-r--r--ext/pango/gstclockoverlay.h4
2 files changed, 33 insertions, 0 deletions
diff --git a/ext/pango/gstclockoverlay.c b/ext/pango/gstclockoverlay.c
index ba8e625e6..ea2645b45 100644
--- a/ext/pango/gstclockoverlay.c
+++ b/ext/pango/gstclockoverlay.c
@@ -80,7 +80,11 @@ gst_clock_overlay_render_time (GstClockOverlay * overlay)
#endif
struct tm *t;
time_t now;
+#ifdef G_OS_WIN32
+ gunichar2 buf[256];
+#else
gchar buf[256];
+#endif
now = time (NULL);
@@ -97,9 +101,17 @@ gst_clock_overlay_render_time (GstClockOverlay * overlay)
if (t == NULL)
return g_strdup ("--:--:--");
+#ifdef G_OS_WIN32
+ if (wcsftime (buf, sizeof (buf), (wchar_t *) overlay->wformat, t) == 0)
+ return g_strdup ("");
+
+ return g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL);
+#else
if (strftime (buf, sizeof (buf), overlay->format, t) == 0)
return g_strdup ("");
+
return g_strdup (buf);
+#endif
}
/* Called with lock held */
@@ -112,7 +124,10 @@ gst_clock_overlay_get_text (GstBaseTextOverlay * overlay,
txt = g_strdup (overlay->default_text);
+ GST_OBJECT_LOCK (overlay);
time_str = gst_clock_overlay_render_time (clock_overlay);
+ GST_OBJECT_UNLOCK (overlay);
+
if (txt != NULL && *txt != '\0') {
ret = g_strdup_printf ("%s %s", txt, time_str);
} else {
@@ -170,6 +185,8 @@ gst_clock_overlay_finalize (GObject * object)
g_free (overlay->text);
overlay->format = NULL;
+ g_free (overlay->wformat);
+
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -188,6 +205,11 @@ gst_clock_overlay_init (GstClockOverlay * overlay)
overlay->format = g_strdup (DEFAULT_PROP_TIMEFORMAT);
+#ifdef G_OS_WIN32
+ overlay->wformat =
+ g_utf8_to_utf16 (DEFAULT_PROP_TIMEFORMAT, -1, NULL, NULL, NULL);
+#endif
+
context = textoverlay->pango_context;
pango_context_set_language (context, pango_language_from_string ("en_US"));
@@ -215,6 +237,13 @@ gst_clock_overlay_set_property (GObject * object, guint prop_id,
case PROP_TIMEFORMAT:
g_free (overlay->format);
overlay->format = g_value_dup_string (value);
+ if (!overlay->format)
+ overlay->format = g_strdup (DEFAULT_PROP_TIMEFORMAT);
+#ifdef G_OS_WIN32
+ g_free (overlay->wformat);
+ overlay->wformat =
+ g_utf8_to_utf16 (overlay->format, -1, NULL, NULL, NULL);
+#endif
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
diff --git a/ext/pango/gstclockoverlay.h b/ext/pango/gstclockoverlay.h
index b3f4a43ee..3a52c35ac 100644
--- a/ext/pango/gstclockoverlay.h
+++ b/ext/pango/gstclockoverlay.h
@@ -48,6 +48,10 @@ typedef struct _GstClockOverlayClass GstClockOverlayClass;
struct _GstClockOverlay {
GstBaseTextOverlay textoverlay;
gchar *format; /* as in strftime () */
+
+ /* for wcsftime */
+ gunichar2 *wformat;
+
gchar *text;
};