#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)
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,
}
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);
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);
+}
/* GStreamer X-based Overlay
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
*
* x-overlay.h: X-based overlay interface design
*
/* 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
#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)
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,
}
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);
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);
+}
/* GStreamer X-based Overlay
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
*
* x-overlay.h: X-based overlay interface design
*
/* 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