Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
2f3c89c9
Commit
2f3c89c9
authored
Mar 22, 2014
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vaapi: add support for DRM backend
parent
833f43cf
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
104 additions
and
28 deletions
+104
-28
configure.ac
configure.ac
+38
-18
modules/codec/Makefile.am
modules/codec/Makefile.am
+18
-5
modules/codec/avcodec/vaapi.c
modules/codec/avcodec/vaapi.c
+48
-5
No files found.
configure.ac
View file @
2f3c89c9
...
@@ -2289,13 +2289,40 @@ AC_ARG_ENABLE(libva,
...
@@ -2289,13 +2289,40 @@ 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_vaapi="no"
have_vaapi_drm="no"
have_vaapi_x11="no"
AS_IF([test "${enable_libva}" != "no"], [
PKG_CHECK_EXISTS([libva], [
have_vaapi="yes"
], [
AS_IF([test -n "${enable_libva}"], [
AC_MSG_ERROR([${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"
have_avcodec_vaapi="no"
AS_IF([test "${enable_libva}" != "no" -a "${have_avcodec}" = "yes"], [
AS_IF([test "${have_vaapi}" = "yes" -a "${have_avcodec}" = "yes"], [
PKG_CHECK_MODULES(LIBVA, [libva libva-x11], [
VLC_SAVE_FLAGS
VLC_SAVE_FLAGS
CPPFLAGS="${CPPFLAGS} ${AVCODEC_CFLAGS}"
CPPFLAGS="${CPPFLAGS} ${AVCODEC_CFLAGS}"
CFLAGS="${CFLAGS} ${AVCODEC_CFLAGS}"
CFLAGS="${CFLAGS} ${AVCODEC_CFLAGS}"
AC_CHECK_HEADERS(libavcodec/vaapi.h
, [
AC_CHECK_HEADERS([libavcodec/vaapi.h]
, [
AC_MSG_NOTICE([VAAPI acceleration activated])
AC_MSG_NOTICE([VAAPI acceleration activated])
have_avcodec_vaapi="yes"
have_avcodec_vaapi="yes"
],[
],[
...
@@ -2306,13 +2333,6 @@ AS_IF([test "${enable_libva}" != "no" -a "${have_avcodec}" = "yes"], [
...
@@ -2306,13 +2333,6 @@ AS_IF([test "${enable_libva}" != "no" -a "${have_avcodec}" = "yes"], [
])
])
])
])
VLC_RESTORE_FLAGS
VLC_RESTORE_FLAGS
],[
AS_IF([test -n "${enable_libva}"], [
AC_MSG_ERROR([${LIBVA_PKG_ERRORS}.])
], [
AC_MSG_WARN([${LIBVA_PKG_ERRORS}.])
])
])
])
])
AM_CONDITIONAL([HAVE_AVCODEC_VAAPI], [test "${have_avcodec_vaapi}" = "yes"])
AM_CONDITIONAL([HAVE_AVCODEC_VAAPI], [test "${have_avcodec_vaapi}" = "yes"])
...
...
modules/codec/Makefile.am
View file @
2f3c89c9
...
@@ -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
=
\
...
...
modules/codec/avcodec/vaapi.c
View file @
2f3c89c9
...
@@ -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
{
{
#ifdef VLC_VA_BACKEND_XLIB
Display
*
p_display_x11
;
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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment