summaryrefslogtreecommitdiffstats
path: root/gst/udp/gstudpsrc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/udp/gstudpsrc.c')
-rw-r--r--gst/udp/gstudpsrc.c341
1 files changed, 176 insertions, 165 deletions
diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c
index 66bcd268..48e00862 100644
--- a/gst/udp/gstudpsrc.c
+++ b/gst/udp/gstudpsrc.c
@@ -29,30 +29,32 @@
#define UDP_DEFAULT_MULTICAST_GROUP "0.0.0.0"
/* elementfactory information */
-static GstElementDetails gst_udpsrc_details = GST_ELEMENT_DETAILS (
- "UDP packet receiver",
- "Source/Network",
- "Receive data over the network via UDP",
- "Wim Taymans <wim.taymans@chello.be>"
-);
+static GstElementDetails gst_udpsrc_details =
+GST_ELEMENT_DETAILS ("UDP packet receiver",
+ "Source/Network",
+ "Receive data over the network via UDP",
+ "Wim Taymans <wim.taymans@chello.be>");
/* UDPSrc signals and args */
-enum {
+enum
+{
/* FILL ME */
LAST_SIGNAL
};
-enum {
+enum
+{
ARG_0,
ARG_PORT,
ARG_CONTROL,
ARG_MULTICAST_GROUP
- /* FILL ME */
+ /* FILL ME */
};
#define GST_TYPE_UDPSRC_CONTROL (gst_udpsrc_control_get_type())
static GType
-gst_udpsrc_control_get_type(void) {
+gst_udpsrc_control_get_type (void)
+{
static GType udpsrc_control_type = 0;
static GEnumValue udpsrc_control[] = {
{CONTROL_NONE, "1", "none"},
@@ -61,26 +63,27 @@ gst_udpsrc_control_get_type(void) {
{CONTROL_ZERO, NULL, NULL},
};
if (!udpsrc_control_type) {
- udpsrc_control_type = g_enum_register_static("GstUDPSrcControl", udpsrc_control);
+ udpsrc_control_type =
+ g_enum_register_static ("GstUDPSrcControl", udpsrc_control);
}
return udpsrc_control_type;
}
-static void gst_udpsrc_base_init (gpointer g_class);
-static void gst_udpsrc_class_init (GstUDPSrc *klass);
-static void gst_udpsrc_init (GstUDPSrc *udpsrc);
+static void gst_udpsrc_base_init (gpointer g_class);
+static void gst_udpsrc_class_init (GstUDPSrc * klass);
+static void gst_udpsrc_init (GstUDPSrc * udpsrc);
-static GstData* gst_udpsrc_get (GstPad *pad);
-static GstElementStateReturn
- gst_udpsrc_change_state (GstElement *element);
+static GstData *gst_udpsrc_get (GstPad * pad);
+static GstElementStateReturn gst_udpsrc_change_state (GstElement * element);
-static void gst_udpsrc_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec);
-static void gst_udpsrc_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec);
-static void gst_udpsrc_set_clock (GstElement *element, GstClock *clock);
+static void gst_udpsrc_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_udpsrc_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_udpsrc_set_clock (GstElement * element, GstClock * clock);
static GstElementClass *parent_class = NULL;
+
/*static guint gst_udpsrc_signals[LAST_SIGNAL] = { 0 }; */
GType
@@ -90,18 +93,19 @@ gst_udpsrc_get_type (void)
if (!udpsrc_type) {
static const GTypeInfo udpsrc_info = {
- sizeof(GstUDPSrcClass),
+ sizeof (GstUDPSrcClass),
gst_udpsrc_base_init,
NULL,
- (GClassInitFunc)gst_udpsrc_class_init,
+ (GClassInitFunc) gst_udpsrc_class_init,
NULL,
NULL,
- sizeof(GstUDPSrc),
+ sizeof (GstUDPSrc),
0,
- (GInstanceInitFunc)gst_udpsrc_init,
+ (GInstanceInitFunc) gst_udpsrc_init,
NULL
};
- udpsrc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstUDPSrc", &udpsrc_info, 0);
+ udpsrc_type =
+ g_type_register_static (GST_TYPE_ELEMENT, "GstUDPSrc", &udpsrc_info, 0);
}
return udpsrc_type;
}
@@ -115,26 +119,26 @@ gst_udpsrc_base_init (gpointer g_class)
}
static void
-gst_udpsrc_class_init (GstUDPSrc *klass)
+gst_udpsrc_class_init (GstUDPSrc * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
- gobject_class = (GObjectClass*) klass;
- gstelement_class = (GstElementClass*) klass;
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PORT,
- g_param_spec_int ("port", "port", "The port to receive the packets from",
- 0, 32768, UDP_DEFAULT_PORT, G_PARAM_READWRITE));
+ g_param_spec_int ("port", "port", "The port to receive the packets from",
+ 0, 32768, UDP_DEFAULT_PORT, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, ARG_CONTROL,
- g_param_spec_enum ("control", "control", "The type of control",
- GST_TYPE_UDPSRC_CONTROL, CONTROL_UDP, G_PARAM_READWRITE));
+ g_param_spec_enum ("control", "control", "The type of control",
+ GST_TYPE_UDPSRC_CONTROL, CONTROL_UDP, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, ARG_MULTICAST_GROUP,
- g_param_spec_string ("multicast_group", "multicast_group",
- "The Address of multicast group to join",
- UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE));
+ g_param_spec_string ("multicast_group", "multicast_group",
+ "The Address of multicast group to join",
+ UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE));
gobject_class->set_property = gst_udpsrc_set_property;
gobject_class->get_property = gst_udpsrc_get_property;
@@ -144,17 +148,17 @@ gst_udpsrc_class_init (GstUDPSrc *klass)
}
static void
-gst_udpsrc_set_clock (GstElement *element, GstClock *clock)
+gst_udpsrc_set_clock (GstElement * element, GstClock * clock)
{
GstUDPSrc *udpsrc;
-
+
udpsrc = GST_UDPSRC (element);
udpsrc->clock = clock;
}
static void
-gst_udpsrc_init (GstUDPSrc *udpsrc)
+gst_udpsrc_init (GstUDPSrc * udpsrc)
{
/* create the src and src pads */
udpsrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
@@ -171,8 +175,8 @@ gst_udpsrc_init (GstUDPSrc *udpsrc)
udpsrc->first_buf = TRUE;
}
-static GstData*
-gst_udpsrc_get (GstPad *pad)
+static GstData *
+gst_udpsrc_get (GstPad * pad)
{
GstUDPSrc *udpsrc;
GstBuffer *outbuf;
@@ -190,13 +194,13 @@ gst_udpsrc_get (GstPad *pad)
FD_ZERO (&read_fds);
FD_SET (udpsrc->sock, &read_fds);
if (udpsrc->control != CONTROL_NONE) {
- FD_SET (udpsrc->control_sock, &read_fds);
+ FD_SET (udpsrc->control_sock, &read_fds);
}
- max_sock = MAX(udpsrc->sock, udpsrc->control_sock);
+ max_sock = MAX (udpsrc->sock, udpsrc->control_sock);
- if (select (max_sock+1, &read_fds, NULL, NULL, NULL) > 0) {
+ if (select (max_sock + 1, &read_fds, NULL, NULL, NULL) > 0) {
if ((udpsrc->control_sock != -1) &&
- FD_ISSET (udpsrc->control_sock, &read_fds)) {
+ FD_ISSET (udpsrc->control_sock, &read_fds)) {
#ifndef GST_DISABLE_LOADSAVE
guchar *buf;
int ret;
@@ -205,94 +209,94 @@ gst_udpsrc_get (GstPad *pad)
xmlDocPtr doc;
GstCaps *caps;
- buf = g_malloc (1024*10);
+ buf = g_malloc (1024 * 10);
switch (udpsrc->control) {
- case CONTROL_TCP:
- len = sizeof (struct sockaddr);
- fdread = accept (udpsrc->control_sock, &addr, &len);
- if (fdread < 0) {
- perror ("accept");
- }
-
- ret = read (fdread, buf, 1024*10);
- break;
- case CONTROL_UDP:
- len = sizeof (struct sockaddr);
- ret = recvfrom (udpsrc->control_sock, buf, 1024*10, 0, (struct sockaddr *)&tmpaddr, &len);
- if (ret < 0) {
- perror ("recvfrom");
- }
- break;
- case CONTROL_NONE:
+ case CONTROL_TCP:
+ len = sizeof (struct sockaddr);
+ fdread = accept (udpsrc->control_sock, &addr, &len);
+ if (fdread < 0) {
+ perror ("accept");
+ }
+
+ ret = read (fdread, buf, 1024 * 10);
+ break;
+ case CONTROL_UDP:
+ len = sizeof (struct sockaddr);
+ ret =
+ recvfrom (udpsrc->control_sock, buf, 1024 * 10, 0,
+ (struct sockaddr *) &tmpaddr, &len);
+ if (ret < 0) {
+ perror ("recvfrom");
+ }
+ break;
+ case CONTROL_NONE:
default:
- g_free (buf);
- return NULL;
- break;
+ g_free (buf);
+ return NULL;
+ break;
}
buf[ret] = '\0';
- doc = xmlParseMemory(buf, ret);
- caps = gst_caps_load_thyself(doc->xmlRootNode);
+ doc = xmlParseMemory (buf, ret);
+ caps = gst_caps_load_thyself (doc->xmlRootNode);
if (caps == NULL) {
- return NULL;
+ return NULL;
}
-
+
/* foward the connect, we don't signal back the result here... */
if (gst_caps_is_fixed (caps)) {
- gst_pad_try_set_caps (udpsrc->srcpad, caps);
+ gst_pad_try_set_caps (udpsrc->srcpad, caps);
} else {
- GST_ERROR ("caps %" GST_PTR_FORMAT, caps);
- GST_ELEMENT_ERROR (udpsrc, CORE, NEGOTIATION, (NULL), ("Got unfixed caps from peer"));
+ GST_ERROR ("caps %" GST_PTR_FORMAT, caps);
+ GST_ELEMENT_ERROR (udpsrc, CORE, NEGOTIATION, (NULL),
+ ("Got unfixed caps from peer"));
}
#endif
g_free (buf);
outbuf = NULL;
- }
- else {
+ } else {
outbuf = gst_buffer_new ();
GST_BUFFER_DATA (outbuf) = g_malloc (24000);
GST_BUFFER_SIZE (outbuf) = 24000;
if (udpsrc->first_buf) {
- if (udpsrc->clock) {
- GstClockTime current_time;
- GstEvent *discont;
+ if (udpsrc->clock) {
+ GstClockTime current_time;
+ GstEvent *discont;
+
+ current_time = gst_clock_get_time (udpsrc->clock);
- current_time = gst_clock_get_time (udpsrc->clock);
-
- GST_BUFFER_TIMESTAMP (outbuf) = current_time;
+ GST_BUFFER_TIMESTAMP (outbuf) = current_time;
- discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME,
- current_time, NULL);
+ discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME,
+ current_time, NULL);
- gst_pad_push (udpsrc->srcpad, GST_DATA (discont));
+ gst_pad_push (udpsrc->srcpad, GST_DATA (discont));
}
udpsrc->first_buf = FALSE;
}
-
+
else {
- GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
}
len = sizeof (struct sockaddr);
numbytes = recvfrom (udpsrc->sock, GST_BUFFER_DATA (outbuf),
- GST_BUFFER_SIZE (outbuf), 0, (struct sockaddr *)&tmpaddr, &len);
+ GST_BUFFER_SIZE (outbuf), 0, (struct sockaddr *) &tmpaddr, &len);
if (numbytes != -1) {
- GST_BUFFER_SIZE (outbuf) = numbytes;
- }
- else {
+ GST_BUFFER_SIZE (outbuf) = numbytes;
+ } else {
perror ("recvfrom");
- gst_buffer_unref (outbuf);
- outbuf = NULL;
+ gst_buffer_unref (outbuf);
+ outbuf = NULL;
}
-
+
}
- }
- else {
+ } else {
perror ("select");
outbuf = NULL;
}
@@ -301,29 +305,30 @@ gst_udpsrc_get (GstPad *pad)
static void
-gst_udpsrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value,
+ GParamSpec * pspec)
{
GstUDPSrc *udpsrc;
/* it's not null if we got it, but it might not be ours */
- g_return_if_fail(GST_IS_UDPSRC(object));
- udpsrc = GST_UDPSRC(object);
+ g_return_if_fail (GST_IS_UDPSRC (object));
+ udpsrc = GST_UDPSRC (object);
switch (prop_id) {
case ARG_PORT:
- udpsrc->port = g_value_get_int (value);
+ udpsrc->port = g_value_get_int (value);
break;
case ARG_MULTICAST_GROUP:
- g_free(udpsrc->multi_group);
-
+ g_free (udpsrc->multi_group);
+
if (g_value_get_string (value) == NULL)
- udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP);
+ udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP);
else
- udpsrc->multi_group = g_strdup (g_value_get_string (value));
-
+ udpsrc->multi_group = g_strdup (g_value_get_string (value));
+
break;
case ARG_CONTROL:
- udpsrc->control = g_value_get_enum (value);
+ udpsrc->control = g_value_get_enum (value);
break;
default:
break;
@@ -331,13 +336,14 @@ gst_udpsrc_set_property (GObject *object, guint prop_id, const GValue *value, GP
}
static void
-gst_udpsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+gst_udpsrc_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
{
GstUDPSrc *udpsrc;
/* it's not null if we got it, but it might not be ours */
- g_return_if_fail(GST_IS_UDPSRC(object));
- udpsrc = GST_UDPSRC(object);
+ g_return_if_fail (GST_IS_UDPSRC (object));
+ udpsrc = GST_UDPSRC (object);
switch (prop_id) {
case ARG_PORT:
@@ -357,92 +363,98 @@ gst_udpsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSp
/* create a socket for sending to remote machine */
static gboolean
-gst_udpsrc_init_receive (GstUDPSrc *src)
+gst_udpsrc_init_receive (GstUDPSrc * src)
{
guint bc_val;
- gint reuse=1;
+ gint reuse = 1;
+
memset (&src->myaddr, 0, sizeof (src->myaddr));
- src->myaddr.sin_family = AF_INET; /* host byte order */
- src->myaddr.sin_port = htons (src->port); /* short, network byte order */
+ src->myaddr.sin_family = AF_INET; /* host byte order */
+ src->myaddr.sin_port = htons (src->port); /* short, network byte order */
src->myaddr.sin_addr.s_addr = INADDR_ANY;
if ((src->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
- perror("socket");
+ perror ("socket");
return FALSE;
}
-
- if (setsockopt(src->sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) {
- perror("setsockopt");
- return FALSE;
+
+ if (setsockopt (src->sock, SOL_SOCKET, SO_REUSEADDR, &reuse,
+ sizeof (reuse)) == -1) {
+ perror ("setsockopt");
+ return FALSE;
}
- if (bind (src->sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr)) == -1) {
- perror("bind");
+ if (bind (src->sock, (struct sockaddr *) &src->myaddr,
+ sizeof (src->myaddr)) == -1) {
+ perror ("bind");
return FALSE;
}
if (inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) {
if (src->multi_addr.imr_multiaddr.s_addr) {
src->multi_addr.imr_interface.s_addr = INADDR_ANY;
- setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &src->multi_addr, sizeof(src->multi_addr));
+ setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &src->multi_addr,
+ sizeof (src->multi_addr));
}
}
bc_val = 1;
setsockopt (src->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val));
- src->myaddr.sin_port = htons (src->port+1);
-
+ src->myaddr.sin_port = htons (src->port + 1);
+
switch (src->control) {
case CONTROL_TCP:
- if ((src->control_sock = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
- perror("control_socket");
- return FALSE;
- }
-
- if (bind (src->control_sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr)) == -1) {
- perror("control_bind");
- return FALSE;
- }
-
- if (listen (src->control_sock, 5) == -1) {
- perror("listen");
- return FALSE;
- }
-
- fcntl (src->control_sock, F_SETFL, O_NONBLOCK);
-
- break;
+ if ((src->control_sock = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
+ perror ("control_socket");
+ return FALSE;
+ }
+
+ if (bind (src->control_sock, (struct sockaddr *) &src->myaddr,
+ sizeof (src->myaddr)) == -1) {
+ perror ("control_bind");
+ return FALSE;
+ }
+
+ if (listen (src->control_sock, 5) == -1) {
+ perror ("listen");
+ return FALSE;
+ }
+
+ fcntl (src->control_sock, F_SETFL, O_NONBLOCK);
+
+ break;
case CONTROL_UDP:
- if ((src->control_sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
- perror("socket");
- return FALSE;
- }
-
- if (bind (src->control_sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr)) == -1)
- {
- perror("control_bind");
- return FALSE;
- }
- /* We can only do broadcast in udp */
- bc_val = 1;
- setsockopt (src->control_sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val));
- break;
+ if ((src->control_sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
+ perror ("socket");
+ return FALSE;
+ }
+
+ if (bind (src->control_sock, (struct sockaddr *) &src->myaddr,
+ sizeof (src->myaddr)) == -1) {
+ perror ("control_bind");
+ return FALSE;
+ }
+ /* We can only do broadcast in udp */
+ bc_val = 1;
+ setsockopt (src->control_sock, SOL_SOCKET, SO_BROADCAST, &bc_val,
+ sizeof (bc_val));
+ break;
case CONTROL_NONE:
- GST_FLAG_SET (src, GST_UDPSRC_OPEN);
- return TRUE;
- break;
+ GST_FLAG_SET (src, GST_UDPSRC_OPEN);
+ return TRUE;
+ break;
default:
- return FALSE;
- break;
+ return FALSE;
+ break;
}
GST_FLAG_SET (src, GST_UDPSRC_OPEN);
-
+
return TRUE;
}
static void
-gst_udpsrc_close (GstUDPSrc *src)
+gst_udpsrc_close (GstUDPSrc * src)
{
if (src->sock != -1) {
close (src->sock);
@@ -457,7 +469,7 @@ gst_udpsrc_close (GstUDPSrc *src)
}
static GstElementStateReturn
-gst_udpsrc_change_state (GstElement *element)
+gst_udpsrc_change_state (GstElement * element)
{
g_return_val_if_fail (GST_IS_UDPSRC (element), GST_STATE_FAILURE);
@@ -467,7 +479,7 @@ gst_udpsrc_change_state (GstElement *element)
} else {
if (!GST_FLAG_IS_SET (element, GST_UDPSRC_OPEN)) {
if (!gst_udpsrc_init_receive (GST_UDPSRC (element)))
- return GST_STATE_FAILURE;
+ return GST_STATE_FAILURE;
}
}
@@ -476,4 +488,3 @@ gst_udpsrc_change_state (GstElement *element)
return GST_STATE_SUCCESS;
}
-