diff options
author | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2010-08-06 12:14:04 +0200 |
---|---|---|
committer | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2010-08-06 12:14:30 +0200 |
commit | b6f22c519dc018943ed924e1fdbd7405206479cc (patch) | |
tree | bb57496c51b42a5197f7bc349abfab0fa5611e60 | |
parent | 8996b80d62dd380990f284a0a73db5c7f280185a (diff) |
vdpau: fix destruction of GstVdpDevice when it failed to open
only close display in finalize and check if vdp_decoder_destroy is available
before we use it
-rw-r--r-- | sys/vdpau/gstvdp/gstvdpdevice.c | 8 | ||||
-rw-r--r-- | sys/vdpau/gstvdp/gstvdpdevice.h | 2 |
2 files changed, 4 insertions, 6 deletions
diff --git a/sys/vdpau/gstvdp/gstvdpdevice.c b/sys/vdpau/gstvdp/gstvdpdevice.c index 2e441b93c1..359874b167 100644 --- a/sys/vdpau/gstvdp/gstvdpdevice.c +++ b/sys/vdpau/gstvdp/gstvdpdevice.c @@ -136,19 +136,16 @@ create_display_error: return FALSE; create_device_error: - XCloseDisplay (device->display); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_OPEN_READ, "Could not create VDPAU device for display: %s", device->display_name); return FALSE; get_error_string_error: - XCloseDisplay (device->display); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_OPEN_READ, "Could not get vdp_get_error_string function pointer from VDPAU"); return FALSE; function_error: - XCloseDisplay (device->display); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_OPEN_READ, "Could not get function pointer from VDPAU, error returned was: %s", device->vdp_get_error_string (status)); @@ -176,6 +173,7 @@ gst_vdp_device_init (GstVdpDevice * device) device->display_name = NULL; device->display = NULL; device->device = VDP_INVALID_HANDLE; + device->vdp_decoder_destroy = NULL; } static void @@ -183,14 +181,16 @@ gst_vdp_device_finalize (GObject * object) { GstVdpDevice *device = (GstVdpDevice *) object; - if (device->device != VDP_INVALID_HANDLE) { + if (device->device != VDP_INVALID_HANDLE && device->vdp_decoder_destroy) { device->vdp_device_destroy (device->device); device->device = VDP_INVALID_HANDLE; } + if (device->display) { XCloseDisplay (device->display); device->display = NULL; } + g_free (device->display_name); device->display_name = NULL; diff --git a/sys/vdpau/gstvdp/gstvdpdevice.h b/sys/vdpau/gstvdp/gstvdpdevice.h index 6010e75548..3fda2b29db 100644 --- a/sys/vdpau/gstvdp/gstvdpdevice.h +++ b/sys/vdpau/gstvdp/gstvdpdevice.h @@ -47,8 +47,6 @@ struct _GstVdpDeviceClass struct _GstVdpDevice { GObject object; - - gboolean constructed; gchar *display_name; Display *display; |