From: <tp...@ke...> - 2008-04-25 19:34:52
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: tpm Date: Fri Apr 25 2008 19:34:45 UTC Log message: * 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. Modified files: . : ChangeLog gst/debug : rndbuffersize.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3422&r2=1.3423 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/debug/rndbuffersize.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3422 retrieving revision 1.3423 diff -u -d -r1.3422 -r1.3423 --- ChangeLog 25 Apr 2008 19:23:48 -0000 1.3422 +++ ChangeLog 25 Apr 2008 19:34:30 -0000 1.3423 @@ -1,5 +1,19 @@ 2008-04-25 Tim-Philipp Müller <tim at centricular dot net> + * 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. + +2008-04-25 Tim-Philipp Müller <tim at centricular dot net> * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: Index: rndbuffersize.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/debug/rndbuffersize.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- rndbuffersize.c 17 Aug 2007 15:30:39 -0000 1.3 +++ rndbuffersize.c 25 Apr 2008 19:34:31 -0000 1.4 @@ -44,11 +44,11 @@ { GstElement parent; + /*< private > */ GRand *rand; gulong seed; glong min, max; - /* < private > */ GstPad *sinkpad, *srcpad; guint64 offset; }; @@ -65,14 +65,16 @@ 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, @@ -99,17 +101,15 @@ 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 <ste...@no...>)"); 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_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 <ste...@no...>)"); } @@ -128,38 +128,34 @@ 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", - + 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 @@ 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 @@ 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); + 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_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))); +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)); @@ -333,7 +376,7 @@ GST_DEBUG_CATEGORY_INIT (gst_rnd_buffer_size_debug, "rndbuffersize", 0, - "debugging category for rndbuffersize element"); + "rndbuffersize element"); return TRUE; |