summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2010-08-06 12:14:04 +0200
committerCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2010-08-06 12:14:30 +0200
commitb6f22c519dc018943ed924e1fdbd7405206479cc (patch)
treebb57496c51b42a5197f7bc349abfab0fa5611e60
parent8996b80d62dd380990f284a0a73db5c7f280185a (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.c8
-rw-r--r--sys/vdpau/gstvdp/gstvdpdevice.h2
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;