[gst-plugins-farsight/master] Add proper locking to mimdec

Olivier Crete olivier.crete at collabora.co.uk
Tue Mar 3 10:53:13 PST 2009


20080704220243-3e2dc-71c157d82999dfb41bd62b4064b1887ab22e84c1.gz
---
 ext/mimic/gstmimdec.c |    9 +++++++++
 ext/mimic/gstmimdec.h |    3 +++
 2 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c
index fa70af7..eeb9562 100644
--- a/ext/mimic/gstmimdec.c
+++ b/ext/mimic/gstmimdec.c
@@ -164,6 +164,8 @@ gst_mimdec_chain (GstPad *pad, GstBuffer *in)
   buf = GST_BUFFER (in);
   gst_adapter_push (mimdec->adapter, buf);
 
+  GST_OBJECT_LOCK (mimdec);
+
   if (!GST_CLOCK_TIME_IS_VALID (mimdec->gst_timestamp))
     mimdec->gst_timestamp = GST_BUFFER_TIMESTAMP (in);
 
@@ -245,7 +247,9 @@ gst_mimdec_chain (GstPad *pad, GstBuffer *in)
 
       event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME,
           0, -1, 0);
+      GST_OBJECT_UNLOCK (mimdec);
       result = gst_pad_push_event (mimdec->srcpad, event);
+      GST_OBJECT_LOCK (mimdec);
       if (!result)
       {
         GST_WARNING_OBJECT (mimdec, "gst_pad_push_event failed");
@@ -298,13 +302,16 @@ gst_mimdec_chain (GstPad *pad, GstBuffer *in)
         "height", G_TYPE_INT, height, NULL);
     gst_buffer_set_caps (out_buf, caps);
     gst_caps_unref (caps);
+    GST_OBJECT_UNLOCK (mimdec);
     res = gst_pad_push (mimdec->srcpad, out_buf);
+    GST_OBJECT_LOCK (mimdec);
 
     gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
     mimdec->have_header = FALSE;
   }
 
  out:
+  GST_OBJECT_UNLOCK (mimdec);
   gst_object_unref (mimdec);
 
   return res;
@@ -319,6 +326,7 @@ gst_mimdec_change_state (GstElement *element, GstStateChange transition)
     case GST_STATE_CHANGE_READY_TO_NULL:
       mimdec = GST_MIMDEC (element);
       if (mimdec->dec != NULL) {
+        GST_OBJECT_LOCK (element);
         mimic_close (mimdec->dec);
         mimdec->dec = NULL;
         mimdec->buffer_size = -1;
@@ -327,6 +335,7 @@ gst_mimdec_change_state (GstElement *element, GstStateChange transition)
         mimdec->gst_timestamp = GST_CLOCK_TIME_NONE;
         mimdec->current_ts = -1;
         mimdec->last_ts = -1;
+        GST_OBJECT_UNLOCK (element);
       }
       break;
     default:
diff --git a/ext/mimic/gstmimdec.h b/ext/mimic/gstmimdec.h
index c9b7799..2cc4a48 100644
--- a/ext/mimic/gstmimdec.h
+++ b/ext/mimic/gstmimdec.h
@@ -48,8 +48,11 @@ struct _GstMimDec
   GstElement element;
 
   GstPad *sinkpad, *srcpad;
+
+  /* Protected by stream lock */
   GstAdapter *adapter;
 
+  /* Protected by object lock */
   MimCtx *dec;
 
   gint buffer_size;
-- 
1.5.6.5




More information about the farsight-commits mailing list