週刊オープンソース:OxideAV、公開へ
週刊ダイジェストの第一回。オープンソースでその週に出したものを短くまとめる。 書くほどのことが何もなかった週は、これは出さない。
OxideAV、公開へ
今週の目玉は OxideAV — Pure-Rust の
メディアトランスコード/ストリーミングフレームワーク。週の頭までは
ワークスペースのモノレポだったが、17日にフォーマット単位で45以上の
クレートに切り出し、それぞれを OxideAV/ organization 配下の独立した
リポジトリとして公開した。同日には release-plz 経由で最初の
v0.0.3 / v0.0.4 を出し、以降リリースサイクルはずっと回っている。
対応範囲はあえて広めに取っている:
- 映像 — H.264、H.265、AV1、VP8、VP9、MPEG-1/2、MPEG-4 ASP、H.263、 Theora、ProRes、MJPEG。
- 音声 — AAC、MP1/2/3、Opus、Vorbis、FLAC、CELT、Speex、GSM、 G.722 / G.723.1 / G.728 / G.729。
- 画像 — PNG/APNG、GIF、WebP、JPEG、AVIF(スケルトン)、JPEG 2000 (スケルトン)、JPEG XL(スケルトン)。
- コンテナ — MP4/MOV、Matroska/WebM、Ogg、AVI、IFF。単純なフォーマット (WAV、生 PCM、slin)はひとつのクレートに同居。
- トラッカー — MOD、S3M(仕様上デコードのみ)。
- 字幕 — PGS、DVB、VobSub、ASS/SSA。
- 基盤 —
oxideav-core(Packet / Frame / Timestamp)、oxideav-codecとoxideav-container(トレイト+レジストリ)、oxideav-pixfmt(色空間変換、 量子化、ディザ)、oxideav-job(パイプライン化されたマルチスレッド ランタイムで走る JSON 駆動のトランスコードグラフ)。
原則は C 依存をツリーのどこにも入れない こと。ffmpeg も libav も
使わず、直接・間接を問わず *-sys 系のクレートも引かない。各コーデックは
仕様から実装している。CLI(oxideav-cli)と、SDL2+TUI のリファレンス
プレイヤー(oxideplay)も同梱。
まだ初期段階で、バージョンは全体的に v0.0.x、カバレッジも均一ではない。 デコードのみのもの、エンコーダがこれから乗るもの、コーデック ID の予約 だけで動作は拒否するスケルトンのままのもの、と幅がある。目指している のは、C のバイナリを 1 GB 引き込まずに実パイプラインへ差し込める フレームワーク。
今週いちばん押したのは H.264。134 コミットで 4:2:2 / 4:4:4 の
CABAC デコード、MBAFF の P/B スライスデータ、SI/SP プライマリスライス
デコード、separate_colour_plane_flag=1 の対応を片付け、さらに CAVLC の
P スライスエンコーダ第一弾(P_L0_16x16 + P_Skip、整数動き推定)を
着地させた。AAC はショートブロック発射のステートマシン化と、
チャンネル単位の TNS 解析が入った。どちらもやることはまだたくさんある。
libwallet:Swap API
KarpelesLab/libwallet は
0.3.14 と 0.3.15 を出荷。目玉はマルチチェーンの Swap API — Solana 側は
Jupiter Ultra と dFlow、EVM 側は 1inch を、プロバイダを抽象化した
ひとつのインターフェースで扱えるようにした。ERC-20 の事前承認が必要な
ケースを検出して UI に伝える仕組みも入っている。Solana の優先手数料は
正しく ComputeBudget 命令経由で流すようになり、表示残高はようやく
rent-exempt 分を二重計上せず除外するようになった。
他にも今週
- goavif — Pure-Go の AVIF コーデック。OxideAV と同じ週に公開。cgo 禁止ルールも同じ。
- goro / goro-rs — Go 版の PHP と、その Rust 版の平行移植。どちらも継続的にコミット。
- strtotime — PHP の
strtotime()を Go に移植。タイムゾーン対応の自然言語日時パース、 RFC 2822、ISO 8601、相対日付。4月13日の一日で仕上げた。
来週
引き続き OxideAV 全体の作業を進める。