adder: Don't calls gst_pad_set_caps() on sinkpads

It doesn't make much sense and the CAPS query handling
on the sinkpads should handle this.
This commit is contained in:
Sebastian Dröge 2013-05-30 14:32:03 +02:00
parent 5e63a0f674
commit 0693b78e86
2 changed files with 20 additions and 70 deletions

View file

@ -219,7 +219,7 @@ static GstCaps *
gst_adder_sink_getcaps (GstPad * pad, GstCaps * filter)
{
GstAdder *adder;
GstCaps *result, *peercaps, *sinkcaps, *filter_caps;
GstCaps *result, *peercaps, *current_caps, *filter_caps;
adder = GST_ADDER (GST_PAD_PARENT (pad));
@ -246,33 +246,37 @@ gst_adder_sink_getcaps (GstPad * pad, GstCaps * filter)
peercaps = gst_pad_peer_query_caps (adder->srcpad, filter_caps);
/* get the allowed caps on this sinkpad */
sinkcaps = gst_pad_get_current_caps (pad);
if (sinkcaps == NULL) {
sinkcaps = gst_pad_get_pad_template_caps (pad);
if (!sinkcaps)
sinkcaps = gst_caps_new_any ();
GST_OBJECT_LOCK (adder);
current_caps =
adder->current_caps ? gst_caps_ref (adder->current_caps) : NULL;
if (current_caps == NULL) {
current_caps = gst_pad_get_pad_template_caps (pad);
if (!current_caps)
current_caps = gst_caps_new_any ();
}
GST_OBJECT_UNLOCK (adder);
if (peercaps) {
/* if the peer has caps, intersect */
GST_DEBUG_OBJECT (adder, "intersecting peer and template caps");
GST_DEBUG_OBJECT (adder, "intersecting peer and our caps");
result =
gst_caps_intersect_full (peercaps, sinkcaps, GST_CAPS_INTERSECT_FIRST);
gst_caps_intersect_full (peercaps, current_caps,
GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (peercaps);
gst_caps_unref (sinkcaps);
gst_caps_unref (current_caps);
} else {
/* the peer has no caps (or there is no peer), just use the allowed caps
* of this sinkpad. */
/* restrict with filter-caps if any */
if (filter_caps) {
GST_DEBUG_OBJECT (adder, "no peer caps, using filtered sinkcaps");
GST_DEBUG_OBJECT (adder, "no peer caps, using filtered caps");
result =
gst_caps_intersect_full (filter_caps, sinkcaps,
gst_caps_intersect_full (filter_caps, current_caps,
GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (sinkcaps);
gst_caps_unref (current_caps);
} else {
GST_DEBUG_OBJECT (adder, "no peer caps, using sinkcaps");
result = sinkcaps;
GST_DEBUG_OBJECT (adder, "no peer caps, using our caps");
result = current_caps;
}
}
@ -311,41 +315,12 @@ gst_adder_sink_query (GstCollectPads * pads, GstCollectData * pad,
return res;
}
typedef struct
{
GstPad *pad;
GstCaps *caps;
} IterData;
static void
setcapsfunc (const GValue * item, IterData * data)
{
GstPad *otherpad = g_value_get_object (item);
if (otherpad != data->pad) {
GST_LOG_OBJECT (data->pad, "calling set_caps with %" GST_PTR_FORMAT,
data->caps);
gst_pad_set_caps (data->pad, data->caps);
gst_pad_use_fixed_caps (data->pad);
}
}
/* the first caps we receive on any of the sinkpads will define the caps for all
* the other sinkpads because we can only mix streams with the same caps.
*/
static gboolean
gst_adder_setcaps (GstAdder * adder, GstPad * pad, GstCaps * caps)
{
GstIterator *it;
GstIteratorResult ires;
IterData idata;
gboolean done;
/* this gets called recursively due to gst_iterator_foreach calling
* gst_pad_set_caps() */
if (adder->in_setcaps)
return TRUE;
/* don't allow reconfiguration for now; there's still a race between the
* different upstream threads doing query_caps + accept_caps + sending
* (possibly different) CAPS events, but there's not much we can do about
@ -365,34 +340,11 @@ gst_adder_setcaps (GstAdder * adder, GstPad * pad, GstCaps * caps)
GST_INFO_OBJECT (pad, "setting caps to %" GST_PTR_FORMAT, caps);
GST_OBJECT_LOCK (adder);
adder->current_caps = gst_caps_ref (caps);
GST_OBJECT_UNLOCK (adder);
/* send caps event later, after stream-start event */
it = gst_element_iterate_pads (GST_ELEMENT_CAST (adder));
/* FIXME, see if the other pads can accept the format. Also lock the
* format on the other pads to this new format. */
idata.caps = caps;
idata.pad = pad;
adder->in_setcaps = TRUE;
done = FALSE;
while (!done) {
ires = gst_iterator_foreach (it, (GstIteratorForeachFunction) setcapsfunc,
&idata);
switch (ires) {
case GST_ITERATOR_RESYNC:
gst_iterator_resync (it);
break;
default:
done = TRUE;
break;
}
}
adder->in_setcaps = FALSE;
gst_iterator_free (it);
GST_INFO_OBJECT (pad, "handle caps change to %" GST_PTR_FORMAT, caps);
if (!gst_audio_info_from_caps (&adder->info, caps))

View file

@ -76,8 +76,6 @@ struct _GstAdder {
/* Pending inline events */
GList *pending_events;
gboolean in_setcaps;
gboolean send_stream_start;
gboolean send_caps;
};