Commit 2f3c89c9 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

vaapi: add support for DRM backend

parent 833f43cf
...@@ -2289,30 +2289,50 @@ AC_ARG_ENABLE(libva, ...@@ -2289,30 +2289,50 @@ AC_ARG_ENABLE(libva,
AS_IF([test "${enable_libva}" = "yes" -a "${have_avcodec}" != "yes" ], [ AS_IF([test "${enable_libva}" = "yes" -a "${have_avcodec}" != "yes" ], [
AC_MSG_ERROR([--enable-libva and --disable-avcodec options are mutually exclusive. Use --enable-avcodec.]) AC_MSG_ERROR([--enable-libva and --disable-avcodec options are mutually exclusive. Use --enable-avcodec.])
]) ])
have_avcodec_vaapi="no"
AS_IF([test "${enable_libva}" != "no" -a "${have_avcodec}" = "yes"], [ have_vaapi="no"
PKG_CHECK_MODULES(LIBVA, [libva libva-x11], [ have_vaapi_drm="no"
VLC_SAVE_FLAGS have_vaapi_x11="no"
CPPFLAGS="${CPPFLAGS} ${AVCODEC_CFLAGS}" AS_IF([test "${enable_libva}" != "no"], [
CFLAGS="${CFLAGS} ${AVCODEC_CFLAGS}" PKG_CHECK_EXISTS([libva], [
AC_CHECK_HEADERS(libavcodec/vaapi.h, [ have_vaapi="yes"
AC_MSG_NOTICE([VAAPI acceleration activated]) ], [
have_avcodec_vaapi="yes"
],[
AS_IF([test -n "${enable_libva}"], [
AC_MSG_ERROR([libva is present but libavcodec/vaapi.h is missing])
], [
AC_MSG_WARN([libva is present but libavcodec/vaapi.h is missing ])
])
])
VLC_RESTORE_FLAGS
],[
AS_IF([test -n "${enable_libva}"], [ AS_IF([test -n "${enable_libva}"], [
AC_MSG_ERROR([${LIBVA_PKG_ERRORS}.]) AC_MSG_ERROR([${LIBVA_PKG_ERRORS}.])
], [ ], [
AC_MSG_WARN([${LIBVA_PKG_ERRORS}.]) AC_MSG_WARN([${LIBVA_PKG_ERRORS}.])
]) ])
]) ])
PKG_CHECK_MODULES([LIBVA_DRM], [libva-drm], [
have_vaapi_drm="yes"
], [
AC_MSG_WARN([${LIBVA_DRM_PKG_ERRORS}.])
])
PKG_CHECK_MODULES(LIBVA_X11, [libva-x11], [
have_vaapi_x11="yes"
], [
AC_MSG_WARN([${LIBVA_X11_PKG_ERRORS}.])
])
])
AM_CONDITIONAL([HAVE_VAAPI_DRM], [test "${have_vaapi_drm}" = "yes"])
AM_CONDITIONAL([HAVE_VAAPI_X11], [test "${have_vaapi_x11}" = "yes"])
have_avcodec_vaapi="no"
AS_IF([test "${have_vaapi}" = "yes" -a "${have_avcodec}" = "yes"], [
VLC_SAVE_FLAGS
CPPFLAGS="${CPPFLAGS} ${AVCODEC_CFLAGS}"
CFLAGS="${CFLAGS} ${AVCODEC_CFLAGS}"
AC_CHECK_HEADERS([libavcodec/vaapi.h], [
AC_MSG_NOTICE([VAAPI acceleration activated])
have_avcodec_vaapi="yes"
],[
AS_IF([test -n "${enable_libva}"], [
AC_MSG_ERROR([libva is present but libavcodec/vaapi.h is missing])
], [
AC_MSG_WARN([libva is present but libavcodec/vaapi.h is missing ])
])
])
VLC_RESTORE_FLAGS
]) ])
AM_CONDITIONAL([HAVE_AVCODEC_VAAPI], [test "${have_avcodec_vaapi}" = "yes"]) AM_CONDITIONAL([HAVE_AVCODEC_VAAPI], [test "${have_avcodec_vaapi}" = "yes"])
......
...@@ -270,14 +270,27 @@ endif ...@@ -270,14 +270,27 @@ endif
### avcodec hardware acceleration ### ### avcodec hardware acceleration ###
libvaapi_plugin_la_SOURCES = \ libvaapi_drm_plugin_la_SOURCES = \
video_chroma/copy.c video_chroma/copy.h \ video_chroma/copy.c video_chroma/copy.h \
codec/avcodec/vaapi.c codec/avcodec/vaapi.c
libvaapi_plugin_la_CFLAGS = $(AM_CFLAGS) \ libvaapi_drm_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -DVLC_VA_BACKEND_DRM
$(LIBVA_CFLAGS) $(X_CFLAGS) $(AVCODEC_CFLAGS) libvaapi_drm_plugin_la_CFLAGS = $(AM_CFLAGS) \
libvaapi_plugin_la_LIBADD = $(LIBVA_LIBS) $(X_LIBS) $(X_PRE_LIBS) -lX11 $(LIBVA_DRM_CFLAGS) $(AVCODEC_CFLAGS)
libvaapi_drm_plugin_la_LIBADD = $(LIBVA_DRM_LIBS)
libvaapi_x11_plugin_la_SOURCES = \
video_chroma/copy.c video_chroma/copy.h \
codec/avcodec/vaapi.c
libvaapi_x11_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -DVLC_VA_BACKEND_XLIB
libvaapi_x11_plugin_la_CFLAGS = $(AM_CFLAGS) \
$(LIBVA_X11_CFLAGS) $(X_CFLAGS) $(AVCODEC_CFLAGS)
libvaapi_x11_plugin_la_LIBADD = $(LIBVA_X11_LIBS) $(X_LIBS) $(X_PRE_LIBS) -lX11
if HAVE_AVCODEC_VAAPI if HAVE_AVCODEC_VAAPI
codec_LTLIBRARIES += libvaapi_plugin.la if HAVE_VAAPI_DRM
codec_LTLIBRARIES += libvaapi_drm_plugin.la
endif
if HAVE_VAAPI_X11
codec_LTLIBRARIES += libvaapi_x11_plugin.la
endif
endif endif
libdxva2_plugin_la_SOURCES = \ libdxva2_plugin_la_SOURCES = \
......
...@@ -30,12 +30,20 @@ ...@@ -30,12 +30,20 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_plugin.h> #include <vlc_plugin.h>
#include <vlc_fourcc.h> #include <vlc_fourcc.h>
#include <vlc_xlib.h>
#ifdef VLC_VA_BACKEND_XLIB
# include <vlc_xlib.h>
# include <va/va_x11.h>
#endif
#ifdef VLC_VA_BACKEND_DRM
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <vlc_fs.h>
# include <va/va_drm.h>
#endif
#include <libavcodec/avcodec.h> #include <libavcodec/avcodec.h>
#include <libavcodec/vaapi.h> #include <libavcodec/vaapi.h>
#include <X11/Xlib.h>
#include <va/va_x11.h>
#include "avcodec.h" #include "avcodec.h"
#include "va.h" #include "va.h"
...@@ -50,11 +58,16 @@ static int Create( vlc_va_t *, AVCodecContext *, const es_format_t * ); ...@@ -50,11 +58,16 @@ static int Create( vlc_va_t *, AVCodecContext *, const es_format_t * );
static void Delete( vlc_va_t * ); static void Delete( vlc_va_t * );
vlc_module_begin () vlc_module_begin ()
set_description( N_("Video Acceleration (VA) API") ) #if defined (VLC_VA_BACKEND_XLIB)
set_description( N_("Video Acceleration (VA) API / X11") )
#elif defined (VLC_VA_BACKEND_DRM)
set_description( N_("Video Acceleration (VA) API / DRM") )
#endif
set_capability( "hw decoder", 0 ) set_capability( "hw decoder", 0 )
set_category( CAT_INPUT ) set_category( CAT_INPUT )
set_subcategory( SUBCAT_INPUT_VCODEC ) set_subcategory( SUBCAT_INPUT_VCODEC )
set_callbacks( Create, Delete ) set_callbacks( Create, Delete )
add_shortcut( "vaapi" )
vlc_module_end () vlc_module_end ()
typedef struct typedef struct
...@@ -67,7 +80,12 @@ typedef struct ...@@ -67,7 +80,12 @@ typedef struct
struct vlc_va_sys_t struct vlc_va_sys_t
{ {
Display *p_display_x11; #ifdef VLC_VA_BACKEND_XLIB
Display *p_display_x11;
#endif
#ifdef VLC_VA_BACKEND_DRM
int drm_fd;
#endif
VADisplay p_display; VADisplay p_display;
VAConfigID i_config_id; VAConfigID i_config_id;
...@@ -138,6 +156,7 @@ static int Open( vlc_va_t *va, int i_codec_id, int i_thread_count ) ...@@ -138,6 +156,7 @@ static int Open( vlc_va_t *va, int i_codec_id, int i_thread_count )
sys->image.image_id = VA_INVALID_ID; sys->image.image_id = VA_INVALID_ID;
/* Create a VA display */ /* Create a VA display */
#ifdef VLC_VA_BACKEND_XLIB
sys->p_display_x11 = XOpenDisplay(NULL); sys->p_display_x11 = XOpenDisplay(NULL);
if( !sys->p_display_x11 ) if( !sys->p_display_x11 )
{ {
...@@ -146,6 +165,17 @@ static int Open( vlc_va_t *va, int i_codec_id, int i_thread_count ) ...@@ -146,6 +165,17 @@ static int Open( vlc_va_t *va, int i_codec_id, int i_thread_count )
} }
sys->p_display = vaGetDisplay( sys->p_display_x11 ); sys->p_display = vaGetDisplay( sys->p_display_x11 );
#endif
#ifdef VLC_VA_BACKEND_DRM
sys->drm_fd = vlc_open("/dev/dri/card0", O_RDWR);
if( sys->drm_fd == -1 )
{
msg_Err( va, "Could not access rendering device: %m" );
goto error;
}
sys->p_display = vaGetDisplayDRM( sys->drm_fd );
#endif
if( !sys->p_display ) if( !sys->p_display )
{ {
msg_Err( va, "Could not get a VAAPI device" ); msg_Err( va, "Could not get a VAAPI device" );
...@@ -219,8 +249,14 @@ error: ...@@ -219,8 +249,14 @@ error:
free( va->description ); free( va->description );
if( sys->p_display != NULL ) if( sys->p_display != NULL )
vaTerminate( sys->p_display ); vaTerminate( sys->p_display );
#ifdef VLC_VA_BACKEND_XLIB
if( sys->p_display_x11 != NULL ) if( sys->p_display_x11 != NULL )
XCloseDisplay( sys->p_display_x11 ); XCloseDisplay( sys->p_display_x11 );
#endif
#ifdef VLC_VA_BACKEND_DRM
if( sys->drm_fd != -1 )
close( sys->drm_fd );
#endif
free( sys ); free( sys );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -531,7 +567,12 @@ static void Close( vlc_va_sys_t *sys ) ...@@ -531,7 +567,12 @@ static void Close( vlc_va_sys_t *sys )
if( sys->i_config_id != VA_INVALID_ID ) if( sys->i_config_id != VA_INVALID_ID )
vaDestroyConfig( sys->p_display, sys->i_config_id ); vaDestroyConfig( sys->p_display, sys->i_config_id );
vaTerminate( sys->p_display ); vaTerminate( sys->p_display );
#ifdef VLC_VA_BACKEND_XLIB
XCloseDisplay( sys->p_display_x11 ); XCloseDisplay( sys->p_display_x11 );
#endif
#ifdef VLC_VA_BACKEND_DRM
close( sys->drm_fd );
#endif
} }
static void Delete( vlc_va_t *va ) static void Delete( vlc_va_t *va )
...@@ -545,11 +586,13 @@ static void Delete( vlc_va_t *va ) ...@@ -545,11 +586,13 @@ static void Delete( vlc_va_t *va )
static int Create( vlc_va_t *p_va, AVCodecContext *ctx, static int Create( vlc_va_t *p_va, AVCodecContext *ctx,
const es_format_t *fmt ) const es_format_t *fmt )
{ {
#ifdef VLC_VA_BACKEND_XLIB
if( !vlc_xlib_init( VLC_OBJECT(p_va) ) ) if( !vlc_xlib_init( VLC_OBJECT(p_va) ) )
{ {
msg_Warn( p_va, "Ignoring VA API" ); msg_Warn( p_va, "Ignoring VA API" );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
#endif
(void) fmt; (void) fmt;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment