diff --git a/ChangeLog b/ChangeLog index a11f2121da..b6429843b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2005-11-21 Tim-Philipp Müller + + * gst-libs/gst/interfaces/xoverlay.c: (gst_x_overlay_base_init), + (gst_x_overlay_got_xwindow_id), (gst_x_overlay_prepare_xwindow_id): + * gst-libs/gst/interfaces/xoverlay.h: + Remove everything having to do with the desired size; add + gst_x_overlay_prepare_xwindow_id() function; remove the + 'have-xwindow-id' signal and make gst_x_overlay_got_xwindow_id() + post a message on the bus instead (#321816). + + * sys/ximage/ximagesink.c: (gst_ximagesink_xoverlay_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_setcaps), + (gst_xvimagesink_xoverlay_init): + Remove desired size stuff (#321816). + 2005-11-21 Tim-Philipp Müller * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), diff --git a/gst-libs/gst/interfaces/xoverlay.c b/gst-libs/gst/interfaces/xoverlay.c index f4d1e1cf1d..ef919b3b14 100644 --- a/gst-libs/gst/interfaces/xoverlay.c +++ b/gst-libs/gst/interfaces/xoverlay.c @@ -1,7 +1,7 @@ /* GStreamer X-based Overlay * Copyright (C) 2003 Ronald Bultje * - * tv-mixer.c: tv-mixer design virtual class function wrappers + * x-overlay.c: X-based overlay interface design * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -25,15 +25,6 @@ #include "xoverlay.h" -enum -{ - HAVE_XWINDOW_ID, - DESIRED_SIZE, - LAST_SIGNAL -}; - -static guint gst_x_overlay_signals[LAST_SIGNAL] = { 0 }; - static void gst_x_overlay_base_init (gpointer g_class); GType @@ -63,32 +54,10 @@ gst_x_overlay_get_type (void) return gst_x_overlay_type; } -/* FIXME: evil hack, we should figure out our marshal handling in this interfaces some day */ -extern void gst_marshal_VOID__INT_INT (GClosure * closure, - GValue * return_value, guint n_param_values, const GValue * param_values, - gpointer invocation_hint, gpointer marshal_data); - static void gst_x_overlay_base_init (gpointer g_class) { GstXOverlayClass *overlay_class = (GstXOverlayClass *) g_class; - static gboolean initialized = FALSE; - - if (!initialized) { - 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__INT, G_TYPE_NONE, 1, G_TYPE_INT); - gst_x_overlay_signals[DESIRED_SIZE] = - g_signal_new ("desired-size-changed", - GST_TYPE_X_OVERLAY, G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstXOverlayClass, desired_size), - NULL, NULL, - gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); - - initialized = TRUE; - } overlay_class->set_xwindow_id = NULL; } @@ -118,70 +87,50 @@ gst_x_overlay_set_xwindow_id (GstXOverlay * overlay, gulong 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 will post a "have-xwindow-id" element message on the bus. * - * This function should be used by video overlay developpers. + * This function should only be used by video overlay plugin developers. */ void gst_x_overlay_got_xwindow_id (GstXOverlay * overlay, gulong xwindow_id) { + GstStructure *s; + GstMessage *msg; + 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, (gint) xwindow_id); + GST_LOG_OBJECT (GST_OBJECT (overlay), "xwindow_id = %lu", xwindow_id); + s = gst_structure_new ("have-xwindow-id", "xwindow-id", G_TYPE_ULONG, + xwindow_id, NULL); + msg = gst_message_new_element (GST_OBJECT (overlay), s); + gst_element_post_message (GST_ELEMENT (overlay), msg); } /** - * gst_x_overlay_get_desired_size: - * @overlay: a #GstXOverlay which got a XWindow. - * @width: pointer to a gint taking the width or NULL. - * @height: pointer to a gint taking the height or NULL. + * gst_x_overlay_prepare_xwindow_id: + * @overlay: a #GstXOverlay which does not yet have an XWindow. * - * Gets the desired size of the overlay. If the overlay doesn't know its desired - * size, width and height are set to 0. + * This will post a "prepare-xwindow-id" element message on the bus + * to give applications an opportunity to call + * gst_x_overlay_set_xwindow_id() before a plugin creates its own + * window. + * + * This function should only be used by video overlay plugin developers. */ void -gst_x_overlay_get_desired_size (GstXOverlay * overlay, guint * width, - guint * height) +gst_x_overlay_prepare_xwindow_id (GstXOverlay * overlay) { - guint width_tmp, height_tmp; - GstXOverlayClass *klass; + GstStructure *s; + GstMessage *msg; - g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE ((overlay), GST_TYPE_X_OVERLAY)); - - klass = GST_X_OVERLAY_GET_CLASS (overlay); - if (klass->get_desired_size && GST_IS_X_OVERLAY (overlay)) { - /* this ensures that elements don't need to check width and height for NULL - but apps may use NULL */ - klass->get_desired_size (overlay, width ? width : &width_tmp, - height ? height : &height_tmp); - } else { - if (width) - *width = 0; - if (height) - *height = 0; - } -} - -/** - * gst_x_overlay_got_desired_size: - * @overlay: a #GstXOverlay which changed its desired size. - * @width: The new desired width - * @height: The new desired height - * - * This will fire a "desired_size_changed" signal. - * - * This function should be used by video overlay developpers. - */ -void -gst_x_overlay_got_desired_size (GstXOverlay * overlay, guint width, - guint 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[DESIRED_SIZE], 0, width, height); + GST_LOG_OBJECT (GST_OBJECT (overlay), "prepare xwindow_id"); + s = gst_structure_new ("prepare-xwindow-id", NULL); + msg = gst_message_new_element (GST_OBJECT (overlay), s); + gst_element_post_message (GST_ELEMENT (overlay), msg); } /** diff --git a/gst-libs/gst/interfaces/xoverlay.h b/gst-libs/gst/interfaces/xoverlay.h index 5318fef310..062f95edc3 100644 --- a/gst-libs/gst/interfaces/xoverlay.h +++ b/gst-libs/gst/interfaces/xoverlay.h @@ -48,33 +48,25 @@ typedef struct _GstXOverlayClass { /* virtual functions */ void (* set_xwindow_id) (GstXOverlay *overlay, - gulong xwindow_id); - /* optional virtual functions */ - void (* get_desired_size) (GstXOverlay *overlay, - guint *width, - guint *height); - void (* expose) (GstXOverlay *overlay); - - /* signals */ - void (*have_xwindow_id) (GstXOverlay *overlay, - gulong xwindow_id); - void (* desired_size) (GstXOverlay *overlay, - guint width, - guint height); + gulong xwindow_id); - gpointer _gst_reserved[GST_PADDING]; + void (* expose) (GstXOverlay *overlay); + + /*< private >*/ + gpointer _gst_reserved[GST_PADDING]; } GstXOverlayClass; GType gst_x_overlay_get_type (void); /* virtual class function wrappers */ -void gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, gulong xwindow_id); -void gst_x_overlay_get_desired_size (GstXOverlay *overlay, guint *width, guint *height); -void gst_x_overlay_expose (GstXOverlay *overlay); +void gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, gulong xwindow_id); -/* public methods to fire signals */ -void gst_x_overlay_got_xwindow_id (GstXOverlay *overlay, gulong xwindow_id); -void gst_x_overlay_got_desired_size (GstXOverlay *overlay, guint width, guint height); +void gst_x_overlay_expose (GstXOverlay *overlay); + +/* public methods to dispatch bus messages */ +void gst_x_overlay_got_xwindow_id (GstXOverlay *overlay, gulong xwindow_id); + +void gst_x_overlay_prepare_xwindow_id (GstXOverlay *overlay); G_END_DECLS diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index a14103cb0a..d59d934c3d 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -1582,16 +1582,6 @@ gst_ximagesink_set_xwindow_id (GstXOverlay * overlay, XID xwindow_id) g_mutex_unlock (ximagesink->flow_lock); } -static void -gst_ximagesink_get_desired_size (GstXOverlay * overlay, - guint * width, guint * height) -{ - GstXImageSink *ximagesink = GST_XIMAGESINK (overlay); - - *width = GST_VIDEO_SINK_WIDTH (ximagesink); - *height = GST_VIDEO_SINK_HEIGHT (ximagesink); -} - static void gst_ximagesink_expose (GstXOverlay * overlay) { @@ -1607,7 +1597,6 @@ static void gst_ximagesink_xoverlay_init (GstXOverlayClass * iface) { iface->set_xwindow_id = gst_ximagesink_set_xwindow_id; - iface->get_desired_size = gst_ximagesink_get_desired_size; iface->expose = gst_ximagesink_expose; } diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index 553ac399af..2597f1042d 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -1434,9 +1434,6 @@ gst_xvimagesink_setcaps (GstBaseSink * bsink, GstCaps * caps) xvimagesink->xcontext->im_format = im_format; - gst_x_overlay_got_desired_size (GST_X_OVERLAY (xvimagesink), - GST_VIDEO_SINK_WIDTH (xvimagesink), GST_VIDEO_SINK_HEIGHT (xvimagesink)); - return TRUE; } @@ -1832,16 +1829,6 @@ gst_xvimagesink_set_xwindow_id (GstXOverlay * overlay, XID xwindow_id) xvimagesink->xwindow = xwindow; } -static void -gst_xvimagesink_get_desired_size (GstXOverlay * overlay, - guint * width, guint * height) -{ - GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay); - - *width = GST_VIDEO_SINK_WIDTH (xvimagesink); - *height = GST_VIDEO_SINK_HEIGHT (xvimagesink); -} - static void gst_xvimagesink_expose (GstXOverlay * overlay) { @@ -1869,7 +1856,6 @@ static void gst_xvimagesink_xoverlay_init (GstXOverlayClass * iface) { iface->set_xwindow_id = gst_xvimagesink_set_xwindow_id; - iface->get_desired_size = gst_xvimagesink_get_desired_size; iface->expose = gst_xvimagesink_expose; }