diff --git a/gst/gstcaps.c b/gst/gstcaps.c index 0b9be9fad3..5b94d88682 100644 --- a/gst/gstcaps.c +++ b/gst/gstcaps.c @@ -241,8 +241,10 @@ void gst_caps_append_structure (GstCaps *caps, GstStructure *structure) g_return_if_fail(caps != NULL); if (structure){ +#if 0 /* disable this, since too many plugins rely on undefined behavior */ #ifdef USE_POISONING STRUCTURE_POISON (structure); +#endif #endif g_ptr_array_add (caps->structs, structure); } @@ -578,7 +580,9 @@ GstCaps *gst_caps_intersect (const GstCaps *caps1, const GstCaps *caps2) GstStructure *struct1; GstStructure *struct2; GstCaps *dest; - //GstCaps *caps; +#if 0 + GstCaps *caps; +#endif g_return_val_if_fail (caps1 != NULL, NULL); g_return_val_if_fail (caps2 != NULL, NULL); @@ -750,8 +754,10 @@ GstCaps *gst_caps_load_thyself (xmlNodePtr parent) /* utility */ void gst_caps_replace (GstCaps **caps, GstCaps *newcaps) { +#if 0 /* disable this, since too many plugins rely on undefined behavior */ #ifdef USE_POISONING - if (newcaps) CAPS_POISON (newcaps); + //if (newcaps) CAPS_POISON (newcaps); +#endif #endif if (*caps) gst_caps_free(*caps); *caps = newcaps; diff --git a/gst/gstinfo.c b/gst/gstinfo.c index f5effd1e10..8e530b6626 100644 --- a/gst/gstinfo.c +++ b/gst/gstinfo.c @@ -70,6 +70,7 @@ extern gchar *_gst_progname; static void gst_debug_reset_threshold (gpointer category, gpointer unused); static void gst_debug_reset_all_thresholds (void); +static void gst_debug_set_log_function_level (GstLogFunction func, gpointer data, GstDebugLevel level); /* list of all name/level pairs from --gst-debug and GST_DEBUG */ static GStaticMutex __level_name_mutex = G_STATIC_MUTEX_INIT; @@ -87,10 +88,13 @@ static GSList *__categories = NULL; typedef struct { GstLogFunction func; gpointer user_data; + GstDebugLevel max_level; } LogFuncEntry; static GStaticMutex __log_func_mutex = G_STATIC_MUTEX_INIT; static GSList *__log_functions = NULL; +static GstDebugLevel __log_level; +static GstDebugLevel _gst_debug_max_threshold; static GstAtomicInt __default_level; static GstAtomicInt __use_color; gboolean __gst_debug_enabled = TRUE; @@ -287,14 +291,16 @@ void gst_debug_log_valist (GstDebugCategory *category, GstDebugLevel level, g_return_if_fail (function != NULL); g_return_if_fail (format != NULL); - message = g_strdup_vprintf (format, args); - handler = __log_functions; - while (handler) { - entry = handler->data; - handler = g_slist_next (handler); - entry->func (category, level, file, function, line, object, message, entry->user_data); + if (level <= __log_level) { + message = g_strdup_vprintf (format, args); + handler = __log_functions; + while (handler) { + entry = handler->data; + handler = g_slist_next (handler); + entry->func (category, level, file, function, line, object, message, entry->user_data); + } + g_free (message); } - g_free (message); } /** * gst_debug_construct_term_color: @@ -440,6 +446,8 @@ gst_debug_add_log_function (GstLogFunction func, gpointer data) entry = g_new (LogFuncEntry, 1); entry->func = func; entry->user_data = data; + //entry->max_level = GST_LEVEL_LOG; + entry->max_level = 0; /* FIXME: we leak the old list here - other threads might access it right now * in gst_debug_logv. Another solution is to lock the mutex in gst_debug_logv, * but that is waaay costly. @@ -449,11 +457,35 @@ gst_debug_add_log_function (GstLogFunction func, gpointer data) g_static_mutex_lock (&__log_func_mutex); list = g_slist_copy (__log_functions); __log_functions = g_slist_prepend (list, entry); + __log_level = MAX (__log_level, entry->max_level); g_static_mutex_unlock (&__log_func_mutex); GST_DEBUG ("prepended log function %p (user data %p) to log functions", func, data); } + +static void +gst_debug_set_log_function_level (GstLogFunction func, gpointer data, GstDebugLevel level) +{ + LogFuncEntry *entry; + GSList *list; + GstDebugLevel new_level; + + g_static_mutex_lock (&__log_func_mutex); + list = __log_functions; + new_level = 0; + while (list) { + entry = list->data; + if (entry->func == func && entry->user_data == data) { + entry->max_level = level; + } + new_level = MAX (new_level, entry->max_level); + list = g_slist_next (list); + } + __log_level = new_level; + g_static_mutex_unlock (&__log_func_mutex); +} + static gint gst_debug_compare_log_function_by_func (gconstpointer entry, gconstpointer func) { @@ -468,12 +500,16 @@ gst_debug_compare_log_function_by_data (gconstpointer entry, gconstpointer data) return (entrydata < data) ? -1 : (entrydata > data) ? 1 : 0; } + static guint gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data) { GSList *found; GSList *new; guint removals = 0; + GstDebugLevel new_level; + GSList *handler; + g_static_mutex_lock (&__log_func_mutex); new = __log_functions; while ((found = g_slist_find_custom (new, data, func))) { @@ -485,12 +521,21 @@ gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data) new = g_slist_delete_link (new, found); removals++; } + new_level = 0; + handler = new; + while (handler) { + LogFuncEntry *entry = handler->data; + new_level = MAX (entry->max_level, new_level); + handler = g_slist_next (handler); + } + __log_level = new_level; /* FIXME: We leak the old list here. See _add_log_function for why. */ __log_functions = new; g_static_mutex_unlock (&__log_func_mutex); return removals; } + /** * gst_debug_remove_log_function: * @func: the log function to remove @@ -512,6 +557,7 @@ gst_debug_remove_log_function (GstLogFunction func) return removals; } + /** * gst_debug_remove_log_function_by_data: * @data: user data of the log function to remove @@ -531,6 +577,7 @@ gst_debug_remove_log_function_by_data (gpointer data) return removals; } + /** * gst_debug_set_colored: * @colored: Whether to use colored output or not @@ -606,6 +653,23 @@ gst_debug_get_default_threshold (void) { return (GstDebugLevel) gst_atomic_int_read (&__default_level); } + +static void +gst_debug_recalculate_max_threshold (void) +{ + GSList *walk; + GstDebugLevel new_threshold = 0; + walk = __categories; + while (walk) { + GstDebugCategory *cat = walk->data; + new_threshold = MAX (gst_atomic_int_read (cat->threshold), new_threshold); + walk = g_slist_next (walk); + } + _gst_debug_max_threshold = new_threshold; + gst_debug_set_log_function_level (gst_debug_log_default, NULL, + _gst_debug_max_threshold); +} + static void gst_debug_reset_threshold (gpointer category, gpointer unused) { @@ -627,8 +691,10 @@ gst_debug_reset_threshold (gpointer category, gpointer unused) gst_debug_category_set_threshold (cat, gst_debug_get_default_threshold ()); exit: + gst_debug_recalculate_max_threshold (); g_static_mutex_unlock (&__level_name_mutex); } + static void gst_debug_reset_all_thresholds (void) { @@ -673,6 +739,7 @@ gst_debug_set_threshold_for_name (const gchar *name, GstDebugLevel level) g_static_mutex_unlock (&__level_name_mutex); g_static_mutex_lock (&__cat_mutex); g_slist_foreach (__categories, for_each_threshold_by_entry, entry); + gst_debug_recalculate_max_threshold (); g_static_mutex_unlock (&__cat_mutex); } /** @@ -703,6 +770,7 @@ gst_debug_unset_threshold_for_name (const gchar *name) walk = __level_name; } } + gst_debug_recalculate_max_threshold (); g_static_mutex_unlock (&__level_name_mutex); g_pattern_spec_free (pat); gst_debug_reset_all_thresholds (); diff --git a/gst/gstinfo.h b/gst/gstinfo.h index 7d7e6922cd..009f7f44f4 100644 --- a/gst/gstinfo.h +++ b/gst/gstinfo.h @@ -104,6 +104,14 @@ struct _GstDebugCategory { /********** some convenience macros for debugging **********/ +#define GST_TEMP_STRING(str, statement) G_STMT_START { \ + char * str = NULL; \ + statement; \ + g_free( str ); \ +} G_STMT_END + + + /* This is needed in printf's if a char* might be NULL. Solaris crashes then */ #define GST_STR_NULL(str) ((str) ? (str) : "(NULL)") @@ -162,6 +170,16 @@ void gst_debug_log (GstDebugCategory * category, GObject * object, gchar * format, ...) G_GNUC_PRINTF (7, 8) G_GNUC_NO_INSTRUMENT; +void gst_debug_log_callback (GstDebugCategory * category, + GstDebugLevel level, + const gchar * file, + const gchar * function, + gint line, + GObject * object, + char * (*callback)(gpointer callback_arg), + gpointer callback_arg, + gchar * format, + ...) G_GNUC_PRINTF (9, 10) G_GNUC_NO_INSTRUMENT; void gst_debug_log_valist (GstDebugCategory * category, GstDebugLevel level, const gchar * file,