rivet-transcoder 0.1.2

Modular GPU-accelerated video transcoding library, CLI, and HTTP/IPC service (AV1 + Opus, MP4/CMAF-HLS). Imported as `rivet`; CLI is `rivet`.
Documentation
[package]

name = "rivet-transcoder"

version.workspace = true

edition.workspace = true

license-file = "LICENSE.md"

readme = "README.md"

repository.workspace = true

authors.workspace = true

description = "Modular GPU-accelerated video transcoding library, CLI, and HTTP/IPC service (AV1 + Opus, MP4/CMAF-HLS). Imported as `rivet`; CLI is `rivet`."



[lib]

name = "rivet"

path = "src/lib.rs"



[[bin]]

name = "rivet"

path = "src/main.rs"



[dependencies]

codec.workspace = true

container.workspace = true

anyhow.workspace = true

tracing.workspace = true

tracing-subscriber.workspace = true

clap.workspace = true

tokio.workspace = true

bytes.workspace = true

tempfile.workspace = true



# Optional — only for the `thumbnail` feature. ravif wraps rav1e for AVIF

# still-image encode (reuses the AV1 codec story); rgb provides the pixel

# triplet type ravif consumes.

ravif = { version = "0.11", default-features = false, features = ["threading"], optional = true }

rgb = { version = "0.8", optional = true }



# Optional — only for the `server` feature: an HTTP transcode API so another

# application can signal rivet to transcode over the network.

axum = { version = "0.8", optional = true }

serde = { version = "1", features = ["derive"], optional = true }

serde_json = { version = "1", optional = true }

serde_yaml_ng = { version = "0.10", optional = true }

glob = { version = "0.3", optional = true }

uuid = { version = "1", features = ["v4"], optional = true }



[dev-dependencies]

tempfile.workspace = true

# For the `server` feature's HTTP-layer integration test (ServiceExt::oneshot

# drives the router without binding a socket). Small; tests only.

tower = { version = "0.5", features = ["util"] }



# Forward the optional ffmpeg decode backend through to the codec crate

# so `cargo build -p rivet --features ffmpeg` lights up the libavcodec

# primary decode path end-to-end.

[features]

default = []

ffmpeg = ["codec/ffmpeg"]

# Intel QSV AV1 encode via hand-rolled dlopen oneVPL FFI (no external crate;

# builds on Windows + Linux). Intel Arc / Meteor Lake+.

qsv = ["codec/qsv"]

# NVENC AV1 encode + NVDEC decode via hand-rolled dlopen FFI (no external

# crate; builds on Windows + Linux). NVENC AV1 needs NVIDIA Ada+.

nvidia = ["codec/nvidia"]

# AMF AV1 encode via hand-rolled dlopen FFI (no external crate; builds on

# Windows + Linux). AMD RDNA3+.

amd = ["codec/amd"]

# AVIF single-frame thumbnail capture (pulls ravif + rav1e — a heavy

# still-image encoder — so it is opt-in).

thumbnail = ["dep:ravif", "dep:rgb"]

# HTTP transcode API (`rivet serve`): an axum webserver that accepts media +

# an output spec and runs transcode jobs, so another application can signal

# rivet to transcode over the network. Pairs naturally with the hardware

# encode features (e.g. `--features server,nvidia`).

server = ["dep:axum", "dep:serde", "dep:serde_json", "dep:uuid", "tokio/net"]

# `rivet ipc`: a Unix-domain-socket server so a long-running app can stream

# media in and out without HTTP or temp files. Opt-in (Unix only at runtime; on

# Windows the command exists but reports use `pipe`/`serve`). The `pipe`

# stdin/stdout streaming path is always available and needs no feature.

ipc = []

# `rivet batch`: a YAML/JSON manifest DSL for converting many files in one run.

# Pulls serde + a YAML/JSON parser + glob. See docs/batch.md.

batch = ["dep:serde", "dep:serde_json", "dep:serde_yaml_ng", "dep:glob"]