diff options
author | Seungha Yang <seungha@centricular.com> | 2021-04-05 00:34:21 +0900 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2021-04-13 11:20:09 +0100 |
commit | 92afe79be011c182e697a195fd4e92f8b3a6b65b (patch) | |
tree | 107266b27fc032fad74bc712081b0fd8907acbfb | |
parent | 5eb5bec7b5e3d0a2972784bbe1d28b21257a3734 (diff) | |
download | gstreamer-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.c | 29 | ||||
-rw-r--r-- | ext/pango/gstclockoverlay.h | 4 |
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; }; |