From 55eff822560fc48656ca5bbe591b7edaea4cc537 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 8 Dec 2008 22:28:05 +0000 Subject: [PATCH] plugins/elements/gsttee.c: Check for changed pads-list before checking the last returned Original commit message from CVS: * plugins/elements/gsttee.c: (gst_tee_handle_buffer): Check for changed pads-list before checking the last returned GstFlowReturn because the pad could have been removed and we need to ignore the value in that case. --- ChangeLog | 7 +++++++ plugins/elements/gsttee.c | 20 ++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 14af40758a..b823d837d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-12-08 Wim Taymans + + * plugins/elements/gsttee.c: (gst_tee_handle_buffer): + Check for changed pads-list before checking the last returned + GstFlowReturn because the pad could have been removed and we + need to ignore the value in that case. + 2008-12-08 Wim Taymans * libs/gst/base/gstbasetransform.c: diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c index c160de3366..b22cb185c1 100644 --- a/plugins/elements/gsttee.c +++ b/plugins/elements/gsttee.c @@ -593,6 +593,18 @@ restart: GST_LOG_OBJECT (tee, "pad already pushed with %s", gst_flow_get_name (ret)); } + + /* before we go combining the return value, check if the pad list is still + * the same. It could be possible that the pad we just pushed was removed + * and the return value it not valid anymore */ + if (GST_ELEMENT_CAST (tee)->pads_cookie != cookie) { + GST_LOG_OBJECT (tee, "pad list changed"); + /* the list of pads changed, restart iteration. Pads that we already + * pushed on and are still in the new list, will not be pushed on + * again. */ + goto restart; + } + /* stop pushing more buffers when we have a fatal error */ if (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED) goto error; @@ -602,14 +614,6 @@ restart: GST_LOG_OBJECT (tee, "Replacing ret val %d with %d", cret, ret); cret = ret; } - - if (GST_ELEMENT_CAST (tee)->pads_cookie != cookie) { - GST_LOG_OBJECT (tee, "pad list changed"); - /* the list of pads changed, restart iteration. Pads that we already - * pushed on and are still in the new list, will not be pushed on - * again. */ - goto restart; - } pads = g_list_next (pads); } GST_OBJECT_UNLOCK (tee);