From 553c017e6ed62719094a3bf7acdaff76d2bbf179 Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Tue, 22 Dec 2015 11:49:21 +0100 Subject: player: Move video renderer and signal dispatcher code into separate files --- docs/lib/Makefile.am | 5 +- lib/gst/player/Makefile.am | 17 +- .../gstplayer-g-main-context-signal-dispatcher.c | 199 ++++++++++ .../gstplayer-g-main-context-signal-dispatcher.h | 48 +++ .../player/gstplayer-signal-dispatcher-private.h | 34 ++ lib/gst/player/gstplayer-signal-dispatcher.c | 53 +++ lib/gst/player/gstplayer-signal-dispatcher.h | 51 +++ lib/gst/player/gstplayer-types.h | 35 ++ .../gstplayer-video-overlay-video-renderer.c | 214 ++++++++++ .../gstplayer-video-overlay-video-renderer.h | 49 +++ lib/gst/player/gstplayer-video-renderer-private.h | 33 ++ lib/gst/player/gstplayer-video-renderer.c | 45 +++ lib/gst/player/gstplayer-video-renderer.h | 47 +++ lib/gst/player/gstplayer.c | 432 +-------------------- lib/gst/player/gstplayer.h | 75 +--- lib/gst/player/player.h | 2 + tests/player.c | 2 +- 17 files changed, 834 insertions(+), 507 deletions(-) create mode 100644 lib/gst/player/gstplayer-g-main-context-signal-dispatcher.c create mode 100644 lib/gst/player/gstplayer-g-main-context-signal-dispatcher.h create mode 100644 lib/gst/player/gstplayer-signal-dispatcher-private.h create mode 100644 lib/gst/player/gstplayer-signal-dispatcher.c create mode 100644 lib/gst/player/gstplayer-signal-dispatcher.h create mode 100644 lib/gst/player/gstplayer-types.h create mode 100644 lib/gst/player/gstplayer-video-overlay-video-renderer.c create mode 100644 lib/gst/player/gstplayer-video-overlay-video-renderer.h create mode 100644 lib/gst/player/gstplayer-video-renderer-private.h create mode 100644 lib/gst/player/gstplayer-video-renderer.c create mode 100644 lib/gst/player/gstplayer-video-renderer.h 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 + * + * 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 + * + * 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 +#include + +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 + * + * 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 + +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 + * + * 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 + * + * 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 +#include + +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 + * + * 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 + +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 + * + * 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 + +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 + * + * 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 +#include + +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 + * + * 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 + +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 + * + * 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 + * + * 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 +#include + +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 @@ -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 +#include +#include +#include #include 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 #include +#include +#include #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 +#include GST_DEBUG_CATEGORY_STATIC (test_debug); #define GST_CAT_DEFAULT test_debug -- cgit v1.2.3