summaryrefslogtreecommitdiff
path: root/lib/gst/player/gstplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gst/player/gstplayer.c')
-rw-r--r--lib/gst/player/gstplayer.c432
1 files changed, 2 insertions, 430 deletions
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;
-}