2026-04-26

Weekly open source: OxideAV grows up the stack

Last week was "OxideAV extracted into 45+ crates and shipped in public." This week the framework grew up the stack — it's no longer just codecs and containers.

OxideAV: higher-layer crates

The one I'm happiest about is oxideav-scene — a time-based composition model where one Scene data structure backs three workloads: PDF-style document layout, a live streaming compositor (paired with oxideav-rtmp for per-viewer overlays), and a Premiere/Resolve-style NLE timeline. Same SceneObject / Transform / Animation / Keyframe types in all three cases — adding a watermark to a PDF and adding a lower-third to a livestream are the same operation on the same model, just sampled differently. Future scene-shaped workloads (slideshows, generative composition, animated banners, …) get to ride the same data model. Scaffold so far — types and trait shapes in place, real rendering lands later.

The rest of the higher-layer crates this week:

  • oxideav-rtmp — RTMP server (accept incoming publishers) and client (push to a remote server). Zero external deps, blocking-thread-per-connection.
  • oxideav-sysaudio — audio output through runtime-loaded native backends (ALSA, PulseAudio, WASAPI, CoreAudio). The point is no C build-time linkage: the binary picks up whatever audio system is on the host.
  • oxideav-image-filter — blur / edge / resize / etc, single-frame.
  • oxideav-cli-convert — an ImageMagick-style convert engine driven by the oxideav pipeline. Image, video, and audio in one CLI.

Together, oxideav-image-filter and oxideav-cli-convert push the project toward covering both ffmpeg's and ImageMagick's use cases out of a single process. ImageMagick has accumulated a long tail of security issues over the years (ImageTragick was the famous one) and pulls in a forest of external libraries — libjpeg, libpng, libxml2, ghostscript, and friends. Folding the same workload into one end-to-end pure-Rust pipeline with no C dependencies is, beyond the convenience, a meaningfully smaller attack surface.

OxideAV: format coverage

Eleven new codec / container repos:

  • Audio — AC-3 + AC-4 (Dolby Digital + the new generation), iLBC, the ADPCM family (MS / IMA / Yamaha).
  • Video — H.261 (the first one), H.266 / VVC (the newest), Dirac (BBC), MS-MPEG-4 (the DIV3/DIV4/MP41-43 codec the world calls "DivX" but isn't standard Part 2), VP6 (the Flash-era On2 codec).
  • Containers — FLV (Flash Video), BMP + ICO/CUR (Windows bitmap + icon).

OxideAV: existing codecs

The major decoders / encoders kept moving — sample of the week:

  • H.264 encoder added in sixteen rounds, from a baseline IDR scaffold up through P-slice support (single-L0 integer-pel ME), with in-loop §8.7 deblocking on local recon and Lagrangian RDO mode decision in between.
  • H.265 decoder filled in 4:2:2 (chroma_format_idc=2) intra and inter, then Main 10 / 12-bit (yuv422p12le).
  • AV1 decoder rounds 12–16, including the fix for the inverted §8.2.6 read_symbol that was producing all-128 luma.
  • H.266 got SAO, long-tap deblocking, the §8.8.5 adaptive loop filter (luma + chroma + ALF APS parser + filtIdx classification), and a forward-side CABAC engine for the encoder.
  • AAC finished HE-AACv2 — Parametric Stereo encoder with real per-band IID/ICC analysis, time-direction differential emission, and a dual-decoder PSNR test against ffmpeg.

Still v0.0.x / v0.1.x across the board.

libwallet: pushing toward go-live

libwallet went from v0.3.16 to v0.4.5 over the week. Each release was a deliberate cut, and the underlying work is the last mile of the things that need to be real before this can ship.

iOS is the main one. The Dart package now ships as an .xcframework (Apple's recommended packaging format), with the linking model rewritten: out went the dlsym-on-app-binary hack, in came a proper ObjC bridge and -force_load on the source slice. Flutter pinned for the iOS test leg with per-attempt watchdogs for the attach-hang flake. The result is a wallet that builds, packages, and runs on iOS the way Apple expects libraries to.

Wallet primitives picked up:

  • Wallet:promote — reshare an imported single-key share into a TSS committee (1-of-1 → t-of-n). Pairs with the new ImportKey helpers in tss-lib below.
  • Wallet:promoteMnemonic + raw private key / BIP39 import — bring an existing wallet in, mark it signable, then promote it. This is the "I had a wallet before TSS, please don't lose it" path.
  • Wallet:probeActivity — ask a chain whether an address has ever been touched. Used during recovery and account-discovery flows.
  • EVM off-chain signing now emits Ethereum wire format instead of DER — a real correctness fix for anything verifying signatures.
  • personal_ecRecover implemented locally so a basic Web3 operation no longer round-trips through an RPC.

Plus a per-chain trusted token registry (wlttoken/curated) regenerated across all 11 supported chains, exposed via Token:listCurated (+ Dart client), and used to enrich SPL balance rows. Freshness-aware RPC picker for Ethereum mainnet. Misc Solana fixes — Jupiter Ultra /order is GET (was 404'ing on POST), "mainnet" accepted as a Solana chain id, Solana address skipped for non-ed25519 accounts.

Also this week

  • goro (PHP in Go) — closure IncRef / HandleDecRef lifetime fix, hashtable deep-copy auto-unref of phantom single-alias refs, class-scoped const-eval framing. Pass rate updated after the deep-engine sweep — 170 failing tests left.
  • goicu — new breakiter package: ICU-compatible text segmentation (graphemes, words, lines, sentences).
  • cterm — terminal emulator aimed at AI coding tools. Hyperlink rendering with hover + interaction (cocoa + win32), Disconnect added to the remote-tab right-click menu, scope tightened (mosh + latch + relay dropped).
  • tss-libImportKey helpers for migrating legacy ECDSA / EdDSA keys into a TSS committee. Pairs with libwallet's Wallet:promote flow above.
  • slirp deprecated in favor of pktkit — a from-scratch zero-copy L2/L3 packet library (virtual switches, NAT, DHCP, ARP, NDP, protocol ALGs).

Next week

More progress on OxideAV's codecs, and libwallet go-live.