[Nice] [nice/master] Gstreamer element using mainloop

Youness Alaoui youness.alaoui at collabora.co.uk
Wed Nov 5 14:00:58 PST 2008


darcs-hash:20080422163806-4f0f6-347a05842219dbf47903a1813c3a46df01a6b4af.gz
---
 gst/gstnicesrc.c |   64 ++++++++++++++++++++++++++++++++++++++++-------------
 gst/gstnicesrc.h |    4 +++
 2 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/gst/gstnicesrc.c b/gst/gstnicesrc.c
index ada4deb..930b075 100644
--- a/gst/gstnicesrc.c
+++ b/gst/gstnicesrc.c
@@ -161,8 +161,34 @@ gst_nice_src_init (GstNiceSrc *src, GstNiceSrcClass *g_class)
   gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
   gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
   gst_base_src_set_do_timestamp (GST_BASE_SRC (src), TRUE);
+  src->agent = NULL;
+  src->stream_id = 0;
+  src->component_id = 0;
+  src->mainloop = g_main_loop_new (g_main_context_new (), FALSE);
 }
 
+static void
+gst_nice_src_read_callback (NiceAgent *agent,
+    guint stream_id,
+    guint component_id,
+    guint len,
+    gchar *buf,
+    gpointer data)
+{
+  GstBaseSrc *basesrc = GST_BASE_SRC (data);
+  GstNiceSrc *nicesrc = GST_NICE_SRC (basesrc);
+
+  nicesrc->flow_ret = gst_pad_alloc_buffer (basesrc->srcpad, nicesrc->offset,
+      len, GST_PAD_CAPS (basesrc->srcpad), &nicesrc->outbuf);
+  if (nicesrc->flow_ret == GST_FLOW_OK) {
+    memcpy (nicesrc->outbuf->data, buf, len);
+    nicesrc->outbuf->size = len;
+  }
+
+  g_main_loop_quit (nicesrc->mainloop);
+}
+
+
 static GstFlowReturn
 gst_nice_src_create (
   GstBaseSrc *basesrc,
@@ -170,24 +196,20 @@ gst_nice_src_create (
   guint length,
   GstBuffer **buffer)
 {
-  GstFlowReturn res;
-  GstBuffer *buf;
   GstNiceSrc *nicesrc;
-  guint len;
 
   nicesrc = GST_NICE_SRC (basesrc);
-  res = gst_pad_alloc_buffer (basesrc->srcpad, offset, BUFFER_SIZE, GST_PAD_CAPS
-      (basesrc->srcpad), &buf);
-
-  if (res != GST_FLOW_OK)
-    return res;
-
-  len = nice_agent_recv (nicesrc->agent, nicesrc->stream_id,
-      nicesrc->component_id, BUFFER_SIZE, (gchar *) buf->data);
-  g_assert (len);
-  buf->size = len;
-  *buffer = buf;
-  return GST_FLOW_OK;
+
+  nicesrc->outbuf = NULL;
+  nicesrc->offset = offset;
+
+  g_main_loop_run (nicesrc->mainloop);
+
+  if (nicesrc->outbuf) {
+    *buffer = nicesrc->outbuf;
+  }
+
+  return nicesrc->flow_ret;
 }
 
 static void
@@ -274,12 +296,22 @@ gst_nice_src_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_NULL_TO_READY:
-      if (src->agent == NULL)
+      if (src->agent == NULL || src->stream_id == 0 || src->component_id == 0)
         {
           GST_ERROR_OBJECT (element,
               "Trying to start Nice source without an agent set");
           return GST_STATE_CHANGE_FAILURE;
         }
+      else
+        {
+          nice_agent_attach_recv (src->agent, src->stream_id, src->component_id,
+              g_main_loop_get_context (src->mainloop),
+              gst_nice_src_read_callback, (gpointer) src);
+        }
+      break;
+    case GST_STATE_CHANGE_READY_TO_NULL:
+      nice_agent_attach_recv (src->agent, src->stream_id, src->component_id,
+          g_main_loop_get_context (src->mainloop), NULL, NULL);
       break;
     default:
       break;
diff --git a/gst/gstnicesrc.h b/gst/gstnicesrc.h
index 61b04cf..6452f52 100644
--- a/gst/gstnicesrc.h
+++ b/gst/gstnicesrc.h
@@ -65,6 +65,10 @@ struct _GstNiceSrc
   NiceAgent *agent;
   guint stream_id;
   guint component_id;
+  GMainLoop *mainloop;
+  guint64 offset;
+  GstFlowReturn flow_ret;
+  GstBuffer *outbuf;
 };
 
 typedef struct _GstNiceSrcClass GstNiceSrcClass;
-- 
1.5.6.5




More information about the Nice mailing list