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