diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2008-04-25 19:34:31 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2008-04-25 19:34:31 +0000 |
commit | a66d502e0a291a94ec0de9585f300d5ff78c8da9 (patch) | |
tree | a7d3c8c8656c89229882d741621ddeb4e339ad22 /gst | |
parent | 7387f2cce405c39653c3a4a67e0050d0ecf63a1e (diff) |
gst/debug/rndbuffersize.c: Bring rndbuffersize element into a state that doesn't require us to move it to -bad immedi...
Original commit message from CVS:
* gst/debug/rndbuffersize.c: (DEFAULT_SEED), (DEFAULT_MIN),
(DEFAULT_MAX), (src_template), (sink_template),
(gst_rnd_buffer_size_base_init), (gst_rnd_buffer_size_class_init),
(gst_rnd_buffer_size_init), (gst_rnd_buffer_size_activate),
(gst_rnd_buffer_size_loop), (gst_rnd_buffer_size_plugin_init):
Bring rndbuffersize element into a state that doesn't require us
to move it to -bad immediately. For one, fix up default min/max
values so that the element actuall works using the default values.
Also, don't ignore flow return values and do some kind of minimal
eos logic. Allow min=max to pull fixed-sized buffers. Bunch of
other gratuitious clean-ups.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/debug/rndbuffersize.c | 127 |
1 files changed, 85 insertions, 42 deletions
diff --git a/gst/debug/rndbuffersize.c b/gst/debug/rndbuffersize.c index 9ec57838..bb77a5b3 100644 --- a/gst/debug/rndbuffersize.c +++ b/gst/debug/rndbuffersize.c @@ -44,11 +44,11 @@ struct _GstRndBufferSize { GstElement parent; + /*< private > */ GRand *rand; gulong seed; glong min, max; - /* < private > */ GstPad *sinkpad, *srcpad; guint64 offset; }; @@ -65,14 +65,16 @@ enum ARG_MAXIMUM }; -GstStaticPadTemplate gst_rnd_buffer_size_src_template = -GST_STATIC_PAD_TEMPLATE ("src", +#define DEFAULT_SEED 0 +#define DEFAULT_MIN 1 +#define DEFAULT_MAX (8*1024) + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); -GstStaticPadTemplate gst_rnd_buffer_size_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); @@ -99,17 +101,15 @@ static void gst_rnd_buffer_size_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - const GstElementDetails details = GST_ELEMENT_DETAILS ("Random buffer size", - "Testing", - "pull random sized buffers", - "Nokia Corporation (contact <stefan.kost@nokia.com>)"); gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gst_rnd_buffer_size_sink_template)); + gst_static_pad_template_get (&sink_template)); gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gst_rnd_buffer_size_src_template)); + gst_static_pad_template_get (&src_template)); - gst_element_class_set_details (gstelement_class, &details); + gst_element_class_set_details_simple (gstelement_class, "Random buffer size", + "Testing", "pull random sized buffers", + "Stefan Kost <stefan.kost@nokia.com>)"); } @@ -128,38 +128,34 @@ gst_rnd_buffer_size_class_init (GstRndBufferSizeClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_change_state); + /* FIXME 0.11: these should all be int instead of long, to avoid bugs + * when passing these as varargs with g_object_set(), and there was no + * reason to use long in the first place here */ g_object_class_install_property (gobject_class, ARG_SEED, g_param_spec_ulong ("seed", "random number seed", "seed for randomness (initialized when going from READY to PAUSED)", - 0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + 0, G_MAXUINT32, DEFAULT_SEED, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); g_object_class_install_property (gobject_class, ARG_MINIMUM, g_param_spec_long ("min", "mininum", "mininum buffer size", - 0, G_MAXLONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + 0, G_MAXINT32, DEFAULT_MIN, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); g_object_class_install_property (gobject_class, ARG_MAXIMUM, g_param_spec_long ("max", "maximum", "maximum buffer size", - 0, G_MAXLONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - + 1, G_MAXINT32, DEFAULT_MAX, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); } - static void gst_rnd_buffer_size_init (GstRndBufferSize * self, GstRndBufferSizeClass * g_class) { - self->sinkpad = - gst_pad_new_from_static_template (&gst_rnd_buffer_size_sink_template, - "sink"); - gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); + self->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_activate_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_activate)); gst_pad_set_activatepull_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_activate_pull)); + gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); - self->srcpad = - gst_pad_new_from_static_template (&gst_rnd_buffer_size_src_template, - "src"); + self->srcpad = gst_pad_new_from_static_template (&src_template, "src"); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); - } @@ -229,8 +225,7 @@ gst_rnd_buffer_size_activate (GstPad * pad) if (gst_pad_check_pull_range (pad)) { return gst_pad_activate_pull (pad, TRUE); } else { - GST_INFO_OBJECT (GST_RND_BUFFER_SIZE (GST_OBJECT_PARENT (pad)), - "push mode not supported"); + GST_INFO_OBJECT (pad, "push mode not supported"); return FALSE; } } @@ -257,28 +252,76 @@ gst_rnd_buffer_size_loop (GstRndBufferSize * self) { GstBuffer *buf = NULL; GstFlowReturn ret; - gulong num_bytes = g_rand_int_range (self->rand, self->min, self->max); + guint num_bytes; + + if (G_UNLIKELY (self->min > self->max)) + goto bogus_minmax; + + if (G_UNLIKELY (self->min != self->max)) { + num_bytes = g_rand_int_range (self->rand, self->min, self->max); + } else { + num_bytes = self->min; + } + + GST_LOG_OBJECT (self, "pulling %u bytes at offset %" G_GUINT64_FORMAT, + num_bytes, self->offset); - GST_INFO_OBJECT (self, "pull_range from %" G_GUINT64_FORMAT " of %lu bytes", - self->offset, num_bytes); ret = gst_pad_pull_range (self->sinkpad, self->offset, num_bytes, &buf); - if (ret == GST_FLOW_OK) { - if (GST_BUFFER_SIZE (buf) < num_bytes) { - self->offset += GST_BUFFER_SIZE (buf); - GST_WARNING_OBJECT (self, "short buffer : %u < %lu", - GST_BUFFER_SIZE (buf), num_bytes); + + if (ret != GST_FLOW_OK) + goto pull_failed; + + if (GST_BUFFER_SIZE (buf) < num_bytes) { + GST_WARNING_OBJECT (self, "short buffer: %u bytes", GST_BUFFER_SIZE (buf)); + } + + self->offset += GST_BUFFER_SIZE (buf); + + ret = gst_pad_push (self->srcpad, buf); + + if (ret != GST_FLOW_OK) + goto push_failed; + + return; + +pause_task: + { + GST_DEBUG_OBJECT (self, "pausing task"); + gst_pad_pause_task (self->sinkpad); + return; + } + +pull_failed: + { + if (ret == GST_FLOW_UNEXPECTED) { + GST_DEBUG_OBJECT (self, "eos"); + gst_pad_push_event (self->srcpad, gst_event_new_eos ()); } else { - self->offset += num_bytes; + GST_WARNING_OBJECT (self, "pull_range flow: %s", gst_flow_get_name (ret)); } + goto pause_task; + } - gst_pad_push (self->srcpad, buf); - } else { - GST_WARNING_OBJECT (self, "pull_range read failed: %s", - gst_flow_get_name (ret)); - gst_pad_pause_task (self->sinkpad); +push_failed: + { + GST_DEBUG_OBJECT (self, "push flow: %s", gst_flow_get_name (ret)); if (ret == GST_FLOW_UNEXPECTED) { + GST_DEBUG_OBJECT (self, "eos"); gst_pad_push_event (self->srcpad, gst_event_new_eos ()); + } else if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) { + GST_ELEMENT_ERROR (self, STREAM, FAILED, + ("Internal data stream error."), + ("streaming stopped, reason: %s", gst_flow_get_name (ret))); } + goto pause_task; + } + +bogus_minmax: + { + GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, + ("The minimum buffer size is smaller than the maximum buffer size."), + ("buffer sizes: max=%d, min=%d", self->min, self->max)); + goto pause_task; } } @@ -333,7 +376,7 @@ gst_rnd_buffer_size_plugin_init (GstPlugin * plugin) return FALSE; GST_DEBUG_CATEGORY_INIT (gst_rnd_buffer_size_debug, "rndbuffersize", 0, - "debugging category for rndbuffersize element"); + "rndbuffersize element"); return TRUE; } |