From 4653e156539b8bac4797c394d763c193bacfb03d Mon Sep 17 00:00:00 2001 From: Julien Moutte Date: Mon, 17 Nov 2003 16:29:38 +0000 Subject: Merged GstVideoOverlay features here. Original commit message from CVS: Merged GstVideoOverlay features here. --- gst-libs/gst/xoverlay/xoverlay.c | 90 ++++++++++++++++++++++++++++++++++++---- gst-libs/gst/xoverlay/xoverlay.h | 15 ++++++- 2 files changed, 96 insertions(+), 9 deletions(-) diff --git a/gst-libs/gst/xoverlay/xoverlay.c b/gst-libs/gst/xoverlay/xoverlay.c index f0b4ebb5d..53b4214b5 100644 --- a/gst-libs/gst/xoverlay/xoverlay.c +++ b/gst-libs/gst/xoverlay/xoverlay.c @@ -25,7 +25,15 @@ #include "xoverlay.h" -static void gst_x_overlay_class_init (GstXOverlayClass *klass); +enum { + HAVE_XWINDOW_ID, + HAVE_SIZE, + LAST_SIGNAL +}; + +static guint gst_x_overlay_signals[LAST_SIGNAL] = { 0 }; + +static void gst_x_overlay_base_init (gpointer g_class); GType gst_x_overlay_get_type (void) @@ -35,7 +43,7 @@ gst_x_overlay_get_type (void) if (!gst_x_overlay_type) { static const GTypeInfo gst_x_overlay_info = { sizeof (GstXOverlayClass), - (GBaseInitFunc) gst_x_overlay_class_init, + gst_x_overlay_base_init, NULL, NULL, NULL, @@ -56,15 +64,43 @@ gst_x_overlay_get_type (void) } static void -gst_x_overlay_class_init (GstXOverlayClass *klass) +gst_x_overlay_base_init (gpointer g_class) { - /* default virtual functions */ - klass->set_xwindow_id = NULL; + static gboolean initialized = FALSE; + + if (! initialized) + { + gst_x_overlay_signals[HAVE_SIZE] = + g_signal_new ("have_size", + GST_TYPE_X_OVERLAY, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstXOverlayClass, have_size), + NULL, NULL, + gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + gst_x_overlay_signals[HAVE_XWINDOW_ID] = + g_signal_new ("have_xwindow_id", + GST_TYPE_X_OVERLAY, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstXOverlayClass, have_xwindow_id), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, + G_TYPE_POINTER); + + initialized = TRUE; + } } +/** + * gst_x_overlay_set_xwindow_id: + * @overlay: a #GstXOverlay to set the XWindow on. + * @xwindow_id: a #XID referencing the XWindow. + * + * This will call the video overlay's set_xwindow_id method. You should + * use this method to tell to a XOverlay to display video output to a + * specific XWindow. + */ void -gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, - XID xwindow_id) +gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id) { GstXOverlayClass *klass = GST_X_OVERLAY_GET_CLASS (overlay); @@ -72,3 +108,43 @@ gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, klass->set_xwindow_id (overlay, xwindow_id); } } + +/** + * gst_x_overlay_got_xwindow_id: + * @overlay: a #GstXOverlay which got a XWindow. + * @xwindow_id: a #XID referencing the XWindow. + * + * This will fire an have_xwindow_id signal. + * + * This function should be used by video overlay developpers. + */ +void +gst_x_overlay_got_xwindow_id (GstXOverlay *overlay, XID xwindow_id) +{ + g_return_if_fail (overlay != NULL); + g_return_if_fail (GST_IS_X_OVERLAY (overlay)); + + g_signal_emit (G_OBJECT (overlay), + gst_x_overlay_signals[HAVE_XWINDOW_ID], 0, xwindow_id); +} + +/** + * gst_x_overlay_got_video_size: + * @overlay: a #GstXOverlay which received video geometry. + * @width: a width as a #gint. + * @height: a height as a #gint. + * + * This will fire an have_size signal. + * + * This function should be used by video overlay developpers. + */ +void +gst_x_overlay_got_video_size (GstXOverlay *overlay, + gint width, gint height) +{ + g_return_if_fail (overlay != NULL); + g_return_if_fail (GST_IS_X_OVERLAY (overlay)); + + g_signal_emit (G_OBJECT (overlay), gst_x_overlay_signals[HAVE_SIZE], + 0, width, height); +} diff --git a/gst-libs/gst/xoverlay/xoverlay.h b/gst-libs/gst/xoverlay/xoverlay.h index 15258765b..1f8c9f39c 100644 --- a/gst-libs/gst/xoverlay/xoverlay.h +++ b/gst-libs/gst/xoverlay/xoverlay.h @@ -1,5 +1,6 @@ /* GStreamer X-based Overlay * Copyright (C) 2003 Ronald Bultje + * Copyright (C) 2003 Julien Moutte * * x-overlay.h: X-based overlay interface design * @@ -48,13 +49,23 @@ typedef struct _GstXOverlayClass { /* virtual functions */ void (* set_xwindow_id) (GstXOverlay *overlay, XID xwindow_id); + + /* signals */ + void (*have_xwindow_id) (GstXOverlay *overlay, + XID xwindow_id); + void (*have_size) (GstXOverlay *overlay, gint width, gint height); + } GstXOverlayClass; GType gst_x_overlay_get_type (void); /* virtual class function wrappers */ -void gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, - XID xwindow_id); +void gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id); + +/* public methods to fire signals */ +void gst_x_overlay_got_xwindow_id (GstXOverlay *overlay, XID xwindow_id); +void gst_x_overlay_got_video_size (GstXOverlay *overlay, + gint width, gint height); G_END_DECLS -- cgit v1.2.1