[gst-devel] Should element's iterated pads be unref'ed?

Alexey Chernov 4ernov at gmail.com
Tue Feb 15 20:15:11 CET 2011


On Tuesday 15 February 2011 13:11:32 Luis de Bethencourt wrote:
> On Mon, Feb 14, 2011 at 8:47 PM, Alexey Chernov <4ernov at gmail.com> wrote:
> > On Sunday 13 February 2011 21:38:08 Luis de Bethencourt wrote:
> >> On Fri, Feb 11, 2011 at 9:11 PM, Alexey Chernov <4ernov at gmail.com> wrote:
> >> > On Tuesday 08 February 2011 21:12:27 you wrote:
> >> >> On Tue, 2011-02-08 at 15:26 +0300, 4ernov wrote:
> >> >> > What could be the problem? Maybe I should't unref pads after usage?
> >> >> > But in all the code snippets I've seen there's unref for every used
> >> >> > pad.
> >> >> 
> >> >> You probably need to check the result of gst_iterator_next right
> >> >> after you call it. Even if the result is DONE or ERROR you are still
> >> >> using the pad and unreferring it. Just use the example of
> >> >> GstIterator.
> >> > 
> >> > Thanks, Luciana. I searched for an example code with little success so
> >> > you reference is quite helpful. The problem actually went away as I
> >> > cleaned and recompiled the application but I'd better find out what
> >> > the reason was.
> >> > 
> >> > Thank you.
> >> 
> >> So what cleans did you make, do you still have the faulty code?
> > 
> > No, that time I meant only full rebuild and reinstall of the faulty code
> > and it used to fix the problem. Now I fixed the code as you and Luciana
> > suggested.
> > 
> >> Luciana's suggestion was something you should always do, check the
> >> function was successful before continuing.
> >> In some cases you might need to wait until an async Gst function
> >> finishes before doing anything related.
> > 
> > How can I implement this? Is it necessary to call _async function to
> > ensure everything is blocked? The use case is to change pipeline
> > branches dynamically after start of the playback.
> 
> I was just stating that it is good style to check for the return.
> 
> http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gst
> reamer-GstIterator.html#gst-iterator-next In this link you can read about
> the return values of
> gst_iterator_next(): GST_ITERATOR_OK, GST_ITERATOR_DONE,
> GST_ITERATOR_RESYNC, GST_ITERATOR_ERROR.
> As you can see it makes sense to have your code act acordingly
> depending on which return value you get.

Yes, thanks for the reference, so with necessary checks my code must be 
correct now. So, the result is like this:

void block_src_pads(GstElement* element, gboolean block)
{
	GstIterator* it = gst_element_iterate_src_pads(element);
	gpointer p;
	while (gst_iterator_next(it, &p) == GST_ITERATOR_OK)
	{
		GstPad* pad = GST_PAD(p);
		gst_pad_set_blocked (pad, block);
		gst_object_unref(pad);
	}
	gst_iterator_free(it);
}

Thanks to all for help.
 
> Luis
_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



More information about the gstreamer-devel mailing list