cros-codecs: Update enumerate_devices() logic

Prior to this CL, the enumerate_devices() logic would only check that
there was a matching media device for the selected video device. This
works on some devices, however other devices have this logic accidentally
picking devices such as the camera since there is a matching media
device.

This CL updates the |enumerate_devices()| function to take in a Fourcc
value which it will query the OUTPUT queue of each device to see if it
is supported. Unfortunately, the Fourcc value is not available at the
time of creation of the DeviceHandle. As such, the reference in the
V4L2Device is updated to be an Option which will be created in the
initialize_queues() phase.

This CL results in being able to select the correct device on boards
such as Geralt and being able to decode bitstreams on those boards.

Bug: b:401035899
Test: Ran test-25fps.vp9 through ccdec on a Geralt successfully.
Visually inspected logs to verify that enumerate_devices was picking the
correct device.

Change-Id: I98c6f2bd75e04a116b9c68fc7de5e7ecb68e6fc1
4 files changed
tree: 165f3e12c23341dedd4de99a943770c3cd1fcafd
  1. .cargo/
  2. ci/
  3. examples/
  4. fuzz/
  5. src/
  6. test/
  7. .clippy.toml
  8. .gitignore
  9. Android.bp
  10. Cargo.toml
  11. cargo_embargo.json
  12. CONTRIBUTING.md
  13. DIR_METADATA
  14. LICENSE
  15. METADATA
  16. MODULE_LICENSE_BSD
  17. OWNERS
  18. README.md
  19. rustfmt.toml
  20. simple_test.py
README.md

Cros-codecs

A lightweight, simple, low-dependency, and hopefully safe crate for hardware-accelerated video decoding and encoding on Linux.

It is developed for use in ChromeOS (particularly crosvm), but has no dependency to ChromeOS and should be usable anywhere.

Current features

  • Simple decoder API,
  • VAAPI decoder support (using cros-libva) for H.264, H.265, VP8, VP9 and AV1,
  • VAAPI encoder support for H.264, VP9 and AV1,
  • Stateful V4L2 encoder support.

Planned features

  • Stateful V4L2 decoder support,
  • Stateless V4L2 decoder support,
  • Support for more encoder codecs,
  • C API to be used in non-Rust projects.

Non-goals

  • Support for systems other than Linux.

Example programs

The ccdec example program can decode an encoded stream and write the decoded frames to a file. As such it can be used for testing purposes.

$ cargo build --examples
$ ./target/debug/examples/ccdec --help
Usage: ccdec <input> [--output <output>] --input-format <input-format> [--output-format <output-format>] [--compute-md5 <compute-md5>]

Simple player using cros-codecs

Positional Arguments:
  input             input file

Options:
  --output          output file to write the decoded frames to
  --input-format    input format to decode from.
  --output-format   pixel format to decode into. Default: i420
  --compute-md5     whether to display the MD5 of the decoded stream, and at
                    which granularity (stream or frame)
  --help            display usage information

Testing

Fluster can be used for testing, using the ccdec example program described above. This branch contains support for cros-codecs testing. Just make sure the ccdec binary is in your PATH, and run Fluster using one of the ccdec decoders, e.g.

python fluster.py run -d ccdec-H.264 -ts JVT-AVC_V1

Credits

The majority of the code in the initial commit has been written by Daniel Almeida as a VAAPI backend for crosvm, before being split into this crate.