Skip to content

gamut-av1 and gamut-avif publish crate descriptions that their own source contradicts #560

Description

@justin13888

Found while correcting the README crates table for #425 (PR #526). Both are outside that PR
boundary, which is frozen to README.md, AGENTS.md one wording, the guard and its wiring — and
both are published text: a Cargo.toml description is what crates.io and cargo search show,
and a crate-level module doc is the first screen of docs.rs.

1. gamut-av1 describes itself as encoder-only, over a decode-by-default manifest

crates/gamut-av1/Cargo.toml:3:

description = "AV1 still-image (intra-frame) encoder — the standalone codec layer beneath AVIF."

crates/gamut-av1/Cargo.toml:19:

default = ["decode"]

The decoder is not an opt-in extra a description may reasonably omit — it is on by default, it is
crates/gamut-av1/src/decode/ (4223 lines), and src/lib.rs re-exports Av1Decoder,
DecodeLimits, FrameHeader and friends behind that feature. src/lib.rs:1 opens with
"AV1 image encoder." for the same reason.

Anyone reading crates.io concludes gamut-av1 cannot decode. It can, unless they turn the feature
off.

2. gamut-avif lists as deferred what its own source already ships

crates/gamut-avif/src/lib.rs, under Deferred, planned:

alpha / RGBA encoding, 10/12-bit and 4:2:0/4:2:2 chroma subsampling, … the pure-Rust AV1
codestream decoder (which will make Av1StillDecoder optional)

Contradicted twice by the crate itself:

  • src/lib.rs:4-7, forty lines above: AvifEncoder implements gamut_core::EncodeImage for
    Rgba8, Rgb16 and Rgba16. Alpha and high bit depth are the encode surface, not a plan.
  • The pure-Rust AV1 codestream decoder exists: gamut-av1 default = ["decode"], and
    crates/gamut-av1/src/decode/mod.rs:3-4 describes itself as "the pure-Rust software tail behind
    gamut_avif::Av1StillDecoder". gamut-avif already has a normal dependency on gamut-av1 with
    that feature on; what is missing is the wiring, not the decoder.

So the module doc tells a reader that AVIF decode requires them to bring a third-party AV1
decoder (dav1d, a platform decoder), while the workspace ships one.

Scope

  • Rewrite gamut-av1 Cargo.toml description and src/lib.rs:1 to state encoder and
    decoder, with the decoder scope bounded as src/decode/mod.rs:20-22 bounds it.
  • Reconcile gamut-avif "Deferred, planned" list with its own encode surface, and restate the AV1
    decode position as "gamut-av1 ships one; gamut-avif does not yet register it as the implicit
    tail behind Av1StillDecoder" if that is the intent.
  • Related but distinct: STATUS.md drift: gamut-dsp lists a shipped module as deferred, gamut-avif contradicts itself #545 covers the same class in two STATUS.md files.

Acceptance

No crate Cargo.toml description or crate-level module doc names a capability direction the same
crate manifest or source contradicts.

Refs #425, #526, #545.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions