diff options
author | Youness Alaoui <kakaroto@kakaroto.(none)> | 2008-11-03 17:18:08 -0500 |
---|---|---|
committer | Youness Alaoui <kakaroto@kakaroto.(none)> | 2008-11-03 17:18:08 -0500 |
commit | 73c5a0b3b6391f5c2fb6e71563e55b0f2d3528c6 (patch) | |
tree | 244131fb5bfad462280d4e5e1b3339d496cc16c4 /gst | |
parent | ddb6df15cb7c4eaae80edf6eded9fa9a01b00f90 (diff) | |
parent | cbe7189aaa53093a593e5b07cc8de5050e95ee98 (diff) | |
download | libnice-73c5a0b3b6391f5c2fb6e71563e55b0f2d3528c6.tar.gz |
Merge commit 'tester/src-netbuffer' into nice-kakaroto
Diffstat (limited to 'gst')
-rw-r--r-- | gst/gstnicesrc.c | 104 | ||||
-rw-r--r-- | gst/gstnicesrc.h | 18 |
2 files changed, 108 insertions, 14 deletions
diff --git a/gst/gstnicesrc.c b/gst/gstnicesrc.c index e83eade..3c55114 100644 --- a/gst/gstnicesrc.c +++ b/gst/gstnicesrc.c @@ -195,15 +195,21 @@ gst_nice_src_read_callback (NiceAgent *agent, { GstBaseSrc *basesrc = GST_BASE_SRC (data); GstNiceSrc *nicesrc = GST_NICE_SRC (basesrc); + GstNetBuffer *mybuf; GST_LOG_OBJECT (agent, "Got buffer, getting out of the main loop"); - 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; - } + mybuf = gst_netbuffer_new (); + GST_BUFFER_MALLOCDATA (mybuf) = g_memdup (buf, len); + GST_BUFFER_SIZE (mybuf) = len; + GST_BUFFER_DATA (mybuf) = GST_BUFFER_MALLOCDATA (mybuf); + if (GST_PAD_CAPS (basesrc->srcpad)) + GST_BUFFER_CAPS (mybuf) = gst_caps_ref (GST_PAD_CAPS (basesrc->srcpad)); + + mybuf->from = nicesrc->from; + mybuf->to = nicesrc->to; + + nicesrc->outbuf = GST_BUFFER_CAST (mybuf); g_main_loop_quit (nicesrc->mainloop); } @@ -215,8 +221,10 @@ gst_nice_src_unlock_idler (gpointer data) g_main_loop_quit (nicesrc->mainloop); + GST_OBJECT_LOCK (nicesrc); g_source_unref (nicesrc->idle_source); nicesrc->idle_source = NULL; + GST_OBJECT_UNLOCK (nicesrc); return FALSE; } @@ -267,7 +275,6 @@ gst_nice_src_create ( GST_LOG_OBJECT (nicesrc, "create called"); nicesrc->outbuf = NULL; - nicesrc->offset = offset; GST_OBJECT_LOCK (basesrc); if (nicesrc->unlocked) { @@ -282,12 +289,13 @@ gst_nice_src_create ( GST_LOG_OBJECT (nicesrc, "Got buffer, pushing"); *buffer = nicesrc->outbuf; - return nicesrc->flow_ret; + GST_BUFFER_OFFSET (*buffer) = offset; + + return GST_FLOW_OK; } else { GST_LOG_OBJECT (nicesrc, "Got interrupting, returning wrong-state"); return GST_FLOW_WRONG_STATE; } - } static void @@ -295,6 +303,10 @@ gst_nice_src_dispose (GObject *object) { GstNiceSrc *src = GST_NICE_SRC (object); + if (src->new_selected_pair_id) + g_signal_handler_disconnect (src->agent, src->new_selected_pair_id); + src->new_selected_pair_id = 0; + if (src->agent) g_object_unref (src->agent); src->agent = NULL; @@ -368,6 +380,69 @@ gst_nice_src_get_property ( } } +static void +nice_address_to_gst_net_address (NiceAddress *niceaddr, GstNetAddress *gstaddr) +{ + switch (niceaddr->s.addr.sa_family) + { + case AF_INET: + gst_netaddress_set_ip4_address (gstaddr, + niceaddr->s.ip4.sin_addr.s_addr, + niceaddr->s.ip4.sin_port); + break; + case AF_INET6: + gst_netaddress_set_ip6_address (gstaddr, + niceaddr->s.ip6.sin6_addr.s6_addr, + niceaddr->s.ip6.sin6_port); + break; + default: + break; + } +} + +static void +new_selected_pair_cb (NiceAgent *agent, guint stream_id, guint component_id, + gchar *local_cand, gchar *remote_cand, GstNiceSrc *src) +{ + GST_OBJECT_LOCK (src); + + if (stream_id == src->stream_id && component_id == src->component_id) + { + GSList *local_candidates = nice_agent_get_local_candidates ( + src->agent, stream_id, component_id); + GSList *remote_candidates = nice_agent_get_remote_candidates ( + src->agent, stream_id, component_id); + GSList *item = NULL; + + for (item = local_candidates; item; item = g_slist_next (item)) + { + NiceCandidate *cand = item->data; + if (!strcmp (local_cand, cand->foundation)) + { + nice_address_to_gst_net_address (&cand->addr, &src->to); + break; + } + } + + for (item = remote_candidates; item; item = g_slist_next (item)) + { + NiceCandidate *cand = item->data; + if (!strcmp (remote_cand, cand->foundation)) + { + nice_address_to_gst_net_address (&cand->addr, &src->from); + break; + } + } + + g_slist_foreach (local_candidates, (GFunc) nice_candidate_free, NULL); + g_slist_free (local_candidates); + g_slist_foreach (remote_candidates, (GFunc) nice_candidate_free, NULL); + g_slist_free (remote_candidates); + } + + GST_OBJECT_UNLOCK (src); +} + static GstStateChangeReturn gst_nice_src_change_state (GstElement * element, GstStateChange transition) { @@ -386,14 +461,25 @@ gst_nice_src_change_state (GstElement * element, GstStateChange transition) } else { + GST_OBJECT_LOCK (src); 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); + + if (!src->new_selected_pair_id) + src->new_selected_pair_id = g_signal_connect (src->agent, + "new-selected-pair", G_CALLBACK (new_selected_pair_cb), src); + GST_OBJECT_UNLOCK (src); } break; case GST_STATE_CHANGE_READY_TO_NULL: + GST_OBJECT_LOCK (src); nice_agent_attach_recv (src->agent, src->stream_id, src->component_id, g_main_loop_get_context (src->mainloop), NULL, NULL); + if (src->new_selected_pair_id) + g_signal_handler_disconnect (src->agent, src->new_selected_pair_id); + src->new_selected_pair_id = 0; + GST_OBJECT_UNLOCK (src); break; default: break; diff --git a/gst/gstnicesrc.h b/gst/gstnicesrc.h index 96e8f2a..960328d 100644 --- a/gst/gstnicesrc.h +++ b/gst/gstnicesrc.h @@ -40,6 +40,7 @@ #include <gst/gst.h> #include <gst/base/gstbasesrc.h> +#include <gst/netbuffer/gstnetbuffer.h> #include <nice/nice.h> @@ -62,15 +63,22 @@ struct _GstNiceSrc { GstBaseSrc parent; GstPad *srcpad; + GMainLoop *mainloop; + + /* Protected by the object lock */ + gboolean unlocked; + GSource *idle_source; NiceAgent *agent; guint stream_id; guint component_id; - GMainLoop *mainloop; - guint64 offset; - GstFlowReturn flow_ret; + + /* Protected by the stream lock */ GstBuffer *outbuf; - gboolean unlocked; - GSource *idle_source; + + /* Protected by the object lock */ + gulong new_selected_pair_id; + GstNetAddress from; + GstNetAddress to; }; typedef struct _GstNiceSrcClass GstNiceSrcClass; |