vlc | branch: master | Victorien Le Couviour--Tuffet <[email protected]> | Tue Aug 23 12:50:49 2016 +0300| [a7c9dab0a1d426b3a77992d68105ba74aeb9879e] | committer: Thomas Guillem
hw: vaapi: add instance dynamic library This dynamic library holds the current VADisplay instance. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a7c9dab0a1d426b3a77992d68105ba74aeb9879e --- modules/Makefile.am | 1 + modules/hw/vaapi/Makefile.am | 11 ++++++ modules/hw/vaapi/instance.c | 93 ++++++++++++++++++++++++++++++++++++++++++++ modules/hw/vaapi/vlc_vaapi.h | 47 ++++++++++++++++++++++ 4 files changed, 152 insertions(+) diff --git a/modules/Makefile.am b/modules/Makefile.am index 5e9e079a91..0276e271a9 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -31,6 +31,7 @@ include codec/Makefile.am include control/Makefile.am include demux/Makefile.am include gui/Makefile.am +include hw/vaapi/Makefile.am include hw/vdpau/Makefile.am include keystore/Makefile.am include logger/Makefile.am diff --git a/modules/hw/vaapi/Makefile.am b/modules/hw/vaapi/Makefile.am new file mode 100644 index 0000000000..92eb10c2bd --- /dev/null +++ b/modules/hw/vaapi/Makefile.am @@ -0,0 +1,11 @@ +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 + +if HAVE_VAAPI +vaapi_LTLIBRARIES = libvlc_vaapi_instance.la +endif diff --git a/modules/hw/vaapi/instance.c b/modules/hw/vaapi/instance.c new file mode 100644 index 0000000000..3f70fe7ebc --- /dev/null +++ b/modules/hw/vaapi/instance.c @@ -0,0 +1,93 @@ +/***************************************************************************** + * instance.c: VAAPI instance management for VLC + ***************************************************************************** + * Copyright (C) 2017 VLC authors, VideoLAN and VideoLabs + * + * Author: Victorien Le Couviour--Tuffet <[email protected]> + * + * 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.h b/modules/hw/vaapi/vlc_vaapi.h new file mode 100644 index 0000000000..92ef9b1ace --- /dev/null +++ b/modules/hw/vaapi/vlc_vaapi.h @@ -0,0 +1,47 @@ +/***************************************************************************** + * vlc_vaapi.h: VAAPI helper for VLC + ***************************************************************************** + * Copyright (C) 2017 VLC authors, VideoLAN and VideoLabs + * + * Authors: Thomas Guillem <[email protected]> + * Petri Hintukainen <[email protected]> + * Victorien Le Couviour--Tuffet <[email protected]> + * + * 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. + *****************************************************************************/ + +#ifndef VLC_VAAPI_H +# define VLC_VAAPI_H + +#include <va/va.h> + +/************************** + * 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 *); + +#endif /* VLC_VAAPI_H */ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
