From: David S. <dsc...@us...> - 2003-07-25 07:31:31
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Fri Jul 25 2003 00:31:30 PDT Log message: Add test to check that we can actually Put an image of the size of the video. Fixes #112750. Modified files: sys/xvideo : gstxvimage.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstxvimage.c.diff?r1=1.23&r2=1.24 ====Begin Diffs==== Index: gstxvimage.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstxvimage.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstxvimage.c 22 Jul 2003 09:13:58 -0000 1.23 +++ gstxvimage.c 25 Jul 2003 07:31:17 -0000 1.24 @@ -73,9 +73,12 @@ static GStaticMutex omg = G_STATIC_MUTEX_INIT; /* omg, static vars */ +static int _gst_xvimage_error_caught; + static void _gst_xvimage_destroy (GstXvImage *image); static void _gst_xvimage_put (GstXWindow *window, GstXvImage *image); +static gboolean _gst_xvimage_try_put (GstXWindow *window, GstXvImage *image); gboolean _gst_xvimage_check_xvideo(Display *display) @@ -97,6 +100,13 @@ return FALSE; } +static int +_gst_xvimage_error_handler(Display *d, XErrorEvent *event) +{ + _gst_xvimage_error_caught++; + return 0; +} + GstXvImage* _gst_xvimage_new (GstImageFormat *format, GstXWindow *window, @@ -203,6 +213,14 @@ GST_IMAGE_SIZE (image) = image->ximage->data_size; } + if(!_gst_xvimage_try_put(window, image)){ + g_warning ("XvShmPutImage failed"); + + g_free (image); + g_static_mutex_unlock (&omg); + return NULL; + } + g_static_mutex_unlock (&omg); _gst_xwindow_ref (window); return image; @@ -238,6 +256,39 @@ #endif /* USE_SHM */ g_free (image); +} + +static gboolean +_gst_xvimage_try_put (GstXWindow *window, + GstXvImage *image) +{ +#ifdef USE_SHM + XWindowAttributes attr; + void *old_handler; + + g_return_val_if_fail (window != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); + + XGetWindowAttributes(window->disp, window->win, &attr); + + XSync(window->disp,0); + _gst_xvimage_error_caught = 0; + old_handler = XSetErrorHandler(_gst_xvimage_error_handler); + XvShmPutImage (window->disp, image->im_port, window->win, + window->gc, image->ximage, + 0, 0, image->width, image->height, + 0, 0, attr.width, attr.height, False); + XSync(window->disp, False); + XSetErrorHandler(old_handler); + if(_gst_xvimage_error_caught>0){ + return FALSE; + } + + return TRUE; +#else /* USE_SHM */ + g_error ("trying to draw shared memory image when gst was compiled without shared memory support"); + return FALSE; +#endif /* USE_SHM */ } static void |