diff --git a/ChangeLog b/ChangeLog index b35b38e8b0..a597f6bffc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2005-08-24 Andy Wingo + + * sys/v4l/gstv4lelement.c (gst_v4lelement_start) + (gst_v4lelement_stop): Call _start and _stop for xoverlay instead + of _open and _close. + + * sys/v4l/gstv4lxoverlay.h: + * sys/v4l/gstv4lxoverlay.c (gst_v4l_xoverlay_set_xwindow_id): Open + an Xv connection here, instead of all the time. Make Xv only be + loaded if you axe for it. Kindof a workaround for buggy behaviour + of Xv when using remote xservers (XvQueryExtension would block). + (gst_v4l_xoverlay_stop, gst_v4l_xoverlay_start): New functions, + replace the _open and _close public API. Only start the xv + connection if necessary. + (gst_v4l_xoverlay_open, gst_v4l_xoverlay_close): Made static. + 2005-08-23 David Schleef * gst/audioresample/Makefile.am: Leet audioresampling code diff --git a/sys/v4l/gstv4lelement.c b/sys/v4l/gstv4lelement.c index 1a5d96db38..4d1636ad6c 100644 --- a/sys/v4l/gstv4lelement.c +++ b/sys/v4l/gstv4lelement.c @@ -445,7 +445,7 @@ gst_v4lelement_start (GstBaseSrc * src) return FALSE; #ifdef HAVE_XVIDEO - gst_v4l_xoverlay_open (v4lelement); + gst_v4l_xoverlay_start (v4lelement); #endif return TRUE; @@ -457,7 +457,7 @@ gst_v4lelement_stop (GstBaseSrc * src) GstV4lElement *v4lelement = GST_V4LELEMENT (src); #ifdef HAVE_XVIDEO - gst_v4l_xoverlay_close (v4lelement); + gst_v4l_xoverlay_stop (v4lelement); #endif if (!gst_v4l_close (v4lelement)) diff --git a/sys/v4l/gstv4lxoverlay.c b/sys/v4l/gstv4lxoverlay.c index b169b4a7d7..90c7f8837f 100644 --- a/sys/v4l/gstv4lxoverlay.c +++ b/sys/v4l/gstv4lxoverlay.c @@ -59,7 +59,7 @@ gst_v4l_xoverlay_interface_init (GstXOverlayClass * klass) "V4L XOverlay interface debugging"); } -void +static void gst_v4l_xoverlay_open (GstV4lElement * v4lelement) { struct stat s; @@ -76,6 +76,13 @@ gst_v4l_xoverlay_open (GstV4lElement * v4lelement) return; } + /* First let's check that XVideo extension is available */ + if (!XQueryExtension (dpy, "XVideo", &i, &i, &i)) { + GST_WARNING ("Xv extension not available - no overlay"); + XCloseDisplay (dpy); + return; + } + /* find port that belongs to this device */ if (XvQueryExtension (dpy, &ver, &rel, &req, &ev, &err) != Success) { GST_WARNING ("Xv extension not supported - no overlay"); @@ -124,7 +131,7 @@ gst_v4l_xoverlay_open (GstV4lElement * v4lelement) } } -void +static void gst_v4l_xoverlay_close (GstV4lElement * v4lelement) { GstV4lXv *v4lxv = v4lelement->xv; @@ -144,6 +151,20 @@ gst_v4l_xoverlay_close (GstV4lElement * v4lelement) v4lelement->xv = NULL; } +void +gst_v4l_xoverlay_start (GstV4lElement * v4lelement) +{ + if (v4lelement->xwindow_id) { + gst_v4l_xoverlay_open (v4lelement); + } +} + +void +gst_v4l_xoverlay_stop (GstV4lElement * v4lelement) +{ + gst_v4l_xoverlay_close (v4lelement); +} + static gboolean idle_refresh (gpointer data) { @@ -171,12 +192,17 @@ static void gst_v4l_xoverlay_set_xwindow_id (GstXOverlay * overlay, XID xwindow_id) { GstV4lElement *v4lelement = GST_V4LELEMENT (overlay); - GstV4lXv *v4lxv = v4lelement->xv; + GstV4lXv *v4lxv; XWindowAttributes attr; gboolean change = (v4lelement->xwindow_id != xwindow_id); GST_LOG_OBJECT (v4lelement, "Changing port to %lx", xwindow_id); + if (!v4lxv && GST_V4L_IS_OPEN (v4lelement)) + gst_v4l_xoverlay_open (v4lelement); + + v4lxv = v4lelement->xv; + if (v4lxv) g_mutex_lock (v4lxv->mutex); diff --git a/sys/v4l/gstv4lxoverlay.h b/sys/v4l/gstv4lxoverlay.h index 9f7993a55c..3600038673 100644 --- a/sys/v4l/gstv4lxoverlay.h +++ b/sys/v4l/gstv4lxoverlay.h @@ -32,7 +32,9 @@ G_BEGIN_DECLS void gst_v4l_xoverlay_interface_init (GstXOverlayClass *klass); -void gst_v4l_xoverlay_open (GstV4lElement *v4lelement); -void gst_v4l_xoverlay_close (GstV4lElement *v4lelement); +void gst_v4l_xoverlay_start (GstV4lElement * v4lelement); +void gst_v4l_xoverlay_stop (GstV4lElement * v4lelement); + +G_END_DECLS #endif /* __GST_V4L_X_OVERLAY_H__ */