summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Sauer <ensonic@users.sf.net>2012-12-17 21:17:41 +0100
committerStefan Sauer <ensonic@users.sf.net>2012-12-17 21:17:41 +0100
commit29a34058a9a128532e19a4ee24b32d0528877ba1 (patch)
tree898f34dfeb82c5d3353ebc4889ba26c4dda0c2f0
parentc1c19f4bd2e1aa2f51ffc88821bd2b83a1be6385 (diff)
trace: also track calls to _send_event, but filter nested calls
-rw-r--r--src/gsttracelib.c55
1 files changed, 44 insertions, 11 deletions
diff --git a/src/gsttracelib.c b/src/gsttracelib.c
index 7861a4a..76e8d22 100644
--- a/src/gsttracelib.c
+++ b/src/gsttracelib.c
@@ -367,14 +367,13 @@ _log_common (GstClockTimeDiff treal)
* cpufreq-selector -g ondemand
*/
/* this is the total average, apply a window */
//cpuload = (guint) gst_util_uint64_scale (tusersys, G_GINT64_CONSTANT(100), treal);
aspent+=dspent;
areal+=dreal;
- if(areal > GST_SECOND) {
- //if(areal > (GST_MSECOND*500)) {
+ if(areal > GST_MSECOND * 50) {
cpuload = (guint) gst_util_uint64_scale (aspent, G_GINT64_CONSTANT(100), areal);
/* we only want cpu-load in playing, otherwise max is almost always 100 */
if (check_cpuload && (cpuload <= 100)) {
if (cpuload > stats->max_cpuload) {
stats->max_cpuload = cpuload;
if (cpuload > max_cpuload) {
@@ -1206,28 +1205,21 @@ gst_pad_pull_range (GstPad * pad, guint64 offset, guint size, GstBuffer ** buffe
} else {
stats->last_ts = elapsed1;
}
return ret;
}
-/* gst_pad_push_event(pad) calls gst_pad_send_event(peer);
- * but not in all code-paths'
- */
-static gboolean (*orig_pad_push_event) (GstPad *, GstEvent *);
-
-gboolean
-gst_pad_push_event (GstPad *pad, GstEvent *event)
+void
+gst_pad_send_or_push_event_common (GstPad *pad, GstEvent *event, GstClockTimeDiff elapsed)
{
- GstClockTimeDiff elapsed = _get_elapsed();
GstObject *parent;
GstElement *element;
GsttlElementStats *stats, *that_stats;
GstPad *real_pad = pad;
GstPad *peer_pad = GST_PAD_PEER (pad);
GsttlPadStats *pad_stats,*peer_pad_stats;
- gboolean ret;
parent = _get_real_pad_parent(real_pad);
if(element = GST_ELEMENT (parent)) {
stats = _get_element_stats (element);
pad_stats = _get_pad_stats (pad);
peer_pad_stats = _get_pad_stats (peer_pad);
@@ -1282,21 +1274,62 @@ gst_pad_push_event (GstPad *pad, GstEvent *event)
stats->num_events++;
num_events++;
/* switch cpu-load logging on/off */
_check_playing (element);
}
+}
+
+
+/* gst_pad_push_event(pad) calls gst_pad_send_event(peer);
+ * but not in all code-paths', we track both, but handle the case where one calls
+ * the other */
+static gboolean (*orig_pad_push_event) (GstPad *, GstEvent *);
+static gboolean _in_push_event = FALSE;
+
+gboolean
+gst_pad_push_event (GstPad *pad, GstEvent *event)
+{
+ GstClockTimeDiff elapsed = _get_elapsed();
+ gboolean ret;
+
+ gst_pad_send_or_push_event_common (pad, event, elapsed);
_log_common(elapsed);
+ _in_push_event = TRUE;
ret = orig_pad_push_event (pad, event);
elapsed = _get_elapsed();
_log_common(elapsed);
+ _in_push_event = FALSE;
+
+ return ret;
+}
+
+static gboolean (*orig_pad_send_event) (GstPad *, GstEvent *);
+
+gboolean
+gst_pad_send_event (GstPad *pad, GstEvent *event)
+{
+ GstClockTimeDiff elapsed = _get_elapsed();
+ gboolean ret;
+
+ if (_in_push_event) {
+ return orig_pad_send_event (pad, event);
+ }
+
+ gst_pad_send_or_push_event_common (pad, event, elapsed);
+
+ _log_common(elapsed);
+ ret = orig_pad_send_event (pad, event);
+ elapsed = _get_elapsed();
+ _log_common(elapsed);
return ret;
}
+
static gboolean (*orig_element_post_message) (GstElement *, GstMessage *);
gboolean
gst_element_post_message (GstElement *element, GstMessage *message)
{
GstClockTimeDiff elapsed = _get_elapsed();