0.3.3 — Speech-oriented reencode defaults
reencode/2defaults match the FFmpeg speech ladder as closely asopus-rsallows::application :voip,:complexity 10, VBR (cbr: false),:frame_duration_ms 20.- New options:
:application,:complexity,:cbr,:frame_duration_ms. 40/60ms frames are rejected with:invalid_settings(opus-rslimitation; FFmpeg can use 60 ms).- Ogg mux packs many complete Opus packets per page (≤255 lacing values), matching common libopus/ffmpeg layout and removing one-packet-per-page size bloat.
0.3.2 — Broader precompiled NIF matrix
- Precompiled NIFs for six targets: Apple Silicon + Intel macOS, Linux glibc and musl (Alpine) on both aarch64 and x86_64.
- Release builds Linux artifacts in matching Docker images; musl artifacts are smoke-tested under Alpine Elixir.
- Windows remains deferred.
0.3.1 — Faster Ogg reencode on Apple Silicon (ADR003)
reencode/2uses pinnedopus-rs(NEON on aarch64) plus thin in-crate Ogg Opus family-0 demux/mux; dropsruopus(see ADR003).- Same Elixir API (
bitrate:required). ~7 s speech fixture: ~24 ms median at 20 kb/s vs ~965 ms withruopuson M3 Ultra (~40×). - Packet/PCM APIs unchanged.
0.3.0 — Reencode Ogg Opus blobs at a numeric bitrate
RustyOpus.reencode/2takes an Ogg Opus blob andbitrate:(bits/s) and returns a smaller Ogg Opus blob. Pure Rust. No ffmpeg, no C libopus, no quality atoms.- Hard-tested against committed Ogg Opus speech fixtures.
- Packet/PCM APIs from 0.2.0 are unchanged.
0.2.0 — Whole-stream encode, decode, and transcode
Encoder.encode_many/2andDecoder.decode_many/2encode or decode a whole buffer or packet list in one DirtyCpu NIF call.RustyOpus.encode/4,decode/4, andtranscode/5open a codec, run the bulk path, and close it — the default path for converting a stream.- Default frame size is 20 ms (
div(rate, 50)). A short last encode frame is padded with silence, never truncated. - 0.1.0 call sites are unchanged: per-frame
encode/3/decode/3and single-frame helpersencode_pcm/4,decode_packet/4, andchange_quality/5still work.
0.1.0 — Initial release
- Pure-Rust Opus (RFC 6716) codec for Elixir via Rustler, wrapped from
opus-rs 0.1.29. RustyOpus.Encoderwith bitrate, complexity, CBR/VBR, in-band FEC, and packet-loss controls;RustyOpus.Decoderwith packet-loss concealment.- Stable PCM contract: little-endian
f32binary, interleaved for stereo. RustyOpus.change_quality/4,5decodes a packet and re-encodes it at a new quality preset (:low/:medium/:high) or a:target_bitrate.RustyOpus.Qualitypresets andRustyOpus.PCMhelpers (interleave/deinterleave).- Panic containment at the NIF boundary: hostile packets return tagged errors instead of crashing the caller; dirty-scheduled codec work never blocks normal schedulers.
- Checksum-verified precompiled NIFs for Linux x86-64/ARM64 and macOS x86-64/Apple Silicon, with a source-build fallback.
- Real speech fixtures imported from the audio DB (
scripts/import_fixtures.sh).