crosvm/media/ffmpeg
Tatsuyuki Ishi 8f2ccb3b50 virtio: video: Introduce FFmpeg encoder backend.
The FFmpeg backend is a software emulated video encoder device backend.
It can be used for testing, for developing guest kernel changes and
more.

The backend roughly mirrors how the FFmpeg decoder backend is
implemented right now, with the notable difference that it does not use
swscale as the de-facto input format is NV12 or YUV420 and the guest can
likely provide buffers in that format.

BUG=b:239897269
TEST=See testing instructions in the updated book document.

Change-Id: Iae9928bdad86729f890e738acfa58e21573a115b
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/3920263
Reviewed-by: Alexandre Courbot <acourbot@chromium.org>
Commit-Queue: Alexandre Courbot <acourbot@chromium.org>
2022-09-30 05:36:51 +00:00
..
src virtio: video: Introduce FFmpeg encoder backend. 2022-09-30 05:36:51 +00:00
bindgen.sh media/ffmpeg: only show VERSIONS notice on change 2022-09-14 18:01:56 +00:00
build.rs health-check: enforce blank line after copyright 2022-09-13 22:24:35 +00:00
Cargo.toml media: ffmpeg: Convert SwConverter to a AvFrame-based API. 2022-09-29 09:47:01 +00:00
README.md media: ffmpeg: upgrade to ffmpeg 5.0 libraries 2022-08-23 01:47:48 +00:00
VERSIONS media: ffmpeg: upgrade to ffmpeg 5.0 libraries 2022-08-23 01:47:48 +00:00

FFmpeg wrapper

This is a minimal FFmpeg 5.0 wrapper for use with the virtio-video device, allowing to run a virtual video device backed by software decoding or encoding. This is useful for development and testing in situations where no supported video acceleration is available on the host.

Although several FFmpeg binding crates exist, most of them are not able to link against the system FFmpeg, and the only one that does is released under a software license that makes our lawyers nervous. Also they all run bindgen at build time, which is not possible to do under the Chrome OS build system and would require to patch the crate with fully generated bindings.

So taking this in consideration, as well as the extra work that it is to depend on external Rust crates in Chrome OS, it is preferable to add our own simple bindings here that cover just the parts of FFmpeg that we need.

This crate has minimal dependencies ; on the FFmpeg side, it just uses libavcodec, libavutil and libswscale.

The bindings can be updated using the bindgen.sh script. A few elements that bindgen cannot generate because they are behind C macros are re-defined in avutil.rs and error.rs, as well as tests to ensure their correctness.

And that's about it.