J40: JPEG XLデコーダ
(github.com/lifthrasiir)JPEG XLは、ISO/IEC 18181として標準化された次世代画像ファイル形式です。GeekNewsにも一度取り上げられたことがありますね。 https://ja.news.hada.io/topic?id=3788
最近はブラウザを除くほぼすべての画像関連ツールで対応が追加されているようですが、リファレンス実装であるlibjxlの品質が高いため、それをそのまま使うことが多いです。ところが、libjxl自体はC++で十数万行に及ぶかなり大規模なソフトウェアなのでビルドが簡単ではなく、libjxlが先に作られてから仕様が整備されたため、仕様とlibjxlが一致しない箇所もかなりあります(しかも標準化後ですらこのありさま……)。さらに、JPEG XLエンコーダを作るのは一部機能だけに対応してもよいので比較的簡単ですが、デコーダはすべての機能に対応しなければならないため、長いあいだlibjxl以外では1ピクセルでもデコードできるデコーダがまったくありませんでした。
J40は、そうした状況を打開してみようという思いと、退職後のリハビリも兼ねて始めたプロジェクトですが、実に4か月もかかってしまいました……。現在のJ40は(Jon Sneyers氏の表現を借りれば)仕様全体の80%ほどをC99で実装した状態ですが、こんなに大きくなると分かっていたら最初からRustで書けばよかったです。ともあれ、このプロジェクトがJPEG XLに関心のある方の助けになれば幸いです。
3件のコメント
https://github.com/lifthrasiir/j40/…
この部分は負数チェックが必要そうです。
j40__ans_table関数でもsizeof(int16_t) * (size_t) table_sizeを変数に保存して、D 配列にアクセスする前にチェックしたほうがよさそうです。特に case 2 では、
0 <= bias_size <= alpha_size <= table_size <= sizeof(int16_t) * (size_t) table_size条件にJ40__SHOULDを使う必要がありそうです。素晴らしいプロジェクト、楽しく拝見しました〜
もしかして fuzzer を回しましたか? haha API は比較的あとで決まったため、fuzzer を回すのが遅れて、ようやく今回しているところですが、おそらく予測可能な箇所でかなり落ちると思います……ちなみにこの件は fuzzing の過程で確認しており、まもなく修正を上げる予定です。
うわあ、すごいですね。いつも応援しています!!