diff --git a/src/Makefile.am b/src/Makefile.am
index b2de3e48f..468bd05f4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -194,6 +194,7 @@ libpulsevideocore_@PV_MAJORMINOR@_la_SOURCES = \
server/pv-client.c server/pv-client.h \
server/pv-daemon.c server/pv-daemon.h \
server/pv-source.c server/pv-source.h \
+ server/pv-client-source.c server/pv-client-source.h \
server/pv-source-output.c server/pv-source-output.h \
modules/v4l2/pv-v4l2-source.c
@@ -210,7 +211,11 @@ plugindir = $(libdir)/gstreamer-1.0
plugin_LTLIBRARIES = libgstpulsevideosrc.la
libgstpulsevideosrc_la_SOURCES = \
- gst/gstpvsrc.c
+ gst/gstpv.c \
+ gst/gstfdpay.c \
+ gst/gstfddepay.c \
+ gst/gstpvsrc.c \
+ gst/gstpvsink.c
libgstpulsevideosrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GLIB_CFLAGS)
libgstpulsevideosrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
@@ -218,7 +223,7 @@ libgstpulsevideosrc_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GLIB_LIBS) $(LIB
libpulsevideo-@PV_MAJORMINOR@.la libpulsevideocore-@PV_MAJORMINOR@.la
libgstpulsevideosrc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = gst/gstpvsrc.h
+noinst_HEADERS = gst/gstpvsrc.h gst/gstpvsink.h gst/gstfdpay.h gst/gstfddepay.h
###################################
# Some minor stuff #
diff --git a/src/client/pulsevideo.c b/src/client/pulsevideo.c
index 3ef738a00..9ce56141c 100644
--- a/src/client/pulsevideo.c
+++ b/src/client/pulsevideo.c
@@ -34,7 +34,4 @@ void
pv_init (int *argc, char **argv[])
{
gst_init (argc, argv);
-
- gst_element_register (NULL, "pvfdpay", GST_RANK_NONE, GST_TYPE_FDPAY);
- gst_element_register (NULL, "pvfddepay", GST_RANK_NONE, GST_TYPE_FDDEPAY);
}
diff --git a/src/client/pv-stream.c b/src/client/pv-stream.c
index 2493944be..f3b05b8ca 100644
--- a/src/client/pv-stream.c
+++ b/src/client/pv-stream.c
@@ -417,7 +417,7 @@ do_connect_capture (PvStream *stream)
g_dbus_proxy_call (context->priv->client,
"CreateSourceOutput",
- g_variant_new ("(o@a{sv})",
+ g_variant_new ("(o@a{sv})",
(priv->target ? priv->target : "/"),
priv->spec),
G_DBUS_CALL_FLAGS_NONE,
@@ -434,6 +434,7 @@ do_connect_capture (PvStream *stream)
* @stream: a #PvStream
* @source: the source name to connect to
* @flags: a #PvStreamFlags
+ * @spec: a #GVariant
*
* Connect @stream for capturing from @source.
*
@@ -465,6 +466,61 @@ pv_stream_connect_capture (PvStream *stream,
return TRUE;
}
+static gboolean
+do_connect_provide (PvStream *stream)
+{
+ PvStreamPrivate *priv = stream->priv;
+ PvContext *context = priv->context;
+
+ g_assert (g_main_context_get_thread_default () == priv->context->priv->context);
+
+ g_dbus_proxy_call (context->priv->client,
+ "CreateSourceInput",
+ g_variant_new ("(@a{sv})",
+ priv->spec),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, /* GCancellable *cancellable */
+ on_source_output_created,
+ stream);
+
+ return FALSE;
+}
+
+/**
+ * pv_stream_connect_provide:
+ * @stream: a #PvStream
+ * @flags: a #PvStreamFlags
+ * @spec: a #GVariant
+ *
+ * Connect @stream for providing data for a new source.
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+pv_stream_connect_provide (PvStream *stream,
+ PvStreamFlags flags,
+ GVariant *spec)
+{
+ PvStreamPrivate *priv;
+ PvContext *context;
+
+ g_return_val_if_fail (PV_IS_STREAM (stream), FALSE);
+ g_return_val_if_fail (spec != NULL, FALSE);
+
+ priv = stream->priv;
+ context = priv->context;
+ g_return_val_if_fail (pv_context_get_state (context) == PV_CONTEXT_STATE_READY, FALSE);
+
+ priv->spec = spec;
+
+ stream_set_state (stream, PV_STREAM_STATE_CONNECTING);
+
+ g_main_context_invoke (context->priv->context, (GSourceFunc) do_connect_provide, stream);
+
+ return TRUE;
+}
+
static void
on_source_output_removed (GObject *source_object,
GAsyncResult *res,
@@ -861,3 +917,28 @@ pv_stream_capture_buffer (PvStream *stream, PvBufferInfo *info)
return TRUE;
}
+
+/**
+ * pv_stream_provide_buffer:
+ * @stream: a #PvStream
+ * @info: a #PvBufferInfo
+ *
+ * Provide the next buffer from @stream. This function should be called every
+ * time a new frame becomes available.
+ *
+ * Returns: %TRUE when @info was handled
+ */
+gboolean
+pv_stream_provide_buffer (PvStream *stream, PvBufferInfo *info)
+{
+ PvStreamPrivate *priv;
+
+ g_return_val_if_fail (PV_IS_STREAM (stream), FALSE);
+ g_return_val_if_fail (info != NULL, FALSE);
+
+ priv = stream->priv;
+ g_return_val_if_fail (priv->state == PV_STREAM_STATE_STREAMING, FALSE);
+
+ return TRUE;
+}
+
diff --git a/src/dbus/org.pulsevideo.xml b/src/dbus/org.pulsevideo.xml
index faeaa68c2..afad6b5f9 100644
--- a/src/dbus/org.pulsevideo.xml
+++ b/src/dbus/org.pulsevideo.xml
@@ -63,6 +63,17 @@
+
+
+
+
+