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 @@ + + + + +