1From 84fd8c8948c03f2f28215b31b925cdcaad79c686 Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Mon, 29 Nov 2021 14:49:25 +0800 4Subject: [PATCH 2/4] HACK: gstpad: Add 1 sec timeout for activation 5 6When using ghost pad, changing the activation mode might cause 7recursive waiting and hang the pipeline. 8 9It's hard to fix it without bring in new issues, let's just add a 10timeout as a workaround. 11 12Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 13--- 14 gst/gstpad.c | 22 ++++++++++++++++++++++ 15 1 file changed, 22 insertions(+) 16 17diff --git a/gst/gstpad.c b/gst/gstpad.c 18index db98933..2982d10 100644 19--- a/gst/gstpad.c 20+++ b/gst/gstpad.c 21@@ -969,6 +969,18 @@ gst_pad_mode_get_name (GstPadMode mode) 22 return "unknown"; 23 } 24 25+static inline void 26+wait_activation_locked (GstPad * pad) 27+{ 28+ /* HACK: 1 sec timeout for activation */ 29+ for (gint i = 0; i < 1000; i++) { 30+ if (G_LIKELY (!pad->priv->in_activation)) 31+ break; 32+ 33+ g_usleep(1000); 34+ } 35+} 36+ 37 /* Returns TRUE if pad wasn't already in the new_mode */ 38 static gboolean 39 pre_activate (GstPad * pad, GstPadMode new_mode) 40@@ -976,8 +988,13 @@ pre_activate (GstPad * pad, GstPadMode new_mode) 41 switch (new_mode) { 42 case GST_PAD_MODE_NONE: 43 GST_OBJECT_LOCK (pad); 44+#if 0 45 while (G_UNLIKELY (pad->priv->in_activation)) 46 g_cond_wait (&pad->priv->activation_cond, GST_OBJECT_GET_LOCK (pad)); 47+#else 48+ if (G_UNLIKELY (pad->priv->in_activation)) 49+ wait_activation_locked (pad); 50+#endif 51 if (new_mode == GST_PAD_MODE (pad)) { 52 GST_WARNING_OBJECT (pad, 53 "Pad is already in the process of being deactivated"); 54@@ -996,8 +1013,13 @@ pre_activate (GstPad * pad, GstPadMode new_mode) 55 case GST_PAD_MODE_PUSH: 56 case GST_PAD_MODE_PULL: 57 GST_OBJECT_LOCK (pad); 58+#if 0 59 while (G_UNLIKELY (pad->priv->in_activation)) 60 g_cond_wait (&pad->priv->activation_cond, GST_OBJECT_GET_LOCK (pad)); 61+#else 62+ if (G_UNLIKELY (pad->priv->in_activation)) 63+ wait_activation_locked (pad); 64+#endif 65 if (new_mode == GST_PAD_MODE (pad)) { 66 GST_WARNING_OBJECT (pad, 67 "Pad is already in the process of being activated"); 68-- 692.20.1 70 71