Some small cleanups. added a drop_probaility arg to identity, so it occasionally can drop buffers to simulate network...

Original commit message from CVS:
Some small cleanups.
added a drop_probaility arg to identity, so it occasionally can drop buffers
to simulate network packet loss
This commit is contained in:
Wim Taymans 2002-01-01 13:46:04 +00:00
parent ad6c7ef940
commit 03391373ef
6 changed files with 52 additions and 56 deletions

View file

@ -257,7 +257,7 @@ static void
gst_aggregator_push (GstAggregator *aggregator, GstPad *pad, GstBuffer *buf, guchar *debug) gst_aggregator_push (GstAggregator *aggregator, GstPad *pad, GstBuffer *buf, guchar *debug)
{ {
if (!aggregator->silent) if (!aggregator->silent)
g_print("aggregator: %10.10s ******* (%s:%s)a (%d bytes, %llu) \n", gst_element_info (GST_ELEMENT (aggregator), "%10.10s ******* (%s:%s)a (%d bytes, %llu) \n",
debug, GST_DEBUG_PAD_NAME (pad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf)); debug, GST_DEBUG_PAD_NAME (pad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
gst_pad_push (aggregator->srcpad, buf); gst_pad_push (aggregator->srcpad, buf);

View file

@ -21,6 +21,7 @@
*/ */
#include <stdlib.h>
#include <gstidentity.h> #include <gstidentity.h>
@ -47,6 +48,7 @@ enum {
ARG_SLEEP_TIME, ARG_SLEEP_TIME,
ARG_DUPLICATE, ARG_DUPLICATE,
ARG_ERROR_AFTER, ARG_ERROR_AFTER,
ARG_DROP_PROBABILITY,
ARG_SILENT, ARG_SILENT,
}; };
@ -104,6 +106,9 @@ gst_identity_class_init (GstIdentityClass *klass)
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_AFTER, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_AFTER,
g_param_spec_int ("error_after", "Error After", "Error after N buffers", g_param_spec_int ("error_after", "Error After", "Error after N buffers",
G_MININT, G_MAXINT, -1, G_PARAM_READWRITE)); G_MININT, G_MAXINT, -1, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DROP_PROBABILITY,
g_param_spec_float ("drop_probability", "Drop Probability", "The Probability a buffer is dropped",
0.0, 1.0, 0.0, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT,
g_param_spec_boolean ("silent", "silent", "silent", g_param_spec_boolean ("silent", "silent", "silent",
TRUE,G_PARAM_READWRITE)); TRUE,G_PARAM_READWRITE));
@ -165,6 +170,7 @@ gst_identity_init (GstIdentity *identity)
identity->sleep_time = 0; identity->sleep_time = 0;
identity->duplicate = 1; identity->duplicate = 1;
identity->error_after = -1; identity->error_after = -1;
identity->drop_probability = 0.0;
identity->silent = FALSE; identity->silent = FALSE;
} }
@ -189,9 +195,18 @@ gst_identity_chain (GstPad *pad, GstBuffer *buf)
} }
} }
for (i=identity->duplicate; i; i--) { if (identity->drop_probability > 0.0) {
if ((gfloat)(1.0*rand()/(RAND_MAX)) < identity->drop_probability) {
gst_element_info (GST_ELEMENT (identity), "dropping ******* (%s:%s)i (%d bytes, %llu)",
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
gst_buffer_unref (buf);
return;
}
}
for (i = identity->duplicate; i; i--) {
if (!identity->silent) if (!identity->silent)
g_print("identity: chain ******* (%s:%s)i (%d bytes, %llu) \n", gst_element_info (GST_ELEMENT (identity), "chain ******* (%s:%s)i (%d bytes, %llu)",
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf)); GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0, g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
@ -224,31 +239,7 @@ gst_identity_loop (GstElement *element)
gst_pad_event_default (identity->sinkpad, GST_EVENT (buf)); gst_pad_event_default (identity->sinkpad, GST_EVENT (buf));
} }
if (identity->error_after >= 0) { gst_identity_chain (identity->sinkpad, buf);
identity->error_after--;
if (identity->error_after == 0) {
gst_buffer_unref (buf);
gst_element_error (element, "errored after iterations as requested");
return;
}
}
for (i=identity->duplicate; i; i--) {
if (!identity->silent)
g_print("identity: loop ******* (%s:%s)i (%d bytes, %llu) \n",
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
buf);
if (i>1)
gst_buffer_ref (buf);
gst_pad_push (identity->srcpad, buf);
if (identity->sleep_time)
usleep (identity->sleep_time);
}
} }
static void static void
@ -285,6 +276,9 @@ gst_identity_set_property (GObject *object, guint prop_id, const GValue *value,
case ARG_ERROR_AFTER: case ARG_ERROR_AFTER:
identity->error_after = g_value_get_uint (value); identity->error_after = g_value_get_uint (value);
break; break;
case ARG_DROP_PROBABILITY:
identity->drop_probability = g_value_get_float (value);
break;
default: default:
break; break;
} }
@ -311,6 +305,9 @@ static void gst_identity_get_property(GObject *object, guint prop_id, GValue *va
case ARG_ERROR_AFTER: case ARG_ERROR_AFTER:
g_value_set_uint (value, identity->error_after); g_value_set_uint (value, identity->error_after);
break; break;
case ARG_DROP_PROBABILITY:
g_value_set_float (value, identity->drop_probability);
break;
case ARG_SILENT: case ARG_SILENT:
g_value_set_boolean (value, identity->silent); g_value_set_boolean (value, identity->silent);
break; break;

View file

@ -60,6 +60,7 @@ struct _GstIdentity {
gboolean loop_based; gboolean loop_based;
guint duplicate; guint duplicate;
gint error_after; gint error_after;
gfloat drop_probability;
guint sleep_time; guint sleep_time;
gboolean silent; gboolean silent;
}; };

View file

@ -257,7 +257,7 @@ static void
gst_aggregator_push (GstAggregator *aggregator, GstPad *pad, GstBuffer *buf, guchar *debug) gst_aggregator_push (GstAggregator *aggregator, GstPad *pad, GstBuffer *buf, guchar *debug)
{ {
if (!aggregator->silent) if (!aggregator->silent)
g_print("aggregator: %10.10s ******* (%s:%s)a (%d bytes, %llu) \n", gst_element_info (GST_ELEMENT (aggregator), "%10.10s ******* (%s:%s)a (%d bytes, %llu) \n",
debug, GST_DEBUG_PAD_NAME (pad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf)); debug, GST_DEBUG_PAD_NAME (pad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
gst_pad_push (aggregator->srcpad, buf); gst_pad_push (aggregator->srcpad, buf);

View file

@ -21,6 +21,7 @@
*/ */
#include <stdlib.h>
#include <gstidentity.h> #include <gstidentity.h>
@ -47,6 +48,7 @@ enum {
ARG_SLEEP_TIME, ARG_SLEEP_TIME,
ARG_DUPLICATE, ARG_DUPLICATE,
ARG_ERROR_AFTER, ARG_ERROR_AFTER,
ARG_DROP_PROBABILITY,
ARG_SILENT, ARG_SILENT,
}; };
@ -104,6 +106,9 @@ gst_identity_class_init (GstIdentityClass *klass)
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_AFTER, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_AFTER,
g_param_spec_int ("error_after", "Error After", "Error after N buffers", g_param_spec_int ("error_after", "Error After", "Error after N buffers",
G_MININT, G_MAXINT, -1, G_PARAM_READWRITE)); G_MININT, G_MAXINT, -1, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DROP_PROBABILITY,
g_param_spec_float ("drop_probability", "Drop Probability", "The Probability a buffer is dropped",
0.0, 1.0, 0.0, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT,
g_param_spec_boolean ("silent", "silent", "silent", g_param_spec_boolean ("silent", "silent", "silent",
TRUE,G_PARAM_READWRITE)); TRUE,G_PARAM_READWRITE));
@ -165,6 +170,7 @@ gst_identity_init (GstIdentity *identity)
identity->sleep_time = 0; identity->sleep_time = 0;
identity->duplicate = 1; identity->duplicate = 1;
identity->error_after = -1; identity->error_after = -1;
identity->drop_probability = 0.0;
identity->silent = FALSE; identity->silent = FALSE;
} }
@ -189,9 +195,18 @@ gst_identity_chain (GstPad *pad, GstBuffer *buf)
} }
} }
for (i=identity->duplicate; i; i--) { if (identity->drop_probability > 0.0) {
if ((gfloat)(1.0*rand()/(RAND_MAX)) < identity->drop_probability) {
gst_element_info (GST_ELEMENT (identity), "dropping ******* (%s:%s)i (%d bytes, %llu)",
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
gst_buffer_unref (buf);
return;
}
}
for (i = identity->duplicate; i; i--) {
if (!identity->silent) if (!identity->silent)
g_print("identity: chain ******* (%s:%s)i (%d bytes, %llu) \n", gst_element_info (GST_ELEMENT (identity), "chain ******* (%s:%s)i (%d bytes, %llu)",
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf)); GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0, g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
@ -224,31 +239,7 @@ gst_identity_loop (GstElement *element)
gst_pad_event_default (identity->sinkpad, GST_EVENT (buf)); gst_pad_event_default (identity->sinkpad, GST_EVENT (buf));
} }
if (identity->error_after >= 0) { gst_identity_chain (identity->sinkpad, buf);
identity->error_after--;
if (identity->error_after == 0) {
gst_buffer_unref (buf);
gst_element_error (element, "errored after iterations as requested");
return;
}
}
for (i=identity->duplicate; i; i--) {
if (!identity->silent)
g_print("identity: loop ******* (%s:%s)i (%d bytes, %llu) \n",
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf));
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
buf);
if (i>1)
gst_buffer_ref (buf);
gst_pad_push (identity->srcpad, buf);
if (identity->sleep_time)
usleep (identity->sleep_time);
}
} }
static void static void
@ -285,6 +276,9 @@ gst_identity_set_property (GObject *object, guint prop_id, const GValue *value,
case ARG_ERROR_AFTER: case ARG_ERROR_AFTER:
identity->error_after = g_value_get_uint (value); identity->error_after = g_value_get_uint (value);
break; break;
case ARG_DROP_PROBABILITY:
identity->drop_probability = g_value_get_float (value);
break;
default: default:
break; break;
} }
@ -311,6 +305,9 @@ static void gst_identity_get_property(GObject *object, guint prop_id, GValue *va
case ARG_ERROR_AFTER: case ARG_ERROR_AFTER:
g_value_set_uint (value, identity->error_after); g_value_set_uint (value, identity->error_after);
break; break;
case ARG_DROP_PROBABILITY:
g_value_set_float (value, identity->drop_probability);
break;
case ARG_SILENT: case ARG_SILENT:
g_value_set_boolean (value, identity->silent); g_value_set_boolean (value, identity->silent);
break; break;

View file

@ -60,6 +60,7 @@ struct _GstIdentity {
gboolean loop_based; gboolean loop_based;
guint duplicate; guint duplicate;
gint error_after; gint error_after;
gfloat drop_probability;
guint sleep_time; guint sleep_time;
gboolean silent; gboolean silent;
}; };