summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-12-22 11:49:21 +0100
committerSebastian Dröge <sebastian@centricular.com>2015-12-22 12:03:26 +0100
commit553c017e6ed62719094a3bf7acdaff76d2bbf179 (patch)
tree1325e72bcf5a8d4dfb8fc2899f97e9445457c755
parentc0ac5f3bb51625eecfd02fae070271d46df057cd (diff)
player: Move video renderer and signal dispatcher code into separate files
-rw-r--r--docs/lib/Makefile.am5
-rw-r--r--lib/gst/player/Makefile.am17
-rw-r--r--lib/gst/player/gstplayer-g-main-context-signal-dispatcher.c199
-rw-r--r--lib/gst/player/gstplayer-g-main-context-signal-dispatcher.h48
-rw-r--r--lib/gst/player/gstplayer-signal-dispatcher-private.h34
-rw-r--r--lib/gst/player/gstplayer-signal-dispatcher.c53
-rw-r--r--lib/gst/player/gstplayer-signal-dispatcher.h51
-rw-r--r--lib/gst/player/gstplayer-types.h35
-rw-r--r--lib/gst/player/gstplayer-video-overlay-video-renderer.c214
-rw-r--r--lib/gst/player/gstplayer-video-overlay-video-renderer.h49
-rw-r--r--lib/gst/player/gstplayer-video-renderer-private.h33
-rw-r--r--lib/gst/player/gstplayer-video-renderer.c45
-rw-r--r--lib/gst/player/gstplayer-video-renderer.h47
-rw-r--r--lib/gst/player/gstplayer.c432
-rw-r--r--lib/gst/player/gstplayer.h75
-rw-r--r--lib/gst/player/player.h2
-rw-r--r--tests/player.c2
17 files changed, 834 insertions, 507 deletions
diff --git a/docs/lib/Makefile.am b/docs/lib/Makefile.am
index 986c63a..45e1795 100644
--- a/docs/lib/Makefile.am
+++ b/docs/lib/Makefile.am
@@ -49,7 +49,10 @@ EXTRA_HFILES=
# Header files or dirs to ignore when scanning. Use base file/dir names
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
-IGNORE_HFILES=gstplayer-media-info-private.h
+IGNORE_HFILES= \
+ gstplayer-signal-dispatcher-private.h \
+ gstplayer-video-renderer-private.h \
+ gstplayer-media-info-private.h
# Images to copy into HTML directory.
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
diff --git a/lib/gst/player/Makefile.am b/lib/gst/player/Makefile.am
index 90ab459..eacab55 100644
--- a/lib/gst/player/Makefile.am
+++ b/lib/gst/player/Makefile.am
@@ -2,7 +2,11 @@ lib_LTLIBRARIES = libgstplayer-@GST_PLAYER_API_VERSION@.la
libgstplayer_@GST_PLAYER_API_VERSION@_la_SOURCES = \
gstplayer.c \
- gstplayer-media-info.c
+ gstplayer-signal-dispatcher.c \
+ gstplayer-video-renderer.c \
+ gstplayer-media-info.c \
+ gstplayer-g-main-context-signal-dispatcher.c \
+ gstplayer-video-overlay-video-renderer.c
libgstplayer_@GST_PLAYER_API_VERSION@_la_CFLAGS = \
-I$(top_srcdir)/lib \
@@ -23,12 +27,19 @@ libgstplayer_@GST_PLAYER_API_VERSION@_la_LIBADD = \
libgstplayerdir = $(includedir)/gst-player-@GST_PLAYER_API_VERSION@/gst/player
-noinst_HEADERS = gstplayer-media-info-private.h
+noinst_HEADERS = \
+ gstplayer-signal-dispatcher-private.h \
+ gstplayer-video-renderer-private.h \
+ gstplayer-media-info-private.h
libgstplayer_HEADERS = \
player.h \
gstplayer.h \
- gstplayer-media-info.h
+ gstplayer-signal-dispatcher.h \
+ gstplayer-video-renderer.h \
+ gstplayer-media-info.h \
+ gstplayer-g-main-context-signal-dispatcher.h \
+ gstplayer-video-overlay-video-renderer.h
CLEANFILES =
diff --git a/lib/gst/player/gstplayer-g-main-context-signal-dispatcher.c b/lib/gst/player/gstplayer-g-main-context-signal-dispatcher.c
new file mode 100644
index 0000000..5253311
--- /dev/null
+++ b/lib/gst/player/gstplayer-g-main-context-signal-dispatcher.c
@@ -0,0 +1,199 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gstplayer-g-main-context-signal-dispatcher.h"
+
+struct _GstPlayerGMainContextSignalDispatcher
+{
+ GObject parent;
+ GMainContext *application_context;
+};
+
+struct _GstPlayerGMainContextSignalDispatcherClass
+{
+ GObjectClass parent_class;
+};
+
+static void
+ gst_player_g_main_context_signal_dispatcher_interface_init
+ (GstPlayerSignalDispatcherInterface * iface);
+
+enum
+{
+ G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_0,
+ G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT,
+ G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST
+};
+
+G_DEFINE_TYPE_WITH_CODE (GstPlayerGMainContextSignalDispatcher,
+ gst_player_g_main_context_signal_dispatcher, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_PLAYER_SIGNAL_DISPATCHER,
+ gst_player_g_main_context_signal_dispatcher_interface_init));
+
+static GParamSpec
+ * g_main_context_signal_dispatcher_param_specs
+ [G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST] = { NULL, };
+
+static void
+gst_player_g_main_context_signal_dispatcher_finalize (GObject * object)
+{
+ GstPlayerGMainContextSignalDispatcher *self =
+ GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
+
+ if (self->application_context)
+ g_main_context_unref (self->application_context);
+
+ G_OBJECT_CLASS
+ (gst_player_g_main_context_signal_dispatcher_parent_class)->finalize
+ (object);
+}
+
+static void
+gst_player_g_main_context_signal_dispatcher_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstPlayerGMainContextSignalDispatcher *self =
+ GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
+
+ switch (prop_id) {
+ case G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT:
+ self->application_context = g_value_dup_boxed (value);
+ if (!self->application_context)
+ self->application_context = g_main_context_ref_thread_default ();
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_player_g_main_context_signal_dispatcher_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstPlayerGMainContextSignalDispatcher *self =
+ GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
+
+ switch (prop_id) {
+ case G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT:
+ g_value_set_boxed (value, self->application_context);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+ gst_player_g_main_context_signal_dispatcher_class_init
+ (GstPlayerGMainContextSignalDispatcherClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->finalize =
+ gst_player_g_main_context_signal_dispatcher_finalize;
+ gobject_class->set_property =
+ gst_player_g_main_context_signal_dispatcher_set_property;
+ gobject_class->get_property =
+ gst_player_g_main_context_signal_dispatcher_get_property;
+
+ g_main_context_signal_dispatcher_param_specs
+ [G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT] =
+ g_param_spec_boxed ("application-context", "Application Context",
+ "Application GMainContext to dispatch signals to", G_TYPE_MAIN_CONTEXT,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (gobject_class,
+ G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST,
+ g_main_context_signal_dispatcher_param_specs);
+}
+
+static void
+ gst_player_g_main_context_signal_dispatcher_init
+ (G_GNUC_UNUSED GstPlayerGMainContextSignalDispatcher * self)
+{
+}
+
+typedef struct
+{
+ void (*emitter) (gpointer data);
+ gpointer data;
+ GDestroyNotify destroy;
+} GMainContextSignalDispatcherData;
+
+static gboolean
+g_main_context_signal_dispatcher_dispatch_gsourcefunc (gpointer user_data)
+{
+ GMainContextSignalDispatcherData *data = user_data;
+
+ data->emitter (data->data);
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+g_main_context_signal_dispatcher_dispatch_destroy (gpointer user_data)
+{
+ GMainContextSignalDispatcherData *data = user_data;
+
+ if (data->destroy)
+ data->destroy (data->data);
+ g_free (data);
+}
+
+static void
+gst_player_g_main_context_signal_dispatcher_dispatch (GstPlayerSignalDispatcher
+ * iface, G_GNUC_UNUSED GstPlayer * player, void (*emitter) (gpointer data),
+ gpointer data, GDestroyNotify destroy)
+{
+ GstPlayerGMainContextSignalDispatcher *self =
+ GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (iface);
+ GMainContextSignalDispatcherData *gsourcefunc_data =
+ g_new (GMainContextSignalDispatcherData, 1);
+
+ gsourcefunc_data->emitter = emitter;
+ gsourcefunc_data->data = data;
+ gsourcefunc_data->destroy = destroy;
+
+ g_main_context_invoke_full (self->application_context,
+ G_PRIORITY_DEFAULT, g_main_context_signal_dispatcher_dispatch_gsourcefunc,
+ gsourcefunc_data, g_main_context_signal_dispatcher_dispatch_destroy);
+}
+
+static void
+ gst_player_g_main_context_signal_dispatcher_interface_init
+ (GstPlayerSignalDispatcherInterface * iface)
+{
+ iface->dispatch = gst_player_g_main_context_signal_dispatcher_dispatch;
+}
+
+/**
+ * gst_player_g_main_context_signal_dispatcher_new:
+ * @application_context: (allow-none): GMainContext to use or %NULL
+ *
+ * Returns: (transfer full):
+ */
+GstPlayerSignalDispatcher *
+gst_player_g_main_context_signal_dispatcher_new (GMainContext *
+ application_context)
+{
+ return g_object_new (GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER,
+ "application-context", application_context, NULL);
+}
diff --git a/lib/gst/player/gstplayer-g-main-context-signal-dispatcher.h b/lib/gst/player/gstplayer-g-main-context-signal-dispatcher.h
new file mode 100644
index 0000000..431032b
--- /dev/null
+++ b/lib/gst/player/gstplayer-g-main-context-signal-dispatcher.h
@@ -0,0 +1,48 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_H__
+#define __GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_H__
+
+#include <gst/player/gstplayer-types.h>
+#include <gst/player/gstplayer-signal-dispatcher.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerGMainContextSignalDispatcher
+ GstPlayerGMainContextSignalDispatcher;
+typedef struct _GstPlayerGMainContextSignalDispatcherClass
+ GstPlayerGMainContextSignalDispatcherClass;
+
+#define GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (gst_player_g_main_context_signal_dispatcher_get_type ())
+#define GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER))
+#define GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcherClass))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcher))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcherClass))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CAST(obj) ((GstPlayerGMainContextSignalDispatcher*)(obj))
+
+GType gst_player_g_main_context_signal_dispatcher_get_type (void);
+
+GstPlayerSignalDispatcher * gst_player_g_main_context_signal_dispatcher_new (GMainContext * application_context);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_H__ */
diff --git a/lib/gst/player/gstplayer-signal-dispatcher-private.h b/lib/gst/player/gstplayer-signal-dispatcher-private.h
new file mode 100644
index 0000000..e09563c
--- /dev/null
+++ b/lib/gst/player/gstplayer-signal-dispatcher-private.h
@@ -0,0 +1,34 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_PLAYER_SIGNAL_DISPATCHER_PRIVATE_H__
+#define __GST_PLAYER_SIGNAL_DISPATCHER_PRIVATE_H__
+
+#include <gst/player/gstplayer-signal-dispatcher.h>
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL void gst_player_signal_dispatcher_dispatch (GstPlayerSignalDispatcher * self,
+ GstPlayer * player, void (*emitter) (gpointer data), gpointer data,
+ GDestroyNotify destroy);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_SIGNAL_DISPATCHER_PRIVATE_H__ */
diff --git a/lib/gst/player/gstplayer-signal-dispatcher.c b/lib/gst/player/gstplayer-signal-dispatcher.c
new file mode 100644
index 0000000..1b47a2a
--- /dev/null
+++ b/lib/gst/player/gstplayer-signal-dispatcher.c
@@ -0,0 +1,53 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gstplayer-signal-dispatcher.h"
+#include "gstplayer-signal-dispatcher-private.h"
+
+G_DEFINE_INTERFACE (GstPlayerSignalDispatcher, gst_player_signal_dispatcher,
+ G_TYPE_OBJECT);
+
+static void
+gst_player_signal_dispatcher_default_init (G_GNUC_UNUSED
+ GstPlayerSignalDispatcherInterface * iface)
+{
+
+}
+
+void
+gst_player_signal_dispatcher_dispatch (GstPlayerSignalDispatcher * self,
+ GstPlayer * player, void (*emitter) (gpointer data), gpointer data,
+ GDestroyNotify destroy)
+{
+ GstPlayerSignalDispatcherInterface *iface;
+
+ if (!self) {
+ emitter (data);
+ if (destroy)
+ destroy (data);
+ return;
+ }
+
+ g_return_if_fail (GST_IS_PLAYER_SIGNAL_DISPATCHER (self));
+ iface = GST_PLAYER_SIGNAL_DISPATCHER_GET_INTERFACE (self);
+ g_return_if_fail (iface->dispatch != NULL);
+
+ iface->dispatch (self, player, emitter, data, destroy);
+}
diff --git a/lib/gst/player/gstplayer-signal-dispatcher.h b/lib/gst/player/gstplayer-signal-dispatcher.h
new file mode 100644
index 0000000..31b8aad
--- /dev/null
+++ b/lib/gst/player/gstplayer-signal-dispatcher.h
@@ -0,0 +1,51 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_PLAYER_SIGNAL_DISPATCHER_H__
+#define __GST_PLAYER_SIGNAL_DISPATCHER_H__
+
+#include <gst/gst.h>
+#include <gst/player/gstplayer-types.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerSignalDispatcher GstPlayerSignalDispatcher;
+typedef struct _GstPlayerSignalDispatcherInterface GstPlayerSignalDispatcherInterface;
+
+#define GST_TYPE_PLAYER_SIGNAL_DISPATCHER (gst_player_signal_dispatcher_get_type ())
+#define GST_PLAYER_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_SIGNAL_DISPATCHER, GstPlayerSignalDispatcher))
+#define GST_IS_PLAYER_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_SIGNAL_DISPATCHER))
+#define GST_PLAYER_SIGNAL_DISPATCHER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PLAYER_SIGNAL_DISPATCHER, GstPlayerSignalDispatcherInterface))
+
+struct _GstPlayerSignalDispatcherInterface {
+ GTypeInterface parent_iface;
+
+ void (*dispatch) (GstPlayerSignalDispatcher * self,
+ GstPlayer * player,
+ void (*emitter) (gpointer data),
+ gpointer data,
+ GDestroyNotify destroy);
+};
+
+GType gst_player_signal_dispatcher_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_SIGNAL_DISPATCHER_H__ */
diff --git a/lib/gst/player/gstplayer-types.h b/lib/gst/player/gstplayer-types.h
new file mode 100644
index 0000000..f6627e6
--- /dev/null
+++ b/lib/gst/player/gstplayer-types.h
@@ -0,0 +1,35 @@
+/* GStreamer
+ *
+ * Copyright (C) 2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_PLAYER_TYPES_H__
+#define __GST_PLAYER_TYPES_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayer GstPlayer;
+typedef struct _GstPlayerClass GstPlayerClass;
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_TYPES_H__ */
+
+
diff --git a/lib/gst/player/gstplayer-video-overlay-video-renderer.c b/lib/gst/player/gstplayer-video-overlay-video-renderer.c
new file mode 100644
index 0000000..b5dc1a9
--- /dev/null
+++ b/lib/gst/player/gstplayer-video-overlay-video-renderer.c
@@ -0,0 +1,214 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gstplayer-video-overlay-video-renderer.h"
+#include "gstplayer.h"
+
+#include <gst/video/video.h>
+
+struct _GstPlayerVideoOverlayVideoRenderer
+{
+ GObject parent;
+
+ GstVideoOverlay *video_overlay;
+ gpointer window_handle;
+};
+
+struct _GstPlayerVideoOverlayVideoRendererClass
+{
+ GObjectClass parent_class;
+};
+
+static void
+ gst_player_video_overlay_video_renderer_interface_init
+ (GstPlayerVideoRendererInterface * iface);
+
+enum
+{
+ VIDEO_OVERLAY_VIDEO_RENDERER_PROP_0,
+ VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE,
+ VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST
+};
+
+G_DEFINE_TYPE_WITH_CODE (GstPlayerVideoOverlayVideoRenderer,
+ gst_player_video_overlay_video_renderer, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_PLAYER_VIDEO_RENDERER,
+ gst_player_video_overlay_video_renderer_interface_init));
+
+static GParamSpec
+ * video_overlay_video_renderer_param_specs
+ [VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST] = { NULL, };
+
+static void
+gst_player_video_overlay_video_renderer_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstPlayerVideoOverlayVideoRenderer *self =
+ GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
+
+ switch (prop_id) {
+ case VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE:
+ self->window_handle = g_value_get_pointer (value);
+ if (self->video_overlay)
+ gst_video_overlay_set_window_handle (self->video_overlay,
+ (guintptr) self->window_handle);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_player_video_overlay_video_renderer_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstPlayerVideoOverlayVideoRenderer *self =
+ GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
+
+ switch (prop_id) {
+ case VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE:
+ g_value_set_pointer (value, self->window_handle);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_player_video_overlay_video_renderer_finalize (GObject * object)
+{
+ GstPlayerVideoOverlayVideoRenderer *self =
+ GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
+
+ if (self->video_overlay)
+ gst_object_unref (self->video_overlay);
+
+ G_OBJECT_CLASS
+ (gst_player_video_overlay_video_renderer_parent_class)->finalize (object);
+}
+
+static void
+ gst_player_video_overlay_video_renderer_class_init
+ (GstPlayerVideoOverlayVideoRendererClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property =
+ gst_player_video_overlay_video_renderer_set_property;
+ gobject_class->get_property =
+ gst_player_video_overlay_video_renderer_get_property;
+ gobject_class->finalize = gst_player_video_overlay_video_renderer_finalize;
+
+ video_overlay_video_renderer_param_specs
+ [VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE] =
+ g_param_spec_pointer ("window-handle", "Window Handle",
+ "Window handle to embed the video into",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (gobject_class,
+ VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST,
+ video_overlay_video_renderer_param_specs);
+}
+
+static void
+ gst_player_video_overlay_video_renderer_init
+ (G_GNUC_UNUSED GstPlayerVideoOverlayVideoRenderer * self)
+{
+}
+
+static GstElement *gst_player_video_overlay_video_renderer_create_video_sink
+ (GstPlayerVideoRenderer * iface, GstPlayer * player)
+{
+ GstElement *video_overlay;
+ GstPlayerVideoOverlayVideoRenderer *self =
+ GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (iface);
+
+ if (self->video_overlay)
+ gst_object_unref (self->video_overlay);
+
+ video_overlay = gst_player_get_pipeline (player);
+ g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (video_overlay), NULL);
+
+ self->video_overlay = GST_VIDEO_OVERLAY (video_overlay);
+
+ gst_video_overlay_set_window_handle (self->video_overlay,
+ (guintptr) self->window_handle);
+
+ return NULL;
+}
+
+static void
+ gst_player_video_overlay_video_renderer_interface_init
+ (GstPlayerVideoRendererInterface * iface)
+{
+ iface->create_video_sink =
+ gst_player_video_overlay_video_renderer_create_video_sink;
+}
+
+/**
+ * gst_player_video_overlay_video_renderer_new:
+ * @window_handle: (allow-none): Window handle to use or %NULL
+ *
+ * Returns: (transfer full):
+ */
+GstPlayerVideoRenderer *
+gst_player_video_overlay_video_renderer_new (gpointer window_handle)
+{
+ return g_object_new (GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER,
+ "window-handle", window_handle, NULL);
+}
+
+/**
+ * gst_player_video_overlay_video_renderer_set_window_handle:
+ * @self: #GstPlayerVideoRenderer instance
+ * @window_handle: handle referencing to the platform specific window
+ *
+ * Sets the platform specific window handle into which the video
+ * should be rendered
+ **/
+void gst_player_video_overlay_video_renderer_set_window_handle
+ (GstPlayerVideoOverlayVideoRenderer * self, gpointer window_handle)
+{
+ g_return_if_fail (GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (self));
+
+ g_object_set (self, "window-handle", window_handle, NULL);
+}
+
+/**
+ * gst_player_video_overlay_video_renderer_get_window_handle:
+ * @self: #GstPlayerVideoRenderer instance
+ *
+ * Returns: (transfer none): The currently set, platform specific window
+ * handle
+ */
+gpointer
+ gst_player_video_overlay_video_renderer_get_window_handle
+ (GstPlayerVideoOverlayVideoRenderer * self) {
+ gpointer window_handle;
+
+ g_return_val_if_fail (GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (self),
+ NULL);
+
+ g_object_get (self, "window-handle", &window_handle, NULL);
+
+ return window_handle;
+}
diff --git a/lib/gst/player/gstplayer-video-overlay-video-renderer.h b/lib/gst/player/gstplayer-video-overlay-video-renderer.h
new file mode 100644
index 0000000..72a420b
--- /dev/null
+++ b/lib/gst/player/gstplayer-video-overlay-video-renderer.h
@@ -0,0 +1,49 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_H__
+#define __GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_H__
+
+#include <gst/player/gstplayer-types.h>
+#include <gst/player/gstplayer-video-renderer.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerVideoOverlayVideoRenderer
+ GstPlayerVideoOverlayVideoRenderer;
+typedef struct _GstPlayerVideoOverlayVideoRendererClass
+ GstPlayerVideoOverlayVideoRendererClass;
+
+#define GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (gst_player_video_overlay_video_renderer_get_type ())
+#define GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER))
+#define GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRendererClass))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRenderer))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRendererClass))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CAST(obj) ((GstPlayerVideoOverlayVideoRenderer*)(obj))
+
+GType gst_player_video_overlay_video_renderer_get_type (void);
+GstPlayerVideoRenderer * gst_player_video_overlay_video_renderer_new (gpointer window_handle);
+void gst_player_video_overlay_video_renderer_set_window_handle (GstPlayerVideoOverlayVideoRenderer * self, gpointer window_handle);
+gpointer gst_player_video_overlay_video_renderer_get_window_handle (GstPlayerVideoOverlayVideoRenderer * self);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_H__ */
diff --git a/lib/gst/player/gstplayer-video-renderer-private.h b/lib/gst/player/gstplayer-video-renderer-private.h
new file mode 100644
index 0000000..6ecab15
--- /dev/null
+++ b/lib/gst/player/gstplayer-video-renderer-private.h
@@ -0,0 +1,33 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_PLAYER_VIDEO_RENDERER_PRIVATE_H__
+#define __GST_PLAYER_VIDEO_RENDERER_PRIVATE_H__
+
+#include <gst/player/gstplayer-video-renderer.h>
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL GstElement * gst_player_video_renderer_create_video_sink (GstPlayerVideoRenderer *
+ self, GstPlayer * player);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_VIDEO_RENDERER_PRIVATE_H__ */
diff --git a/lib/gst/player/gstplayer-video-renderer.c b/lib/gst/player/gstplayer-video-renderer.c
new file mode 100644
index 0000000..f2c442e
--- /dev/null
+++ b/lib/gst/player/gstplayer-video-renderer.c
@@ -0,0 +1,45 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gstplayer-video-renderer.h"
+#include "gstplayer-video-renderer-private.h"
+
+G_DEFINE_INTERFACE (GstPlayerVideoRenderer, gst_player_video_renderer,
+ G_TYPE_OBJECT);
+
+static void
+gst_player_video_renderer_default_init (G_GNUC_UNUSED
+ GstPlayerVideoRendererInterface * iface)
+{
+
+}
+
+GstElement *
+gst_player_video_renderer_create_video_sink (GstPlayerVideoRenderer * self,
+ GstPlayer * player)
+{
+ GstPlayerVideoRendererInterface *iface;
+
+ g_return_val_if_fail (GST_IS_PLAYER_VIDEO_RENDERER (self), NULL);
+ iface = GST_PLAYER_VIDEO_RENDERER_GET_INTERFACE (self);
+ g_return_val_if_fail (iface->create_video_sink != NULL, NULL);
+
+ return iface->create_video_sink (self, player);
+}
diff --git a/lib/gst/player/gstplayer-video-renderer.h b/lib/gst/player/gstplayer-video-renderer.h
new file mode 100644
index 0000000..b9df5c9
--- /dev/null
+++ b/lib/gst/player/gstplayer-video-renderer.h
@@ -0,0 +1,47 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_PLAYER_VIDEO_RENDERER_H__
+#define __GST_PLAYER_VIDEO_RENDERER_H__
+
+#include <gst/gst.h>
+#include <gst/player/gstplayer-types.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerVideoRenderer GstPlayerVideoRenderer;
+typedef struct _GstPlayerVideoRendererInterface GstPlayerVideoRendererInterface;
+
+#define GST_TYPE_PLAYER_VIDEO_RENDERER (gst_player_video_renderer_get_type ())
+#define GST_PLAYER_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_VIDEO_RENDERER, GstPlayerVideoRenderer))
+#define GST_IS_PLAYER_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_VIDEO_RENDERER))
+#define GST_PLAYER_VIDEO_RENDERER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PLAYER_VIDEO_RENDERER, GstPlayerVideoRendererInterface))
+
+struct _GstPlayerVideoRendererInterface {
+ GTypeInterface parent_iface;
+
+ GstElement * (*create_video_sink) (GstPlayerVideoRenderer * self, GstPlayer * player);
+};
+
+GType gst_player_video_renderer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_VIDEO_RENDERER_H__ */
diff --git a/lib/gst/player/gstplayer.c b/lib/gst/player/gstplayer.c
index aa266e3..ef816cb 100644
--- a/lib/gst/player/gstplayer.c
+++ b/lib/gst/player/gstplayer.c
@@ -39,6 +39,8 @@
*/
#include "gstplayer.h"
+#include "gstplayer-signal-dispatcher-private.h"
+#include "gstplayer-video-renderer-private.h"
#include "gstplayer-media-info-private.h"
#include <gst/gst.h>
@@ -162,14 +164,6 @@ struct _GstPlayerClass
GstObjectClass parent_class;
};
-static GstElement
- * gst_player_video_renderer_create_video_sink (GstPlayerVideoRenderer *
- self, GstPlayer * player);
-
-static void gst_player_signal_dispatcher_dispatch (GstPlayerSignalDispatcher *
- self, GstPlayer * player, void (*emitter) (gpointer data), gpointer data,
- GDestroyNotify destroy);
-
static GMutex vis_lock;
static GQueue vis_list = G_QUEUE_INIT;
static guint32 vis_cookie;
@@ -3946,425 +3940,3 @@ gst_player_error_get_name (GstPlayerError error)
g_assert_not_reached ();
return NULL;
}
-
-G_DEFINE_INTERFACE (GstPlayerSignalDispatcher, gst_player_signal_dispatcher,
- G_TYPE_OBJECT);
-
-static void
-gst_player_signal_dispatcher_default_init (G_GNUC_UNUSED
- GstPlayerSignalDispatcherInterface * iface)
-{
-
-}
-
-static void
-gst_player_signal_dispatcher_dispatch (GstPlayerSignalDispatcher * self,
- GstPlayer * player, void (*emitter) (gpointer data), gpointer data,
- GDestroyNotify destroy)
-{
- GstPlayerSignalDispatcherInterface *iface;
-
- if (!self) {
- emitter (data);
- if (destroy)
- destroy (data);
- return;
- }
-
- g_return_if_fail (GST_IS_PLAYER_SIGNAL_DISPATCHER (self));
- iface = GST_PLAYER_SIGNAL_DISPATCHER_GET_INTERFACE (self);
- g_return_if_fail (iface->dispatch != NULL);
-
- iface->dispatch (self, player, emitter, data, destroy);
-}
-
-struct _GstPlayerGMainContextSignalDispatcher
-{
- GObject parent;
- GMainContext *application_context;
-};
-
-struct _GstPlayerGMainContextSignalDispatcherClass
-{
- GObjectClass parent_class;
-};
-
-static void
- gst_player_g_main_context_signal_dispatcher_interface_init
- (GstPlayerSignalDispatcherInterface * iface);
-
-enum
-{
- G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_0,
- G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT,
- G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST
-};
-
-G_DEFINE_TYPE_WITH_CODE (GstPlayerGMainContextSignalDispatcher,
- gst_player_g_main_context_signal_dispatcher, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (GST_TYPE_PLAYER_SIGNAL_DISPATCHER,
- gst_player_g_main_context_signal_dispatcher_interface_init));
-
-static GParamSpec
- * g_main_context_signal_dispatcher_param_specs
- [G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST] = { NULL, };
-
-static void
-gst_player_g_main_context_signal_dispatcher_finalize (GObject * object)
-{
- GstPlayerGMainContextSignalDispatcher *self =
- GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
-
- if (self->application_context)
- g_main_context_unref (self->application_context);
-
- G_OBJECT_CLASS
- (gst_player_g_main_context_signal_dispatcher_parent_class)->finalize
- (object);
-}
-
-static void
-gst_player_g_main_context_signal_dispatcher_set_property (GObject * object,
- guint prop_id, const GValue * value, GParamSpec * pspec)
-{
- GstPlayerGMainContextSignalDispatcher *self =
- GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
-
- switch (prop_id) {
- case G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT:
- self->application_context = g_value_dup_boxed (value);
- if (!self->application_context)
- self->application_context = g_main_context_ref_thread_default ();
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_player_g_main_context_signal_dispatcher_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec)
-{
- GstPlayerGMainContextSignalDispatcher *self =
- GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
-
- switch (prop_id) {
- case G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT:
- g_value_set_boxed (value, self->application_context);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
- gst_player_g_main_context_signal_dispatcher_class_init
- (GstPlayerGMainContextSignalDispatcherClass * klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->finalize =
- gst_player_g_main_context_signal_dispatcher_finalize;
- gobject_class->set_property =
- gst_player_g_main_context_signal_dispatcher_set_property;
- gobject_class->get_property =
- gst_player_g_main_context_signal_dispatcher_get_property;
-
- g_main_context_signal_dispatcher_param_specs
- [G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT] =
- g_param_spec_boxed ("application-context", "Application Context",
- "Application GMainContext to dispatch signals to", G_TYPE_MAIN_CONTEXT,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
-
- g_object_class_install_properties (gobject_class,
- G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST,
- g_main_context_signal_dispatcher_param_specs);
-}
-
-static void
- gst_player_g_main_context_signal_dispatcher_init
- (G_GNUC_UNUSED GstPlayerGMainContextSignalDispatcher * self)
-{
-}
-
-typedef struct
-{
- void (*emitter) (gpointer data);
- gpointer data;
- GDestroyNotify destroy;
-} GMainContextSignalDispatcherData;
-
-static gboolean
-g_main_context_signal_dispatcher_dispatch_gsourcefunc (gpointer user_data)
-{
- GMainContextSignalDispatcherData *data = user_data;
-
- data->emitter (data->data);
-
- return G_SOURCE_REMOVE;
-}
-
-static void
-g_main_context_signal_dispatcher_dispatch_destroy (gpointer user_data)
-{
- GMainContextSignalDispatcherData *data = user_data;
-
- if (data->destroy)
- data->destroy (data->data);
- g_free (data);
-}
-
-static void
-gst_player_g_main_context_signal_dispatcher_dispatch (GstPlayerSignalDispatcher
- * iface, G_GNUC_UNUSED GstPlayer * player, void (*emitter) (gpointer data),
- gpointer data, GDestroyNotify destroy)
-{
- GstPlayerGMainContextSignalDispatcher *self =
- GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (iface);
- GMainContextSignalDispatcherData *gsourcefunc_data =
- g_new (GMainContextSignalDispatcherData, 1);
-
- gsourcefunc_data->emitter = emitter;
- gsourcefunc_data->data = data;
- gsourcefunc_data->destroy = destroy;
-
- g_main_context_invoke_full (self->application_context,
- G_PRIORITY_DEFAULT, g_main_context_signal_dispatcher_dispatch_gsourcefunc,
- gsourcefunc_data, g_main_context_signal_dispatcher_dispatch_destroy);
-}
-
-static void
- gst_player_g_main_context_signal_dispatcher_interface_init
- (GstPlayerSignalDispatcherInterface * iface)
-{
- iface->dispatch = gst_player_g_main_context_signal_dispatcher_dispatch;
-}
-
-/**
- * gst_player_g_main_context_signal_dispatcher_new:
- * @application_context: (allow-none): GMainContext to use or %NULL
- *
- * Returns: (transfer full):
- */
-GstPlayerSignalDispatcher *
-gst_player_g_main_context_signal_dispatcher_new (GMainContext *
- application_context)
-{
- return g_object_new (GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER,
- "application-context", application_context, NULL);
-}
-
-G_DEFINE_INTERFACE (GstPlayerVideoRenderer, gst_player_video_renderer,
- G_TYPE_OBJECT);
-
-static void
-gst_player_video_renderer_default_init (G_GNUC_UNUSED
- GstPlayerVideoRendererInterface * iface)
-{
-
-}
-
-static GstElement *
-gst_player_video_renderer_create_video_sink (GstPlayerVideoRenderer * self,
- GstPlayer * player)
-{
- GstPlayerVideoRendererInterface *iface;
-
- g_return_val_if_fail (GST_IS_PLAYER_VIDEO_RENDERER (self), NULL);
- iface = GST_PLAYER_VIDEO_RENDERER_GET_INTERFACE (self);
- g_return_val_if_fail (iface->create_video_sink != NULL, NULL);
-
- return iface->create_video_sink (self, player);
-}
-
-struct _GstPlayerVideoOverlayVideoRenderer
-{
- GObject parent;
-
- GstVideoOverlay *video_overlay;
- gpointer window_handle;
-};
-
-struct _GstPlayerVideoOverlayVideoRendererClass
-{
- GObjectClass parent_class;
-};
-
-static void
- gst_player_video_overlay_video_renderer_interface_init
- (GstPlayerVideoRendererInterface * iface);
-
-enum
-{
- VIDEO_OVERLAY_VIDEO_RENDERER_PROP_0,
- VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE,
- VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST
-};
-
-G_DEFINE_TYPE_WITH_CODE (GstPlayerVideoOverlayVideoRenderer,
- gst_player_video_overlay_video_renderer, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (GST_TYPE_PLAYER_VIDEO_RENDERER,
- gst_player_video_overlay_video_renderer_interface_init));
-
-static GParamSpec
- * video_overlay_video_renderer_param_specs
- [VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST] = { NULL, };
-
-static void
-gst_player_video_overlay_video_renderer_set_property (GObject * object,
- guint prop_id, const GValue * value, GParamSpec * pspec)
-{
- GstPlayerVideoOverlayVideoRenderer *self =
- GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
-
- switch (prop_id) {
- case VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE:
- self->window_handle = g_value_get_pointer (value);
- if (self->video_overlay)
- gst_video_overlay_set_window_handle (self->video_overlay,
- (guintptr) self->window_handle);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_player_video_overlay_video_renderer_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec)
-{
- GstPlayerVideoOverlayVideoRenderer *self =
- GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
-
- switch (prop_id) {
- case VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE:
- g_value_set_pointer (value, self->window_handle);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_player_video_overlay_video_renderer_finalize (GObject * object)
-{
- GstPlayerVideoOverlayVideoRenderer *self =
- GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
-
- if (self->video_overlay)
- gst_object_unref (self->video_overlay);
-
- G_OBJECT_CLASS
- (gst_player_video_overlay_video_renderer_parent_class)->finalize (object);
-}
-
-static void
- gst_player_video_overlay_video_renderer_class_init
- (GstPlayerVideoOverlayVideoRendererClass * klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->set_property =
- gst_player_video_overlay_video_renderer_set_property;
- gobject_class->get_property =
- gst_player_video_overlay_video_renderer_get_property;
- gobject_class->finalize = gst_player_video_overlay_video_renderer_finalize;
-
- video_overlay_video_renderer_param_specs
- [VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE] =
- g_param_spec_pointer ("window-handle", "Window Handle",
- "Window handle to embed the video into",
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
-
- g_object_class_install_properties (gobject_class,
- VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST,
- video_overlay_video_renderer_param_specs);
-}
-
-static void
- gst_player_video_overlay_video_renderer_init
- (G_GNUC_UNUSED GstPlayerVideoOverlayVideoRenderer * self)
-{
-}
-
-static GstElement *gst_player_video_overlay_video_renderer_create_video_sink
- (GstPlayerVideoRenderer * iface, GstPlayer * player)
-{
- GstElement *video_overlay;
- GstPlayerVideoOverlayVideoRenderer *self =
- GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (iface);
-
- if (self->video_overlay)
- gst_object_unref (self->video_overlay);
-
- video_overlay = gst_player_get_pipeline (player);
- g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (video_overlay), NULL);
-
- self->video_overlay = GST_VIDEO_OVERLAY (video_overlay);
-
- gst_video_overlay_set_window_handle (self->video_overlay,
- (guintptr) self->window_handle);
-
- return NULL;
-}
-
-static void
- gst_player_video_overlay_video_renderer_interface_init
- (GstPlayerVideoRendererInterface * iface)
-{
- iface->create_video_sink =
- gst_player_video_overlay_video_renderer_create_video_sink;
-}
-
-/**
- * gst_player_video_overlay_video_renderer_new:
- * @window_handle: (allow-none): Window handle to use or %NULL
- *
- * Returns: (transfer full):
- */
-GstPlayerVideoRenderer *
-gst_player_video_overlay_video_renderer_new (gpointer window_handle)
-{
- return g_object_new (GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER,
- "window-handle", window_handle, NULL);
-}
-
-/**
- * gst_player_video_overlay_video_renderer_set_window_handle:
- * @self: #GstPlayerVideoRenderer instance
- * @window_handle: handle referencing to the platform specific window
- *
- * Sets the platform specific window handle into which the video
- * should be rendered
- **/
-void gst_player_video_overlay_video_renderer_set_window_handle
- (GstPlayerVideoOverlayVideoRenderer * self, gpointer window_handle)
-{
- g_return_if_fail (GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (self));
-
- g_object_set (self, "window-handle", window_handle, NULL);
-}
-
-/**
- * gst_player_video_overlay_video_renderer_get_window_handle:
- * @self: #GstPlayerVideoRenderer instance
- *
- * Returns: (transfer none): The currently set, platform specific window
- * handle
- */
-gpointer
- gst_player_video_overlay_video_renderer_get_window_handle
- (GstPlayerVideoOverlayVideoRenderer * self) {
- gpointer window_handle;
-
- g_return_val_if_fail (GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (self),
- NULL);
-
- g_object_get (self, "window-handle", &window_handle, NULL);
-
- return window_handle;
-}
diff --git a/lib/gst/player/gstplayer.h b/lib/gst/player/gstplayer.h
index 5232424..1bf2a14 100644
--- a/lib/gst/player/gstplayer.h
+++ b/lib/gst/player/gstplayer.h
@@ -22,6 +22,9 @@
#define __GST_PLAYER_H__
#include <gst/gst.h>
+#include <gst/player/gstplayer-types.h>
+#include <gst/player/gstplayer-signal-dispatcher.h>
+#include <gst/player/gstplayer-video-renderer.h>
#include <gst/player/gstplayer-media-info.h>
G_BEGIN_DECLS
@@ -62,9 +65,6 @@ typedef enum {
const gchar *gst_player_error_get_name (GstPlayerError error);
-typedef struct _GstPlayer GstPlayer;
-typedef struct _GstPlayerClass GstPlayerClass;
-
#define GST_TYPE_PLAYER (gst_player_get_type ())
#define GST_IS_PLAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER))
#define GST_IS_PLAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER))
@@ -73,43 +73,9 @@ typedef struct _GstPlayerClass GstPlayerClass;
#define GST_PLAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER, GstPlayerClass))
#define GST_PLAYER_CAST(obj) ((GstPlayer*)(obj))
-typedef struct _GstPlayerSignalDispatcher GstPlayerSignalDispatcher;
-typedef struct _GstPlayerSignalDispatcherInterface GstPlayerSignalDispatcherInterface;
-
-#define GST_TYPE_PLAYER_SIGNAL_DISPATCHER (gst_player_signal_dispatcher_get_type ())
-#define GST_PLAYER_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_SIGNAL_DISPATCHER, GstPlayerSignalDispatcher))
-#define GST_IS_PLAYER_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_SIGNAL_DISPATCHER))
-#define GST_PLAYER_SIGNAL_DISPATCHER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PLAYER_SIGNAL_DISPATCHER, GstPlayerSignalDispatcherInterface))
-
-struct _GstPlayerSignalDispatcherInterface {
- GTypeInterface parent_iface;
-
- void (*dispatch) (GstPlayerSignalDispatcher * self,
- GstPlayer * player,
- void (*emitter) (gpointer data),
- gpointer data,
- GDestroyNotify destroy);
-};
-
-typedef struct _GstPlayerVideoRenderer GstPlayerVideoRenderer;
-typedef struct _GstPlayerVideoRendererInterface GstPlayerVideoRendererInterface;
-
-#define GST_TYPE_PLAYER_VIDEO_RENDERER (gst_player_video_renderer_get_type ())
-#define GST_PLAYER_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_VIDEO_RENDERER, GstPlayerVideoRenderer))
-#define GST_IS_PLAYER_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_VIDEO_RENDERER))
-#define GST_PLAYER_VIDEO_RENDERER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PLAYER_VIDEO_RENDERER, GstPlayerVideoRendererInterface))
-
-struct _GstPlayerVideoRendererInterface {
- GTypeInterface parent_iface;
-
- GstElement * (*create_video_sink) (GstPlayerVideoRenderer * self, GstPlayer * player);
-};
GType gst_player_get_type (void);
-GType gst_player_video_renderer_get_type (void);
-GType gst_player_signal_dispatcher_get_type (void);
-
GstPlayer * gst_player_new (void);
GstPlayer * gst_player_new_full (GstPlayerVideoRenderer * video_renderer, GstPlayerSignalDispatcher * signal_dispatcher);
@@ -235,41 +201,6 @@ void gst_player_set_color_balance (GstPlayer * player,
gdouble gst_player_get_color_balance (GstPlayer * player,
GstPlayerColorBalanceType type);
-typedef struct _GstPlayerGMainContextSignalDispatcher
- GstPlayerGMainContextSignalDispatcher;
-typedef struct _GstPlayerGMainContextSignalDispatcherClass
- GstPlayerGMainContextSignalDispatcherClass;
-
-#define GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (gst_player_g_main_context_signal_dispatcher_get_type ())
-#define GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER))
-#define GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER))
-#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcherClass))
-#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcher))
-#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcherClass))
-#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CAST(obj) ((GstPlayerGMainContextSignalDispatcher*)(obj))
-
-GType gst_player_g_main_context_signal_dispatcher_get_type (void);
-
-GstPlayerSignalDispatcher * gst_player_g_main_context_signal_dispatcher_new (GMainContext * application_context);
-
-typedef struct _GstPlayerVideoOverlayVideoRenderer
- GstPlayerVideoOverlayVideoRenderer;
-typedef struct _GstPlayerVideoOverlayVideoRendererClass
- GstPlayerVideoOverlayVideoRendererClass;
-
-#define GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (gst_player_video_overlay_video_renderer_get_type ())
-#define GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER))
-#define GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER))
-#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRendererClass))
-#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRenderer))
-#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRendererClass))
-#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CAST(obj) ((GstPlayerVideoOverlayVideoRenderer*)(obj))
-
-GType gst_player_video_overlay_video_renderer_get_type (void);
-GstPlayerVideoRenderer * gst_player_video_overlay_video_renderer_new (gpointer window_handle);
-void gst_player_video_overlay_video_renderer_set_window_handle (GstPlayerVideoOverlayVideoRenderer * self, gpointer window_handle);
-gpointer gst_player_video_overlay_video_renderer_get_window_handle (GstPlayerVideoOverlayVideoRenderer * self);
-
G_END_DECLS
#endif /* __GST_PLAYER_H__ */
diff --git a/lib/gst/player/player.h b/lib/gst/player/player.h
index b8118bc..71e4868 100644
--- a/lib/gst/player/player.h
+++ b/lib/gst/player/player.h
@@ -23,5 +23,7 @@
#include <gst/player/gstplayer.h>
#include <gst/player/gstplayer-media-info.h>
+#include <gst/player/gstplayer-g-main-context-signal-dispatcher.h>
+#include <gst/player/gstplayer-video-overlay-video-renderer.h>
#endif /* __PLAYER_H__ */
diff --git a/tests/player.c b/tests/player.c
index 4516e05..bdeb32c 100644
--- a/tests/player.c
+++ b/tests/player.c
@@ -67,7 +67,7 @@ G_STMT_START { \
"'" #a "' (%lf) is not equal to '" #b"' (%lf)", first, second); \
} G_STMT_END;
-#include <gst/player/gstplayer.h>
+#include <gst/player/player.h>
GST_DEBUG_CATEGORY_STATIC (test_debug);
#define GST_CAT_DEFAULT test_debug