gst/videomixer/videomixer.c: When using gst_element_iterate_pads() one has to unref every pad after usage.

Original commit message from CVS:
* gst/videomixer/videomixer.c: (gst_videomixer_query_duration),
(gst_videomixer_query_latency):
When using gst_element_iterate_pads() one has to unref every pad
after usage.
This commit is contained in:
Sebastian Dröge 2008-06-02 12:22:56 +00:00
parent facf5d90c7
commit 0275425212
2 changed files with 68 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2008-06-02 Sebastian Dröge <slomo@circular-chaos.org>
* gst/videomixer/videomixer.c: (gst_videomixer_query_duration),
(gst_videomixer_query_latency):
When using gst_element_iterate_pads() one has to unref every pad
after usage.
2008-05-31 Edward Hervey <edward.hervey@collabora.co.uk>
Patch by: Bastien Nocera <hadess at hadess dot net>

View file

@ -80,13 +80,16 @@ static GType gst_videomixer_get_type (void);
static void gst_videomixer_pad_class_init (GstVideoMixerPadClass * klass);
static void gst_videomixer_pad_init (GstVideoMixerPad * mixerpad);
static void gst_videomixer_pad_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static void gst_videomixer_pad_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static gboolean gst_videomixer_src_event (GstPad * pad, GstEvent * event);
static gboolean gst_videomixer_sink_event (GstPad * pad, GstEvent * event);
@ -188,6 +191,7 @@ gst_videomixer_pad_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstVideoMixerPad *pad;
GstVideoMixer *mix;
pad = GST_VIDEO_MIXER_PAD (object);
@ -221,7 +225,9 @@ static void
gst_videomixer_set_master_geometry (GstVideoMixer * mix)
{
GSList *walk;
gint width = 0, height = 0, fps_n = 0, fps_d = 0;
GstVideoMixerPad *master = NULL;
walk = mix->sinkpads;
@ -264,10 +270,15 @@ static gboolean
gst_videomixer_pad_sink_setcaps (GstPad * pad, GstCaps * vscaps)
{
GstVideoMixer *mix;
GstVideoMixerPad *mixpad;
GstStructure *structure;
gint in_width, in_height;
gboolean ret = FALSE;
const GValue *framerate;
mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
@ -360,6 +371,7 @@ static GType
gst_video_mixer_background_get_type (void)
{
static GType video_mixer_background_type = 0;
static const GEnumValue video_mixer_background[] = {
{VIDEO_MIXER_BACKGROUND_CHECKER, "Checker pattern", "checker"},
{VIDEO_MIXER_BACKGROUND_BLACK, "Black", "black"},
@ -396,6 +408,7 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d",
static void gst_videomixer_finalize (GObject * object);
static GstCaps *gst_videomixer_getcaps (GstPad * pad);
static gboolean gst_videomixer_query (GstPad * pad, GstQuery * query);
static GstFlowReturn gst_videomixer_collected (GstCollectPads * pads,
@ -403,6 +416,7 @@ static GstFlowReturn gst_videomixer_collected (GstCollectPads * pads,
static GstPad *gst_videomixer_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * name);
static void gst_videomixer_release_pad (GstElement * element, GstPad * pad);
static void gst_videomixer_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_videomixer_get_property (GObject * object, guint prop_id,
@ -437,6 +451,7 @@ gst_videomixer_child_proxy_get_child_by_index (GstChildProxy * child_proxy,
guint index)
{
GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy);
GstObject *obj;
GST_VIDEO_MIXER_STATE_LOCK (mix);
@ -450,6 +465,7 @@ static guint
gst_videomixer_child_proxy_get_children_count (GstChildProxy * child_proxy)
{
guint count = 0;
GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy);
GST_VIDEO_MIXER_STATE_LOCK (mix);
@ -486,6 +502,7 @@ static void
gst_videomixer_class_init (GstVideoMixerClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
gobject_class = (GObjectClass *) klass;
@ -595,9 +612,13 @@ static gboolean
gst_videomixer_query_duration (GstVideoMixer * mix, GstQuery * query)
{
gint64 max;
gboolean res;
GstFormat format;
GstIterator *it;
gboolean done;
/* parse format */
@ -611,6 +632,7 @@ gst_videomixer_query_duration (GstVideoMixer * mix, GstQuery * query)
it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix));
while (!done) {
GstIteratorResult ires;
gpointer item;
ires = gst_iterator_next (it, &item);
@ -621,6 +643,7 @@ gst_videomixer_query_duration (GstVideoMixer * mix, GstQuery * query)
case GST_ITERATOR_OK:
{
GstPad *pad = GST_PAD_CAST (item);
gint64 duration;
/* ask sink peer for duration */
@ -636,6 +659,7 @@ gst_videomixer_query_duration (GstVideoMixer * mix, GstQuery * query)
else if (duration > max)
max = duration;
}
gst_object_unref (pad);
break;
}
case GST_ITERATOR_RESYNC:
@ -665,9 +689,13 @@ static gboolean
gst_videomixer_query_latency (GstVideoMixer * mix, GstQuery * query)
{
GstClockTime min, max;
gboolean live;
gboolean res;
GstIterator *it;
gboolean done;
res = TRUE;
@ -681,6 +709,7 @@ gst_videomixer_query_latency (GstVideoMixer * mix, GstQuery * query)
it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix));
while (!done) {
GstIteratorResult ires;
gpointer item;
ires = gst_iterator_next (it, &item);
@ -691,8 +720,11 @@ gst_videomixer_query_latency (GstVideoMixer * mix, GstQuery * query)
case GST_ITERATOR_OK:
{
GstPad *pad = GST_PAD_CAST (item);
GstQuery *peerquery;
GstClockTime min_cur, max_cur;
gboolean live_cur;
peerquery = gst_query_new_latency ();
@ -716,6 +748,7 @@ gst_videomixer_query_latency (GstVideoMixer * mix, GstQuery * query)
}
gst_query_unref (peerquery);
gst_object_unref (pad);
break;
}
case GST_ITERATOR_RESYNC:
@ -748,6 +781,7 @@ static gboolean
gst_videomixer_query (GstPad * pad, GstQuery * query)
{
GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
gboolean res = FALSE;
switch (GST_QUERY_TYPE (query)) {
@ -789,7 +823,9 @@ static GstCaps *
gst_videomixer_getcaps (GstPad * pad)
{
GstVideoMixer *mix;
GstCaps *caps;
GstStructure *structure;
mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
@ -818,7 +854,9 @@ gst_videomixer_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * req_name)
{
GstVideoMixer *mix = NULL;
GstVideoMixerPad *mixpad = NULL;
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
g_return_val_if_fail (templ != NULL, NULL);
@ -834,7 +872,9 @@ gst_videomixer_request_new_pad (GstElement * element,
if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) {
gint serial = 0;
gchar *name = NULL;
GstVideoMixerCollect *mixcol = NULL;
if (req_name == NULL || strlen (req_name) < 6) {
@ -894,6 +934,7 @@ static void
gst_videomixer_release_pad (GstElement * element, GstPad * pad)
{
GstVideoMixer *mix = NULL;
GstVideoMixerPad *mixpad;
mix = GST_VIDEO_MIXER (element);
@ -1076,9 +1117,13 @@ gst_videomixer_blend_ayuv_ayuv (guint8 * src, gint xpos, gint ypos,
guint8 * dest, gint dest_width, gint dest_height)
{
gint alpha, b_alpha;
gint i, j;
gint src_stride, dest_stride;
gint src_add, dest_add;
gint Y, U, V;
src_stride = src_width * 4;
@ -1184,6 +1229,7 @@ static gboolean
gst_videomixer_fill_queues (GstVideoMixer * mix)
{
GSList *walk = NULL;
gboolean eos = TRUE;
g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), FALSE);
@ -1192,7 +1238,9 @@ gst_videomixer_fill_queues (GstVideoMixer * mix)
walk = mix->collect->data;
while (walk) {
GstCollectData *data = (GstCollectData *) walk->data;
GstVideoMixerCollect *mixcol = (GstVideoMixerCollect *) data;
GstVideoMixerPad *mixpad = mixcol->mixpad;
walk = g_slist_next (walk);
@ -1229,6 +1277,7 @@ gst_videomixer_fill_queues (GstVideoMixer * mix)
}
if (mix->sendseg && (mixpad == mix->master)) {
GstEvent *event;
GstSegment *segment = &data->segment;
/* FIXME, use rate/applied_rate as set on all sinkpads.
@ -1269,6 +1318,7 @@ gst_videomixer_blend_buffers (GstVideoMixer * mix, GstBuffer * outbuf)
walk = mix->sinkpads;
while (walk) { /* We walk with this list because it's ordered */
GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data);
GstVideoMixerCollect *mixcol = pad->mixcol;
walk = g_slist_next (walk);
@ -1299,6 +1349,7 @@ static void
gst_videomixer_update_queues (GstVideoMixer * mix)
{
GSList *walk;
guint64 interval;
interval = mix->master->queued;
@ -1313,6 +1364,7 @@ gst_videomixer_update_queues (GstVideoMixer * mix)
walk = mix->sinkpads;
while (walk) {
GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data);
GstVideoMixerCollect *mixcol = pad->mixcol;
walk = g_slist_next (walk);
@ -1333,8 +1385,11 @@ static GstFlowReturn
gst_videomixer_collected (GstCollectPads * pads, GstVideoMixer * mix)
{
GstFlowReturn ret = GST_FLOW_OK;
GstBuffer *outbuf = NULL;
size_t outsize = 0;
gboolean eos = FALSE;
g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), GST_FLOW_ERROR);
@ -1445,6 +1500,7 @@ static gboolean
forward_event (GstVideoMixer * mix, GstEvent * event)
{
gboolean ret;
GstIterator *it;
GValue vret = { 0 };
@ -1470,6 +1526,7 @@ static gboolean
gst_videomixer_src_event (GstPad * pad, GstEvent * event)
{
GstVideoMixer *mix;
gboolean result;
mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
@ -1482,7 +1539,9 @@ gst_videomixer_src_event (GstPad * pad, GstEvent * event)
case GST_EVENT_SEEK:
{
GstSeekFlags flags;
GstSeekType curtype;
gint64 cur;
/* parse the seek parameters */
@ -1530,6 +1589,7 @@ static gboolean
gst_videomixer_sink_event (GstPad * pad, GstEvent * event)
{
GstVideoMixer *videomixer;
gboolean ret;
videomixer = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
@ -1595,6 +1655,7 @@ static GstStateChangeReturn
gst_videomixer_change_state (GstElement * element, GstStateChange transition)
{
GstVideoMixer *mix;
GstStateChangeReturn ret;
g_return_val_if_fail (GST_IS_VIDEO_MIXER (element), GST_STATE_CHANGE_FAILURE);