codec/h264: separate DPB entry reference and frame

The DPB serves two purposes: as a way to reorder frames in display
order, and as a way to mark frames that are still used as reference.

Currently both purposes are served by the same `handle` member, but
separating it into dedicated members brings benefits: the type of the
decoded frame could be different from the one used for reference, and
the decoded frame could be take()n away from an Option when the frame is
bumped, making sure it cannot be emitted a second time.

IOW, this should allow the removal of the Rcs to reference frames in the
DPB, once a proper reference frame type is introduced.
3 files changed
tree: 8693833b2d6bb0e46638fc6b9aa0d144da31451c
  1. .github/
  2. ci/
  3. examples/
  4. fuzz/
  5. src/
  6. .clippy.toml
  7. .gitignore
  8. .prettierrc
  9. Cargo.lock
  10. Cargo.toml
  11. CONTRIBUTING.md
  12. LICENSE
  13. README.md
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>] [--synchronous] [--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
  --synchronous     whether to decode frames synchronously
  --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. 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.