summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorYouness Alaoui <kakaroto@kakaroto.(none)>2008-11-03 17:18:08 -0500
committerYouness Alaoui <kakaroto@kakaroto.(none)>2008-11-03 17:18:08 -0500
commit73c5a0b3b6391f5c2fb6e71563e55b0f2d3528c6 (patch)
tree244131fb5bfad462280d4e5e1b3339d496cc16c4 /gst
parentddb6df15cb7c4eaae80edf6eded9fa9a01b00f90 (diff)
parentcbe7189aaa53093a593e5b07cc8de5050e95ee98 (diff)
downloadlibnice-73c5a0b3b6391f5c2fb6e71563e55b0f2d3528c6.tar.gz
Merge commit 'tester/src-netbuffer' into nice-kakaroto
Diffstat (limited to 'gst')
-rw-r--r--gst/gstnicesrc.c104
-rw-r--r--gst/gstnicesrc.h18
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;