vlc | branch: master | Thomas Guillem <[email protected]> | Sun Feb 24 12:56:08 2019 +0100| [8c5c9471c5c3b38b28c6e29efa7a927c8366ca7d] | committer: Thomas Guillem
hw: vaapi: move instance management into decoder_device.c > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8c5c9471c5c3b38b28c6e29efa7a927c8366ca7d --- modules/hw/vaapi/decoder_device.c | 133 +++++++++++++++++++++++++++++++++++--- modules/hw/vaapi/vlc_vaapi.c | 100 ---------------------------- modules/hw/vaapi/vlc_vaapi.h | 28 -------- 3 files changed, 123 insertions(+), 138 deletions(-) diff --git a/modules/hw/vaapi/decoder_device.c b/modules/hw/vaapi/decoder_device.c index 1dbb69ec16..5efe9e635b 100644 --- a/modules/hw/vaapi/decoder_device.c +++ b/modules/hw/vaapi/decoder_device.c @@ -26,6 +26,7 @@ #include <vlc_plugin.h> #include <vlc_vout_window.h> #include <vlc_codec.h> +#include <vlc_fs.h> #include "hw/vaapi/vlc_vaapi.h" #include <va/va_drmcommon.h> @@ -45,6 +46,57 @@ # include <fcntl.h> #endif +typedef void (*vaapi_native_destroy_cb)(VANativeDisplay); +struct vaapi_instance; + +struct vaapi_instance +{ + VADisplay dpy; + VANativeDisplay native; + vaapi_native_destroy_cb native_destroy_cb; +}; + +/* Initializes the VADisplay. If not NULL, native_destroy_cb will be called + * when the instance is released in order to destroy the native holder (that + * can be a drm/x11/wl). On error, dpy is terminated and the destroy callback + * is called. */ +static struct vaapi_instance * +vaapi_InitializeInstance(vlc_object_t *o, VADisplay dpy, + VANativeDisplay native, + vaapi_native_destroy_cb native_destroy_cb) +{ + int major = 0, minor = 0; + VAStatus s = vaInitialize(dpy, &major, &minor); + if (s != VA_STATUS_SUCCESS) + { + msg_Err(o, "vaInitialize: %s", vaErrorStr(s)); + goto error; + } + struct vaapi_instance *inst = malloc(sizeof(*inst)); + + if (unlikely(inst == NULL)) + goto error; + inst->dpy = dpy; + inst->native = native; + inst->native_destroy_cb = native_destroy_cb; + + return inst; +error: + vaTerminate(dpy); + if (native != NULL && native_destroy_cb != NULL) + native_destroy_cb(native); + return NULL; +} + +static void +vaapi_DestroyInstance(struct vaapi_instance *inst) +{ + vaTerminate(inst->dpy); + if (inst->native != NULL && inst->native_destroy_cb != NULL) + inst->native_destroy_cb(inst->native); + free(inst); +} + #ifdef HAVE_VA_X11 static void x11_native_destroy_cb(VANativeDisplay native) @@ -52,7 +104,7 @@ x11_native_destroy_cb(VANativeDisplay native) XCloseDisplay(native); } -static struct vlc_vaapi_instance * +static struct vaapi_instance * x11_init_vaapi_instance(vlc_decoder_device *device, vout_window_t *window, VADisplay *vadpyp) { @@ -70,22 +122,83 @@ x11_init_vaapi_instance(vlc_decoder_device *device, vout_window_t *window, return NULL; } - return vlc_vaapi_InitializeInstance(VLC_OBJECT(device), vadpy, - x11dpy, x11_native_destroy_cb); + return vaapi_InitializeInstance(VLC_OBJECT(device), vadpy, + x11dpy, x11_native_destroy_cb); } #endif #ifdef HAVE_VA_DRM -static struct vlc_vaapi_instance * + +static void +native_drm_destroy_cb(VANativeDisplay native) +{ + vlc_close((intptr_t) native); +} + +/* Get and Initializes a VADisplay from a DRM device. If device is NULL, this + * function will try to open default devices. */ +static struct vaapi_instance * +vaapi_InitializeInstanceDRM(vlc_object_t *o, + VADisplay (*pf_getDisplayDRM)(int), + VADisplay *pdpy, const char *device) +{ + static const char *default_drm_device_paths[] = { + "/dev/dri/renderD128", + "/dev/dri/card0", + "/dev/dri/renderD129", + "/dev/dri/card1", + }; + + const char *user_drm_device_paths[] = { device }; + const char **drm_device_paths; + size_t drm_device_paths_count; + + if (device != NULL) + { + drm_device_paths = user_drm_device_paths; + drm_device_paths_count = 1; + } + else + { + drm_device_paths = default_drm_device_paths; + drm_device_paths_count = ARRAY_SIZE(default_drm_device_paths); + } + + for (size_t i = 0; i < drm_device_paths_count; i++) + { + int drm_fd = vlc_open(drm_device_paths[i], O_RDWR); + if (drm_fd < 0) + continue; + + VADisplay dpy = pf_getDisplayDRM(drm_fd); + if (dpy) + { + struct vaapi_instance *va_inst = + vaapi_InitializeInstance(o, dpy, + (VANativeDisplay)(intptr_t)drm_fd, + native_drm_destroy_cb); + if (va_inst) + { + *pdpy = dpy; + return va_inst; + } + } + else + vlc_close(drm_fd); + } + return NULL; +} + +static struct vaapi_instance * drm_init_vaapi_instance(vlc_decoder_device *device, VADisplay *vadpyp) { - return vlc_vaapi_InitializeInstanceDRM(VLC_OBJECT(device), vaGetDisplayDRM, - vadpyp, NULL); + return vaapi_InitializeInstanceDRM(VLC_OBJECT(device), vaGetDisplayDRM, + vadpyp, NULL); } #endif #ifdef HAVE_VA_WL -static struct vlc_vaapi_instance * +static struct vaapi_instance * wl_init_vaapi_instance(vlc_decoder_device *device, vout_window_t *window, VADisplay *vadpyp) { @@ -93,21 +206,21 @@ wl_init_vaapi_instance(vlc_decoder_device *device, vout_window_t *window, if (vadpy == NULL) return NULL; - return vlc_vaapi_InitializeInstance(VLC_OBJECT(device), vadpy, NULL, NULL); + return vaapi_InitializeInstance(VLC_OBJECT(device), vadpy, NULL, NULL); } #endif static void Close(vlc_decoder_device *device) { - vlc_vaapi_DestroyInstance(device->sys); + vaapi_DestroyInstance(device->sys); } static int Open(vlc_decoder_device *device, vout_window_t *window) { VADisplay vadpy = NULL; - struct vlc_vaapi_instance *vainst = NULL; + struct vaapi_instance *vainst = NULL; #if defined (HAVE_VA_X11) if (window && window->type == VOUT_WINDOW_TYPE_XID) vainst = x11_init_vaapi_instance(device, window, &vadpy); diff --git a/modules/hw/vaapi/vlc_vaapi.c b/modules/hw/vaapi/vlc_vaapi.c index 6fa00d0731..05184a013b 100644 --- a/modules/hw/vaapi/vlc_vaapi.c +++ b/modules/hw/vaapi/vlc_vaapi.c @@ -38,7 +38,6 @@ #include <va/va.h> #include <vlc_common.h> -#include <vlc_fs.h> #include <vlc_fourcc.h> #include <vlc_filter.h> #include <vlc_picture_pool.h> @@ -76,105 +75,6 @@ vlc_chroma_to_vaapi(int i_vlc_chroma, unsigned *va_rt_format, int *va_fourcc) } /************************** - * VA instance management * - **************************/ - -struct vlc_vaapi_instance { - VADisplay dpy; - VANativeDisplay native; - vlc_vaapi_native_destroy_cb native_destroy_cb; -}; - -struct vlc_vaapi_instance * -vlc_vaapi_InitializeInstance(vlc_object_t *o, VADisplay dpy, - VANativeDisplay native, - vlc_vaapi_native_destroy_cb native_destroy_cb) -{ - int major = 0, minor = 0; - VA_CALL(o, vaInitialize, dpy, &major, &minor); - struct vlc_vaapi_instance *inst = malloc(sizeof(*inst)); - - if (unlikely(inst == NULL)) - goto error; - inst->dpy = dpy; - inst->native = native; - inst->native_destroy_cb = native_destroy_cb; - - return inst; -error: - vaTerminate(dpy); - if (native != NULL && native_destroy_cb != NULL) - native_destroy_cb(native); - return NULL; -} - -static void native_drm_destroy_cb(VANativeDisplay native) -{ - vlc_close((intptr_t) native); -} - -struct vlc_vaapi_instance * -vlc_vaapi_InitializeInstanceDRM(vlc_object_t *o, - VADisplay (*pf_getDisplayDRM)(int), - VADisplay *pdpy, const char *device) -{ - static const char *default_drm_device_paths[] = { - "/dev/dri/renderD128", - "/dev/dri/card0", - "/dev/dri/renderD129", - "/dev/dri/card1", - }; - - const char *user_drm_device_paths[] = { device }; - const char **drm_device_paths; - size_t drm_device_paths_count; - - if (device != NULL) - { - drm_device_paths = user_drm_device_paths; - drm_device_paths_count = 1; - } - else - { - drm_device_paths = default_drm_device_paths; - drm_device_paths_count = ARRAY_SIZE(default_drm_device_paths); - } - - for (size_t i = 0; i < drm_device_paths_count; i++) - { - int drm_fd = vlc_open(drm_device_paths[i], O_RDWR); - if (drm_fd < 0) - continue; - - VADisplay dpy = pf_getDisplayDRM(drm_fd); - if (dpy) - { - struct vlc_vaapi_instance *va_inst = - vlc_vaapi_InitializeInstance(o, dpy, - (VANativeDisplay)(intptr_t)drm_fd, - native_drm_destroy_cb); - if (va_inst) - { - *pdpy = dpy; - return va_inst; - } - } - else - vlc_close(drm_fd); - } - return NULL; -} - -void -vlc_vaapi_DestroyInstance(struct vlc_vaapi_instance *inst) -{ - vaTerminate(inst->dpy); - if (inst->native != NULL && inst->native_destroy_cb != NULL) - inst->native_destroy_cb(inst->native); - free(inst); -} - -/************************** * VAAPI create & destroy * **************************/ diff --git a/modules/hw/vaapi/vlc_vaapi.h b/modules/hw/vaapi/vlc_vaapi.h index a3f0169d9f..ede4ff01dd 100644 --- a/modules/hw/vaapi/vlc_vaapi.h +++ b/modules/hw/vaapi/vlc_vaapi.h @@ -41,34 +41,6 @@ #include <vlc_picture_pool.h> /************************** - * VA instance management * - **************************/ - -typedef void (*vlc_vaapi_native_destroy_cb)(VANativeDisplay); -struct vlc_vaapi_instance; - -/* Initializes the VADisplay and sets the reference counter to 1. If not NULL, - * native_destroy_cb will be called when the instance is released in order to - * destroy the native holder (that can be a drm/x11/wl). On error, dpy is - * terminated and the destroy callback is called. */ -struct vlc_vaapi_instance * -vlc_vaapi_InitializeInstance(vlc_object_t *o, VADisplay dpy, - VANativeDisplay native, - vlc_vaapi_native_destroy_cb native_destroy_cb); - -/* Get and Initializes a VADisplay from a DRM device. If device is NULL, this - * function will try to open default devices. */ -struct vlc_vaapi_instance * -vlc_vaapi_InitializeInstanceDRM(vlc_object_t *o, - VADisplay (*pf_getDisplayDRM)(int), - VADisplay *pdpy, const char *device); - - -/* Destroy the VAAPI instance refcount, and call vaTerminate */ -void -vlc_vaapi_DestroyInstance(struct vlc_vaapi_instance *inst); - -/************************** * VAAPI create & destroy * **************************/ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
