[FFmpeg-trac] #7106(ffmpeg:new): Compiling FFmpeg with VAAPI enabled results in failure at: /FFmpeg/libavutil/hwcontext_vaapi.c:1235: undefined reference to `vaSetErrorCallback' using libva master branch
FFmpeg
trac at avcodec.org
Fri Mar 23 22:45:30 EET 2018
#7106: Compiling FFmpeg with VAAPI enabled results in failure at:
/FFmpeg/libavutil/hwcontext_vaapi.c:1235: undefined reference to
`vaSetErrorCallback' using libva master branch
------------------------------------+--------------------------------------
Reporter: Brainiarc7 | Type: defect
Status: new | Priority: normal
Component: ffmpeg | Version: git-master
Keywords: libva | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
------------------------------------+--------------------------------------
'''Summary of the bug:
'''
Building FFmpeg with VAAPI enabled results in the error above. Attaching
relevant logs below.
Notes: I installed libva from upstream, compiled from source:
https://github.com/intel/libva/tree/master
'''How to reproduce:'''
Build libva and libva-utils from upstream, confirm all is working as
expected via vainfo, then build FFmpeg:
1. vainfo:
{{{
vainfo
libva info: VA-API version 1.1.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/local/lib/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_1_1
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.1 (libva 2.1.1.pre1)
vainfo: Driver version: Intel i965 driver for Intel(R) Ivybridge Desktop -
2.1.1.pre1 (2.1.0-41-g99c3748)
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264StereoHigh : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc
VAProfileJPEGBaseline : VAEntrypointVLD
}}}
'''How libva and its' components were built:'''
Build platform: Ubuntu 16.04LTS
Installing the base dependencies:
{{{
sudo apt-get -y install autoconf automake build-essential libass-dev
libtool pkg-config texinfo zlib1g-dev libva-dev cmake mercurial libdrm-dev
}}}
I then created a clean working directory and worked from there:
{{{
mkdir -p ~/vaapi
mkdir -p ~/ffmpeg_build
}}}
'''Individual components:'''
1. cmrt:
This is the C for Media Runtime GPU Kernel Manager for Intel G45 & HD
Graphics family. it's a prerequisite for building the intel-hybrid-driver
package.
{{{
cd ~/vaapi
git clone https://github.com/01org/cmrt
cd cmrt
./autogen.sh
./configure
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
}}}
2. libva:
Libva is an implementation for VA-API (Video Acceleration API)
VA-API is an open-source library and API specification, which provides
access to graphics hardware acceleration capabilities for video
processing. It consists of a main library and driver-specific acceleration
backends for each supported hardware vendor. It is a prerequisite for
building the VAAPI driver components below.
{{{
cd ~/vaapi
git clone https://github.com/01org/libva
cd libva
./autogen.sh
./configure
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
}}}
3. intel-hybrid-driver:
This package provides support for WebM project VPx codecs. GPU
acceleration is provided via media kernels executed on Intel GEN GPUs. The
hybrid driver provides the CPU bound entropy (e.g., CPBAC) decoding and
manages the GEN GPU media kernel parameters and buffers.
This package grants access to the VPX-series hybrid decode capabilities on
supported hardware configurations.
{{{
cd ~/vaapi
git clone https://github.com/01org/intel-hybrid-driver
cd intel-hybrid-driver
./autogen.sh
./configure
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
}}}
4. intel-vaapi-driver:
This package provides the VA-API (Video Acceleration API) user mode driver
for Intel GEN Graphics family SKUs. The current video driver back-end
provides a bridge to the GEN GPUs through the packaging of buffers and
commands to be sent to the i915 driver for exercising both hardware and
shader functionality for video decode, encode, and processing. it also
provides a wrapper to the intel-hybrid-driver when called up to handle
VP8/9 hybrid decode tasks on supported hardware (when configured with the
--enable-hybrid-codec option as shown below:).
{{{
cd ~/vaapi
git clone https://github.com/01org/intel-vaapi-driver
cd intel-vaapi-driver
./autogen.sh
./configure --enable-hybrid-codec
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
}}}
5. libva-utils:
This package provides a collection of tests for VA-API, such as vainfo,
needed to validate a platform's supported features (encode, decode &
postproc attributes on a per-codec basis by VAAPI entry points
information).
{{{
cd ~/vaapi
git clone https://github.com/intel/libva-utils
cd libva-utils
./autogen.sh
./configure
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
}}}
I then set the environment variables for the VAAPI drivers as shown below:
Check if LIBVA environment variables are correctly configured:
{{{
set | grep LIBVA
}}}
Should output something like:
{{{
LIBVA_DRIVER_NAME=i965
LIBVA_DRIVERS_PATH=/usr/local/lib/dri
}}}
If not (as expected), set them on your system environment variables
(/etc/environment) and reboot.
{{{
sudo systemctl reboot
}}}
After the reboot, I then proceeded to build FFmpeg as shown:
Preparing the workspace directories:
{{{
mkdir -p $HOME/bin
chown -Rc $USER:$USER $HOME/bin
mkdir -p ~/ffmpeg_sources
}}}
Including extra components as needed:
(a). Build and deploy nasm: Nasm is an assembler for x86 optimizations
used by x264 and FFmpeg. Highly recommended or your resulting build may be
very slow.
Note that we've now switched away from Yasm to nasm, as this is the
current assembler that x265,x264, among others, are adopting.
{{{
cd ~/ffmpeg_sources
wget wget
http://www.nasm.us/pub/nasm/releasebuilds/2.14rc0/nasm-2.14rc0.tar.gz
tar xzvf nasm-2.14rc0.tar.gz
cd nasm-2.14rc0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make -j$(nproc) VERBOSE=1
make -j$(nproc) install
make -j$(nproc) distclean
}}}
(b). Build and deploy libx264 statically: This library provides a H.264
video encoder. See the H.264 Encoding Guide for more information and usage
examples. This requires ffmpeg to be configured with --enable-gpl
--enable-libx264.
{{{
cd ~/ffmpeg_sources
git clone http://git.videolan.org/git/x264.git -b stable
cd x264/
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --enable-
static --disable-opencl
PATH="$HOME/bin:$PATH" make -j$(nproc) VERBOSE=1
make -j$(nproc) install VERBOSE=1
make -j$(nproc) distclean
}}}
(c). Build and configure libx265: This library provides a H.265/HEVC video
encoder. See the H.265 Encoding Guide for more information and usage
examples.
{{{
cd ~/ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265
cd ~/ffmpeg_sources/x265/build/linux
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles"
-DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off
../../source
make -j$(nproc) VERBOSE=1
make -j$(nproc) install VERBOSE=1
make -j$(nproc) clean VERBOSE=1
}}}
(d). Build and deploy the libfdk-aac library: This provides an AAC audio
encoder. See the AAC Audio Encoding Guide for more information and usage
examples. This requires ffmpeg to be configured with --enable-libfdk-aac
(and --enable-nonfree if you also included --enable-gpl).
{{{
cd ~/ffmpeg_sources
wget -O fdk-aac.tar.gz https://github.com/mstorsjo/fdk-aac/tarball/master
tar xzvf fdk-aac.tar.gz
cd mstorsjo-fdk-aac*
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make -j$(nproc)
make -j$(nproc) install
make -j$(nproc) distclean
}}}
(e). Build and configure libvpx
{{{
cd ~/ffmpeg_sources
git clone https://chromium.googlesource.com/webm/libvpx
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --enable-runtime-cpu-detect
--enable-vp9 --enable-vp8 \
--enable-postproc --enable-vp9-postproc --enable-multi-res-encoding
--enable-webm-io --enable-better-hw-compatibility --enable-
vp9-highbitdepth --enable-onthefly-bitpacking --enable-realtime-only
--cpu=native --as=nasm
time make -j$(nproc)
time make -j$(nproc) install
time make clean -j$(nproc)
time make distclean
}}}
(f). Build LibVorbis
{{{
cd ~/ffmpeg_sources
wget -c -v
http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.6.tar.xz
tar -xvf libvorbis-1.3.6.tar.xz
cd libvorbis-1.3.6
./configure --enable-static --prefix="$HOME/ffmpeg_build"
time make -j$(nproc)
time make -j$(nproc) install
time make clean -j$(nproc)
time make distclean
}}}
(g). Build FFmpeg:
{{{
cd ~/ffmpeg_sources
git clone https://github.com/FFmpeg/FFmpeg -b master
cd FFmpeg
PATH="$HOME/bin:$PATH"
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig:/usr/local/lib/pkgconfig"
./configure \
--pkg-config-flags="--static" \
--prefix="$HOME/bin" \
--extra-cflags="-I$HOME/bin/include" \
--extra-ldflags="-L$HOME/bin/lib" \
--bindir="$HOME/bin" \
--enable-vaapi \
--disable-debug \
--enable-libvorbis \
--enable-libvpx \
--enable-libdrm \
--enable-gpl \
--cpu=native \
--enable-opengl \
--enable-libfdk-aac \
--enable-libx264 \
--enable-libx265 \
--extra-libs=-lpthread \
--enable-nonfree
PATH="$HOME/bin" make -j$(nproc)
make -j$(nproc) install
make -j$(nproc) distclean
hash -r
}}}
'''Failures encountered:'''
The build runs and as it almost finishes, it halts with an error as shown
below:
{{{
INSTALL libavcodec/libavcodec.a
libavutil/libavutil.a(hwcontext_vaapi.o): In function
`vaapi_device_create':
hwcontext_vaapi.c:(.text+0x1883): undefined reference to
`vaSetErrorCallback'
hwcontext_vaapi.c:(.text+0x1893): undefined reference to
`vaSetInfoCallback'
libavutil/libavutil.a(hwcontext_vaapi.o): In function
`vaapi_device_derive':
hwcontext_vaapi.c:(.text+0x24c3): undefined reference to
`vaSetErrorCallback'
hwcontext_vaapi.c:(.text+0x24d3): undefined reference to
`vaSetInfoCallback'
libavutil/libavutil.a(hwcontext_vaapi.o): In function
`vaapi_device_create':
hwcontext_vaapi.c:(.text+0x1883): undefined reference to
`vaSetErrorCallback'
hwcontext_vaapi.c:(.text+0x1893): undefined reference to
`vaSetInfoCallback'
libavutil/libavutil.a(hwcontext_vaapi.o): In function
`vaapi_device_derive':
hwcontext_vaapi.c:(.text+0x24c3): undefined reference to
`vaSetErrorCallback'
hwcontext_vaapi.c:(.text+0x24d3): undefined reference to
`vaSetInfoCallback'
collect2: error: ld returned 1 exit status
collect2: error: ld returned 1 exit status
Makefile:107: recipe for target 'ffmpeg_g' failed
make: *** [ffmpeg_g] Error 1
make: *** Waiting for unfinished jobs....
Makefile:107: recipe for target 'ffprobe_g' failed
make: *** [ffprobe_g] Error 1
libavutil/libavutil.a(hwcontext_vaapi.o): In function
`vaapi_device_create':
hwcontext_vaapi.c:(.text+0x1883): undefined reference to
`vaSetErrorCallback'
hwcontext_vaapi.c:(.text+0x1893): undefined reference to
`vaSetInfoCallback'
libavutil/libavutil.a(hwcontext_vaapi.o): In function
`vaapi_device_derive':
hwcontext_vaapi.c:(.text+0x24c3): undefined reference to
`vaSetErrorCallback'
hwcontext_vaapi.c:(.text+0x24d3): undefined reference to
`vaSetInfoCallback'
collect2: error: ld returned 1 exit status
Makefile:107: recipe for target 'ffplay_g' failed
make: *** [ffplay_g] Error 1
}}}
--
Ticket URL: <https://trac.ffmpeg.org/ticket/7106>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list