J40: JPEG-XL-Decoder
(github.com/lifthrasiir)JPEG XL ist ein Bilddateiformat der nächsten Generation, standardisiert als ISO/IEC 18181. Es war auch schon einmal bei GeekNews zu sehen. https://de.news.hada.io/topic?id=3788
In letzter Zeit scheint die Unterstützung in praktisch allen bildbezogenen Tools ergänzt zu werden, nur Browser ausgenommen. Dabei wird oft einfach die Referenzimplementierung libjxl verwendet, weil deren Qualität hoch ist. Allerdings ist libjxl selbst eine ziemlich große Software mit mehreren hunderttausend Zeilen C++, sodass der Build nicht gerade einfach ist. Außerdem wurde erst libjxl entwickelt und danach die Spezifikation erstellt, weshalb es etliche Stellen gibt, an denen Spezifikation und libjxl nicht übereinstimmen (und zwar sogar noch nach der Standardisierung ...). Hinzu kommt: Einen JPEG-XL-Encoder zu bauen ist vergleichsweise einfach, weil dafür auch die Unterstützung nur eines Teils der Funktionen ausreicht. Ein Decoder hingegen muss alle Funktionen unterstützen, weshalb es lange Zeit neben libjxl überhaupt keinen Decoder gab, der auch nur ein einziges Pixel decodieren konnte.
J40 ist ein Projekt, das diese Situation aufbrechen sollte und das ich nach meinem Ausscheiden aus dem Beruf auch als eine Art Reha begonnen habe; am Ende hat es ganze vier Monate gedauert ... Der aktuelle Stand von J40 ist (um Jon Sneyers zu zitieren), dass etwa 80 % der gesamten Spezifikation in C99 implementiert sind. Hätte ich gewusst, dass es so groß wird, hätte ich es von Anfang an lieber in Rust geschrieben. Wie auch immer: Ich hoffe, dieses Projekt ist für alle hilfreich, die sich für JPEG XL interessieren.
3 Kommentare
https://github.com/lifthrasiir/j40/…
Ich glaube, dieser Teil sollte auf negative Werte geprüft werden~~
Auch in der Funktion
j40__ans_tablesolltesizeof(int16_t) * (size_t) table_sizein einer Variablen gespeichert und vor dem Zugriff auf das D-Array geprüft werden.Insbesondere in case 2 scheint es notwendig zu sein, die Bedingung
0 <= bias_size <= alpha_size <= table_size <= sizeof(int16_t) * (size_t) table_sizemitJ40__SHOULDzu prüfen.Ich habe mir das großartige Projekt gerne angesehen~
Habt ihr den Fuzzer vielleicht schon laufen lassen? Haha, da die API erst vergleichsweise spät festgelegt wurde, hat sich auch das Fuzzing verzögert, sodass wir es erst jetzt laufen lassen; wahrscheinlich wird es an einigen vorhersehbaren Stellen ordentlich krachen ... Zur Info: Das wurde im Fuzzing-Prozess bestätigt, und wir werden dazu in Kürze einen Fix hochladen.
Wow, großartig. Ich unterstütze Ihre Arbeit immer!!