#include #include "utils.h" #include void print (GstDebugColorFlags c, gboolean err, gboolean nline, const gchar * format, va_list var_args) { GString *str = g_string_new (NULL); GstDebugColorMode color_mode; gchar *color = NULL; const gchar *clear = NULL; color_mode = gst_debug_get_color_mode (); #ifdef G_OS_WIN32 if (color_mode == GST_DEBUG_COLOR_MODE_UNIX) { #else if (color_mode != GST_DEBUG_COLOR_MODE_OFF) { #endif clear = "\033[00m"; color = gst_debug_construct_term_color (c); } if (color) { g_string_append (str, color); g_free (color); } g_string_append_vprintf (str, format, var_args); if (nline) g_string_append_c (str, '\n'); if (clear) g_string_append (str, clear); if (err) g_printerr ("%s", str->str); else g_print ("%s", str->str); g_string_free (str, TRUE); } void ok (const gchar * format, ...) { va_list var_args; va_start (var_args, format); print (GST_DEBUG_FG_GREEN, FALSE, TRUE, format, var_args); va_end (var_args); } void warn (const gchar * format, ...) { va_list var_args; va_start (var_args, format); print (GST_DEBUG_FG_YELLOW, TRUE, TRUE, format, var_args); va_end (var_args); } void error (const gchar * format, ...) { va_list var_args; va_start (var_args, format); print (GST_DEBUG_FG_RED, TRUE, TRUE, format, var_args); va_end (var_args); } gchar * ensure_uri (const gchar * location) { if (gst_uri_is_valid (location)) return g_strdup (location); else return gst_filename_to_uri (location, NULL); } gchar * get_file_extension (gchar * uri) { size_t len; gint find; len = strlen (uri); find = len - 1; while (find >= 0) { if (uri[find] == '.') break; find--; } if (find < 0) return NULL; return &uri[find + 1]; } GList * get_usable_profiles (GstEncodingTarget * target) { GList *tmpprof, *usable_profiles = NULL; for (tmpprof = (GList *) gst_encoding_target_get_profiles (target); tmpprof; tmpprof = tmpprof->next) { GstEncodingProfile *profile = tmpprof->data; GstElement *tmpencodebin = gst_element_factory_make ("encodebin", NULL); gst_encoding_profile_set_presence (profile, 1); if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) { GList *tmpsubprof; for (tmpsubprof = (GList *) gst_encoding_container_profile_get_profiles (GST_ENCODING_CONTAINER_PROFILE (profile)); tmpsubprof; tmpsubprof = tmpsubprof->next) gst_encoding_profile_set_presence (tmpsubprof->data, 1); } g_object_set (tmpencodebin, "profile", gst_object_ref (profile), NULL); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (tmpencodebin), GST_DEBUG_GRAPH_SHOW_ALL, gst_encoding_profile_get_name (profile)); /* The profile could be expended */ if (GST_BIN (tmpencodebin)->children) usable_profiles = g_list_prepend (usable_profiles, profile); gst_object_unref (tmpencodebin); } return usable_profiles; } GstEncodingProfile * create_encoding_profile (const gchar * pname) { GstEncodingProfile *profile; GValue value = G_VALUE_INIT; g_value_init (&value, GST_TYPE_ENCODING_PROFILE); if (!gst_value_deserialize (&value, pname)) { g_value_reset (&value); return NULL; } profile = g_value_dup_object (&value); g_value_reset (&value); return profile; } static const gchar * get_profile_type (GstEncodingProfile * profile) { if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) return "Container"; else if (GST_IS_ENCODING_AUDIO_PROFILE (profile)) return "Audio"; else if (GST_IS_ENCODING_VIDEO_PROFILE (profile)) return "Video"; else return "Unknown"; } static void print_profile (GstEncodingProfile * profile, const gchar * prefix) { const gchar *name = gst_encoding_profile_get_name (profile); const gchar *desc = gst_encoding_profile_get_description (profile); GstCaps *format = gst_encoding_profile_get_format (profile); gchar *capsdesc; if (gst_caps_is_fixed (format)) capsdesc = gst_pb_utils_get_codec_description (format); else capsdesc = gst_caps_to_string (format); g_print ("%s%s: %s%s%s%s%s%s\n", prefix, get_profile_type (profile), name ? name : capsdesc, desc ? ": " : "", desc ? desc : "", name ? " (" : "", name ? capsdesc : "", name ? ")" : ""); g_free (capsdesc); } void describe_encoding_profile (GstEncodingProfile * profile) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); print_profile (profile, " "); if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) { const GList *tmp; for (tmp = gst_encoding_container_profile_get_profiles (GST_ENCODING_CONTAINER_PROFILE (profile)); tmp; tmp = tmp->next) print_profile (tmp->data, " - "); } }