mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +00:00
info: Fix possible broken debug output on Windows
Depending on Windows codepage setting, some characters could be broken when printing on terminal. Fortunatly g_print* family will take care Windows codepage. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/566>
This commit is contained in:
parent
90530bdb28
commit
30dfa177be
1 changed files with 62 additions and 19 deletions
|
@ -1209,6 +1209,43 @@ gst_debug_log_get_line (GstDebugCategory * category, GstDebugLevel level,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
static void
|
||||||
|
_gst_debug_fprintf (FILE * file, const gchar * format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
gchar *str = NULL;
|
||||||
|
gint length;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
length = gst_info_vasprintf (&str, format, args);
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
if (length == 0 || !str)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Even if it's valid UTF-8 string, console might print broken string
|
||||||
|
* depending on codepage and the content of the given string.
|
||||||
|
* Fortunately, g_print* family will take care of the Windows' codepage
|
||||||
|
* specific behavior.
|
||||||
|
*/
|
||||||
|
if (file == stderr) {
|
||||||
|
g_printerr ("%s", str);
|
||||||
|
} else if (file == stdout) {
|
||||||
|
g_print ("%s", str);
|
||||||
|
} else {
|
||||||
|
/* We are writing to file. Text editors/viewers should be able to
|
||||||
|
* decode valid UTF-8 string regardless of codepage setting */
|
||||||
|
fwrite (str, 1, length, file);
|
||||||
|
|
||||||
|
/* FIXME: fflush here might be redundant if setvbuf works as expected */
|
||||||
|
fflush (file);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (str);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_debug_log_default:
|
* gst_debug_log_default:
|
||||||
* @category: category to log
|
* @category: category to log
|
||||||
|
@ -1242,6 +1279,16 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
|
||||||
GstDebugColorMode color_mode;
|
GstDebugColorMode color_mode;
|
||||||
const gchar *message_str;
|
const gchar *message_str;
|
||||||
FILE *log_file = user_data ? user_data : stderr;
|
FILE *log_file = user_data ? user_data : stderr;
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
#define FPRINTF_DEBUG _gst_debug_fprintf
|
||||||
|
/* _gst_debug_fprintf will do fflush if it's required */
|
||||||
|
#define FFLUSH_DEBUG(f) ((void)(f))
|
||||||
|
#else
|
||||||
|
#define FPRINTF_DEBUG fprintf
|
||||||
|
#define FFLUSH_DEBUG(f) G_STMT_START { \
|
||||||
|
fflush (f); \
|
||||||
|
} G_STMT_END
|
||||||
|
#endif
|
||||||
|
|
||||||
_gst_debug_log_preamble (message, object, &file, &message_str, &obj,
|
_gst_debug_log_preamble (message, object, &file, &message_str, &obj,
|
||||||
&elapsed);
|
&elapsed);
|
||||||
|
@ -1267,12 +1314,12 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
|
||||||
levelcolor = levelcolormap[level];
|
levelcolor = levelcolormap[level];
|
||||||
|
|
||||||
#define PRINT_FMT " %s"PID_FMT"%s "PTR_FMT" %s%s%s %s"CAT_FMT"%s %s\n"
|
#define PRINT_FMT " %s"PID_FMT"%s "PTR_FMT" %s%s%s %s"CAT_FMT"%s %s\n"
|
||||||
fprintf (log_file, "%" GST_TIME_FORMAT PRINT_FMT, GST_TIME_ARGS (elapsed),
|
FPRINTF_DEBUG (log_file, "%" GST_TIME_FORMAT PRINT_FMT,
|
||||||
pidcolor, pid, clear, g_thread_self (), levelcolor,
|
GST_TIME_ARGS (elapsed), pidcolor, pid, clear, g_thread_self (),
|
||||||
gst_debug_level_get_name (level), clear, color,
|
levelcolor, gst_debug_level_get_name (level), clear, color,
|
||||||
gst_debug_category_get_name (category), file, line, function, obj,
|
gst_debug_category_get_name (category), file, line, function, obj,
|
||||||
clear, message_str);
|
clear, message_str);
|
||||||
fflush (log_file);
|
FFLUSH_DEBUG (log_file);
|
||||||
#undef PRINT_FMT
|
#undef PRINT_FMT
|
||||||
g_free (color);
|
g_free (color);
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
@ -1284,40 +1331,36 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
|
||||||
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), (c)); \
|
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), (c)); \
|
||||||
} G_STMT_END
|
} G_STMT_END
|
||||||
/* timestamp */
|
/* timestamp */
|
||||||
fprintf (log_file, "%" GST_TIME_FORMAT " ", GST_TIME_ARGS (elapsed));
|
FPRINTF_DEBUG (log_file, "%" GST_TIME_FORMAT " ",
|
||||||
fflush (log_file);
|
GST_TIME_ARGS (elapsed));
|
||||||
/* pid */
|
/* pid */
|
||||||
SET_COLOR (available_colors[pid % G_N_ELEMENTS (available_colors)]);
|
SET_COLOR (available_colors[pid % G_N_ELEMENTS (available_colors)]);
|
||||||
fprintf (log_file, PID_FMT, pid);
|
FPRINTF_DEBUG (log_file, PID_FMT, pid);
|
||||||
fflush (log_file);
|
|
||||||
/* thread */
|
/* thread */
|
||||||
SET_COLOR (clear);
|
SET_COLOR (clear);
|
||||||
fprintf (log_file, " " PTR_FMT " ", g_thread_self ());
|
FPRINTF_DEBUG (log_file, " " PTR_FMT " ", g_thread_self ());
|
||||||
fflush (log_file);
|
|
||||||
/* level */
|
/* level */
|
||||||
SET_COLOR (levelcolormap_w32[level]);
|
SET_COLOR (levelcolormap_w32[level]);
|
||||||
fprintf (log_file, "%s ", gst_debug_level_get_name (level));
|
FPRINTF_DEBUG (log_file, "%s ", gst_debug_level_get_name (level));
|
||||||
fflush (log_file);
|
|
||||||
/* category */
|
/* category */
|
||||||
SET_COLOR (gst_debug_construct_win_color (gst_debug_category_get_color
|
SET_COLOR (gst_debug_construct_win_color (gst_debug_category_get_color
|
||||||
(category)));
|
(category)));
|
||||||
fprintf (log_file, CAT_FMT, gst_debug_category_get_name (category),
|
FPRINTF_DEBUG (log_file, CAT_FMT, gst_debug_category_get_name (category),
|
||||||
file, line, function, obj);
|
file, line, function, obj);
|
||||||
fflush (log_file);
|
|
||||||
/* message */
|
/* message */
|
||||||
SET_COLOR (clear);
|
SET_COLOR (clear);
|
||||||
fprintf (log_file, " %s\n", message_str);
|
FPRINTF_DEBUG (log_file, " %s\n", message_str);
|
||||||
fflush (log_file);
|
|
||||||
}
|
}
|
||||||
G_UNLOCK (win_print_mutex);
|
G_UNLOCK (win_print_mutex);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* no color, all platforms */
|
/* no color, all platforms */
|
||||||
fprintf (log_file, "%" GST_TIME_FORMAT NOCOLOR_PRINT_FMT, GST_TIME_ARGS
|
FPRINTF_DEBUG (log_file, "%" GST_TIME_FORMAT NOCOLOR_PRINT_FMT,
|
||||||
(elapsed), pid, g_thread_self (), gst_debug_level_get_name (level),
|
GST_TIME_ARGS (elapsed), pid, g_thread_self (),
|
||||||
|
gst_debug_level_get_name (level),
|
||||||
gst_debug_category_get_name (category), file, line, function, obj,
|
gst_debug_category_get_name (category), file, line, function, obj,
|
||||||
message_str);
|
message_str);
|
||||||
fflush (log_file);
|
FFLUSH_DEBUG (log_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (object != NULL)
|
if (object != NULL)
|
||||||
|
|
Loading…
Reference in a new issue