<html><head></head><body><div class="gmail_quote">Le 1 juillet 2017 11:22:26 GMT+02:00, "Hugo Beauzée-Luyssen" <hugo@beauzee.fr> a écrit :<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">---<br /> modules/codec/avcodec/vaapi.c | 92 ++++++++++++++++++++------<br /> modules/hw/vaapi/<a href="http://Makefile.am">Makefile.am</a> | 11 +---<br /> modules/hw/vaapi/chroma.c | 13 ++--<br /> modules/hw/vaapi/filters.c | 9 ++-<br /> modules/hw/vaapi/instance.c | 93 ---------------------------<br /> modules/hw/vaapi/vlc_vaapi.c | 8 ++-<br /> modules/hw/vaapi/vlc_vaapi.h | 18 ++----<br /> modules/video_output/opengl/converter_vaapi.c | 87 +++++++++++++++++--------<br /> 8 files changed, 161 insertions(+), 170 deletions(-)<br /> delete mode 100644 modules/hw/vaapi/instance.c<br /><br />diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c<br />index 4f46802400..f9ae5edff4 100644<br />--- a/modules/codec/avcodec/vaapi.c<br />+++ b/modules/codec/avcodec/vaapi.c<br />@@ -33,6 +33,7 @@<br /> #include <vlc_fourcc.h><br /> #include <vlc_picture.h><br /> #include <vlc_picture_pool.h><br />+#include <vlc_instance_holder.h><br /> <br /> #ifdef VLC_VA_BACKEND_XLIB<br /> # include <vlc_xlib.h><br />@@ -67,6 +68,12 @@ struct vlc_va_sys_t<br /> #endif<br /> };<br /> <br />+typedef struct vlc_va_instance_ctx<br />+{<br />+ vlc_object_t* p_obj;<br />+ vlc_va_sys_t* p_sys;<br />+} vlc_va_instance_ctx;<br />+<br /> static int GetVaProfile(AVCodecContext *ctx, VAProfile *va_profile,<br /> unsigned *pic_count)<br /> {<br />@@ -147,7 +154,7 @@ static void DeleteDR(vlc_va_t *va, void *hwctx)<br /> <br /> vlc_vaapi_DestroyContext(o, sys->hw_ctx.display, sys->hw_ctx.context_id);<br /> vlc_vaapi_DestroyConfig(o, sys->hw_ctx.display, sys->hw_ctx.config_id);<br />- vlc_vaapi_ReleaseInstance(sys->hw_ctx.display);<br />+ vlc_instance_holder_release( VLC_OBJECT( va ), "vaapi-instance" );<br /> free(sys);<br /> }<br /> <br />@@ -164,7 +171,8 @@ static int CreateDR(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br /> vlc_va_sys_t *sys = NULL;<br /> <br /> /* The picture must be allocated by the vout */<br />- VADisplay *va_dpy = vlc_vaapi_GetInstance();<br />+ VADisplay *va_dpy = vlc_instance_holder_get( VLC_OBJECT( va ),<br />+ "vaapi-instance" );<br /> if (va_dpy == NULL)<br /> return VLC_EGENERIC;<br /> <br />@@ -221,7 +229,7 @@ error:<br /> vlc_vaapi_DestroyConfig(o, sys->hw_ctx.display, sys->hw_ctx.config_id);<br /> free(sys);<br /> }<br />- vlc_vaapi_ReleaseInstance(va_dpy);<br />+ vlc_instance_holder_release( VLC_OBJECT( va ), "vaapi-instance" );<br /> return ret;<br /> }<br /> <br />@@ -254,7 +262,7 @@ static void Delete(vlc_va_t *va, void **hwctx)<br /> picture_pool_Release(sys->pool);<br /> vlc_vaapi_DestroyContext(o, sys->hw_ctx.display, sys->hw_ctx.context_id);<br /> vlc_vaapi_DestroyConfig(o, sys->hw_ctx.display, sys->hw_ctx.config_id);<br />- vlc_vaapi_ReleaseInstance(sys->hw_ctx.display);<br />+ vlc_instance_holder_release( VLC_OBJECT( va ), "vaapi-instance" );<br /> #ifdef VLC_VA_BACKEND_XLIB<br /> XCloseDisplay(sys->p_display_x11);<br /> #endif<br />@@ -264,6 +272,49 @@ static void Delete(vlc_va_t *va, void **hwctx)<br /> free(sys);<br /> }<br /> <br />+static void* CreateVaDisplayInstance( VADisplay* p_display,<br />+ vlc_va_instance_ctx* p_ctx )<br />+{<br />+ if (p_display == NULL)<br />+ {<br />+ msg_Err(p_ctx->p_obj, "Could not get a VAAPI device");<br />+ return NULL;<br />+ }<br />+<br />+ if (vlc_vaapi_Initialize(p_ctx->p_obj, p_display))<br />+ {<br />+ msg_Err(p_ctx->p_obj, "Could not initialize VA display" );<br />+ vaTerminate( p_display );<br />+ return NULL;<br />+ }<br />+ return p_display;<br />+}<br />+<br />+#ifdef VLC_VA_BACKEND_XLIB<br />+static void* CreateVaDisplayInstanceX11( void* p_opaque )<br />+{<br />+ vlc_va_instance_ctx* p_ctx = (vlc_va_instance_ctx*)p_opaque;<br />+ return CreateVaDisplayInstance( vaGetDisplay( p_ctx->p_sys->p_display_x11),<br />+ p_ctx );<br />+}<br />+#endif<br />+<br />+#ifdef VLC_VA_BACKEND_DRM<br />+static void* CreateVaDisplayInstanceDRM( void* p_opaque )<br />+{<br />+ vlc_va_instance_ctx* p_ctx = (vlc_va_instance_ctx*)p_opaque;<br />+ return CreateVaDisplayInstance( vaGetDisplayDRM(p_ctx->p_sys->drm_fd ),<br />+ p_ctx );<br />+}<br />+#endif<br />+<br />+<br />+static void DestroyVaDisplayInstance( void* p_instance, void* p_ctx )<br />+{<br />+ vaTerminate( (VADisplay)p_instance );<br />+ free( p_ctx );<br />+}<br />+<br /> static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br /> const es_format_t *fmt, picture_sys_t *p_sys)<br /> {<br />@@ -300,6 +351,15 @@ static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br /> sys->hw_ctx.context_id = VA_INVALID_ID;<br /> sys->pool = NULL;<br /> <br />+ vlc_va_instance_ctx* p_ctx = malloc( sizeof( *p_ctx ) );<br />+ if ( unlikely( p_ctx == NULL ) )<br />+ {<br />+ free( sys );<br />+ return VLC_ENOMEM;<br />+ }<br />+ p_ctx->p_obj = VLC_OBJECT( va );<br />+ p_ctx->p_sys = sys;<br />+<br /> /* Create a VA display */<br /> #ifdef VLC_VA_BACKEND_XLIB<br /> sys->p_display_x11 = XOpenDisplay(NULL);<br />@@ -309,7 +369,9 @@ static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br /> goto error;<br /> }<br /> <br />- sys->hw_ctx.display = vaGetDisplay(sys->p_display_x11);<br />+ sys->hw_ctx.display = vlc_instance_holder_acquire(<br />+ VLC_OBJECT( va ), "vaapi-instance", &CreateVaDisplayInstanceX11,<br />+ &DestroyVaDisplayInstance, p_ctx );<br /> #endif<br /> #ifdef VLC_VA_BACKEND_DRM<br /> static const char drm_device_paths[][20] = {<br />@@ -323,7 +385,9 @@ static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br /> if (sys->drm_fd < 0)<br /> continue;<br /> <br />- sys->hw_ctx.display = vaGetDisplayDRM(sys->drm_fd);<br />+ sys->hw_ctx.display = vlc_instance_holder_acquire(<br />+ VLC_OBJECT( va ),"vaapi-instance", &CreateVaDisplayInstanceDRM,<br />+ &DestroyVaDisplayInstance, p_ctx );<br /> if (sys->hw_ctx.display)<br /> break;<br /> <br />@@ -337,19 +401,6 @@ static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,<br /> goto error;<br /> }<br /> <br />- if (vlc_vaapi_Initialize(o, sys->hw_ctx.display))<br />- {<br />- sys->hw_ctx.display = NULL;<br />- goto error;<br />- }<br />-<br />- if (vlc_vaapi_SetInstance(sys->hw_ctx.display))<br />- {<br />- msg_Err(va, "VAAPI instance already in use");<br />- sys->hw_ctx.display = NULL;<br />- goto error;<br />- }<br />-<br /> sys->hw_ctx.config_id =<br /> vlc_vaapi_CreateConfigChecked(o, sys->hw_ctx.display, i_profile,<br /> VAEntrypointVLD, 0);<br />@@ -392,7 +443,8 @@ error:<br /> if (sys->hw_ctx.config_id != VA_INVALID_ID)<br /> vlc_vaapi_DestroyConfig(o, sys->hw_ctx.display, sys->hw_ctx.config_id);<br /> if (sys->hw_ctx.display != NULL)<br />- vlc_vaapi_ReleaseInstance(sys->hw_ctx.display);<br />+ vlc_instance_holder_release( VLC_OBJECT( va ),<br />+ "vaapi-instance" );<br /> #ifdef VLC_VA_BACKEND_XLIB<br /> if( sys->p_display_x11 != NULL)<br /> XCloseDisplay(sys->p_display_x11);<br />diff --git a/modules/hw/vaapi/<a href="http://Makefile.am">Makefile.am</a> b/modules/hw/vaapi/<a href="http://Makefile.am">Makefile.am</a><br />index d0e595e7c6..563bad2844 100644<br />--- a/modules/hw/vaapi/<a href="http://Makefile.am">Makefile.am</a><br />+++ b/modules/hw/vaapi/<a href="http://Makefile.am">Makefile.am</a><br />@@ -1,23 +1,16 @@<br /> vaapidir = $(pluginsdir)/vaapi<br /> <br />-libvlc_vaapi_instance_la_SOURCES = hw/vaapi/instance.c hw/vaapi/vlc_vaapi.h<br />-libvlc_vaapi_instance_la_CFLAGS = $(LIBVA_CFLAGS)<br />-libvlc_vaapi_instance_la_LIBADD = $(LIBVA_LIBS) $(LIBPTHREAD)<br />-libvlc_vaapi_instance_la_LDFLAGS = -no-undefined \<br />- -version-info 0:0:0<br />-<br /> libvaapi_chroma_plugin_la_SOURCES = hw/vaapi/chroma.c hw/vaapi/vlc_vaapi.c hw/vaapi/vlc_vaapi.h \<br /> video_chroma/copy.c video_chroma/copy.h<br /> libvaapi_chroma_plugin_la_CFLAGS = $(AM_CFLAGS) $(LIBVA_CFLAGS)<br />-libvaapi_chroma_plugin_la_LIBADD = $(AM_LIBADD) $(LIBVA_LIBS) libvlc_vaapi_<a href="http://instance.la">instance.la</a><br />+libvaapi_chroma_plugin_la_LIBADD = $(AM_LIBADD) $(LIBVA_LIBS)<br /> <br /> libvaapi_filters_plugin_la_SOURCES = hw/vaapi/filters.c hw/vaapi/vlc_vaapi.c hw/vaapi/vlc_vaapi.h<br /> libvaapi_filters_plugin_la_CPPFLAGS = $(AM_CPPFLAGS)<br /> libvaapi_filters_plugin_la_CFLAGS = $(AM_CFLAGS) $(LIBVA_CFLAGS)<br />-libvaapi_filters_plugin_la_LIBADD = $(AM_LIBADD) $(LIBVA_LIBS) libvlc_vaapi_<a href="http://instance.la">instance.la</a><br />+libvaapi_filters_plugin_la_LIBADD = $(AM_LIBADD) $(LIBVA_LIBS)<br /> <br /> if HAVE_VAAPI<br />-pkglib_LTLIBRARIES += libvlc_vaapi_<a href="http://instance.la">instance.la</a><br /> vaapi_LTLIBRARIES = libvaapi_chroma_<a href="http://plugin.la">plugin.la</a> \<br /> libvaapi_filters_<a href="http://plugin.la">plugin.la</a><br /> endif<br />diff --git a/modules/hw/vaapi/chroma.c b/modules/hw/vaapi/chroma.c<br />index 278ecf9e17..f952325c4a 100644<br />--- a/modules/hw/vaapi/chroma.c<br />+++ b/modules/hw/vaapi/chroma.c<br />@@ -31,6 +31,7 @@<br /> #include <vlc_common.h><br /> #include <vlc_filter.h><br /> #include <vlc_plugin.h><br />+#include <vlc_instance_holder.h><br /> <br /> #include "../../video_chroma/copy.h"<br /> #include "vlc_vaapi.h"<br />@@ -134,7 +135,8 @@ DownloadSurface(filter_t *filter, picture_t *src_pic)<br /> {<br /> /* Get the instance here since the instance may be not created by the<br /> * decoder from Open() */<br />- va_dpy = filter_sys->dpy = vlc_vaapi_GetInstance();<br />+ va_dpy = filter_sys->dpy = vlc_instance_holder_get(<br />+ VLC_OBJECT( filter ), "vaapi-instance" );<br /> assert(filter_sys->dpy);<br /> }<br /> else<br />@@ -313,7 +315,7 @@ static int Open(vlc_object_t *obj)<br /> <br /> if (is_upload)<br /> {<br />- filter_sys->dpy = vlc_vaapi_GetInstance();<br />+ filter_sys->dpy = vlc_instance_holder_get( obj, "vaapi-instance" );<br /> if (filter_sys->dpy == NULL)<br /> {<br /> free(filter_sys);<br />@@ -327,7 +329,7 @@ static int Open(vlc_object_t *obj)<br /> VA_FOURCC_NV12);<br /> if (!filter_sys->dest_pics)<br /> {<br />- vlc_vaapi_ReleaseInstance(filter_sys->dpy);<br />+ vlc_instance_holder_release( obj, "vaapi-instance" );<br /> free(filter_sys);<br /> return VLC_EGENERIC;<br /> }<br />@@ -344,7 +346,8 @@ static int Open(vlc_object_t *obj)<br /> if (is_upload)<br /> {<br /> picture_pool_Release(filter_sys->dest_pics);<br />- vlc_vaapi_ReleaseInstance(filter_sys->dpy);<br />+ vlc_instance_holder_release( VLC_OBJECT( filter ),<br />+ "vaapi-instance" );<br /> }<br /> free(filter_sys);<br /> return VLC_EGENERIC;<br />@@ -366,7 +369,7 @@ Close(vlc_object_t *obj)<br /> if (filter_sys->dest_pics)<br /> picture_pool_Release(filter_sys->dest_pics);<br /> if (filter_sys->dpy != NULL)<br />- vlc_vaapi_ReleaseInstance(filter_sys->dpy);<br />+ vlc_instance_holder_release( obj, "vaapi-instance" );<br /> CopyCleanCache(&filter_sys->cache);<br /> <br /> free(filter_sys);<br />diff --git a/modules/hw/vaapi/filters.c b/modules/hw/vaapi/filters.c<br />index 0af9c0548b..f778d155ed 100644<br />--- a/modules/hw/vaapi/filters.c<br />+++ b/modules/hw/vaapi/filters.c<br />@@ -31,6 +31,7 @@<br /> #include <vlc_filter.h><br /> #include <vlc_plugin.h><br /> #include "vlc_vaapi.h"<br />+#include <vlc_instance_holder.h><br /> <br /> /********************************<br /> * Common structures and macros *<br />@@ -298,7 +299,8 @@ Open(filter_t * filter,<br /> filter_sys->va.conf = VA_INVALID_ID;<br /> filter_sys->va.ctx = VA_INVALID_ID;<br /> filter_sys->va.buf = VA_INVALID_ID;<br />- filter_sys->va.dpy = vlc_vaapi_GetInstance();<br />+ filter_sys->va.dpy = vlc_instance_holder_get( VLC_OBJECT( filter ),<br />+ "vaapi-instance" );<br /> if (!filter_sys->va.dpy)<br /> goto error;<br /> <br />@@ -377,7 +379,8 @@ error:<br /> vlc_vaapi_DestroyConfig(VLC_OBJECT(filter),<br /> filter_sys->va.dpy, filter_sys->va.conf);<br /> if (filter_sys->va.dpy)<br />- vlc_vaapi_ReleaseInstance(filter_sys->va.dpy);<br />+ vlc_instance_holder_release( VLC_OBJECT( filter ),<br />+ "vaapi-instance" );<br /> free(filter_sys);<br /> return VLC_EGENERIC;<br /> }<br />@@ -389,7 +392,7 @@ Close(vlc_object_t * obj, filter_sys_t * filter_sys)<br /> vlc_vaapi_DestroyBuffer(obj, filter_sys->va.dpy, filter_sys->va.buf);<br /> vlc_vaapi_DestroyContext(obj, filter_sys->va.dpy, filter_sys->va.ctx);<br /> vlc_vaapi_DestroyConfig(obj, filter_sys->va.dpy, filter_sys->va.conf);<br />- vlc_vaapi_ReleaseInstance(filter_sys->va.dpy);<br />+ vlc_instance_holder_release( obj, "vaapi-instance" );<br /> free(filter_sys);<br /> }<br /> <br />diff --git a/modules/hw/vaapi/instance.c b/modules/hw/vaapi/instance.c<br />deleted file mode 100644<br />index 3f70fe7ebc..0000000000<br />--- a/modules/hw/vaapi/instance.c<br />+++ /dev/null<br />@@ -1,93 +0,0 @@<br />-/*****************************************************************************<br />- * instance.c: VAAPI instance management for VLC<br />- *****************************************************************************<br />- * Copyright (C) 2017 VLC authors, VideoLAN and VideoLabs<br />- *<br />- * Author: Victorien Le Couviour--Tuffet <victorien.lecouviour.tuffet@gmail.com><br />- *<br />- * This program is free software; you can redistribute it and/or modify it<br />- * under the terms of the GNU Lesser General Public License as published by<br />- * the Free Software Foundation; either version 2.1 of the License, or<br />- * (at your option) any later version.<br />- *<br />- * This program is distributed in the hope that it will be useful,<br />- * but WITHOUT ANY WARRANTY; without even the implied warranty of<br />- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br />- * GNU Lesser General Public License for more details.<br />- *<br />- * You should have received a copy of the GNU Lesser General Public License<br />- * along with this program; if not, write to the Free Software Foundation,<br />- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.<br />- *****************************************************************************/<br />-<br />-#ifdef HAVE_CONFIG_H<br />-# include "config.h"<br />-#endif<br />-<br />-#include <assert.h><br />-#include <pthread.h><br />-#include <stdlib.h><br />-#include <vlc_common.h><br />-#include "vlc_vaapi.h"<br />-<br />-#pragma GCC visibility push(default)<br />-<br />-static struct<br />-{<br />- pthread_mutex_t lock;<br />- VADisplay dpy;<br />- unsigned refcount;<br />-} va_instance = { PTHREAD_MUTEX_INITIALIZER, NULL, 0 };<br />-<br />-/* Set the VA instance and sets the reference counter to 1. */<br />-int<br />-vlc_vaapi_SetInstance(VADisplay dpy)<br />-{<br />- pthread_mutex_lock(&va_instance.lock);<br />- if (va_instance.refcount != 0)<br />- {<br />- vaTerminate(dpy);<br />- pthread_mutex_unlock(&va_instance.lock);<br />- return VLC_EGENERIC;<br />- }<br />- va_instance.refcount = 1;<br />- va_instance.dpy = dpy;<br />- pthread_mutex_unlock(&va_instance.lock);<br />- return VLC_SUCCESS;<br />-}<br />-<br />-/* Retrieve the VA instance and increases the reference counter by 1. */<br />-VADisplay<br />-vlc_vaapi_GetInstance(void)<br />-{<br />- VADisplay dpy;<br />- pthread_mutex_lock(&va_instance.lock);<br />- if (!va_instance.dpy)<br />- dpy = NULL;<br />- else<br />- {<br />- dpy = va_instance.dpy;<br />- ++va_instance.refcount;<br />- }<br />- pthread_mutex_unlock(&va_instance.lock);<br />- return dpy;<br />-}<br />-<br />-/* Decreases the reference counter by 1 and frees the instance if that counter<br />- reaches 0. */<br />-void<br />-vlc_vaapi_ReleaseInstance(VADisplay *dpy)<br />-{<br />- assert(va_instance.dpy == dpy && va_instance.refcount > 0);<br />- (void) dpy;<br />-<br />- pthread_mutex_lock(&va_instance.lock);<br />- if (--va_instance.refcount == 0)<br />- {<br />- vaTerminate(va_instance.dpy);<br />- va_instance.dpy = NULL;<br />- }<br />- pthread_mutex_unlock(&va_instance.lock);<br />-}<br />-<br />-#pragma GCC visibility pop<br />diff --git a/modules/hw/vaapi/vlc_vaapi.c b/modules/hw/vaapi/vlc_vaapi.c<br />index 04514eb852..28f4e6a58f 100644<br />--- a/modules/hw/vaapi/vlc_vaapi.c<br />+++ b/modules/hw/vaapi/vlc_vaapi.c<br />@@ -39,6 +39,7 @@<br /> #include <vlc_atomic.h><br /> #include <vlc_fourcc.h><br /> #include <vlc_picture_pool.h><br />+#include <vlc_instance_holder.h><br /> <br /> /* This macro is designed to wrap any VA call, and in case of failure,<br /> display the VA error string then goto the 'error' label (which you must<br />@@ -422,6 +423,7 @@ struct picture_sys_t<br /> {<br /> struct pic_sys_vaapi_instance *instance;<br /> struct vaapi_pic_ctx ctx;<br />+ vlc_object_t* p_vlc_obj;<br /> };<br /> <br /> static void<br />@@ -434,7 +436,7 @@ pool_pic_destroy_cb(picture_t *pic)<br /> {<br /> vaDestroySurfaces(instance->dpy, instance->render_targets,<br /> instance->num_render_targets);<br />- vlc_vaapi_ReleaseInstance(instance->dpy);<br />+ vlc_instance_holder_release( p_sys->p_vlc_obj, "vaapi-instance" );<br /> free(instance);<br /> }<br /> free(pic->p_sys);<br />@@ -515,6 +517,7 @@ vlc_vaapi_PoolNew(vlc_object_t *o, VADisplay dpy, unsigned count,<br /> goto error_pic;<br /> }<br /> p_sys->instance = instance;<br />+ p_sys->p_vlc_obj = o->obj.libvlc;<br /> p_sys->ctx.s.destroy = pic_sys_ctx_destroy_cb;<br /> p_sys->ctx.s.copy = pic_ctx_copy_cb;<br /> p_sys->ctx.surface = instance->render_targets[i];<br />@@ -537,7 +540,8 @@ vlc_vaapi_PoolNew(vlc_object_t *o, VADisplay dpy, unsigned count,<br /> goto error_pic;<br /> <br /> atomic_store(&instance->refcount, count);<br />- instance->dpy = vlc_vaapi_GetInstance(); /* Hold a reference on VADisplay */<br />+ /* Hold a reference on VADisplay */<br />+ instance->dpy = vlc_instance_holder_get( o, "vaapi-instance" );<br /> assert(instance->dpy == dpy);<br /> <br /> *render_targets = instance->render_targets;<br />diff --git a/modules/hw/vaapi/vlc_vaapi.h b/modules/hw/vaapi/vlc_vaapi.h<br />index 51dbc69a6c..e06bcfeca3 100644<br />--- a/modules/hw/vaapi/vlc_vaapi.h<br />+++ b/modules/hw/vaapi/vlc_vaapi.h<br />@@ -35,18 +35,12 @@<br /> * VA instance management *<br /> **************************/<br /> <br />-/* Allocates the VA instance and sets the reference counter to 1. */<br />-int<br />-vlc_vaapi_SetInstance(VADisplay dpy);<br />-<br />-/* Retrieve the VA instance and increases the reference counter by 1. */<br />-VADisplay<br />-vlc_vaapi_GetInstance(void);<br />-<br />-/* Decreases the reference counter by 1 and frees the instance if that counter<br />- reaches 0. */<br />-void<br />-vlc_vaapi_ReleaseInstance(VADisplay *);<br />+static inline void<br />+vlc_vaapi_DestroyInstance( void* instance, void* opaque )<br />+{<br />+ VLC_UNUSED( opaque );<br />+ vaTerminate( (VADisplay)instance );<br />+}<br /> <br /> /*****************<br /> * VAAPI display *<br />diff --git a/modules/video_output/opengl/converter_vaapi.c b/modules/video_output/opengl/converter_vaapi.c<br />index 03987a8e34..658432e434 100644<br />--- a/modules/video_output/opengl/converter_vaapi.c<br />+++ b/modules/video_output/opengl/converter_vaapi.c<br />@@ -25,6 +25,7 @@<br /> #include "internal.h"<br /> #include "../../hw/vaapi/vlc_vaapi.h"<br /> #include <vlc_vout_window.h><br />+#include <vlc_instance_holder.h><br /> <br /> #include <assert.h><br /> <br />@@ -252,7 +253,7 @@ tc_vaegl_release(const opengl_tex_converter_t *tc)<br /> if (priv->last.pic != NULL)<br /> vaegl_release_last_pic(tc, priv);<br /> <br />- vlc_vaapi_ReleaseInstance(priv->vadpy);<br />+ vlc_instance_holder_release( VLC_OBJECT( tc->gl ), "vaapi-instance" );<br /> <br /> #ifdef HAVE_VA_X11<br /> if (priv->x11dpy != NULL)<br />@@ -296,12 +297,8 @@ tc_vaegl_init(opengl_tex_converter_t *tc, VADisplay *vadpy)<br /> if (vadpy == NULL)<br /> return VLC_EGENERIC;<br /> <br />- int ret = VLC_ENOMEM;<br />- struct priv *priv = tc->priv = calloc(1, sizeof(struct priv));<br />- if (unlikely(tc->priv == NULL))<br />- goto error;<br />+ struct priv *priv = tc->priv;<br /> <br />- ret = VLC_EGENERIC;<br /> priv->vadpy = vadpy;<br /> priv->fourcc = 0;<br /> <br />@@ -330,30 +327,48 @@ tc_vaegl_init(opengl_tex_converter_t *tc, VADisplay *vadpy)<br /> if (tc_va_check_interop_blacklist(tc, priv->vadpy))<br /> goto error;<br /> <br />- if (vlc_vaapi_SetInstance(priv->vadpy))<br />- {<br />- msg_Err(tc->gl, "VAAPI instance already in use");<br />- vadpy = NULL;<br />- goto error;<br />- }<br />-<br /> tc->fshader = opengl_fragment_shader_init(tc, GL_TEXTURE_2D, VLC_CODEC_NV12,<br /> tc-><a href="http://fmt.space">fmt.space</a>);<br /> if (tc->fshader == 0)<br />- {<br />- vlc_vaapi_ReleaseInstance(priv->vadpy);<br />- vadpy = NULL;<br /> goto error;<br />- }<br /> return VLC_SUCCESS;<br /> <br /> error:<br /> if (vadpy != NULL)<br /> vaTerminate(vadpy);<br />- free(tc->priv);<br />- return ret;<br />+ return VLC_EGENERIC;<br />+}<br />+<br />+<br />+static VADisplay CreateVADisplayInstance( VADisplay p_display, opengl_tex_converter_t* p_tc )<br />+{<br />+ if ( tc_vaegl_init( p_tc, p_display ) )<br />+ {<br />+ vaTerminate( p_display );<br />+ return NULL;<br />+ }<br />+ return p_display;<br /> }<br /> <br />+#ifdef HAVE_VA_X11<br />+static void* CreateVADisplayInstanceX11( void* p_opaque )<br />+{<br />+ opengl_tex_converter_t* p_tc = (opengl_tex_converter_t*)p_opaque;<br />+ struct priv* p_priv = p_tc->priv;<br />+ return CreateVADisplayInstance( vaGetDisplay( p_priv->x11dpy ), p_tc );<br />+}<br />+#endif<br />+<br />+#ifdef HAVE_VA_WL<br />+static void* CreateVADisplayInstanceWL( void* p_opaque )<br />+{<br />+ opengl_tex_converter_t* p_tc = (opengl_tex_converter_t*)p_opaque;<br />+ return CreateVADisplayInstance( vaGetDisplayWl( p_tc->gl->surface->display.wl ),<br />+ p_tc );<br />+}<br />+<br />+#endif<br />+<br /> int<br /> opengl_tex_converter_vaapi_init(opengl_tex_converter_t *tc)<br /> {<br />@@ -362,6 +377,9 @@ opengl_tex_converter_vaapi_init(opengl_tex_converter_t *tc)<br /> || tc->gl->egl.destroyImageKHR == NULL)<br /> return VLC_EGENERIC;<br /> <br />+ struct priv* p_priv = tc->priv = calloc(1, sizeof(struct priv));<br />+ if (unlikely(p_priv == NULL))<br />+ return VLC_ENOMEM;<br /> switch (tc->gl->surface->type)<br /> {<br /> #ifdef HAVE_VA_X11<br />@@ -369,27 +387,44 @@ opengl_tex_converter_vaapi_init(opengl_tex_converter_t *tc)<br /> {<br /> if (!vlc_xlib_init(VLC_OBJECT(tc->gl)))<br /> return VLC_EGENERIC;<br />- Display *x11dpy = XOpenDisplay(tc->gl->surface->display.x11);<br />- if (x11dpy == NULL)<br />+ p_priv->x11dpy = XOpenDisplay(tc->gl->surface->display.x11);<br />+ if (p_priv->x11dpy == NULL)<br />+ {<br />+ free( p_priv );<br /> return VLC_EGENERIC;<br />+ }<br /> <br />- if (tc_vaegl_init(tc, vaGetDisplay(x11dpy)))<br />+ VADisplay disp = vlc_instance_holder_acquire(<br />+ VLC_OBJECT( tc->gl ), "vaapi-instance",<br />+ &CreateVADisplayInstanceX11, &vlc_vaapi_DestroyInstance,<br />+ tc );<br />+ if (disp == NULL)<br /> {<br />- XCloseDisplay(x11dpy);<br />+ XCloseDisplay(p_priv->x11dpy);<br />+ p_priv->x11dpy = NULL;<br />+ free( p_priv );<br /> return VLC_EGENERIC;<br /> }<br />- struct priv *priv = tc->priv;<br />- priv->x11dpy = x11dpy;<br /> break;<br /> }<br /> #endif<br /> #ifdef HAVE_VA_WL<br /> case VOUT_WINDOW_TYPE_WAYLAND:<br />- if (tc_vaegl_init(tc, vaGetDisplayWl(tc->gl->surface->display.wl)))<br />+ {<br />+ VADisplay disp = vlc_instance_holder_acquire(<br />+ VLC_OBJECT( tc->gl ),"vaapi-instance",<br />+ &CreateVADisplayInstanceWL, &vlc_vaapi_DestroyInstance,<br />+ tc->gl->surface->display.wl);<br />+ if (disp == NULL)<br />+ {<br />+ free( p_priv );<br /> return VLC_EGENERIC;<br />+ }<br /> break;<br />+ }<br /> #endif<br /> default:<br />+ free( p_priv );<br /> return VLC_EGENERIC;<br /> }<br /> </pre></blockquote></div><br clear="all">VA _cannot_ use a single instance. You can have more than one VA device. Also, AFAIK, VA instances are not thread-safe.<br>
-- <br>
Rémi Denis-Courmont<br>
Typed on an inconvenient virtual keyboard</body></html>