rusty_vorbis 0.1.2: The Vorbis Decode ArtCraft Timed
rusty_vorbis 0.1.2 decodes the Vorbis files ArtCraft timed 1.55x to 1.63x faster than symphonia on one core, in float, matching FFmpeg samples.

How much faster is rusty_vorbis 0.1.2 at Vorbis decode?
On 60-second files, one pinned core, rusty_vorbis 0.1.2 is 1.55 to 1.63 times faster than symphonia 0.5.5 on stereo music and 1.52 times faster on 5.1. Against lewton 0.10.2 those rows are 2.48 to 3.11 times faster. Samples stay within 3e-8 of FFmpeg 8.1. The ArtCraft editors' own timer is still the open rerun.
On 22 October 2026, rusty_vorbis 0.1.2 added a Vorbis I decoder to the crate that had only encoded. The prompt was a measurement from the ArtCraft team. Their note on remade_ffmpeg_rs moved audio decode in the storytold ArtCraft editors from symphonia 0.5.5 onto the house codecs, and the Vorbis row, still running lewton 0.10.2, was 1.22 to 1.24 times slower. They put Vorbis back on symphonia. Version 0.1.2 is the house decoder they can time next.
rusty_vorbis is the Vorbis engine inside remade_ffmpeg_rs. The pipeline note is remade_ffmpeg_rs. The program around it is The Importance of Remade With Rust. The same week's JPEG decode, measured by the same team, is rusty_jpeg 0.4.4.
What ArtCraft timed
The editors decode imported audio to interleaved float. FLAC through rusty_flac was neutral on that pass. Vorbis was the row they sent back.
The ten-minute file
A 10-minute stereo 44.1 kHz file, music-like, encoded with libvorbis at quality 5, was decoded to float and written as 24-bit WAV through the app. Whole processes, twenty paired rounds, pinned at High priority. A null arm, the same binary against itself, read 1.014 on one core and 1.002 on eight.
The lewton path took 1.217 times as long as symphonia on one core, minimum 1.276, zero wins in twenty, z -4.47. On eight cores it took 1.244 times as long, minimum 1.265, the same zero wins. An in-process split put lewton's own decode at about 1.4 to 1.5 times symphonia on that file. The glue around lewton was the smaller share of the gap.
Float, the ending, and the channel order
Speed sat beside two other costs. The adapter in front of lewton wrote 16-bit samples, so a float consumer moved by up to one 16-bit step against FFmpeg's float decode. The editors called lewton themselves to keep float. A test file came out 44,608 frames long against the correct 43,972, because the end of the stream was left past the final granule. More than two channels came out in Vorbis order, centre second and the low-frequency channel last. FFmpeg's WAV order puts the centre third and the low-frequency channel fourth.
What 0.1.2 changed
The release is a packet-level decoder. Three header packets build it. Audio packets then yield float, with no allocation on the packet itself. The remade_ffmpeg adapter builds that decoder from the Ogg headers and writes one interleaved float frame.
The speed table
The published comparison is in process, on 60-second files, with the packets already split out of the Ogg page before the timer starts. One core is pinned at High priority. The arms alternate. Twenty-four rounds. Every row was 24 wins of 24. A null arm stayed within 2 percent.
| File | vs symphonia 0.5.5 | vs lewton 0.10.2 | | --- | --- | --- | | stereo 44.1 kHz, q3 | 1.63x | 3.04x | | stereo 44.1 kHz, q5 | 1.61x | 3.05x | | stereo 44.1 kHz, q8 | 1.55x | 3.11x | | 5.1, 48 kHz, q5 | 1.52x | 2.48x |
That table is rusty_vorbis on the 60-second files, one core. The 10-minute pass through the editors remains the open rerun.
Each brick was measured against the previous rusty_vorbis commit. On the stereo minute, floor curves drawn as runs of one gain were 1.12 times faster, 40 of 40. A bit reader kept in registers through each residue partition was 1.04 times, 32 of 40. Walking the two stereo channels together was 1.02 times, 28 of 40, and a six-channel file was the same 1.02 times. A scattered pre-rotation, a window written into the caller's buffer, and a division-free floor step measured slower or inside the noise, and stayed out. The floor run read about 44 ms against about 50 ms, on a busy machine, so cite the 1.12 ratio. Residue was 43 percent of that file, the floor 20 percent, and the inverse transform 19 percent.
Samples that follow the spec
Against FFmpeg 8.1 on a libvorbis corpus, quality 0 through 10, one to eight channels, 8 to 96 kHz, the decoder's frame counts match and the largest sample gap is 3e-8. That is an SNR of at least 135 dB. A second gate feeds 300 generated setups, floor 0 and floor 1, residue formats 0, 1 and 2, both lookup types, submaps and coupling, and compares packet by packet with lewton.
Three disagreements with lewton 0.10.2 turned up on that gate and were settled on the specification. The fast inverse transform at the two shortest block sizes disagreed with lewton's own slow transform, which matches this decoder. Coupling roles were swapped when the magnitude channel was numbered above the angle. One of eight cascade books was left unread. rusty_vorbis follows the specification on each. A malformed packet returns an error and leaves the decoder where it was. A setup header that asks for a huge codebook is refused by an allocation cap.
What a builder can rely on
The remade_ffmpeg adapter takes rusty_vorbis samples and writes interleaved float. Channels 3 to 8 leave in FFmpeg's layout. One, two and four channels already agreed between Vorbis and WAV. Only the last packet is trimmed, and only by the amount that would run past the final granule. A sweep of 408 files against FFmpeg 8.1, written as float, matched every frame count, largest gap 2.09e-7. A 144-file sweep matched 144 of 144, largest gap 7.45e-8. Before the granule was counted in the container's terms, 24 of those 408 files kept extra samples. A regression file of 2,400 frames now matches FFmpeg.
The encoder was already here
rusty_vorbis 0.1.1 encoded, and decode was lewton's job. The encoder's standing is a different measurement from the table above. Single-threaded, it is about 1.4 times behind libvorbis. The wall-clock figure of about 5.3 times on stereo music is a 24-core run against a libvorbis that stays on one core for the stream. Quote those two together. The decode table is one core, against symphonia and lewton.
Neighbouring notes are rusty_opus and three AV2 and AVIF debug fixes. The map of the program is Vision.
Where to look next
Read issue 49, then pin rusty_vorbis 0.1.2, before an editor's export timer is treated as closed. The suite that filed the measurement lists its apps at ArtCraft. mata.network is the mesh this Media band is built toward.
FAQ
Quick answers for builders evaluating this technology.
What did the ArtCraft team measure on Vorbis?
The audio and video editors in the storytold ArtCraft suite decoded a 10-minute stereo 44.1 kHz Vorbis file through lewton 0.10.2 and through symphonia 0.5.5. The lewton path was 1.22 to 1.24 times slower, with zero wins in twenty paired rounds. They put Vorbis back on symphonia and filed the timings.
Do the rusty_vorbis 0.1.2 samples match FFmpeg?
On a libvorbis corpus the decoder's frame counts match FFmpeg 8.1 and the largest sample gap is 3e-8, an SNR of at least 135 dB. The remade_ffmpeg adapter, on 408 files written as float, matched every frame count, with a largest gap of 2.09e-7.
What does the remade_ffmpeg Vorbis adapter write now?
Interleaved float, in FFmpeg's channel order for three to eight channels. One, two and four channels already matched. The last packet is trimmed to the final granule. A regression file of 2,400 frames matches FFmpeg. The earlier adapter wrote 16-bit samples and could leave the ending long.
Did the ArtCraft editors get re-timed on rusty_vorbis 0.1.2?
The speed table times the decoder on 60-second files, one core, in process. The 10-minute export through the editors remains remade_ffmpeg_rs issue 49.
Where should a builder read the rusty_vorbis 0.1.2 decode note?
The ArtCraft timing on remade_ffmpeg_rs issue 49, then the rusty_vorbis 0.1.2 release, then the sibling note on the rusty_jpeg 0.4.4 decode. mata.network is the mesh this Media band is built toward.