X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libs%2Fgst%2Fbase%2Fgstaggregator.c;h=94d481604fb8564afb251f0be5e567a6d45d7b8b;hb=5bf13cdd5314bc3c6c81bd620e712acdcab14eb2;hp=322819340bd6ec7093823900566dbd8dda045b53;hpb=ae57b1c76d6f5ddd5b38f9be2df4a66bfcd574b5;p=platform%2Fupstream%2Fgstreamer.git diff --git a/libs/gst/base/gstaggregator.c b/libs/gst/base/gstaggregator.c index 3228193..94d4816 100644 --- a/libs/gst/base/gstaggregator.c +++ b/libs/gst/base/gstaggregator.c @@ -295,7 +295,7 @@ gst_aggregator_pad_flush (GstAggregatorPad * aggpad, GstAggregator * agg) PAD_UNLOCK (aggpad); if (klass->flush) - return klass->flush (aggpad, agg); + return (klass->flush (aggpad, agg) == GST_FLOW_OK); return TRUE; } @@ -1669,17 +1669,26 @@ gst_aggregator_default_create_new_pad (GstAggregator * self, GST_OBJECT_LOCK (self); if (req_name == NULL || strlen (req_name) < 6 - || !g_str_has_prefix (req_name, "sink_")) { + || !g_str_has_prefix (req_name, "sink_") + || strrchr (req_name, '%') != NULL) { /* no name given when requesting the pad, use next available int */ serial = ++priv->max_padserial; } else { + gchar *endptr = NULL; + /* parse serial number from requested padname */ - serial = g_ascii_strtoull (&req_name[5], NULL, 10); - if (serial > priv->max_padserial) - priv->max_padserial = serial; + serial = g_ascii_strtoull (&req_name[5], &endptr, 10); + if (endptr != NULL && *endptr == '\0') { + if (serial > priv->max_padserial) { + priv->max_padserial = serial; + } + } else { + serial = ++priv->max_padserial; + } } name = g_strdup_printf ("sink_%u", serial); + g_assert (g_type_is_a (pad_type, GST_TYPE_AGGREGATOR_PAD)); agg_pad = g_object_new (pad_type, "name", name, "direction", GST_PAD_SINK, "template", templ, NULL); g_free (name); @@ -2422,6 +2431,7 @@ gst_aggregator_init (GstAggregator * self, GstAggregatorClass * klass) { GstPadTemplate *pad_template; GstAggregatorPrivate *priv; + GType pad_type; g_return_if_fail (klass->aggregate != NULL); @@ -2441,7 +2451,14 @@ gst_aggregator_init (GstAggregator * self, GstAggregatorClass * klass) self->priv->peer_latency_max = self->priv->sub_latency_max = 0; self->priv->has_peer_latency = FALSE; - self->srcpad = gst_pad_new_from_template (pad_template, "src"); + pad_type = + GST_PAD_TEMPLATE_GTYPE (pad_template) == + G_TYPE_NONE ? GST_TYPE_AGGREGATOR_PAD : + GST_PAD_TEMPLATE_GTYPE (pad_template); + g_assert (g_type_is_a (pad_type, GST_TYPE_AGGREGATOR_PAD)); + self->srcpad = + g_object_new (pad_type, "name", "src", "direction", GST_PAD_SRC, + "template", pad_template, NULL); gst_aggregator_reset_flow_values (self); @@ -2924,7 +2941,7 @@ gst_aggregator_pad_class_init (GstAggregatorPadClass * klass) gobject_class->get_property = gst_aggregator_pad_get_property; /** - * GstAggregatorPad::buffer-consumed: + * GstAggregatorPad:buffer-consumed: * * Signals that a buffer was consumed. As aggregator pads store buffers * in an internal queue, there is no direct match between input and output