| # Libva Rust Wrapper |
| |
| This crate provides lightweight and (hopefully) safe libva abstractions for use |
| within Rust code with minimal dependencies. It is developed for use in |
| ChromeOS, but has no ChromeOS specifics or dependencies and should thus be |
| usable anywhere. |
| |
| ## Dependencies |
| |
| The native [libva](https://github.com/intel/libva) library is required at link |
| time, so make sure to have the `libva-dev` or equivalent package for your |
| distribution installed. The libva version needs to be 1.20.0 or newer. The |
| VA-API driver corresponding to your hardware is also required: for Intel |
| hardware it will be [intel-media-driver](https://github.com/intel/media-driver), |
| whereas AMD hardware relies on [Mesa](https://gitlab.freedesktop.org/mesa/mesa). |
| |
| An easy way to see whether everything is in order is to run the `vainfo` |
| utility packaged with `libva-utils` or as a standalone package in some |
| distributions. `vainfo` will print the VA-API version, driver string, and a |
| list of supported profiles and endpoints, i.e.: |
| |
| ``` |
| vainfo: VA-API version: 1.13 (libva 2.13.0) |
| vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 22.2.2 () |
| vainfo: Supported profile and entrypoints |
| VAProfileNone : VAEntrypointVideoProc |
| VAProfileNone : VAEntrypointStats |
| VAProfileMPEG2Simple : VAEntrypointVLD |
| VAProfileMPEG2Simple : VAEntrypointEncSlice |
| VAProfileMPEG2Main : VAEntrypointVLD |
| VAProfileMPEG2Main : VAEntrypointEncSlice |
| VAProfileH264Main : VAEntrypointVLD |
| etc |
| ``` |
| |
| For decoding, the desired profile must be supported under `VAEntrypointVLD`. |
| For example, in order to decode VP8 media, this line must be present in the |
| output of `vainfo`: |
| |
| ``` |
| VAProfileVP8Version0_3 : VAEntrypointVLD |
| ``` |
| |
| Whereas to decode H264 Main profile media, this line must be present: |
| |
| ``` |
| VAProfileH264Main : VAEntrypointVLD |
| ``` |
| |
| For more information on VA-API and its usage within ChromeOS, see [this |
| guide](https://chromium.googlesource.com/chromium/src/+/master/docs/gpu/vaapi.md). |
| |
| cros-libva can also be built in Android. Android.bp files are provided that |
| should work on AOSP >= 15. Just check this repository into |
| external/rust/crates/cros-libva and the libcros_libva library target will be |
| available. |
| |
| ## Using |
| |
| The name of this crate is `cros-libva` to highlight the fact that it originates |
| from ChromeOS and it not an official bindings. For ease of use, it is |
| recommended to rename it to just `libva` in your project by using the following |
| line in your `Cargo.toml`: |
| |
| ``` |
| libva = { package = "cros-libva", version = "0.0.1" } |
| ``` |
| |
| ## Testing |
| |
| For a brief introduction on how to use this crate, see the |
| `libva_utils_mpeg2vldemo` test under `src/lib.rs`. You can also quickly test |
| MPEG2 decoding by running it: |
| |
| ``` |
| cargo test -- --ignored libva_utils_mpeg2vldemo |
| ``` |
| |
| ## Credits |
| |
| The first version of this crate was written by Daniel Almeida and hosted in the |
| [crosvm repository](https://chromium.googlesource.com/crosvm/crosvm/) before |
| being split. |