static gboolean
gst_vdp_sink_open_device (VdpSink * vdp_sink)
{
+ gboolean res;
GstVdpDevice *device;
GError *err;
+ g_mutex_lock (vdp_sink->device_lock);
+ if (vdp_sink->device) {
+ res = TRUE;
+ goto done;
+ }
+
err = NULL;
vdp_sink->device = device = gst_vdp_get_device (vdp_sink->display_name, &err);
if (!device)
vdp_sink->event_thread = g_thread_create (
(GThreadFunc) gst_vdp_sink_event_thread, vdp_sink, TRUE, NULL);
- return TRUE;
+ res = TRUE;
+
+done:
+ g_mutex_unlock (vdp_sink->device_lock);
+ return res;
device_error:
gst_vdp_sink_post_error (vdp_sink, err);
- return FALSE;
+ res = FALSE;
+ goto done;
}
static gboolean
vdp_sink->fps_n = 0;
vdp_sink->fps_d = 1;
- GST_OBJECT_LOCK (vdp_sink);
- if (!vdp_sink->device)
- res = gst_vdp_sink_open_device (vdp_sink);
- GST_OBJECT_UNLOCK (vdp_sink);
+ res = gst_vdp_sink_open_device (vdp_sink);
return res;
}
}
/* If the element has not initialized the X11 context try to do so */
- if (!vdp_sink->device && !gst_vdp_sink_open_device (vdp_sink)) {
+ if (!gst_vdp_sink_open_device (vdp_sink)) {
g_mutex_unlock (vdp_sink->flow_lock);
/* we have thrown a GST_ELEMENT_ERROR now */
return;
g_free (vdp_sink->par);
vdp_sink->par = NULL;
}
+ if (vdp_sink->device_lock) {
+ g_mutex_free (vdp_sink->device_lock);
+ vdp_sink->device_lock = NULL;
+ }
if (vdp_sink->x_lock) {
g_mutex_free (vdp_sink->x_lock);
vdp_sink->x_lock = NULL;
vdp_sink->display_name = NULL;
vdp_sink->par = NULL;
+ vdp_sink->device_lock = g_mutex_new ();
vdp_sink->x_lock = g_mutex_new ();
vdp_sink->flow_lock = g_mutex_new ();