From: Julien M. <do...@pd...> - 2004-01-12 14:40:00
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Mon Jan 12 2004 06:41:05 PST Log message: 2004-01-12 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_chain): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Fixing the direct put buffers detection. I prefer checking GST_BUFFER_PRIVATE than the free_func. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.114&r2=1.115 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.45&r2=1.46 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.26&r2=1.27 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.114 retrieving revision 1.115 diff -u -d -r1.114 -r1.115 --- ChangeLog 12 Jan 2004 12:24:04 -0000 1.114 +++ ChangeLog 12 Jan 2004 14:40:53 -0000 1.115 @@ -1,3 +1,10 @@ +2004-01-12 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Fixing the + direct put buffers detection. I prefer checking GST_BUFFER_PRIVATE + than the free_func. + 2004-01-12 Thomas Vander Stichele <thomas at apestaart dot org> * sys/oss/gstossaudio.c: (plugin_init): Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- ximagesink.c 12 Jan 2004 02:01:52 -0000 1.45 +++ ximagesink.c 12 Jan 2004 14:40:53 -0000 1.46 @@ -49,8 +49,6 @@ "height = (int) [ 0, MAX ]") ); -static void gst_ximagesink_buffer_free (GstBuffer *buffer); - static GstVideoSinkClass *parent_class = NULL; /* ============================================================= */ @@ -741,8 +739,7 @@ /* If this buffer has been allocated using our buffer management we simply put the ximage which is in the PRIVATE pointer */ - /* FIXME: need to check for correct xvimagesink here? */ - if (GST_BUFFER_FREE_DATA_FUNC (buf) == gst_ximagesink_buffer_free) + if (GST_BUFFER_PRIVATE (buf)) { gst_ximagesink_ximage_put (ximagesink, GST_BUFFER_PRIVATE (buf)); } Index: xvimagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- xvimagesink.c 12 Jan 2004 02:01:52 -0000 1.26 +++ xvimagesink.c 12 Jan 2004 14:40:53 -0000 1.27 @@ -55,8 +55,6 @@ ) ); -static void gst_xvimagesink_buffer_free (GstBuffer *buffer); - static GstVideoSinkClass *parent_class = NULL; /* ============================================================= */ @@ -901,8 +899,7 @@ /* If this buffer has been allocated using our buffer management we simply put the ximage which is in the PRIVATE pointer */ - /* FIXME: need to check for correct xvimagesink here? */ - if (GST_BUFFER_FREE_DATA_FUNC (buf) == gst_xvimagesink_buffer_free) + if (GST_BUFFER_PRIVATE (buf)) { gst_xvimagesink_xvimage_put (xvimagesink, GST_BUFFER_PRIVATE (buf)); } |
From: Julien M. <do...@pd...> - 2004-01-15 22:02:45
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Thu Jan 15 2004 14:03:57 PST Log message: 2004-01-15 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_chain): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Making both of them use the buffer free function to test how the buffer was allocated. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.145&r2=1.146 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.51&r2=1.52 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.35&r2=1.36 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.145 retrieving revision 1.146 diff -u -d -r1.145 -r1.146 --- ChangeLog 15 Jan 2004 21:05:16 -0000 1.145 +++ ChangeLog 15 Jan 2004 22:03:45 -0000 1.146 @@ -1,3 +1,9 @@ +2004-01-15 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Making both of + them use the buffer free function to test how the buffer was allocated. + 2004-01-15 David Schleef <ds...@sc...> * ext/esd/esdsink.c: (gst_esdsink_class_init): Remove property Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -d -r1.51 -r1.52 --- ximagesink.c 15 Jan 2004 21:05:17 -0000 1.51 +++ ximagesink.c 15 Jan 2004 22:03:45 -0000 1.52 @@ -28,6 +28,8 @@ /* Object header */ #include "ximagesink.h" +static void gst_ximagesink_buffer_free (GstBuffer *buffer); + /* ElementFactory information */ static GstElementDetails gst_ximagesink_details = GST_ELEMENT_DETAILS ( "Video sink", @@ -729,7 +731,7 @@ /* If this buffer has been allocated using our buffer management we simply put the ximage which is in the PRIVATE pointer */ - if (GST_BUFFER_PRIVATE (buf)) + if (GST_BUFFER_FREE_DATA_FUNC (buf) == gst_ximagesink_buffer_free) { gst_ximagesink_ximage_put (ximagesink, GST_BUFFER_PRIVATE (buf)); } Index: xvimagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- xvimagesink.c 15 Jan 2004 21:05:17 -0000 1.35 +++ xvimagesink.c 15 Jan 2004 22:03:45 -0000 1.36 @@ -941,7 +941,6 @@ /* If this buffer has been allocated using our buffer management we simply put the ximage which is in the PRIVATE pointer */ - /* FIXME: need to check for correct xvimagesink here? */ if (GST_BUFFER_FREE_DATA_FUNC (buf) == gst_xvimagesink_buffer_free) { gst_xvimagesink_xvimage_put (xvimagesink, GST_BUFFER_PRIVATE (buf)); |
From: Julien M. <do...@pd...> - 2004-01-18 12:31:17
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Sun Jan 18 2004 04:32:32 PST Log message: 2004-01-18 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_set_property), (gst_ximagesink_get_property), (gst_ximagesink_class_init): Adding synchronous property for debugging. * sys/ximage/ximagesink.h: Adding the synchronous boolean flag. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_set_property): Moving a pointer declaration to a smaller block, fixing indent. Modified files: . : ChangeLog sys/ximage : ximagesink.c ximagesink.h sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.155&r2=1.156 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.52&r2=1.53 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.h.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.38&r2=1.39 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.155 retrieving revision 1.156 diff -u -d -r1.155 -r1.156 --- ChangeLog 16 Jan 2004 23:52:53 -0000 1.155 +++ ChangeLog 18 Jan 2004 12:32:19 -0000 1.156 @@ -1,3 +1,13 @@ +2004-01-18 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_set_property), + (gst_ximagesink_get_property), (gst_ximagesink_class_init): Adding + synchronous property for debugging. + * sys/ximage/ximagesink.h: Adding the synchronous boolean flag. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_set_property): Moving a pointer declaration to a + smaller block, fixing indent. + 2004-01-16 David Schleef <ds...@sc...> * gst/videofilter/gstvideobalance.c: Fix regression; changing a Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- ximagesink.c 15 Jan 2004 22:03:45 -0000 1.52 +++ ximagesink.c 18 Jan 2004 12:32:19 -0000 1.53 @@ -53,7 +53,8 @@ enum { ARG_0, - ARG_DISPLAY + ARG_DISPLAY, + ARG_SYNCHRONOUS /* FILL ME */ }; @@ -1078,6 +1079,13 @@ case ARG_DISPLAY: ximagesink->display_name = g_strdup (g_value_get_string (value)); break; + case ARG_SYNCHRONOUS: + ximagesink->synchronous = g_value_get_boolean (value); + if (ximagesink->xcontext) { + XSynchronize (ximagesink->xcontext->disp, + ximagesink->synchronous); + } + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1099,6 +1107,9 @@ case ARG_DISPLAY: g_value_set_string (value, g_strdup (ximagesink->display_name)); break; + case ARG_SYNCHRONOUS: + g_value_set_boolean (value, ximagesink->synchronous); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1206,6 +1217,10 @@ g_object_class_install_property (gobject_class, ARG_DISPLAY, g_param_spec_string ("display", "Display", "X Display name", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_SYNCHRONOUS, + g_param_spec_boolean ("synchronous", "Synchronous", "When enabled, runs " + "the X display in synchronous mode. (used only for debugging)", FALSE, + G_PARAM_READWRITE)); gobject_class->dispose = gst_ximagesink_dispose; gobject_class->set_property = gst_ximagesink_set_property; Index: ximagesink.h =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- ximagesink.h 14 Jan 2004 23:01:49 -0000 1.15 +++ ximagesink.h 18 Jan 2004 12:32:19 -0000 1.16 @@ -122,6 +122,8 @@ GMutex *pool_lock; GSList *image_pool; + + gboolean synchronous; }; struct _GstXImageSinkClass { Index: xvimagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- xvimagesink.c 16 Jan 2004 23:52:53 -0000 1.38 +++ xvimagesink.c 18 Jan 2004 12:32:19 -0000 1.39 @@ -714,7 +714,6 @@ /* Generate the channels list */ for (i = 0; i < (sizeof (channels) / sizeof (char *)); i++) { - GstColorBalanceChannel *channel; XvAttribute *matching_attr = NULL; if (xv_attr != NULL) @@ -725,6 +724,7 @@ } if (matching_attr) { + GstColorBalanceChannel *channel; channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); channel->label = g_strdup (channels[i]); channel->min_value = matching_attr ? matching_attr->min_value : -1000; @@ -1452,7 +1452,7 @@ xvimagesink->synchronous = g_value_get_boolean (value); if (xvimagesink->xcontext) { XSynchronize (xvimagesink->xcontext->disp, - xvimagesink->synchronous); + xvimagesink->synchronous); } break; default: |
From: Julien M. <do...@pd...> - 2004-01-28 00:28:34
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Tue Jan 27 2004 16:29:54 PST Log message: 2004-01-28 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_destroy), (gst_ximagesink_xcontext_get), (gst_ximagesink_class_init): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xerror), (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xcontext_get): Our X plugins are now able to detect that XShm calls will fail even if the server claims that it has XShm support (remote displays most of the time). We then log the error as a GST_DEBUG and set use_shm to FALSE so that we use non XShm functions. This feature is almost useless for xvimagesink as Xv is not supported on remote displays anyway, but it might happen than even on the local display XShm calls fail. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.214&r2=1.215 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.56&r2=1.57 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.42&r2=1.43 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.214 retrieving revision 1.215 diff -u -d -r1.214 -r1.215 --- ChangeLog 27 Jan 2004 21:37:36 -0000 1.214 +++ ChangeLog 28 Jan 2004 00:29:42 -0000 1.215 @@ -1,3 +1,18 @@ +2004-01-28 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), + (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_destroy), + (gst_ximagesink_xcontext_get), (gst_ximagesink_class_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xerror), + (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xcontext_get): Our + X plugins are now able to detect that XShm calls will fail even if the + server claims that it has XShm support (remote displays most of the + time). We then log the error as a GST_DEBUG and set use_shm to FALSE + so that we use non XShm functions. This feature is almost useless for + xvimagesink as Xv is not supported on remote displays anyway, but + it might happen than even on the local display XShm calls fail. + 2004-01-27 David Schleef <ds...@sc...> * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_init), Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- ximagesink.c 22 Jan 2004 23:54:34 -0000 1.56 +++ ximagesink.c 28 Jan 2004 00:29:42 -0000 1.57 @@ -59,6 +59,7 @@ }; static GstVideoSinkClass *parent_class = NULL; +static gboolean error_catched = FALSE; /* ============================================================= */ /* */ @@ -68,6 +69,71 @@ /* X11 stuff */ +static int +gst_ximagesink_handle_xerror (Display *display, XErrorEvent *xevent) +{ + char error_msg [1024]; + XGetErrorText (display, xevent->error_code, error_msg, 1024); + GST_DEBUG ("ximagesink failed to use XShm calls. error: %s", + error_msg); + error_catched = TRUE; + return 0; +} + +/* This function checks that it is actually really possible to create an image + using XShm */ +static gboolean +gst_ximagesink_check_xshm_calls (GstXContext *xcontext) +{ + GstXImage *ximage = NULL; + int (*handler)(Display *, XErrorEvent *); + + g_return_val_if_fail (xcontext != NULL, FALSE); + +#ifdef HAVE_XSHM + ximage = g_new0 (GstXImage, 1); + + /* Setting an error handler to catch failure */ + handler = XSetErrorHandler (gst_ximagesink_handle_xerror); + + ximage->size = (xcontext->bpp / 8); + + /* Trying to create a 1x1 picture */ + ximage->ximage = XShmCreateImage (xcontext->disp, xcontext->visual, + xcontext->depth, ZPixmap, NULL, + &ximage->SHMInfo, 1, 1); + + ximage->SHMInfo.shmid = shmget (IPC_PRIVATE, ximage->size, IPC_CREAT | 0777); + ximage->SHMInfo.shmaddr = shmat (ximage->SHMInfo.shmid, 0, 0); + ximage->ximage->data = ximage->SHMInfo.shmaddr; + ximage->SHMInfo.readOnly = FALSE; + + XShmAttach (xcontext->disp, &ximage->SHMInfo); + + error_catched = FALSE; + + XSync(xcontext->disp, 0); + + XSetErrorHandler (handler); + + if (error_catched) + { /* Failed, detaching shared memory, destroying image and telling we can't + use XShm */ + error_catched = FALSE; + XDestroyImage (ximage->ximage); + shmdt (ximage->SHMInfo.shmaddr); + shmctl (ximage->SHMInfo.shmid, IPC_RMID, 0); + g_free (ximage); + XSync(xcontext->disp, 0); + return FALSE; + } + else +#endif /* HAVE_XSHM */ + { + return TRUE; + } +} + /* This function handles GstXImage creation depending on XShm availability */ static GstXImage * gst_ximagesink_ximage_new (GstXImageSink *ximagesink, gint width, gint height) @@ -171,7 +237,9 @@ if (ximage->ximage) XDestroyImage (ximage->ximage); } - + + XSync(ximagesink->xcontext->disp, 0); + g_mutex_unlock (ximagesink->x_lock); g_free (ximage); @@ -486,7 +554,8 @@ #ifdef HAVE_XSHM /* Search for XShm extension support */ - if (XQueryExtension (xcontext->disp, "MIT-SHM", &i, &i, &i)) + if (XShmQueryExtension (xcontext->disp) && + gst_ximagesink_check_xshm_calls (xcontext)) { xcontext->use_xshm = TRUE; GST_DEBUG ("ximagesink is using XShm extension"); @@ -1216,7 +1285,7 @@ gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_VIDEOSINK); - + g_object_class_install_property (gobject_class, ARG_DISPLAY, g_param_spec_string ("display", "Display", "X Display name", NULL, G_PARAM_READWRITE)); Index: xvimagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- xvimagesink.c 22 Jan 2004 23:54:34 -0000 1.42 +++ xvimagesink.c 28 Jan 2004 00:29:42 -0000 1.43 @@ -70,6 +70,7 @@ }; static GstVideoSinkClass *parent_class = NULL; +static gboolean error_catched = FALSE; /* ============================================================= */ /* */ @@ -79,6 +80,72 @@ /* X11 stuff */ +static int +gst_xvimagesink_handle_xerror (Display *display, XErrorEvent *xevent) +{ + char error_msg [1024]; + XGetErrorText (display, xevent->error_code, error_msg, 1024); + GST_DEBUG ("xvimagesink failed to use XShm calls. error: %s", + error_msg); + error_catched = TRUE; + return 0; +} + +/* This function checks that it is actually really possible to create an image + using XShm */ +static gboolean +gst_xvimagesink_check_xshm_calls (GstXContext *xcontext) +{ + GstXvImage *xvimage = NULL; + int (*handler)(Display *, XErrorEvent *); + + g_return_val_if_fail (xcontext != NULL, FALSE); + +#ifdef HAVE_XSHM + xvimage = g_new0 (GstXvImage, 1); + + /* Setting an error handler to catch failure */ + handler = XSetErrorHandler (gst_xvimagesink_handle_xerror); + + xvimage->size = (xcontext->bpp / 8); + + /* Trying to create a 1x1 picture */ + xvimage->xvimage = XvShmCreateImage (xcontext->disp, xcontext->xv_port_id, + xcontext->im_format, NULL, 1, 1, + &xvimage->SHMInfo); + + xvimage->SHMInfo.shmid = shmget (IPC_PRIVATE, xvimage->size, + IPC_CREAT | 0777); + xvimage->SHMInfo.shmaddr = shmat (xvimage->SHMInfo.shmid, 0, 0); + xvimage->xvimage->data = xvimage->SHMInfo.shmaddr; + xvimage->SHMInfo.readOnly = FALSE; + + XShmAttach (xcontext->disp, &xvimage->SHMInfo); + + error_catched = FALSE; + + XSync(xcontext->disp, 0); + + XSetErrorHandler (handler); + + if (error_catched) + { /* Failed, detaching shared memory, destroying image and telling we can't + use XShm */ + error_catched = FALSE; + XFree (xvimage->xvimage); + shmdt (xvimage->SHMInfo.shmaddr); + shmctl (xvimage->SHMInfo.shmid, IPC_RMID, 0); + g_free (xvimage); + XSync(xcontext->disp, 0); + return FALSE; + } + else +#endif /* HAVE_XSHM */ + { + return TRUE; + } +} + /* This function handles GstXvImage creation depending on XShm availability */ static GstXvImage * gst_xvimagesink_xvimage_new (GstXvImageSink *xvimagesink, @@ -183,6 +250,8 @@ XFree (xvimage->xvimage); } + XSync(xvimagesink->xcontext->disp, 0); + g_mutex_unlock (xvimagesink->x_lock); g_free (xvimage); @@ -669,20 +738,6 @@ xcontext->endianness = (ImageByteOrder (xcontext->disp) == LSBFirst) ? G_LITTLE_ENDIAN:G_BIG_ENDIAN; -#ifdef HAVE_XSHM - /* Search for XShm extension support */ - if (XQueryExtension (xcontext->disp, "MIT-SHM", &i, &i, &i)) - { - xcontext->use_xshm = TRUE; - GST_DEBUG ("xvimagesink is using XShm extension"); - } - else - { - xcontext->use_xshm = FALSE; - GST_DEBUG ("xvimagesink is not using XShm extension"); - } -#endif /* HAVE_XSHM */ - /* our caps system handles 24/32bpp RGB as big-endian. */ if ((xcontext->bpp == 24 || xcontext->bpp == 32) && xcontext->endianness == G_LITTLE_ENDIAN) { @@ -707,6 +762,23 @@ return NULL; } +#ifdef HAVE_XSHM + /* Search for XShm extension support */ + if (XShmQueryExtension (xcontext->disp) && + gst_xvimagesink_check_xshm_calls (xcontext)) + { + xcontext->use_xshm = TRUE; + GST_DEBUG ("xvimagesink is using XShm extension"); + g_message ("using XShm"); + } + else + { + xcontext->use_xshm = FALSE; + GST_DEBUG ("xvimagesink is not using XShm extension"); + g_message ("not using XShm"); + } +#endif /* HAVE_XSHM */ + xv_attr = XvQueryPortAttributes (xcontext->disp, xcontext->xv_port_id, &N_attr); |
From: Julien M. <do...@pd...> - 2004-01-28 10:44:17
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Wed Jan 28 2004 02:45:46 PST Log message: 2004-01-28 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put), (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get): Removing some useless debugs messages, correctly cleaning the image created to check xshm calls on succes, added a lot of XSync calls in X11 functions, and fixed a segfault when no image format was defined before negotiation happened. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.216&r2=1.217 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.57&r2=1.58 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.43&r2=1.44 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.216 retrieving revision 1.217 diff -u -d -r1.216 -r1.217 --- ChangeLog 28 Jan 2004 05:21:22 -0000 1.216 +++ ChangeLog 28 Jan 2004 10:45:33 -0000 1.217 @@ -1,3 +1,18 @@ +2004-01-28 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), + (gst_ximagesink_ximage_put), (gst_ximagesink_xwindow_new), + (gst_ximagesink_xwindow_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), + (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_xcontext_get): Removing some useless debugs messages, + correctly cleaning the image created to check xshm calls on succes, + added a lot of XSync calls in X11 functions, and fixed a segfault when + no image format was defined before negotiation happened. + 2004-01-28 Benjamin Otte <in...@pu...> * ext/alsa/gstalsa.c: (gst_alsa_query_func): Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- ximagesink.c 28 Jan 2004 00:29:42 -0000 1.57 +++ ximagesink.c 28 Jan 2004 10:45:33 -0000 1.58 @@ -124,14 +124,21 @@ shmdt (ximage->SHMInfo.shmaddr); shmctl (ximage->SHMInfo.shmid, IPC_RMID, 0); g_free (ximage); - XSync(xcontext->disp, 0); + XSync (xcontext->disp, FALSE); return FALSE; } else -#endif /* HAVE_XSHM */ { - return TRUE; + XShmDetach (xcontext->disp, &ximage->SHMInfo); + XDestroyImage (ximage->ximage); + shmdt (ximage->SHMInfo.shmaddr); + shmctl (ximage->SHMInfo.shmid, IPC_RMID, 0); + g_free (ximage); + XSync (xcontext->disp, FALSE); } +#endif /* HAVE_XSHM */ + + return TRUE; } /* This function handles GstXImage creation depending on XShm availability */ @@ -189,7 +196,7 @@ if (ximage->ximage) { - XSync(ximagesink->xcontext->disp, 0); + XSync (ximagesink->xcontext->disp, FALSE); } else { @@ -238,7 +245,7 @@ XDestroyImage (ximage->ximage); } - XSync(ximagesink->xcontext->disp, 0); + XSync (ximagesink->xcontext->disp, FALSE); g_mutex_unlock (ximagesink->x_lock); @@ -276,7 +283,7 @@ 0, 0, x, y, ximage->width, ximage->height); } - XSync(ximagesink->xcontext->disp, FALSE); + XSync (ximagesink->xcontext->disp, FALSE); g_mutex_unlock (ximagesink->x_lock); } @@ -302,9 +309,7 @@ ximagesink->xcontext->root, 0, 0, xwindow->width, xwindow->height, 0, 0, ximagesink->xcontext->black); - - XMapRaised (ximagesink->xcontext->disp, xwindow->win); - + XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask | StructureNotifyMask | PointerMotionMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask); @@ -312,6 +317,10 @@ xwindow->gc = XCreateGC (ximagesink->xcontext->disp, xwindow->win, 0, NULL); + XMapRaised (ximagesink->xcontext->disp, xwindow->win); + + XSync (ximagesink->xcontext->disp, FALSE); + g_mutex_unlock (ximagesink->x_lock); return xwindow; @@ -335,6 +344,8 @@ XFreeGC (ximagesink->xcontext->disp, xwindow->gc); + XSync (ximagesink->xcontext->disp, FALSE); + g_mutex_unlock (ximagesink->x_lock); g_free (xwindow); Index: xvimagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- xvimagesink.c 28 Jan 2004 00:29:42 -0000 1.43 +++ xvimagesink.c 28 Jan 2004 10:45:33 -0000 1.44 @@ -136,14 +136,21 @@ shmdt (xvimage->SHMInfo.shmaddr); shmctl (xvimage->SHMInfo.shmid, IPC_RMID, 0); g_free (xvimage); - XSync(xcontext->disp, 0); + XSync (xcontext->disp, FALSE); return FALSE; } else -#endif /* HAVE_XSHM */ { - return TRUE; + XShmDetach (xcontext->disp, &xvimage->SHMInfo); + XFree (xvimage->xvimage); + shmdt (xvimage->SHMInfo.shmaddr); + shmctl (xvimage->SHMInfo.shmid, IPC_RMID, 0); + g_free (xvimage); + XSync (xcontext->disp, FALSE); } +#endif /* HAVE_XSHM */ + + return TRUE; } /* This function handles GstXvImage creation depending on XShm availability */ @@ -200,7 +207,7 @@ if (xvimage->xvimage) { - XSync(xvimagesink->xcontext->disp, 0); + XSync (xvimagesink->xcontext->disp, FALSE); } else { @@ -250,7 +257,7 @@ XFree (xvimage->xvimage); } - XSync(xvimagesink->xcontext->disp, 0); + XSync (xvimagesink->xcontext->disp, FALSE); g_mutex_unlock (xvimagesink->x_lock); @@ -329,6 +336,8 @@ XMapRaised (xvimagesink->xcontext->disp, xwindow->win); + XSync(xvimagesink->xcontext->disp, FALSE); + g_mutex_unlock (xvimagesink->x_lock); return xwindow; @@ -352,6 +361,8 @@ XFreeGC (xvimagesink->xcontext->disp, xwindow->gc); + XSync(xvimagesink->xcontext->disp, FALSE); + g_mutex_unlock (xvimagesink->x_lock); g_free (xwindow); @@ -374,6 +385,8 @@ XResizeWindow (xvimagesink->xcontext->disp, xwindow->win, xwindow->width, xwindow->height); + XSync(xvimagesink->xcontext->disp, FALSE); + g_mutex_unlock (xvimagesink->x_lock); } @@ -615,6 +628,12 @@ { GstCaps *format_caps = NULL; + /* We set the image format of the xcontext to an existing one. Sink + connect method will override that but we need to have at least a + valid image format so that we can make our xshm calls check before + caps negotiation really happens. */ + xcontext->im_format = formats[i].id; + switch (formats[i].type) { case XvRGB: @@ -769,13 +788,11 @@ { xcontext->use_xshm = TRUE; GST_DEBUG ("xvimagesink is using XShm extension"); - g_message ("using XShm"); } else { xcontext->use_xshm = FALSE; GST_DEBUG ("xvimagesink is not using XShm extension"); - g_message ("not using XShm"); } #endif /* HAVE_XSHM */ |
From: Julien M. <do...@pd...> - 2004-01-31 04:36:54
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Thu Jan 29 2004 02:03:00 PST Log message: 2004-01-29 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_new): Emit the have_xwindow_id signal in xwindow_create. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.220&r2=1.221 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.58&r2=1.59 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.44&r2=1.45 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.220 retrieving revision 1.221 diff -u -d -r1.220 -r1.221 --- ChangeLog 29 Jan 2004 02:50:20 -0000 1.220 +++ ChangeLog 29 Jan 2004 10:02:48 -0000 1.221 @@ -1,3 +1,9 @@ +2004-01-29 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_new): Emit the + have_xwindow_id signal in xwindow_create. + 2004-01-29 Benjamin Otte <in...@pu...> * ext/ogg/gstoggdemux.c: Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- ximagesink.c 28 Jan 2004 10:45:33 -0000 1.58 +++ ximagesink.c 29 Jan 2004 10:02:48 -0000 1.59 @@ -323,6 +323,8 @@ g_mutex_unlock (ximagesink->x_lock); + gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (ximagesink), xwindow->win); + return xwindow; } Index: xvimagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- xvimagesink.c 28 Jan 2004 10:45:33 -0000 1.44 +++ xvimagesink.c 29 Jan 2004 10:02:48 -0000 1.45 @@ -340,6 +340,8 @@ g_mutex_unlock (xvimagesink->x_lock); + gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (xvimagesink), xwindow->win); + return xwindow; } |
From: Julien M. <do...@pd...> - 2004-02-02 21:58:11
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Mon Feb 02 2004 13:59:47 PST Log message: 2004-02-02 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents): Better X events handling, only take the latest events for configure and motion. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): same. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.249&r2=1.250 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.62&r2=1.63 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.249 retrieving revision 1.250 diff -u -d -r1.249 -r1.250 --- ChangeLog 2 Feb 2004 20:27:13 -0000 1.249 +++ ChangeLog 2 Feb 2004 21:59:35 -0000 1.250 @@ -1,3 +1,10 @@ +2004-02-02 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_handle_xevents): Better X events handling, only take + the latest events for configure and motion. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): same. + 2004-02-02 Jon Trowbridge <tr...@gn...> reviewed by: David Schleef <ds...@sc...> Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- ximagesink.c 2 Feb 2004 17:23:33 -0000 1.62 +++ ximagesink.c 2 Feb 2004 21:59:35 -0000 1.63 @@ -373,6 +373,56 @@ g_mutex_unlock (ximagesink->x_lock); } +static void +gst_ximagesink_renegotiate_size (GstXImageSink *ximagesink, + guint width, guint height) +{ + g_return_if_fail (ximagesink != NULL); + g_return_if_fail (GST_IS_XIMAGESINK (ximagesink)); + + /* Window got resized or moved. We do caps negotiation again to get video + scaler to fit that new size only if size of the window changed. */ + + if ( (ximagesink->xwindow->width != width) || + (ximagesink->xwindow->height != height) ) + { + GstPadLinkReturn r; + ximagesink->xwindow->width = width; + ximagesink->xwindow->height = height; + + r = gst_pad_try_set_caps (GST_VIDEOSINK_PAD (ximagesink), + gst_caps_new_simple ("video/x-raw-rgb", + "bpp", G_TYPE_INT, ximagesink->xcontext->bpp, + "depth", G_TYPE_INT, ximagesink->xcontext->depth, + "endianness", G_TYPE_INT, ximagesink->xcontext->endianness, + "red_mask", G_TYPE_INT, ximagesink->xcontext->visual->red_mask, + "green_mask", G_TYPE_INT, ximagesink->xcontext->visual->green_mask, + "blue_mask", G_TYPE_INT, ximagesink->xcontext->visual->blue_mask, + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "framerate", G_TYPE_DOUBLE, ximagesink->framerate, + NULL)); + + if ( (r == GST_PAD_LINK_OK) || (r == GST_PAD_LINK_DONE) ) + { + GST_VIDEOSINK_WIDTH (ximagesink) = width; + GST_VIDEOSINK_HEIGHT (ximagesink) = height; + + if ( (ximagesink->ximage) && + ( (GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) || + (GST_VIDEOSINK_HEIGHT (ximagesink) != ximagesink->ximage->height) ) ) + { + /* We renew our ximage only if size changed */ + gst_ximagesink_ximage_destroy (ximagesink, ximagesink->ximage); + + ximagesink->ximage = gst_ximagesink_ximage_new (ximagesink, + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); + } + } + } +} + /* This function handles XEvents that might be in the queue. It generates GstEvent that will be sent upstream in the pipeline to handle interactivity and navigation. It will also listen for configure events on the window to @@ -381,83 +431,88 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad) { XEvent e; + guint new_width = 0, new_height = 0, pointer_x = 0, pointer_y = 0; + gboolean pointer_moved = FALSE; g_return_if_fail (ximagesink != NULL); g_return_if_fail (GST_IS_XIMAGESINK (ximagesink)); - /* We get all events on our window to throw them upstream */ + /* First we get all structure modification events. Only the last one is + interesting */ g_mutex_lock (ximagesink->x_lock); while (XCheckWindowEvent (ximagesink->xcontext->disp, ximagesink->xwindow->win, - ExposureMask | StructureNotifyMask | - PointerMotionMask | KeyPressMask | - KeyReleaseMask | ButtonPressMask | - ButtonReleaseMask, &e)) + StructureNotifyMask, &e)) { - KeySym keysym; - - /* We lock only for the X function call */ g_mutex_unlock (ximagesink->x_lock); switch (e.type) { case ConfigureNotify: - /* Window got resized or moved. We do caps negotiation - again to get video scaler to fit that new size only if size - of the window changed. */ - GST_DEBUG ("ximagesink window is at %d, %d with geometry : %d,%d", - e.xconfigure.x, e.xconfigure.y, - e.xconfigure.width, e.xconfigure.height); - if ( (ximagesink->xwindow->width != e.xconfigure.width) || - (ximagesink->xwindow->height != e.xconfigure.height) ) - { - GstPadLinkReturn r; - ximagesink->xwindow->width = e.xconfigure.width; - ximagesink->xwindow->height = e.xconfigure.height; - - r = gst_pad_try_set_caps (GST_VIDEOSINK_PAD (ximagesink), - gst_caps_new_simple ("video/x-raw-rgb", - "bpp", G_TYPE_INT, ximagesink->xcontext->bpp, - "depth", G_TYPE_INT, ximagesink->xcontext->depth, - "endianness", G_TYPE_INT, ximagesink->xcontext->endianness, - "red_mask", G_TYPE_INT, ximagesink->xcontext->visual->red_mask, - "green_mask", G_TYPE_INT, ximagesink->xcontext->visual->green_mask, - "blue_mask", G_TYPE_INT, ximagesink->xcontext->visual->blue_mask, - "width", G_TYPE_INT, e.xconfigure.width, - "height", G_TYPE_INT, e.xconfigure.height, - "framerate", G_TYPE_DOUBLE, ximagesink->framerate, - NULL)); - - if ( (r == GST_PAD_LINK_OK) || (r == GST_PAD_LINK_DONE) ) - { - GST_VIDEOSINK_WIDTH (ximagesink) = e.xconfigure.width; - GST_VIDEOSINK_HEIGHT (ximagesink) = e.xconfigure.height; - - if ( (ximagesink->ximage) && - ( (GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) || - (GST_VIDEOSINK_HEIGHT (ximagesink) != ximagesink->ximage->height) ) ) - { - /* We renew our ximage only if size changed */ - gst_ximagesink_ximage_destroy (ximagesink, - ximagesink->ximage); - - ximagesink->ximage = gst_ximagesink_ximage_new ( - ximagesink, - GST_VIDEOSINK_WIDTH (ximagesink), - GST_VIDEOSINK_HEIGHT (ximagesink)); - } - } - } + new_width = e.xconfigure.width; + new_height = e.xconfigure.height; break; + default: + break; + } + + g_mutex_lock (ximagesink->x_lock); + } + g_mutex_unlock (ximagesink->x_lock); + + if ( (new_width != 0) && (new_height != 0) ) + { + GST_DEBUG ("ximagesink window geometry is : %d,%d", + new_width, new_height); + gst_ximagesink_renegotiate_size (ximagesink, new_width, new_height); + } + + /* Then we get all pointer motion events, only the last position is + interesting. */ + g_mutex_lock (ximagesink->x_lock); + while (XCheckWindowEvent (ximagesink->xcontext->disp, + ximagesink->xwindow->win, + PointerMotionMask, &e)) + { + g_mutex_unlock (ximagesink->x_lock); + + switch (e.type) + { case MotionNotify: - /* Mouse pointer moved over our window. We send upstream - events for interactivity/navigation */ - GST_DEBUG ("ximagesink pointer moved over window at %d,%d", - e.xmotion.x, e.xmotion.y); - gst_navigation_send_mouse_event (GST_NAVIGATION (ximagesink), - "mouse-move", 0, - e.xmotion.x, e.xmotion.y); + pointer_x = e.xmotion.x; + pointer_y = e.xmotion.y; + pointer_moved = TRUE; break; + default: + break; + } + + g_mutex_lock (ximagesink->x_lock); + } + g_mutex_unlock (ximagesink->x_lock); + + if (pointer_moved) + { + GST_DEBUG ("ximagesink pointer moved over window at %d,%d", + pointer_x, pointer_y); + gst_navigation_send_mouse_event (GST_NAVIGATION (ximagesink), + "mouse-move", 0, pointer_x, pointer_y); + } + + /* We get all remaining events on our window to throw them upstream */ + g_mutex_lock (ximagesink->x_lock); + while (XCheckWindowEvent (ximagesink->xcontext->disp, + ximagesink->xwindow->win, + KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask, &e)) + { + KeySym keysym; + + /* We lock only for the X function call */ + g_mutex_unlock (ximagesink->x_lock); + + switch (e.type) + { case ButtonPress: /* Mouse button pressed/released over our window. We send upstream events for interactivity/navigation */ Index: xvimagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- xvimagesink.c 2 Feb 2004 17:23:33 -0000 1.48 +++ xvimagesink.c 2 Feb 2004 21:59:35 -0000 1.49 @@ -474,16 +474,49 @@ gst_xvimagesink_handle_xevents (GstXvImageSink *xvimagesink, GstPad *pad) { XEvent e; + guint pointer_x = 0, pointer_y = 0; + gboolean pointer_moved = FALSE; g_return_if_fail (xvimagesink != NULL); g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink)); + /* We get all pointer motion events, only the last position is + interesting. */ + g_mutex_lock (xvimagesink->x_lock); + while (XCheckWindowEvent (xvimagesink->xcontext->disp, + xvimagesink->xwindow->win, + PointerMotionMask, &e)) + { + g_mutex_unlock (xvimagesink->x_lock); + + switch (e.type) + { + case MotionNotify: + pointer_x = e.xmotion.x; + pointer_y = e.xmotion.y; + pointer_moved = TRUE; + break; + default: + break; + } + + g_mutex_lock (xvimagesink->x_lock); + } + g_mutex_unlock (xvimagesink->x_lock); + + if (pointer_moved) + { + GST_DEBUG ("xvimagesink pointer moved over window at %d,%d", + pointer_x, pointer_y); + gst_navigation_send_mouse_event (GST_NAVIGATION (xvimagesink), + "mouse-move", 0, pointer_x, pointer_y); + } + /* We get all events on our window to throw them upstream */ g_mutex_lock (xvimagesink->x_lock); while (XCheckWindowEvent (xvimagesink->xcontext->disp, xvimagesink->xwindow->win, - ExposureMask | StructureNotifyMask | - PointerMotionMask | KeyPressMask | + StructureNotifyMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask, &e)) { @@ -502,15 +535,6 @@ xvimagesink->xwindow->width = e.xconfigure.width; xvimagesink->xwindow->height = e.xconfigure.height; break; - case MotionNotify: - /* Mouse pointer moved over our window. We send upstream - events for interactivity/navigation */ - GST_DEBUG ("xvimagesink pointer moved over window at %d,%d", - e.xmotion.x, e.xmotion.y); - gst_navigation_send_mouse_event (GST_NAVIGATION (xvimagesink), - "mouse-move", 0, - e.xmotion.x, e.xmotion.y); - break; case ButtonPress: /* Mouse button pressed over our window. We send upstream events for interactivity/navigation */ |
From: Julien M. <do...@pd...> - 2004-02-16 23:50:06
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Mon Feb 16 2004 15:46:07 PST Log message: 2004-02-17 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), (gst_ximagesink_expose): Renegotiate size on expose. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_expose): Update window size on expose. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.314&r2=1.315 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.65&r2=1.66 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.52&r2=1.53 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.314 retrieving revision 1.315 diff -u -d -r1.314 -r1.315 --- ChangeLog 16 Feb 2004 22:37:36 -0000 1.314 +++ ChangeLog 16 Feb 2004 23:45:55 -0000 1.315 @@ -1,3 +1,10 @@ +2004-02-17 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_expose): Renegotiate size on expose. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_expose): Update window + size on expose. 2004-02-16 Benjamin Otte <in...@pu...> * testsuite/alsa/sinesrc.c: Index: ximagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -r1.65 -r1.66 --- ximagesink.c 16 Feb 2004 16:24:51 -0000 1.65 +++ ximagesink.c 16 Feb 2004 23:45:55 -0000 1.66 @@ -402,11 +402,15 @@ { g_return_if_fail (GST_IS_XIMAGESINK (ximagesink)); + if (!ximagesink->xwindow) + return; + /* Window got resized or moved. We do caps negotiation again to get video - scaler to fit that new size only if size of the window changed. */ + scaler to fit that new size only if size of the window differs from our + size. */ - if ( (ximagesink->xwindow->width != width) || - (ximagesink->xwindow->height != height) ) + if (GST_VIDEOSINK_WIDTH (ximagesink) != width || + GST_VIDEOSINK_HEIGHT (ximagesink) != height) { GstPadLinkReturn r; ximagesink->xwindow->width = width; @@ -1230,10 +1234,30 @@ static void gst_ximagesink_expose (GstXOverlay *overlay) + XWindowAttributes attr; GstXImageSink *ximagesink = GST_XIMAGESINK (overlay); - if (ximagesink->cur_image) + /* Update the window geometry */ + g_mutex_lock (ximagesink->x_lock); + XGetWindowAttributes (ximagesink->xcontext->disp, + ximagesink->xwindow->win, &attr); + g_mutex_unlock (ximagesink->x_lock); + /* If window is 1x1 it's probably invisible */ + if (attr.width == 1 && attr.height == 1) + if (gst_pad_is_negotiated (GST_VIDEOSINK_PAD (ximagesink))) + gst_ximagesink_renegotiate_size (ximagesink, attr.width, attr.height); + gst_ximagesink_xwindow_clear (ximagesink, ximagesink->xwindow); + if (ximagesink->cur_image) { gst_ximagesink_ximage_put (ximagesink, ximagesink->cur_image); + } } Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- xvimagesink.c 16 Feb 2004 16:24:51 -0000 1.52 +++ xvimagesink.c 16 Feb 2004 23:45:55 -0000 1.53 @@ -1485,7 +1485,20 @@ gst_xvimagesink_expose (GstXOverlay *overlay) GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay); + if (!xvimagesink->xwindow) + g_mutex_lock (xvimagesink->x_lock); + XGetWindowAttributes (xvimagesink->xcontext->disp, + xvimagesink->xwindow->win, &attr); + g_mutex_unlock (xvimagesink->x_lock); + xvimagesink->xwindow->width = attr.width; + xvimagesink->xwindow->height = attr.height; if (xvimagesink->cur_image) { gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->cur_image); |
From: Julien M. <do...@pd...> - 2004-02-17 11:11:19
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Tue Feb 17 2004 03:07:04 PST Log message: 2004-02-17 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new): Fix a possible SHM leak if we crash. All other apps using XShm are doing that. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.315&r2=1.316 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.66&r2=1.67 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.53&r2=1.54 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.315 retrieving revision 1.316 diff -u -d -r1.315 -r1.316 --- ChangeLog 16 Feb 2004 23:45:55 -0000 1.315 +++ ChangeLog 17 Feb 2004 11:06:51 -0000 1.316 @@ -1,3 +1,10 @@ +2004-02-17 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new): Fix a + possible SHM leak if we crash. All other apps using XShm are doing + that. 2004-02-17 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), Index: ximagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- ximagesink.c 16 Feb 2004 23:45:55 -0000 1.66 +++ ximagesink.c 17 Feb 2004 11:06:51 -0000 1.67 @@ -178,6 +178,11 @@ ximage->SHMInfo.readOnly = FALSE; XShmAttach (ximagesink->xcontext->disp, &ximage->SHMInfo); + + XSync (ximagesink->xcontext->disp, FALSE); + shmctl (ximage->SHMInfo.shmid, IPC_RMID, 0); + ximage->SHMInfo.shmid = -1; } else #endif /* HAVE_XSHM */ @@ -191,13 +196,11 @@ ximage->width, ximage->height, ximagesink->xcontext->bpp, ximage->width * (ximagesink->xcontext->bpp / 8)); - } - - if (ximage->ximage) - { XSync (ximagesink->xcontext->disp, FALSE); - else + + if (!ximage->ximage) { if (ximage->data) g_free (ximage->data); Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- xvimagesink.c 16 Feb 2004 23:45:55 -0000 1.53 +++ xvimagesink.c 17 Feb 2004 11:06:52 -0000 1.54 @@ -191,6 +191,11 @@ xvimage->SHMInfo.readOnly = FALSE; XShmAttach (xvimagesink->xcontext->disp, &xvimage->SHMInfo); + XSync (xvimagesink->xcontext->disp, FALSE); + shmctl (xvimage->SHMInfo.shmid, IPC_RMID, 0); + xvimage->SHMInfo.shmid = -1; @@ -202,13 +207,11 @@ xvimage->width, xvimage->height); xvimage->data = g_malloc (xvimage->xvimage->data_size); - - if (xvimage->xvimage) XSync (xvimagesink->xcontext->disp, FALSE); + if (!xvimage->xvimage) if (xvimage->data) g_free (xvimage->data); |
From: Julien M. <do...@pd...> - 2004-02-18 21:22:10
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Wed Feb 18 2004 13:17:02 PST Log message: 2004-02-18 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_update_geometry), (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), (gst_ximagesink_change_state), (gst_ximagesink_expose), (gst_ximagesink_init): Rework the way software video scaling works. So now we check on each chain call if the video frames are feeling the window. If not we try to renegotiate caps. On failure we memorize that and we won't try again for that PLAYING sessions. * sys/ximage/ximagesink.h: Adding a boolean to store the caps renego failure. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the synchronous flag. Modified files: . : ChangeLog sys/ximage : ximagesink.c ximagesink.h sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.321&r2=1.322 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.69&r2=1.70 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.h.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.54&r2=1.55 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.321 retrieving revision 1.322 diff -u -d -r1.321 -r1.322 --- a/ChangeLog 18 Feb 2004 18:41:36 -0000 1.321 +++ b/ChangeLog 18 Feb 2004 21:16:49 -0000 1.322 @@ -1,3 +1,18 @@ +2004-02-18 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: + (gst_ximagesink_xwindow_update_geometry), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), + (gst_ximagesink_change_state), (gst_ximagesink_expose), + (gst_ximagesink_init): Rework the way software video scaling works. So + now we check on each chain call if the video frames are feeling the + window. If not we try to renegotiate caps. On failure we memorize that + and we won't try again for that PLAYING sessions. + * sys/ximage/ximagesink.h: Adding a boolean to store the caps renego + failure. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the + synchronous flag. 2004-02-18 Thomas Vander Stichele <thomas at apestaart dot org> * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): Index: ximagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.69 retrieving revision 1.70 diff -u -d -r1.69 -r1.70 --- a/ximagesink.c 18 Feb 2004 13:06:49 -0000 1.69 +++ b/ximagesink.c 18 Feb 2004 21:16:50 -0000 1.70 @@ -400,6 +400,25 @@ } static void +gst_ximagesink_xwindow_update_geometry (GstXImageSink *ximagesink, + GstXWindow *xwindow) +{ + XWindowAttributes attr; + + g_return_if_fail (xwindow != NULL); + g_return_if_fail (GST_IS_XIMAGESINK (ximagesink)); + /* Update the window geometry */ + g_mutex_lock (ximagesink->x_lock); + XGetWindowAttributes (ximagesink->xcontext->disp, + ximagesink->xwindow->win, &attr); + g_mutex_unlock (ximagesink->x_lock); + ximagesink->xwindow->width = attr.width; + ximagesink->xwindow->height = attr.height; +} +static void gst_ximagesink_renegotiate_size (GstXImageSink *ximagesink) { g_return_if_fail (GST_IS_XIMAGESINK (ximagesink)); @@ -407,6 +426,11 @@ if (!ximagesink->xwindow) return; + gst_ximagesink_xwindow_update_geometry (ximagesink, ximagesink->xwindow); + if (ximagesink->sw_scaling_failed) + return; if (ximagesink->xwindow->width <= 1 || ximagesink->xwindow->height <= 1) @@ -454,6 +478,10 @@ GST_VIDEOSINK_HEIGHT (ximagesink)); } } + else + { + ximagesink->sw_scaling_failed = TRUE; + } } @@ -466,46 +494,11 @@ XEvent e; guint pointer_x = 0, pointer_y = 0; - gboolean pointer_moved = FALSE, window_configured = FALSE; + gboolean pointer_moved = FALSE; - /* First we get all structure modification events. Only the last one is - interesting */ - g_mutex_lock (ximagesink->x_lock); - while (XCheckWindowEvent (ximagesink->xcontext->disp, - ximagesink->xwindow->win, - StructureNotifyMask, &e)) - { - g_mutex_unlock (ximagesink->x_lock); - - switch (e.type) - { - case ConfigureNotify: - /* We ignore configure events from external window. Renegotiation - will only happen if the application tell us to do so through - gst_x_overlay_expose */ - if (ximagesink->xwindow->internal) - { - ximagesink->xwindow->width = e.xconfigure.width; - ximagesink->xwindow->height = e.xconfigure.height; - window_configured = TRUE; - } - break; - default: - } - - g_mutex_lock (ximagesink->x_lock); - } - g_mutex_unlock (ximagesink->x_lock); - - if (window_configured) - GST_DEBUG ("ximagesink window geometry is : %d,%d", - ximagesink->xwindow->width, ximagesink->xwindow->height); - gst_ximagesink_renegotiate_size (ximagesink); + gst_ximagesink_renegotiate_size (ximagesink); /* Then we get all pointer motion events, only the last position is interesting. */ @@ -881,6 +874,7 @@ break; case GST_STATE_PAUSED_TO_READY: ximagesink->framerate = 0; + ximagesink->sw_scaling_failed = FALSE; GST_VIDEOSINK_WIDTH (ximagesink) = 0; GST_VIDEOSINK_HEIGHT (ximagesink) = 0; @@ -1249,28 +1243,18 @@ gst_ximagesink_expose (GstXOverlay *overlay) - XWindowAttributes attr; GstXImageSink *ximagesink = GST_XIMAGESINK (overlay); /* We don't act on internal window from outside that could cause some thread race with the video sink own thread checking for configure event */ if (ximagesink->xwindow->internal) - /* Update the window geometry */ - XGetWindowAttributes (ximagesink->xcontext->disp, - ximagesink->xwindow->win, &attr); - ximagesink->xwindow->width = attr.width; - ximagesink->xwindow->height = attr.height; - gst_ximagesink_renegotiate_size (ximagesink); gst_ximagesink_xwindow_clear (ximagesink, ximagesink->xwindow); if (ximagesink->cur_image) @@ -1397,6 +1381,9 @@ ximagesink->image_pool = NULL; ximagesink->pool_lock = g_mutex_new (); + ximagesink->sw_scaling_failed = FALSE; + ximagesink->synchronous = FALSE; GST_FLAG_SET(ximagesink, GST_ELEMENT_THREAD_SUGGESTED); GST_FLAG_SET(ximagesink, GST_ELEMENT_EVENT_AWARE); Index: ximagesink.h RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- a/ximagesink.h 3 Feb 2004 23:05:46 -0000 1.17 +++ b/ximagesink.h 18 Feb 2004 21:16:50 -0000 1.18 @@ -125,6 +125,7 @@ GSList *image_pool; gboolean synchronous; + gboolean sw_scaling_failed; }; struct _GstXImageSinkClass { Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- a/xvimagesink.c 17 Feb 2004 11:06:52 -0000 1.54 +++ b/xvimagesink.c 18 Feb 2004 21:16:50 -0000 1.55 @@ -1766,6 +1766,8 @@ xvimagesink->image_pool = NULL; xvimagesink->pool_lock = g_mutex_new (); + xvimagesink->synchronous = FALSE; GST_FLAG_SET(xvimagesink, GST_ELEMENT_THREAD_SUGGESTED); GST_FLAG_SET(xvimagesink, GST_ELEMENT_EVENT_AWARE); |
From: Julien M. <do...@pd...> - 2004-06-27 18:53:17
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Mon Jun 28 2004 04:53:16 EST Log message: 2004-06-27 Julien Moutte <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), (gst_ximagesink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_xwindow_new): Trying to fix the random behaviour of window decorations. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.824&r2=1.825 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.79&r2=1.80 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.66&r2=1.67 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.824 retrieving revision 1.825 diff -u -d -r1.824 -r1.825 --- ChangeLog 27 Jun 2004 16:38:41 -0000 1.824 +++ ChangeLog 27 Jun 2004 18:53:03 -0000 1.825 @@ -1,3 +1,11 @@ +2004-06-27 Julien Moutte <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), + (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), + (gst_xvimagesink_xwindow_new): Trying to fix the random behaviour of + window decorations. 2004-06-27 Wim Taymans <wi...@fl...> * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), Index: ximagesink.c RCS file: /cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.79 retrieving revision 1.80 diff -u -d -r1.79 -r1.80 --- ximagesink.c 17 Jun 2004 14:15:23 -0000 1.79 +++ ximagesink.c 27 Jun 2004 18:53:04 -0000 1.80 @@ -33,6 +33,18 @@ GST_DEBUG_CATEGORY_STATIC (gst_debug_ximagesink); #define GST_CAT_DEFAULT gst_debug_ximagesink +typedef struct +{ + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long input_mode; + unsigned long status; +} +MotifWmHints, MwmHints; +#define MWM_HINTS_DECORATIONS (1L << 1) static void gst_ximagesink_buffer_free (GstBuffer * buffer); /* ElementFactory information */ @@ -287,6 +299,38 @@ g_mutex_unlock (ximagesink->x_lock); } +static gboolean +gst_ximagesink_xwindow_decorate (GstXImageSink * ximagesink, + GstXWindow * window) + Atom hints_atom = None; + MotifWmHints *hints; + g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), FALSE); + g_return_val_if_fail (window != NULL, FALSE); + hints_atom = XInternAtom (ximagesink->xcontext->disp, "_MOTIF_WM_HINTS", 1); + hints = g_malloc0 (sizeof (MotifWmHints)); + if (!hints) { + return FALSE; + } + hints->flags |= MWM_HINTS_DECORATIONS; + hints->decorations = 1 << 0; + XChangeProperty (ximagesink->xcontext->disp, window->win, + hints_atom, hints_atom, 32, PropModeReplace, + (guchar *) hints, sizeof (MotifWmHints) / sizeof (long)); + XSync (ximagesink->xcontext->disp, FALSE); + g_free (hints); + return TRUE; /* This function handles a GstXWindow creation */ static GstXWindow * gst_ximagesink_xwindow_new (GstXImageSink * ximagesink, gint width, gint height) @@ -315,6 +359,8 @@ XMapRaised (ximagesink->xcontext->disp, xwindow->win); + gst_ximagesink_xwindow_decorate (ximagesink, xwindow); XSync (ximagesink->xcontext->disp, FALSE); Index: xvimagesink.c RCS file: /cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- xvimagesink.c 17 Jun 2004 14:15:23 -0000 1.66 +++ xvimagesink.c 27 Jun 2004 18:53:04 -0000 1.67 @@ -34,6 +34,18 @@ GST_DEBUG_CATEGORY_STATIC (gst_debug_xvimagesink); #define GST_CAT_DEFAULT gst_debug_xvimagesink static void gst_xvimagesink_buffer_free (GstBuffer * buffer); @@ -298,6 +310,38 @@ g_mutex_unlock (xvimagesink->x_lock); +gst_xvimagesink_xwindow_decorate (GstXvImageSink * xvimagesink, + g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), FALSE); + hints_atom = XInternAtom (xvimagesink->xcontext->disp, "_MOTIF_WM_HINTS", 1); + XChangeProperty (xvimagesink->xcontext->disp, window->win, + XSync (xvimagesink->xcontext->disp, FALSE); gst_xvimagesink_xwindow_new (GstXvImageSink * xvimagesink, @@ -330,6 +374,8 @@ XMapRaised (xvimagesink->xcontext->disp, xwindow->win); + gst_xvimagesink_xwindow_decorate (xvimagesink, xwindow); XSync (xvimagesink->xcontext->disp, FALSE); |
From: Julien M. <do...@pd...> - 2004-06-27 19:02:43
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Mon Jun 28 2004 05:02:41 EST Log message: 2004-06-27 Julien Moutte <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), (gst_ximagesink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_xwindow_new): I prefer locking the mutex in the function directly. We might want to call it from somewhere else one day. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.825&r2=1.826 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.80&r2=1.81 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.67&r2=1.68 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.825 retrieving revision 1.826 diff -u -d -r1.825 -r1.826 --- ChangeLog 27 Jun 2004 18:53:03 -0000 1.825 +++ ChangeLog 27 Jun 2004 19:02:29 -0000 1.826 @@ -3,6 +3,14 @@ * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), (gst_ximagesink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), + (gst_xvimagesink_xwindow_new): I prefer locking the mutex in the + function directly. We might want to call it from somewhere else one day. + +2004-06-27 Julien Moutte <ju...@mo...> + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), + (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_xwindow_new): Trying to fix the random behaviour of window decorations. Index: ximagesink.c RCS file: /cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- ximagesink.c 27 Jun 2004 18:53:04 -0000 1.80 +++ ximagesink.c 27 Jun 2004 19:02:29 -0000 1.81 @@ -309,6 +309,8 @@ g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), FALSE); g_return_val_if_fail (window != NULL, FALSE); + g_mutex_lock (ximagesink->x_lock); hints_atom = XInternAtom (ximagesink->xcontext->disp, "_MOTIF_WM_HINTS", 1); hints = g_malloc0 (sizeof (MotifWmHints)); @@ -326,6 +328,8 @@ XSync (ximagesink->xcontext->disp, FALSE); + g_mutex_unlock (ximagesink->x_lock); g_free (hints); return TRUE; @@ -359,12 +363,12 @@ XMapRaised (ximagesink->xcontext->disp, xwindow->win); - gst_ximagesink_xwindow_decorate (ximagesink, xwindow); - g_mutex_unlock (ximagesink->x_lock); + gst_ximagesink_xwindow_decorate (ximagesink, xwindow); gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (ximagesink), xwindow->win); return xwindow; Index: xvimagesink.c RCS file: /cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.67 retrieving revision 1.68 diff -u -d -r1.67 -r1.68 --- xvimagesink.c 27 Jun 2004 18:53:04 -0000 1.67 +++ xvimagesink.c 27 Jun 2004 19:02:29 -0000 1.68 @@ -320,6 +320,8 @@ g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), FALSE); + g_mutex_lock (xvimagesink->x_lock); hints_atom = XInternAtom (xvimagesink->xcontext->disp, "_MOTIF_WM_HINTS", 1); @@ -337,6 +339,8 @@ XSync (xvimagesink->xcontext->disp, FALSE); + g_mutex_unlock (xvimagesink->x_lock); @@ -374,12 +378,12 @@ XMapRaised (xvimagesink->xcontext->disp, xwindow->win); - gst_xvimagesink_xwindow_decorate (xvimagesink, xwindow); g_mutex_unlock (xvimagesink->x_lock); + gst_xvimagesink_xwindow_decorate (xvimagesink, xwindow); gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (xvimagesink), xwindow->win); |
From: <do...@fr...> - 2004-07-16 11:16:24
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Fri Jul 16 2004 20:49:04 EST Log message: 2004-07-16 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), (gst_ximagesink_sink_link), (gst_ximagesink_chain), (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): * sys/xvimage/xvimagesink.h: Getting the 2 video sinks synchronized again. Using internal data pointer of the x(v)image to store image's data to be coherent with the buffer alloc mechanism. Investigated the image destruction code to be sure that everything gets freed correctly. Modified files: . : ChangeLog sys/ximage : ximagesink.c ximagesink.h sys/xvimage : xvimagesink.c xvimagesink.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.878&r2=1.879 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.83&r2=1.84 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.h.diff?r1=1.22&r2=1.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.71&r2=1.72 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.h.diff?r1=1.19&r2=1.20 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.878 retrieving revision 1.879 diff -u -d -r1.878 -r1.879 --- ChangeLog 16 Jul 2004 10:45:33 -0000 1.878 +++ ChangeLog 16 Jul 2004 10:48:51 -0000 1.879 @@ -1,3 +1,20 @@ +2004-07-16 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), + (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), + (gst_ximagesink_ximage_destroy), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_buffer_free), + (gst_ximagesink_buffer_alloc): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc): + * sys/xvimage/xvimagesink.h: Getting the 2 video sinks synchronized + again. Using internal data pointer of the x(v)image to store image's + data to be coherent with the buffer alloc mechanism. Investigated the + image destruction code to be sure that everything gets freed correctly. 2004-07-16 Wim Taymans <wi...@fl...> * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), Index: ximagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.83 retrieving revision 1.84 diff -u -d -r1.83 -r1.84 --- ximagesink.c 16 Jul 2004 10:33:27 -0000 1.83 +++ ximagesink.c 16 Jul 2004 10:48:52 -0000 1.84 @@ -74,7 +74,7 @@ }; static GstVideoSinkClass *parent_class = NULL; -static gboolean error_catched = FALSE; +static gboolean error_caught = FALSE; /* ============================================================= */ /* */ @@ -91,7 +91,7 @@ XGetErrorText (display, xevent->error_code, error_msg, 1024); GST_DEBUG ("ximagesink failed to use XShm calls. error: %s", error_msg); - error_catched = TRUE; + error_caught = TRUE; return 0; } @@ -100,15 +100,20 @@ static gboolean gst_ximagesink_check_xshm_calls (GstXContext * xcontext) { +#ifndef HAVE_XSHM + return FALSE; +#else GstXImage *ximage = NULL; int (*handler) (Display *, XErrorEvent *); + gboolean result = FALSE; g_return_val_if_fail (xcontext != NULL, FALSE); -#ifdef HAVE_XSHM ximage = g_new0 (GstXImage, 1); + g_return_val_if_fail (ximage != NULL, FALSE); /* Setting an error handler to catch failure */ + error_caught = FALSE; handler = XSetErrorHandler (gst_ximagesink_handle_xerror); ximage->size = (xcontext->bpp / 8); @@ -116,6 +121,8 @@ /* Trying to create a 1x1 picture */ ximage->ximage = XShmCreateImage (xcontext->disp, xcontext->visual, xcontext->depth, ZPixmap, NULL, &ximage->SHMInfo, 1, 1); + if (!ximage->ximage) + goto out; ximage->SHMInfo.shmid = shmget (IPC_PRIVATE, ximage->size, IPC_CREAT | 0777); ximage->SHMInfo.shmaddr = shmat (ximage->SHMInfo.shmid, 0, 0); @@ -124,32 +131,28 @@ XShmAttach (xcontext->disp, &ximage->SHMInfo); - error_catched = FALSE; - XSync (xcontext->disp, 0); - XSetErrorHandler (handler); - if (error_catched) { /* Failed, detaching shared memory, destroying image and telling we can't - use XShm */ - error_catched = FALSE; - XDestroyImage (ximage->ximage); + if (error_caught) { + /* Failed, detaching shared memory, destroying image and telling we can't + use XShm */ + error_caught = FALSE; shmdt (ximage->SHMInfo.shmaddr); shmctl (ximage->SHMInfo.shmid, IPC_RMID, 0); - g_free (ximage); - XSync (xcontext->disp, FALSE); - return FALSE; } else { XShmDetach (xcontext->disp, &ximage->SHMInfo); + result = TRUE; } +out: + XSetErrorHandler (handler); + if (ximage->ximage) + XFree (ximage->ximage); + g_free (ximage); + XSync (xcontext->disp, FALSE); + return result; #endif /* HAVE_XSHM */ - return TRUE; /* This function handles GstXImage creation depending on XShm availability */ @@ -164,7 +167,6 @@ ximage->width = width; ximage->height = height; - ximage->data = NULL; ximage->ximagesink = ximagesink; g_mutex_lock (ximagesink->x_lock); @@ -196,25 +198,24 @@ } else { - ximage->data = g_malloc (ximage->size); ximage->ximage = XCreateImage (ximagesink->xcontext->disp, ximagesink->xcontext->visual, ximagesink->xcontext->depth, - ZPixmap, 0, ximage->data, + ZPixmap, 0, NULL, ximage->width, ximage->height, ximagesink->xcontext->bpp, ximage->width * (ximagesink->xcontext->bpp / 8)); + ximage->ximage->data = g_malloc (ximage->size); XSync (ximagesink->xcontext->disp, FALSE); if (!ximage->ximage) { - if (ximage->data) - g_free (ximage->data); + if (ximage->ximage->data) { + g_free (ximage->ximage->data); + } g_free (ximage); ximage = NULL; @@ -252,8 +253,9 @@ - if (ximage->ximage) + if (ximage->ximage) { XDestroyImage (ximage->ximage); XSync (ximagesink->xcontext->disp, FALSE); @@ -823,23 +825,30 @@ gst_structure_get_int (structure, "pixel_height", &ximagesink->pixel_height); /* Creating our window and our image */ - if (!ximagesink->xwindow) + if (!ximagesink->xwindow) { ximagesink->xwindow = gst_ximagesink_xwindow_new (ximagesink, GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); - else { - if (ximagesink->xwindow->internal) + } else { + if (ximagesink->xwindow->internal) { gst_ximagesink_xwindow_resize (ximagesink, ximagesink->xwindow, GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); - if ((ximagesink->ximage) && ((GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) || (GST_VIDEOSINK_HEIGHT (ximagesink) != ximagesink->ximage->height))) { /* We renew our ximage only if size changed */ + if ((ximagesink->ximage) + && ((GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) + || (GST_VIDEOSINK_HEIGHT (ximagesink) != + ximagesink->ximage->height))) { + /* We renew our ximage only if size changed */ gst_ximagesink_ximage_destroy (ximagesink, ximagesink->ximage); ximagesink->ximage = gst_ximagesink_ximage_new (ximagesink, - } else if (!ximagesink->ximage) /* If no ximage, creating one */ + } else if (!ximagesink->ximage) { + /* If no ximage, creating one */ + } gst_x_overlay_got_desired_size (GST_X_OVERLAY (ximagesink), GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); @@ -935,15 +944,16 @@ put the ximage which is in the PRIVATE pointer */ if (GST_BUFFER_FREE_DATA_FUNC (buf) == gst_ximagesink_buffer_free) { gst_ximagesink_ximage_put (ximagesink, GST_BUFFER_PRIVATE (buf)); - } else { /* Else we have to copy the data into our private image, */ + /* Else we have to copy the data into our private image, */ /* if we have one... */ if (ximagesink->ximage) { memcpy (ximagesink->ximage->ximage->data, GST_BUFFER_DATA (buf), MIN (GST_BUFFER_SIZE (buf), ximagesink->ximage->size)); gst_ximagesink_ximage_put (ximagesink, ximagesink->ximage); - } else { /* No image available. Something went wrong during capsnego ! */ + } else { + /* No image available. Something went wrong during capsnego ! */ gst_buffer_unref (buf); GST_ELEMENT_ERROR (ximagesink, CORE, NEGOTIATION, (NULL), ("no format defined before chain function")); @@ -978,8 +988,8 @@ if ((ximage->width != GST_VIDEOSINK_WIDTH (ximagesink)) || (ximage->height != GST_VIDEOSINK_HEIGHT (ximagesink))) gst_ximagesink_ximage_destroy (ximagesink, ximage); - else { /* In that case we can reuse the image and add it to our image pool. */ + else { + /* In that case we can reuse the image and add it to our image pool. */ g_mutex_lock (ximagesink->pool_lock); ximagesink->image_pool = g_slist_prepend (ximagesink->image_pool, ximage); g_mutex_unlock (ximagesink->pool_lock); @@ -1008,11 +1018,13 @@ ximagesink->image_pool = g_slist_delete_link (ximagesink->image_pool, ximagesink->image_pool); - if ((ximage->width != GST_VIDEOSINK_WIDTH (ximagesink)) || (ximage->height != GST_VIDEOSINK_HEIGHT (ximagesink))) { /* This image is unusable. Destroying... */ + if ((ximage->width != GST_VIDEOSINK_WIDTH (ximagesink)) || + (ximage->height != GST_VIDEOSINK_HEIGHT (ximagesink))) { + /* This image is unusable. Destroying... */ gst_ximagesink_ximage_destroy (ximagesink, ximage); ximage = NULL; - } else { /* We found a suitable image */ + } else { + /* We found a suitable image */ break; } } @@ -1020,7 +1032,8 @@ g_mutex_unlock (ximagesink->pool_lock); - if (!ximage) { /* We found no suitable image in the pool. Creating... */ + if (!ximage) { + /* We found no suitable image in the pool. Creating... */ ximage = gst_ximagesink_ximage_new (ximagesink, Index: ximagesink.h RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- ximagesink.h 16 Apr 2004 23:42:12 -0000 1.22 +++ ximagesink.h 16 Jul 2004 10:48:52 -0000 1.23 @@ -99,7 +99,6 @@ XShmSegmentInfo SHMInfo; - char *data; gint width, height, size; Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.71 retrieving revision 1.72 diff -u -d -r1.71 -r1.72 --- xvimagesink.c 16 Jul 2004 10:33:27 -0000 1.71 +++ xvimagesink.c 16 Jul 2004 10:48:52 -0000 1.72 @@ -119,6 +119,7 @@ xvimage = g_new0 (GstXvImage, 1); + g_return_val_if_fail (xvimage != NULL, FALSE); error_caught = FALSE; @@ -148,7 +149,6 @@ error_caught = FALSE; shmdt (xvimage->SHMInfo.shmaddr); shmctl (xvimage->SHMInfo.shmid, IPC_RMID, 0); XShmDetach (xcontext->disp, &xvimage->SHMInfo); @@ -178,7 +178,6 @@ xvimage->width = width; xvimage->height = height; - xvimage->data = NULL; xvimage->xvimagesink = xvimagesink; g_mutex_lock (xvimagesink->x_lock); @@ -210,22 +209,23 @@ + /* We use image's internal data pointer */ xvimage->xvimage = XvCreateImage (xvimagesink->xcontext->disp, xvimagesink->xcontext->xv_port_id, xvimagesink->xcontext->im_format, - xvimage->data, xvimage->width, xvimage->height); + NULL, xvimage->width, xvimage->height); + /* Allocating memory for image's data */ xvimage->xvimage->data = g_malloc (xvimage->xvimage->data_size); XSync (xvimagesink->xcontext->disp, FALSE); if (!xvimage->xvimage) { - if (xvimage->data) - g_free (xvimage->data); + if (xvimage->xvimage->data) { + g_free (xvimage->xvimage->data); g_free (xvimage); xvimage = NULL; @@ -265,7 +265,11 @@ if (xvimage->xvimage) { - g_free (xvimage->xvimage->data); + /* Freeing image data */ + if (xvimage->xvimage->data) { + g_free (xvimage->xvimage->data); + } + /* Freeing image itself */ XFree (xvimage->xvimage); @@ -1235,15 +1239,16 @@ if (GST_BUFFER_FREE_DATA_FUNC (buf) == gst_xvimagesink_buffer_free) { gst_xvimagesink_xvimage_put (xvimagesink, GST_BUFFER_PRIVATE (buf)); if (xvimagesink->xvimage) { memcpy (xvimagesink->xvimage->xvimage->data, MIN (GST_BUFFER_SIZE (buf), xvimagesink->xvimage->size)); gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->xvimage); GST_ELEMENT_ERROR (xvimagesink, CORE, NEGOTIATION, (NULL), @@ -1278,8 +1283,8 @@ if ((xvimage->width != GST_VIDEOSINK_WIDTH (xvimagesink)) || (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink))) gst_xvimagesink_xvimage_destroy (xvimagesink, xvimage); g_mutex_lock (xvimagesink->pool_lock); xvimagesink->image_pool = g_slist_prepend (xvimagesink->image_pool, xvimage); @@ -1309,11 +1314,13 @@ xvimagesink->image_pool = g_slist_delete_link (xvimagesink->image_pool, xvimagesink->image_pool); - if ((xvimage->width != GST_VIDEOSINK_WIDTH (xvimagesink)) || (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink))) { /* This image is unusable. Destroying... */ + if ((xvimage->width != GST_VIDEOSINK_WIDTH (xvimagesink)) || + (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink))) { gst_xvimagesink_xvimage_destroy (xvimagesink, xvimage); xvimage = NULL; @@ -1321,7 +1328,8 @@ g_mutex_unlock (xvimagesink->pool_lock); - if (!xvimage) { /* We found no suitable image in the pool. Creating... */ + if (!xvimage) { xvimage = gst_xvimagesink_xvimage_new (xvimagesink, GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink)); Index: xvimagesink.h RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- xvimagesink.h 16 Apr 2004 23:42:12 -0000 1.19 +++ xvimagesink.h 16 Jul 2004 10:48:52 -0000 1.20 @@ -115,7 +115,6 @@ |
From: <do...@fr...> - 2004-07-21 11:02:51
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Wed Jul 21 2004 21:02:44 EST Log message: 2004-07-21 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), (gst_ximagesink_renegotiate_size), (gst_ximagesink_sink_link), (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id): Optimize images creation for both elements. We don't create the image on caps nego or renego, we just destroy the internal one if present if it does not match the needs. The chain function takes care of creating a new image when needed. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_sink_link), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id): Additionally xvimage now contains the image format information. The buffer pool checks for the context image format and discard images with different formats. * sys/xvimage/xvimagesink.h: Adding im_format in the xvimage structure. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c xvimagesink.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.892&r2=1.893 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.87&r2=1.88 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.74&r2=1.75 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.h.diff?r1=1.21&r2=1.22 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.892 retrieving revision 1.893 diff -u -d -r1.892 -r1.893 --- ChangeLog 21 Jul 2004 09:23:39 -0000 1.892 +++ ChangeLog 21 Jul 2004 11:02:31 -0000 1.893 @@ -1,3 +1,20 @@ +2004-07-21 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id): Optimize + images creation for both elements. We don't create the image on caps + nego or renego, we just destroy the internal one if present if it does + not match the needs. The chain function takes care of creating a new + image when needed. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_xwindow_id): Additionally xvimage now contains + the image format information. The buffer pool checks for the context + image format and discard images with different formats. + * sys/xvimage/xvimagesink.h: Adding im_format in the xvimage structure. 2004-07-21 Thomas Vander Stichele <thomas at apestaart dot org> * gst/ffmpegcolorspace/gstffmpegcolorspace.c: Index: ximagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.87 retrieving revision 1.88 diff -u -d -r1.87 -r1.88 --- ximagesink.c 20 Jul 2004 19:15:41 -0000 1.87 +++ ximagesink.c 21 Jul 2004 11:02:32 -0000 1.88 @@ -510,10 +510,7 @@ ximagesink->ximage->height))) { /* We renew our ximage only if size changed */ gst_ximagesink_ximage_destroy (ximagesink, ximagesink->ximage); - - ximagesink->ximage = gst_ximagesink_ximage_new (ximagesink, - GST_VIDEOSINK_WIDTH (ximagesink), - GST_VIDEOSINK_HEIGHT (ximagesink)); + ximagesink->ximage = NULL; } } else { ximagesink->sw_scaling_failed = TRUE; @@ -824,6 +821,8 @@ gst_structure_get_int (structure, "pixel_height", &ximagesink->pixel_height); /* Creating our window and our image */ + g_assert (GST_VIDEOSINK_WIDTH (ximagesink) > 0); + g_assert (GST_VIDEOSINK_HEIGHT (ximagesink) > 0); if (!ximagesink->xwindow) { ximagesink->xwindow = gst_ximagesink_xwindow_new (ximagesink, GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); @@ -834,18 +833,13 @@ } } - if ((ximagesink->ximage) - && ((GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) - || (GST_VIDEOSINK_HEIGHT (ximagesink) != ximagesink->ximage->height))) { - /* We renew our ximage only if size changed */ + /* If our ximage has changed we destroy it, next chain iteration will create + a new one */ + if ((ximagesink->ximage) && + ((GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) || + (GST_VIDEOSINK_HEIGHT (ximagesink) != ximagesink->ximage->height))) { gst_ximagesink_ximage_destroy (ximagesink, ximagesink->ximage); - ximagesink->ximage = gst_ximagesink_ximage_new (ximagesink, - GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); - } else if (!ximagesink->ximage) { - /* If no ximage, creating one */ + ximagesink->ximage = NULL; gst_x_overlay_got_desired_size (GST_X_OVERLAY (ximagesink), @@ -949,18 +943,22 @@ } else { /* Else we have to copy the data into our private image, */ /* if we have one... */ - if (ximagesink->ximage) { - memcpy (ximagesink->ximage->ximage->data, - GST_BUFFER_DATA (buf), - MIN (GST_BUFFER_SIZE (buf), ximagesink->ximage->size)); - gst_ximagesink_ximage_put (ximagesink, ximagesink->ximage); - } else { - /* No image available. Something went wrong during capsnego ! */ - gst_buffer_unref (buf); - GST_ELEMENT_ERROR (ximagesink, CORE, NEGOTIATION, (NULL), - ("no format defined before chain function")); - return; + if (!ximagesink->ximage) { + ximagesink->ximage = gst_ximagesink_ximage_new (ximagesink, + GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); + if (!ximagesink->ximage) { + /* No image available. That's very bad ! */ + gst_buffer_unref (buf); + GST_ELEMENT_ERROR (ximagesink, CORE, NEGOTIATION, (NULL), + ("Failed creating an XImage in ximagesink chain function.")); + return; + } + memcpy (ximagesink->ximage->ximage->data, + GST_BUFFER_DATA (buf), + MIN (GST_BUFFER_SIZE (buf), ximagesink->ximage->size)); + gst_ximagesink_ximage_put (ximagesink, ximagesink->ximage); /* set correct time for next buffer */ @@ -1199,13 +1197,6 @@ - /* Recreating our ximage */ - if (!ximagesink->ximage && - GST_VIDEOSINK_WIDTH (ximagesink) && GST_VIDEOSINK_HEIGHT (ximagesink)) { - } if (xwindow) ximagesink->xwindow = xwindow; } Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- xvimagesink.c 19 Jul 2004 11:33:32 -0000 1.74 +++ xvimagesink.c 21 Jul 2004 11:02:32 -0000 1.75 @@ -178,6 +178,7 @@ xvimage->width = width; xvimage->height = height; + xvimage->im_format = xvimagesink->xcontext->im_format; xvimage->xvimagesink = xvimagesink; g_mutex_lock (xvimagesink->x_lock); @@ -189,8 +190,8 @@ if (xvimagesink->xcontext->use_xshm) { xvimage->xvimage = XvShmCreateImage (xvimagesink->xcontext->disp, xvimagesink->xcontext->xv_port_id, - xvimagesink->xcontext->im_format, - NULL, xvimage->width, xvimage->height, &xvimage->SHMInfo); + xvimage->im_format, NULL, + xvimage->width, xvimage->height, &xvimage->SHMInfo); xvimage->SHMInfo.shmid = shmget (IPC_PRIVATE, xvimage->size, IPC_CREAT | 0777); @@ -212,8 +213,7 @@ /* We use image's internal data pointer */ xvimage->xvimage = XvCreateImage (xvimagesink->xcontext->disp, - NULL, xvimage->width, xvimage->height); + xvimage->im_format, NULL, xvimage->width, xvimage->height); /* Allocating memory for image's data */ xvimage->xvimage->data = g_malloc (xvimage->xvimage->data_size); @@ -332,13 +332,12 @@ hints_atom = XInternAtom (xvimagesink->xcontext->disp, "_MOTIF_WM_HINTS", 1); - hints = g_malloc0 (sizeof (MotifWmHints)); - if (!hints) { + if (hints_atom == None) { return FALSE; + hints = g_malloc0 (sizeof (MotifWmHints)); hints->flags |= MWM_HINTS_DECORATIONS; hints->decorations = 1 << 0; @@ -1124,7 +1123,7 @@ /* We renew our xvimage only if size or format changed */ if ((xvimagesink->xvimage) && - ((xvimagesink->xcontext->im_format != im_format) || + ((im_format != xvimagesink->xvimage->im_format) || (GST_VIDEOSINK_WIDTH (xvimagesink) != xvimagesink->xvimage->width) || (GST_VIDEOSINK_HEIGHT (xvimagesink) != xvimagesink->xvimage->height))) { @@ -1134,17 +1133,11 @@ GST_FOURCC_ARGS (im_format)); GST_DEBUG_OBJECT (xvimagesink, "renewing xvimage"); gst_xvimagesink_xvimage_destroy (xvimagesink, xvimagesink->xvimage); - xvimagesink->xcontext->im_format = im_format; - xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink, - GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink)); - } else if (!xvimagesink->xvimage) { - /* If no xvimage, creating one */ + xvimagesink->xvimage = NULL; + xvimagesink->xcontext->im_format = im_format; gst_x_overlay_got_desired_size (GST_X_OVERLAY (xvimagesink), GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink)); @@ -1246,18 +1239,23 @@ - if (xvimagesink->xvimage) { - memcpy (xvimagesink->xvimage->xvimage->data, - MIN (GST_BUFFER_SIZE (buf), xvimagesink->xvimage->size)); - gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->xvimage); - GST_ELEMENT_ERROR (xvimagesink, CORE, NEGOTIATION, (NULL), + if (!xvimagesink->xvimage) { + xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink, + GST_VIDEOSINK_WIDTH (xvimagesink), + GST_VIDEOSINK_HEIGHT (xvimagesink)); + if (!xvimagesink->xvimage) { + GST_ELEMENT_ERROR (xvimagesink, CORE, NEGOTIATION, (NULL), + ("Failed creating an XvImage in xvimagesink chain function.")); + memcpy (xvimagesink->xvimage->xvimage->data, + MIN (GST_BUFFER_SIZE (buf), xvimagesink->xvimage->size)); + gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->xvimage); @@ -1318,8 +1316,10 @@ xvimagesink->image_pool = g_slist_delete_link (xvimagesink->image_pool, xvimagesink->image_pool); + /* We check for geometry or image format changes */ if ((xvimage->width != GST_VIDEOSINK_WIDTH (xvimagesink)) || - (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink))) { + (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink)) || + (xvimage->im_format != xvimagesink->xcontext->im_format)) { /* This image is unusable. Destroying... */ gst_xvimagesink_xvimage_destroy (xvimagesink, xvimage); xvimage = NULL; @@ -1467,13 +1467,6 @@ g_mutex_unlock (xvimagesink->x_lock); - /* Recreating our xvimage */ - if (!xvimagesink->xvimage && - GST_VIDEOSINK_WIDTH (xvimagesink) && GST_VIDEOSINK_HEIGHT (xvimagesink)) { xvimagesink->xwindow = xwindow; Index: xvimagesink.h RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- xvimagesink.h 19 Jul 2004 11:16:48 -0000 1.21 +++ xvimagesink.h 21 Jul 2004 11:02:32 -0000 1.22 @@ -115,7 +115,7 @@ XShmSegmentInfo SHMInfo; #endif /* HAVE_XSHM */ - gint width, height, size; + gint width, height, size, im_format; }; struct _GstXvImageSink { |
From: <do...@fr...> - 2004-09-22 16:00:10
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Wed Sep 22 2004 09:00:08 PDT Log message: 2004-09-22 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls): Fix mistakes from thaytan's patches. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1081&r2=1.1082 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.104&r2=1.105 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.88&r2=1.89 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1081 retrieving revision 1.1082 diff -u -d -r1.1081 -r1.1082 --- ChangeLog 22 Sep 2004 15:32:39 -0000 1.1081 +++ ChangeLog 22 Sep 2004 15:59:56 -0000 1.1082 @@ -1,3 +1,9 @@ +2004-09-22 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls): Fix + mistakes from thaytan's patches. 2004-09-23 Jan Schmidt <th...@ma...> * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): Index: ximagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.104 retrieving revision 1.105 diff -u -d -r1.104 -r1.105 --- ximagesink.c 22 Sep 2004 15:32:39 -0000 1.104 +++ ximagesink.c 22 Sep 2004 15:59:56 -0000 1.105 @@ -284,7 +284,7 @@ if (ximagesink->xcontext->use_xshm) { if (ximage->SHMInfo.shmaddr != ((void *) -1)) { XShmDetach (ximagesink->xcontext->disp, &ximage->SHMInfo); - XSync (xcontext->disp, 0); + XSync (ximagesink->xcontext->disp, 0); shmdt (ximage->SHMInfo.shmaddr); } if (ximage->SHMInfo.shmid > 0) @@ -296,9 +296,6 @@ #endif /* HAVE_XSHM */ { if (ximage->ximage) { - if (ximage->ximage->data) { - g_free (ximage->ximage->data); - } XDestroyImage (ximage->ximage); } Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -d -r1.88 -r1.89 --- xvimagesink.c 22 Sep 2004 15:03:08 -0000 1.88 +++ xvimagesink.c 22 Sep 2004 15:59:56 -0000 1.89 @@ -169,7 +169,7 @@ shmctl (xvimage->SHMInfo.shmid, IPC_RMID, 0); /* To be sure, reset the SHMInfo entry */ - ximage->SHMInfo.shmaddr = ((void *) -1); + xvimage->SHMInfo.shmaddr = ((void *) -1); /* store whether we succeeded in result and reset error_caught */ result = !error_caught; |
From: <do...@fr...> - 2004-10-08 11:27:06
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Fri Oct 08 2004 04:27:01 PDT Log message: 2004-10-08 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): * sys/xvimage/xvimagesink.h: Reverting Ronald's changes as the issue is not coming from those elements. Moreover these elements should not keep the xid they have been given when in NULL state. Modified files: . : ChangeLog sys/ximage : ximagesink.c ximagesink.h sys/xvimage : xvimagesink.c xvimagesink.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1142&r2=1.1143 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.106&r2=1.107 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.h.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.90&r2=1.91 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.h.diff?r1=1.25&r2=1.26 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1142 retrieving revision 1.1143 diff -u -d -r1.1142 -r1.1143 --- ChangeLog 7 Oct 2004 16:22:30 -0000 1.1142 +++ ChangeLog 8 Oct 2004 11:26:48 -0000 1.1143 @@ -1,3 +1,14 @@ +2004-10-08 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: Reverting Ronald's changes as the issue is + not coming from those elements. Moreover these elements should not keep + the xid they have been given when in NULL state. 2004-10-07 Ronald S. Bultje <rb...@ro...> * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), Index: ximagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.106 retrieving revision 1.107 diff -u -d -r1.106 -r1.107 --- ximagesink.c 7 Oct 2004 16:22:30 -0000 1.106 +++ ximagesink.c 8 Oct 2004 11:26:49 -0000 1.107 @@ -49,9 +49,6 @@ static void gst_ximagesink_ximage_destroy (GstXImageSink * ximagesink, GstXImage * ximage); -static void gst_ximagesink_set_xwindow_id (GstXOverlay * overlay, - XID xwindow_id); - /* ElementFactory information */ static GstElementDetails gst_ximagesink_details = GST_ELEMENT_DETAILS ("Video sink", @@ -991,8 +988,8 @@ g_assert (GST_VIDEOSINK_WIDTH (ximagesink) > 0); g_assert (GST_VIDEOSINK_HEIGHT (ximagesink) > 0); if (!ximagesink->xwindow) { - gst_ximagesink_set_xwindow_id (GST_X_OVERLAY (ximagesink), - ximagesink->parent); + ximagesink->xwindow = gst_ximagesink_xwindow_new (ximagesink, + GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); } else { if (ximagesink->xwindow->internal) { gst_ximagesink_xwindow_resize (ximagesink, ximagesink->xwindow, @@ -1383,8 +1380,6 @@ if (xwindow) ximagesink->xwindow = xwindow; - ximagesink->parent = xwindow_id; } static void @@ -1539,7 +1534,6 @@ gst_ximagesink_buffer_alloc); ximagesink->display_name = NULL; - ximagesink->parent = 0; ximagesink->xcontext = NULL; ximagesink->xwindow = NULL; ximagesink->ximage = NULL; Index: ximagesink.h RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- ximagesink.h 7 Oct 2004 16:22:30 -0000 1.27 +++ ximagesink.h 8 Oct 2004 11:26:49 -0000 1.28 @@ -112,7 +112,6 @@ char *display_name; - Drawable parent; GstXContext *xcontext; GstXWindow *xwindow; GstXImage *ximage; Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- xvimagesink.c 7 Oct 2004 16:22:30 -0000 1.90 +++ xvimagesink.c 8 Oct 2004 11:26:49 -0000 1.91 @@ -50,8 +50,6 @@ static void gst_xvimagesink_xvimage_destroy (GstXvImageSink * xvimagesink, GstXvImage * xvimage); -static void gst_xvimagesink_set_xwindow_id (GstXOverlay * overlay, static GstElementDetails gst_xvimagesink_details = @@ -1280,8 +1278,8 @@ g_assert (GST_VIDEOSINK_WIDTH (xvimagesink) > 0); g_assert (GST_VIDEOSINK_HEIGHT (xvimagesink) > 0); if (!xvimagesink->xwindow) - gst_xvimagesink_set_xwindow_id (GST_X_OVERLAY (xvimagesink), - xvimagesink->parent); + xvimagesink->xwindow = gst_xvimagesink_xwindow_new (xvimagesink, + GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink)); else { if (xvimagesink->xwindow->internal) gst_xvimagesink_xwindow_resize (xvimagesink, xvimagesink->xwindow, @@ -1644,7 +1642,6 @@ xvimagesink->xwindow = xwindow; - xvimagesink->parent = xwindow_id; @@ -1918,7 +1915,6 @@ gst_xvimagesink_buffer_alloc); xvimagesink->display_name = NULL; - xvimagesink->parent = 0; xvimagesink->xcontext = NULL; xvimagesink->xwindow = NULL; xvimagesink->xvimage = NULL; Index: xvimagesink.h RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- xvimagesink.h 7 Oct 2004 16:22:30 -0000 1.25 +++ xvimagesink.h 8 Oct 2004 11:26:49 -0000 1.26 @@ -128,7 +128,6 @@ GstXvImage *xvimage; |
From: <do...@fr...> - 2004-11-08 14:32:10
|
CVS Root: /home/cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Mon Nov 08 2004 06:32:08 PST Log message: 2004-11-08 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_clear), (gst_ximagesink_finalize): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_finalize): Some more cleanups, leaks fixed and checks. Modified files: . : ChangeLog sys/ximage : ximagesink.c sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1268&r2=1.1269 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.107&r2=1.108 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.92&r2=1.93 ====Begin Diffs==== Index: ximagesink.c =================================================================== RCS file: /home/cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.107 retrieving revision 1.108 diff -u -d -r1.107 -r1.108 --- ximagesink.c 8 Oct 2004 11:26:49 -0000 1.107 +++ ximagesink.c 8 Nov 2004 14:31:55 -0000 1.108 @@ -856,6 +856,7 @@ gst_ximagesink_xcontext_clear (GstXImageSink * ximagesink) { g_return_if_fail (GST_IS_XIMAGESINK (ximagesink)); + g_return_if_fail (ximagesink->xcontext != NULL); gst_caps_free (ximagesink->xcontext->caps); g_free (ximagesink->xcontext->par); @@ -868,6 +869,7 @@ g_mutex_unlock (ximagesink->x_lock); + g_free (ximagesink->xcontext); ximagesink->xcontext = NULL; } @@ -1506,8 +1508,18 @@ ximagesink->display_name = NULL; } - g_mutex_free (ximagesink->x_lock); - g_mutex_free (ximagesink->pool_lock); + if (ximagesink->par) { + g_free (ximagesink->par); + ximagesink->par = NULL; + } + if (ximagesink->x_lock) { + g_mutex_free (ximagesink->x_lock); + ximagesink->x_lock = NULL; + if (ximagesink->pool_lock) { + g_mutex_free (ximagesink->pool_lock); + ximagesink->pool_lock = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); Index: xvimagesink.c RCS file: /home/cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.92 retrieving revision 1.93 diff -u -d -r1.92 -r1.93 --- xvimagesink.c 26 Oct 2004 11:36:53 -0000 1.92 +++ xvimagesink.c 8 Nov 2004 14:31:55 -0000 1.93 @@ -1054,6 +1054,7 @@ GList *formats_list, *channels_list; g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink)); + g_return_if_fail (xvimagesink->xcontext != NULL); formats_list = xvimagesink->xcontext->formats_list; @@ -1890,9 +1891,18 @@ xvimagesink->display_name = NULL; - g_free (xvimagesink->par); - g_mutex_free (xvimagesink->x_lock); - g_mutex_free (xvimagesink->pool_lock); + if (xvimagesink->par) { + g_free (xvimagesink->par); + xvimagesink->par = NULL; + if (xvimagesink->x_lock) { + g_mutex_free (xvimagesink->x_lock); + xvimagesink->x_lock = NULL; + if (xvimagesink->pool_lock) { + g_mutex_free (xvimagesink->pool_lock); + xvimagesink->pool_lock = NULL; Index: ChangeLog RCS file: /home/cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1268 retrieving revision 1.1269 diff -u -d -r1.1268 -r1.1269 --- ChangeLog 8 Nov 2004 09:48:31 -0000 1.1268 +++ ChangeLog 8 Nov 2004 14:31:55 -0000 1.1269 @@ -1,3 +1,10 @@ +2004-11-08 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_clear), + (gst_ximagesink_finalize): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_finalize): Some more cleanups, leaks fixed and checks. 2004-11-08 Wim Taymans <wi...@fl...> * gst/typefind/gsttypefindfunctions.c: (aac_type_find): |
From: <do...@fr...> - 2005-02-12 18:42:02
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: dolphy Date: Sat Feb 12 2005 10:42:01 PST Log message: 2005-02-12 Julien MOUTTE <ju...@mo...> * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), (gst_ximagesink_sink_link), (gst_ximagesink_change_state), (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_expose), (gst_ximagesink_set_property), (gst_ximagesink_finalize), (gst_ximagesink_init): Protect interface methods from chain and negotiation and vice versa (Fixes #166142). * sys/ximage/ximagesink.h: Add stream_lock. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_expose): Check for xcontext before trying to link. Modified files: . : ChangeLog sys/ximage : ximagesink.c ximagesink.h sys/xvimage : xvimagesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1620&r2=1.1621 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.111&r2=1.112 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.h.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.98&r2=1.99 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1620 retrieving revision 1.1621 diff -u -d -r1.1620 -r1.1621 --- ChangeLog 12 Feb 2005 17:37:37 -0000 1.1620 +++ ChangeLog 12 Feb 2005 18:41:48 -0000 1.1621 @@ -1,3 +1,17 @@ +2005-02-12 Julien MOUTTE <ju...@mo...> + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), + (gst_ximagesink_sink_link), (gst_ximagesink_change_state), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), + (gst_ximagesink_expose), (gst_ximagesink_set_property), + (gst_ximagesink_finalize), (gst_ximagesink_init): Protect interface + methods from chain and negotiation and vice versa (Fixes #166142). + * sys/ximage/ximagesink.h: Add stream_lock. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_expose): Check for xcontext before trying to link. 2005-02-12 Tim-Philipp Müller <tim at centricular dot net> * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_open): Index: ximagesink.c RCS file: /cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.111 retrieving revision 1.112 diff -u -d -r1.111 -r1.112 --- ximagesink.c 5 Feb 2005 23:01:59 -0000 1.111 +++ ximagesink.c 12 Feb 2005 18:41:48 -0000 1.112 @@ -389,6 +389,7 @@ gst_ximagesink_xwindow_new (GstXImageSink * ximagesink, gint width, gint height) { GstXWindow *xwindow = NULL; + XGCValues values; g_return_val_if_fail (GST_IS_XIMAGESINK (ximagesink), NULL); @@ -408,7 +409,8 @@ StructureNotifyMask | PointerMotionMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask); - xwindow->gc = XCreateGC (ximagesink->xcontext->disp, xwindow->win, 0, NULL); + xwindow->gc = XCreateGC (ximagesink->xcontext->disp, xwindow->win, + 0, &values); XMapRaised (ximagesink->xcontext->disp, xwindow->win); @@ -976,6 +978,8 @@ if (!ret) return GST_PAD_LINK_REFUSED; + g_mutex_lock (ximagesink->stream_lock); /* if the caps contain pixel-aspect-ratio, they have to match ours, * otherwise linking should fail */ par = gst_structure_get_value (structure, "pixel-aspect-ratio"); @@ -1008,6 +1012,8 @@ ximagesink->ximage = NULL; } + g_mutex_unlock (ximagesink->stream_lock); gst_x_overlay_got_desired_size (GST_X_OVERLAY (ximagesink), GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); @@ -1031,7 +1037,9 @@ /* call XSynchronize with the current value of synchronous */ GST_DEBUG_OBJECT (ximagesink, "XSynchronize called with %s", ximagesink->synchronous ? "TRUE" : "FALSE"); + g_mutex_lock (ximagesink->x_lock); XSynchronize (ximagesink->xcontext->disp, ximagesink->synchronous); + g_mutex_unlock (ximagesink->x_lock); break; case GST_STATE_READY_TO_PAUSED: ximagesink->time = 0; @@ -1041,14 +1049,20 @@ case GST_STATE_PLAYING_TO_PAUSED: case GST_STATE_PAUSED_TO_READY: + g_mutex_lock (ximagesink->stream_lock); if (ximagesink->xwindow) gst_ximagesink_xwindow_clear (ximagesink, ximagesink->xwindow); ximagesink->framerate = 0; ximagesink->sw_scaling_failed = FALSE; GST_VIDEOSINK_WIDTH (ximagesink) = 0; GST_VIDEOSINK_HEIGHT (ximagesink) = 0; + g_mutex_unlock (ximagesink->stream_lock); case GST_STATE_READY_TO_NULL: + /* We are cleaning our resources here, yes i know chain is not running + but the interface can be called to set a window from a different thread + and that would crash */ if (ximagesink->ximage) { gst_ximagesink_ximage_destroy (ximagesink, ximagesink->ximage); ximagesink->ximage = NULL; @@ -1066,6 +1080,7 @@ gst_ximagesink_xcontext_clear (ximagesink); ximagesink->xcontext = NULL; } @@ -1091,6 +1106,8 @@ return; buf = GST_BUFFER (data); /* update time */ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { @@ -1139,6 +1156,8 @@ gst_buffer_unref (buf); gst_ximagesink_handle_xevents (ximagesink, pad); } /* Buffer management */ @@ -1302,6 +1321,11 @@ + /* We acquire the stream lock while setting this window in the element. + We are basically cleaning tons of stuff replacing the old window, putting + images while we do that would surely crash */ /* Clear image pool as the images are unusable anyway */ gst_ximagesink_imagepool_clear (ximagesink); @@ -1385,6 +1409,8 @@ if (xwindow) ximagesink->xwindow = xwindow; static void @@ -1405,6 +1431,10 @@ if (!ximagesink->xwindow) + /* We don't want chain to iterate while we do that. We might act on random + cur_image and different geometry */ gst_ximagesink_xwindow_update_geometry (ximagesink, ximagesink->xwindow); /* We don't act on internal window from outside that could cause some thread @@ -1416,6 +1446,8 @@ if (ximagesink->cur_image) gst_ximagesink_ximage_put (ximagesink, ximagesink->cur_image); @@ -1451,7 +1483,9 @@ if (ximagesink->xcontext) { GST_DEBUG_OBJECT (ximagesink, "XSynchronize called with %s", ximagesink->synchronous ? "TRUE" : "FALSE"); + g_mutex_lock (ximagesink->x_lock); XSynchronize (ximagesink->xcontext->disp, ximagesink->synchronous); + g_mutex_unlock (ximagesink->x_lock); case ARG_PIXEL_ASPECT_RATIO: @@ -1519,6 +1553,10 @@ g_mutex_free (ximagesink->x_lock); ximagesink->x_lock = NULL; + if (ximagesink->stream_lock) { + g_mutex_free (ximagesink->stream_lock); + ximagesink->stream_lock = NULL; + } if (ximagesink->pool_lock) { g_mutex_free (ximagesink->pool_lock); ximagesink->pool_lock = NULL; @@ -1557,7 +1595,7 @@ ximagesink->framerate = 0; ximagesink->x_lock = g_mutex_new (); - + ximagesink->stream_lock = g_mutex_new (); ximagesink->image_pool = NULL; ximagesink->pool_lock = g_mutex_new (); Index: ximagesink.h RCS file: /cvs/gstreamer/gst-plugins/sys/ximage/ximagesink.h,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- ximagesink.h 8 Oct 2004 11:26:49 -0000 1.28 +++ ximagesink.h 12 Feb 2005 18:41:48 -0000 1.29 @@ -119,6 +119,7 @@ gdouble framerate; GMutex *x_lock; + GMutex *stream_lock; /* Unused */ gint pixel_width, pixel_height; Index: xvimagesink.c RCS file: /cvs/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.98 retrieving revision 1.99 diff -u -d -r1.98 -r1.99 --- xvimagesink.c 11 Feb 2005 22:49:23 -0000 1.98 +++ xvimagesink.c 12 Feb 2005 18:41:49 -0000 1.99 @@ -1203,6 +1203,9 @@ xvimagesink = GST_XVIMAGESINK (gst_pad_get_parent (pad)); + if (!xvimagesink->xcontext) + return GST_PAD_LINK_DELAYED; GST_DEBUG_OBJECT (xvimagesink, "sinkconnect possible caps %" GST_PTR_FORMAT " with given caps %" GST_PTR_FORMAT, xvimagesink->xcontext->caps, caps); |