/* FILL ME */
};
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
static void gst_tcpclientsink_base_init (gpointer g_class);
static void gst_tcpclientsink_class_init (GstTCPClientSink * klass);
static void gst_tcpclientsink_init (GstTCPClientSink * tcpclientsink);
};
tcpclientsink_type =
- g_type_register_static (GST_TYPE_ELEMENT, "GstTCPClientSink",
+ g_type_register_static (GST_TYPE_BASE_SINK, "GstTCPClientSink",
&tcpclientsink_info, 0);
}
return tcpclientsink_type;
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sinktemplate));
+
gst_element_class_set_details (element_class, &gst_tcpclientsink_details);
}
/* control stuff stolen from fdsrc */
#define CONTROL_STOP 'S' /* stop the select call */
-#define CONTROL_SOCKETS(src) src->control_fds
-#define WRITE_SOCKET(src) src->control_fds[1]
-#define READ_SOCKET(src) src->control_fds[0]
+#define CONTROL_SOCKETS(o) o->control_fds
+#define WRITE_SOCKET(o) o->control_fds[1]
+#define READ_SOCKET(o) o->control_fds[0]
-#define SEND_COMMAND(src, command) \
+#define SEND_COMMAND(o, command) \
G_STMT_START { \
unsigned char c; c = command; \
- write (WRITE_SOCKET(src), &c, 1); \
+ write (WRITE_SOCKET(o), &c, 1); \
} G_STMT_END
-#define READ_COMMAND(src, command, res) \
+#define READ_COMMAND(o, command, res) \
G_STMT_START { \
- res = read(READ_SOCKET(src), &command, 1); \
+ res = read(READ_SOCKET(o), &command, 1); \
} G_STMT_END
#include "gsttcpserversrc.h"
#include <unistd.h>
#include <sys/ioctl.h>
+#include <fcntl.h>
+
+
+/* control stuff stolen from fdsrc */
+#define CONTROL_STOP 'S' /* stop the select call */
+#define CONTROL_SOCKETS(o) o->control_fds
+#define WRITE_SOCKET(o) o->control_fds[1]
+#define READ_SOCKET(o) o->control_fds[0]
+
+#define SEND_COMMAND(o, command) \
+G_STMT_START { \
+ unsigned char c; c = command; \
+ write (WRITE_SOCKET(o), &c, 1); \
+} G_STMT_END
+
+#define READ_COMMAND(o, command, res) \
+G_STMT_START { \
+ res = read(READ_SOCKET(o), &command, 1); \
+} G_STMT_END
GST_DEBUG_CATEGORY (tcpserversrc_debug);
static gboolean gst_tcpserversrc_start (GstBaseSrc * bsrc);
static gboolean gst_tcpserversrc_stop (GstBaseSrc * bsrc);
+static gboolean gst_tcpserversrc_unlock (GstBaseSrc * bsrc);
static GstFlowReturn gst_tcpserversrc_create (GstPushSrc * psrc,
GstBuffer ** buf);
gstbasesrc_class->start = gst_tcpserversrc_start;
gstbasesrc_class->stop = gst_tcpserversrc_stop;
+ gstbasesrc_class->unlock = gst_tcpserversrc_unlock;
gstpush_src_class->create = gst_tcpserversrc_create;
src->curoffset = 0;
src->protocol = GST_TCP_PROTOCOL_NONE;
+ READ_SOCKET (src) = -1;
+ WRITE_SOCKET (src) = -1;
+
GST_FLAG_UNSET (src, GST_TCPSERVERSRC_OPEN);
}
switch (src->protocol) {
case GST_TCP_PROTOCOL_NONE:
- ret = gst_tcp_read_buffer (GST_ELEMENT (src), src->client_sock_fd, -1,
- outbuf);
+ ret = gst_tcp_read_buffer (GST_ELEMENT (src), src->client_sock_fd,
+ READ_SOCKET (src), outbuf);
break;
case GST_TCP_PROTOCOL_GDP:
GstCaps *caps;
gchar *string;
- ret = gst_tcp_gdp_read_caps (GST_ELEMENT (src), src->client_sock_fd, -1,
- &caps);
+ ret = gst_tcp_gdp_read_caps (GST_ELEMENT (src), src->client_sock_fd,
+ READ_SOCKET (src), &caps);
if (ret != GST_FLOW_OK)
goto gdp_caps_read_error;
gst_pad_set_caps (GST_BASE_SRC_PAD (psrc), caps);
}
- ret = gst_tcp_gdp_read_buffer (GST_ELEMENT (src), src->client_sock_fd, -1,
- outbuf);
+ ret = gst_tcp_gdp_read_buffer (GST_ELEMENT (src), src->client_sock_fd,
+ READ_SOCKET (src), outbuf);
if (ret == GST_FLOW_OK)
gst_buffer_set_caps (*outbuf, GST_PAD_CAPS (GST_BASE_SRC_PAD (src)));
int ret;
GstTCPServerSrc *src = GST_TCPSERVERSRC (bsrc);
+ /* create the control sockets before anything */
+ if (socketpair (PF_UNIX, SOCK_STREAM, 0, CONTROL_SOCKETS (src)) < 0)
+ goto socket_pair;
+
+ fcntl (READ_SOCKET (src), F_SETFL, O_NONBLOCK);
+ fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK);
+
/* reset caps_received flag */
src->caps_received = FALSE;
return TRUE;
/* ERRORS */
+socket_pair:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
socket_error:
{
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM);
}
GST_FLAG_UNSET (src, GST_TCPSERVERSRC_OPEN);
+ close (READ_SOCKET (src));
+ close (WRITE_SOCKET (src));
+ READ_SOCKET (src) = -1;
+ WRITE_SOCKET (src) = -1;
+
+ return TRUE;
+}
+
+/* will be called only between calls to start() and stop() */
+static gboolean
+gst_tcpserversrc_unlock (GstBaseSrc * bsrc)
+{
+ GstTCPServerSrc *src = GST_TCPSERVERSRC (bsrc);
+
+ SEND_COMMAND (src, CONTROL_STOP);
+
return TRUE;
}