[vlc-devel] [PATCH 2/2] vaapi: Use vlc_instance_holder instead of the instance shared library

Rémi Denis-Courmont remi at remlab.net
Sat Jul 1 17:08:55 CEST 2017


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

VA _cannot_ use a single instance. You can have more than one VA device. Also, AFAIK, VA instances are not thread-safe.
-- 
Rémi Denis-Courmont
Typed on an inconvenient virtual keyboard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170701/67aa5871/attachment.html>


More information about the vlc-devel mailing list