[vlc-devel] [vlc-commits] gl: vaapi: fix the ugly way to get the X11 Display
Thomas Guillem
thomas at gllm.fr
Wed Jun 21 11:56:39 CEST 2017
On Wed, Jun 21, 2017, at 11:39, Thomas Guillem wrote:
> vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Jun 21
> 10:18:43 2017 +0200| [0aa66673349ea3ee632f4bf639c935d2f2240ad2] |
> committer: Thomas Guillem
>
> gl: vaapi: fix the ugly way to get the X11 Display
>
> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0aa66673349ea3ee632f4bf639c935d2f2240ad2
> ---
>
> modules/video_output/Makefile.am | 4 +-
> modules/video_output/opengl/converter_vaapi.c | 70
> ++++++++++++++++-----------
> 2 files changed, 46 insertions(+), 28 deletions(-)
>
> diff --git a/modules/video_output/Makefile.am
> b/modules/video_output/Makefile.am
> index 973a8cd212..2e7c5d8ba7 100644
> --- a/modules/video_output/Makefile.am
> +++ b/modules/video_output/Makefile.am
> @@ -35,11 +35,13 @@ OPENGL_COMMONCFLAGS += -DHAVE_VA_WL
> endif
> endif
> if HAVE_VAAPI_X11
> -OPENGL_COMMONLIBS += $(LIBVA_X11_LIBS)
> +if HAVE_XCB
> +OPENGL_COMMONLIBS += $(LIBVA_X11_LIBS) $(X_LIBS) $(X_PRE_LIBS) -lX11
> OPENGL_COMMONCFLAGS += -DHAVE_VA_X11
Ok, maybe we need to put converters in separate modules/lib
> endif
> endif
> endif
> +endif
>
> if HAVE_DECKLINK
> libdecklinkoutput_plugin_la_SOURCES = video_output/decklink.cpp
> diff --git a/modules/video_output/opengl/converter_vaapi.c
> b/modules/video_output/opengl/converter_vaapi.c
> index 7c9f9947b6..83ea67e0e0 100644
> --- a/modules/video_output/opengl/converter_vaapi.c
> +++ b/modules/video_output/opengl/converter_vaapi.c
> @@ -38,14 +38,7 @@
>
> #ifdef HAVE_VA_X11
> # include <va/va_x11.h>
> -/* TODO ugly way to get the X11 Display via EGL. */
> -struct vlc_gl_sys_t
> -{
> - EGLDisplay display;
> - EGLSurface surface;
> - EGLContext context;
> - Display *x11;
> -};
> +# include <vlc_xlib.h>
> #endif
>
> struct priv
> @@ -55,6 +48,9 @@ struct priv
> PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
> PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
> PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
> +#ifdef HAVE_VA_X11
> + Display *x11dpy;
> +#endif
> EGLDisplay egldpy;
>
> video_color_space_t yuv_space;
> @@ -229,12 +225,15 @@ tc_vaegl_release(const opengl_tex_converter_t *tc)
>
> vlc_vaapi_ReleaseInstance(priv->vadpy);
>
> +#ifdef HAVE_VA_X11
> + if (priv->x11dpy != NULL)
> + XCloseDisplay(priv->x11dpy);
> +#endif
> free(tc->priv);
> }
>
> static GLuint
> -tc_vaegl_init(video_format_t *fmt, opengl_tex_converter_t *tc,
> - struct priv *priv, VADisplay *vadpy)
> +tc_vaegl_init(video_format_t *fmt, opengl_tex_converter_t *tc, VADisplay
> *vadpy)
> {
> #define GETPROC(x) do { \
> if ((priv->x = vlc_gl_GetProcAddress(tc->gl, #x)) == NULL) return
> -1; \
> @@ -242,6 +241,7 @@ tc_vaegl_init(video_format_t *fmt,
> opengl_tex_converter_t *tc,
>
> if (vadpy == NULL)
> return 0;
> + struct priv *priv = tc->priv;
> priv->vadpy = vadpy;
> priv->fourcc = 0;
> priv->yuv_space = fmt->space;
> @@ -305,39 +305,55 @@ opengl_tex_converter_vaapi_init(video_format_t
> *fmt, opengl_tex_converter_t *tc)
> if (fmt->i_chroma != VLC_CODEC_VAAPI_420)
> return 0;
>
> - struct priv *priv = tc->priv = calloc(1, sizeof(struct priv));
> - if (unlikely(priv == NULL))
> - return VLC_ENOMEM;
> -
> GLuint fshader = 0;
> switch (tc->gl->surface->type)
> {
> #ifdef HAVE_VA_X11
> case VOUT_WINDOW_TYPE_XID:
> {
> - struct vlc_gl_sys_t *glsys = tc->gl->sys;
> - fshader = tc_vaegl_init(fmt, tc, priv,
> vaGetDisplay(glsys->x11));
> + if (!vlc_xlib_init(VLC_OBJECT(tc->gl)))
> + return VLC_EGENERIC;
> + Display *x11dpy =
> XOpenDisplay(tc->gl->surface->display.x11);
> + if (x11dpy == NULL)
> + return VLC_EGENERIC;
> +
> + struct priv *priv = tc->priv = calloc(1, sizeof(struct
> priv));
> + if (unlikely(tc->priv == NULL))
> + {
> + XCloseDisplay(x11dpy);
> + return VLC_ENOMEM;
> + }
> +
> + fshader = tc_vaegl_init(fmt, tc, vaGetDisplay(x11dpy));
> + if (fshader == 0)
> + {
> + XCloseDisplay(x11dpy);
> + free(tc->priv);
> + return 0;
> + }
> + priv->x11dpy = x11dpy;
> break;
> }
> #endif
> #ifdef HAVE_VA_WL
> case VOUT_WINDOW_TYPE_WAYLAND:
> - fshader = tc_vaegl_init(fmt, tc, priv,
> + tc->priv = calloc(1, sizeof(struct priv));
> + if (unlikely(tc->priv == NULL))
> + return VLC_ENOMEM;
> +
> + fshader = tc_vaegl_init(fmt, tc,
> vaGetDisplayWl(tc->gl->surface->display.wl));
> + if (fshader == 0)
> + {
> + free(tc->priv);
> + return 0;
> + }
> break;
> #endif
> default:
> - goto error;
> + return VLC_EGENERIC;
> }
> - if (fshader == 0)
> - goto error;
> -
> - tc->priv = priv;
> - tc->pf_get_pool = tc_va_get_pool;
> + tc->pf_get_pool = tc_va_get_pool;
>
> return fshader;
> -
> -error:
> - free(priv);
> - return 0;
> }
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits
More information about the vlc-devel
mailing list