2026-04-26

週次オープンソース:OxideAV、上のレイヤーへ

先週は「OxideAV を 45 以上のクレートに 分割して公開した」という話だった。今週は、コーデックとコンテナの 枠を超えて、フレームワークが上のレイヤーに伸び始めた週になった。

OxideAV:上のレイヤーのクレート

個人的にいちばん気に入っているのは oxideav-scene で、 1 つの Scene データ構造が三種類のワークロードを支える時間ベースの 合成モデルだ。PDF 風のドキュメントレイアウト、ライブストリーミング コンポジタ(oxideav-rtmp と組み合わせれば視聴者ごとのオーバーレイ にも使える)、Premiere/Resolve のような NLE タイムライン——いずれも 同じ SceneObject / Transform / Animation / Keyframe 型で 表現する。PDF にウォーターマークを足すのと、生配信にロワー サードを差し込むのは、同じモデルへの同じ操作で、出力時の サンプリングが違うだけだ。将来「シーン的」な新しいユースケース (スライドショー、生成系の合成、アニメーションバナー……)が出て きても、同じデータモデルに乗せられる。今はまだ scaffold の段階で、 型と trait の形だけが入っていて、実際のレンダリングはこれから載る。

今週増えた他の上位レイヤーのクレート:

  • oxideav-rtmp — RTMP サーバ(受け側として publisher を受け入れる)とクライアント (自分から外部の RTMP サーバに流す)。外部依存ゼロ、コネクション ごとブロッキングスレッド方式。
  • oxideav-sysaudio — ALSA、PulseAudio、WASAPI、CoreAudio をランタイムロードして使う 音声出力。ポイントはビルド時に C をリンクしないこと。バイナリ はそのままどこでも動き、起動先のホストで使える音声システムを 自分で拾う。
  • oxideav-image-filter — blur / edge / resize など、単フレームの画像フィルタ。
  • oxideav-cli-convert — ImageMagick の convert のような変換エンジンを oxideav の パイプラインで動かすもの。画像・動画・音声を 1 つの CLI で扱える。

oxideav-image-filteroxideav-cli-convert を組み合わせると、 OxideAV は ffmpeg と ImageMagick の両方のユースケースを 1 つの プロセスでカバーする方向に進む。ImageMagick は歴史的にいくつもの 脆弱性が積み重なっていて(有名なものに「ImageTragick」がある)、 libjpeg、libpng、libxml2、ghostscript ほか多数の外部ライブラリに 依存している。同じ仕事を C 依存ゼロのピュア Rust なエンドツー エンドのパイプラインに畳み込めるのは、便利さの話を超えて、 攻撃面がはっきり小さくなるという意味でも大きい。

OxideAV:対応フォーマットの拡張

新しいコーデック/コンテナのリポジトリが今週 11 本:

  • 音声 — AC-3 と AC-4(Dolby Digital と次世代)、iLBC、ADPCM 系 (MS / IMA / Yamaha)。
  • 映像 — H.261(最初期の標準)、H.266 / VVC(最新世代)、Dirac (BBC)、MS-MPEG-4(DIV3/DIV4/MP41-43——世間的に「DivX」と呼ばれて いるが Part 2 とは別物)、VP6(Flash 時代の On2)。
  • コンテナ — FLV(Flash Video)、BMP と ICO/CUR(Windows の ビットマップとアイコン)。

OxideAV:既存コーデック

主要なデコーダ/エンコーダも止まらず進んでいる。今週分のサンプル:

  • H.264 エンコーダを 16 ラウンドで詰めた。ベースラインの IDR スキャフォルドから、P スライス対応(単方向 L0、整数画素 ME)まで。 途中、§8.7 のローカル再構築上のインループデブロッキングと、 ラグランジアン RDO のモード決定も入れた。
  • H.265 デコーダが 4:2:2(chroma_format_idc=2)のイントラ/ インターに対応し、Main 10 / 12-bit(yuv422p12le)まで通るように なった。
  • AV1 デコーダはラウンド 12 〜 16。§8.2.6 read_symbol の 反転バグ(輝度が全部 128 になる原因)を直したのもここ。
  • H.266 に SAO、長タップのデブロッキング、§8.8.5 のアダプティブ ループフィルタ(luma + chroma 適用 + ALF APS パーサ + filtIdx 分類)、エンコーダ側の前向き CABAC エンジンが入った。
  • AAC で HE-AACv2 が完成。Parametric Stereo エンコーダの per-band IID/ICC 解析、時間方向の差分エミット、ffmpeg と並べた デュアルデコーダ PSNR テストまで。

ただし全体としてはまだ v0.0.x / v0.1.x。

libwallet:本番投入に向けて

libwallet は今週、 v0.3.16 から v0.4.5 まで上がった。どれも意図して切ったリリースで、 内側で動いているのは「リリースする前に本物にしておかなければなら ない最後の仕上げ」の部分だ。

軸は iOS。Dart パッケージは Apple 推奨形式の .xcframework で 配るようになり、リンクの仕方も書き直した。アプリバイナリへの dlsym ハックをやめて、まともな ObjC ブリッジに置き換え、ソース スライス側に -force_load を当てる構成にした。Flutter のバージョン を iOS テストレッグでピン留めし、attach-hang のフレーキーさには 試行ごとのウォッチドッグを噛ませた。結果として、Apple が想定して いる形でビルド・パッケージング・実行ができる wallet になった。

Wallet 周りのプリミティブも増えた:

  • Wallet:promote — インポートした単一鍵のシェアを TSS コミッティに reshare する(1-of-1 → t-of-n)。下記 tss-lib の 新しい ImportKey ヘルパとセットで使う。
  • Wallet:promoteMnemonic +生の秘密鍵 / BIP39 インポート — 既存の wallet を取り込んで signable にしてから promote する。 「TSS 以前から持っていた wallet を失くさない」ためのパス。
  • Wallet:probeActivity — あるアドレスがそのチェーンで そもそも触られたことがあるかをチェーンに尋ねる。リカバリや アカウント探索で使う。
  • EVM のオフチェーン署名が DER ではなく Ethereum の wire フォーマットを返すようになった。検証側にとっては実害のある 正しさの修正。
  • personal_ecRecover のローカル実装。基本的な Web3 操作の ために RPC を往復しなくて済むようになった。

加えて、対応 11 チェーンぶんを再生成した per-chain の信頼トークン レジストリ(wlttoken/curated)を Token:listCurated(+Dart クライアント)から引けるようにし、SPL の残高表示にこれを差し込んで リッチ化。Ethereum メインネット用に、新鮮さを意識した RPC ピッカ。 Solana 周りの細かい修正——Jupiter Ultra の /order は GET(POST だと 404 だった)、"mainnet" を Solana の chain id として 受け付ける、ed25519 でないアカウントでは Solana アドレスを出さない。

ほかに今週

  • goro(Go で書く PHP)— クロージャの IncRef / HandleDecRef の寿命修正、ハッシュテーブル の deep-copy で「ファントムな単独参照」を auto-unref する処理、 クラススコープの const-eval を [constant expression] 枠で 扱う整理。深部エンジンのスイープ後、残り 170 失敗。
  • goicu — ICU 互換の テキスト分割(書記素・単語・行・文)を扱う breakiter パッケージ を追加。
  • cterm — AI コーディング ツール向けのターミナルエミュレータ。cocoa と win32 で ハイパーリンクのレンダリング+ホバー+クリック対応、リモート タブの右クリックメニューに Disconnect を追加、スコープを整理 (mosh / latch / relay は削除)。
  • tss-lib — レガシーの ECDSA / EdDSA 鍵を TSS コミッティに移行するための ImportKey ヘルパ。上の libwallet の Wallet:promote フローと組み合わせて 使う。
  • slirppktkit を後継として 非推奨化。pktkit は L2/L3 を zero-copy で扱う一からのパケット ライブラリ(仮想スイッチ、NAT、DHCP、ARP、NDP、各プロトコルの ALG)。

来週

OxideAV のコーデックをさらに進める。そして libwallet は本番投入。