16 ポイント 投稿者 lifthrasiir 2022-09-14 | 3件のコメント | WhatsAppで共有

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件のコメント

 
qwerty 2022-09-17

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 を使う必要がありそうです。

素晴らしいプロジェクト、楽しく拝見しました〜

 
lifthrasiir 2022-09-19

もしかして fuzzer を回しましたか? haha API は比較的あとで決まったため、fuzzer を回すのが遅れて、ようやく今回しているところですが、おそらく予測可能な箇所でかなり落ちると思います……ちなみにこの件は fuzzing の過程で確認しており、まもなく修正を上げる予定です。

 
xguru 2022-09-14

うわあ、すごいですね。いつも応援しています!!