Library / SDK
intel/libva avatar
intel/libva

libva: the reference implementation of the VA-API video acceleration API

Libva is an implementation for VA-API (Video Acceleration API)

799 stars321 forksCNOASSERTION

At a glance

What is it?
libva is Intel's implementation of VA-API, the vendor-neutral specification for hardware video acceleration, and it is structured as a main library plus a driver specific backend per hardware vendor. Its most quoted property is a strict backward compatibility rule, and its most practical detail is that the install prefix decision you make at build time determines where the library lives.
Who is it for?
libva suits an application or media pipeline that wants hardware video acceleration without writing against one vendor's interface, and a distributor building an image that needs one implementation rather than several.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A vendor-neutral API with one implementation

libva is an implementation for VA-API, the Video Acceleration API. VA-API itself is described as an open-source library and API specification that provides access to graphics hardware acceleration capabilities for video processing.

The structure is the important part. It consists of a main library and driver-specific acceleration backends for each supported hardware vendor. In other words, an application talks to the main library, and the main library dispatches to a backend that knows how to drive one vendor's hardware.

That is the design pattern that makes VA-API worth having. An application that wants hardware decode should not have to know whether the machine has an Intel GPU, an AMD one or something else, and it should not have to ship three code paths. The API specification is the contract, libva is the implementation of that contract, and the backends are the per-vendor parts.

The consequence is that libva is a platform layer rather than an application library. It is used by media players, video editors and streaming pipelines, and it is what a distribution ships so that those applications can find hardware acceleration on whatever machine the user happens to have.

The primary language is C, the homepage is the GitHub Pages site at intel.github.io/libva, and the Doxygen documentation is regularly updated through that same site. The last push to the repository was on 2026-10-22, and the recent release tags are 2.24.1 from 2026-07-08, 2.24.0 from 2026-07-02 and 2.23.0 from 2025-12-22.

Backward compatibility is written into the contribution rules

The compatibility section of the project documentation is the part most worth reading, because it defines what you can rely on.

No code changes may be introduced that would regress support for existing API, and all contributions must ensure continued compatibility and functionality. Failure to maintain API compatibility may result in the rejection or reversion of the contribution. That is an unusual thing to see written down, and it is the sort of clause that changes how a project is maintained: a change that breaks an existing call is not a matter of judgement about the patch, it is grounds for refusal.

The next paragraph draws the line precisely. Any deliberate modifications or removal of existing API will be transparently communicated in the release notes. So the promise is not that nothing ever changes, it is that nothing changes silently.

The third paragraph is the one that changes how you write code against the library. API options are solely considered as a stable interface, while any debug parameters, environmental variables and internal data structures are not considered as an interface and may be changed or removed at any time.

That is a genuinely useful distinction, and it is the kind of thing that saves a debugging session. If you are reading an environment variable to make libva verbose, you are reading something explicitly outside the compatibility promise. If you are calling a documented API option, you are on stable ground. The project draws that line in public, which is rare and useful.

Autotools or Meson, and both need a prefix decision

The build documentation is explicit about the two supported paths, and it starts with the packages you need.

bash
sudo apt-get install git cmake pkg-config meson libdrm-dev automake libtool

Then you take the latest version of the source:

bash
git clone https://github.com/intel/libva.git
cd libva

For the Debian and Ubuntu family the autotools route is:

bash
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
make
sudo make install

And the Meson route for the same family is a separate build directory:

bash
mkdir build
cd build
meson .. -Dprefix=/usr -Dlibdir=/usr/lib/x86_64-linux-gnu
ninja
sudo ninja install

The rpm family, Fedora, CentOS, SUSE and RHEL, uses the same commands with --libdir=/usr/lib64 instead.

The build documentation notes that it was tested under clear Ubuntu Server 18.04 with gcc-7.3.0, gcc-8.1.0 and clang-6.0, and that it should work on other distributions with various versions of gcc and clang. The advice is dated, but the shape of the build, autogen and Meson, matches the repository layout, which carries both configure.ac with Makefile.am and a meson.build with meson_options.txt, plus an autogen.sh script. There is also an Android.bp file at the root, so the library is also buildable as part of an Android source tree.

The prefix decides where the library lives, and who overwrites it

The installation discussion in the documentation is the part that catches people out, and it is worth reading in full before you build.

When you install libva from OSV package repositories, different OSV distributions use different default locations. The Debian and Ubuntu family install libva to /usr/lib/x86_64-linux-gnu, and the rpm family like Fedora, CentOS, SUSE and RHEL install it to /usr/lib64.

Without a prefix setting, libva installs to /usr/local/lib by default. If you use another path as the installation target folder, or no prefix at all, you have to add the folder to your environment variable or use LD_LIBRARY_PATH to specify the location, with the example given as LD_LIBRARY_PATH=/usr/local/lib when there is no prefix.

The second warning is about overwriting. If you intend to overwrite the system default libva, you could use the same OSV distribution prefix, and then the system libva will be replaced, and your newly installed libva version will also be overwritten when you upgrade it from the OSV distribution package repository.

That is a complete description of the failure mode: build with a prefix that matches your distribution, and the package manager stays in charge. Build into /usr/local, and you now have two copies of libva on the system, the loader has to be told which one wins, and the next package upgrade may not touch your copy at all, which is worse than either clean state.

Contributing, including the janitorial label

The project page spends a paragraph on how to join it, and one of the suggestions is unusually practical.

If you would like to contribute, there is a contributing guide in the repository. Beyond that, the project recommends taking a look at the janitorial bugs in the open issue list, because those bugs can be solved without an extensive knowledge of libva. The janitorial label is a way in: the interesting work of a graphics library is the hard part, and the small clear-ups are what a newcomer can pick up.

The development team is reached through GitHub issues, and the project says plainly that it would love to help you start contributing.

For a reader evaluating the health of the project, the useful signals are the release cadence and the repository structure. The version numbers move in step with upstream driver releases, with 2.23.0 in December 2025 and 2.24.0 and 2.24.1 in July 2026, and the tree is organised the way a mature C library usually is: the va directory holds the implementation, pkgconfig holds the package configuration, doc holds the documentation, build holds the build scripts, and there are separate files for the news, the licence text, a security policy and a style_unify helper.

That last one is worth noting. A style_unify script in the root of a C project is a sign of a project where the formatting of contributions matters enough to be automated, which is another way of saying the review bar is real.

What libva is not

The limitations are structural, and a prospective user should understand them before the first integration.

First, libva is an interface, not an implementation of hardware. The acceleration comes from the driver backends, and each backend is limited by what that vendor's driver exposes. If a codec path, a filter or a surface format is missing from the backend for your GPU, the API cannot conjure it. A pipeline built on libva inherits the union of what the vendors have implemented, which is why testing across hardware matters more here than in most libraries.

Second, if you do not need hardware acceleration at all, libva is an extra dependency and an extra failure mode. Software decoding needs none of this, and on a machine where acceleration is unavailable, the same application runs either way with a different backend decision.

Third, the API surface has a deliberately fuzzy edge. Debug parameters, environmental variables and internal data structures may change or disappear at any time, so code that pokes at them is code that will break.

On the licence, the repository records a custom licence that GitHub cannot classify, with the licence information in the LICENSE file and a COPYING file at the root. For a library that distributions ship inside a media stack, that is a term worth reading rather than assuming, and it is a note on what the repository says rather than legal advice. The MIT licence and the Apache-2.0 licence are the usual neighbours of this code base, but this one is its own thing, and the file is the authority.

Editorial conclusion

libva suits an application or media pipeline that wants hardware video acceleration without writing against one vendor's interface, and a distributor building an image that needs one implementation rather than several. It is the wrong choice if you need a feature the vendor backends do not implement, since the abstraction is only as capable as the drivers behind it, and it is the wrong choice for a quick experiment, since building it means choosing a prefix and matching it to the distribution you are on. Verify three things before you commit: that your hardware has a backend in this repository or in the matching driver package, that the prefix you build with matches the one your distribution uses so an upgrade does not overwrite your copy, and that the API surface you need is part of the stable interface rather than one of the debug parameters that may change at any time.

Frequently asked questions

What is libva?

It is an implementation for VA-API, the Video Acceleration API, an open-source library and API specification that provides access to graphics hardware acceleration for video processing. It consists of a main library plus driver-specific acceleration backends for each supported hardware vendor.

What packages do I need to build libva?

The documented install is sudo apt-get install git cmake pkg-config meson libdrm-dev automake libtool, followed by cloning the repository and building with either autogen and make or Meson and ninja. The build documentation was tested on clear Ubuntu Server 18.04 with gcc-7.3.0, gcc-8.1.0 and clang-6.0.

Where does libva install to?

Without a prefix setting it installs to /usr/local/lib, and you then have to add that folder to your environment variable or use LD_LIBRARY_PATH. Distribution packages install it to /usr/lib/x86_64-linux-gnu on the Debian and Ubuntu family and to /usr/lib64 on the rpm family.

What is libva's backward compatibility promise?

No code changes may be introduced that would regress support for existing API, and contributions that fail to maintain compatibility may be rejected or reverted. Deliberate removals are communicated in the release notes, and debug parameters, environmental variables and internal data structures are explicitly not considered an interface and may change at any time.

How can I start contributing to libva?

The project points at its contributing guide and recommends looking at the issues labelled janitorial, because those can be solved without an extensive knowledge of libva. The development team is reached through GitHub issues, and the documentation is published through GitHub Pages with Doxygen files updated regularly.

Official sources

  1. intel/libva on GitHub
  2. Issues
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/intel-libva.svg)](https://hysenlabs.com/projects/intel-libva)

Was this useful?