diff options
Diffstat (limited to 'lib/gst/player/gstplayer.c')
-rw-r--r-- | lib/gst/player/gstplayer.c | 432 |
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; -} |