週次オープンソース: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-filter と oxideav-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フローと組み合わせて 使う。 - slirp は pktkit を後継として 非推奨化。pktkit は L2/L3 を zero-copy で扱う一からのパケット ライブラリ(仮想スイッチ、NAT、DHCP、ARP、NDP、各プロトコルの ALG)。
来週
OxideAV のコーデックをさらに進める。そして libwallet は本番投入。