16 points par lifthrasiir 2022-09-14 | 3 commentaires | Partager sur WhatsApp

JPEG XL est un format de fichier image de nouvelle génération standardisé sous la norme ISO/IEC 18181. Il a déjà été évoqué une fois sur GeekNews. https://fr.news.hada.io/topic?id=3788

Ces derniers temps, on dirait que la prise en charge s’ajoute à tous les outils liés à l’image, sauf aux navigateurs, et comme l’implémentation de référence libjxl est de grande qualité, elle est souvent réutilisée telle quelle. Mais libjxl lui-même est un logiciel assez volumineux, avec plusieurs centaines de milliers de lignes de C++, donc sa compilation n’est pas simple. En outre, libjxl a été créé avant la rédaction de la spécification, ce qui laisse pas mal d’endroits où la spécification et libjxl ne correspondent pas (et cela continue même après la standardisation…). Par ailleurs, créer un encodeur JPEG XL est relativement facile, car il suffit de prendre en charge une partie des fonctionnalités, mais un décodeur doit toutes les prendre en charge. Pendant longtemps, il n’existait donc absolument aucun décodeur autre que libjxl capable de décoder ne serait-ce qu’un seul pixel.

J40 est un projet commencé pour essayer de débloquer cette situation, et aussi comme forme de rééducation après ma retraite, et il m’a fallu pas moins de quatre mois... Dans son état actuel, J40 implémente en C99 environ 80 % de l’ensemble de la spécification (pour reprendre l’expression de Jon Sneyers), et si j’avais su que cela prendrait une telle ampleur, j’aurais mieux fait de l’écrire en Rust dès le départ, hélas. Quoi qu’il en soit, j’espère que ce projet pourra être utile à celles et ceux qui s’intéressent à JPEG XL.

3 commentaires

 
qwerty 2022-09-17

https://github.com/lifthrasiir/j40/…

Je pense qu’il faudrait vérifier ici les valeurs négatives~~

Dans la fonction j40__ans_table également, il vaudrait mieux stocker sizeof(int16_t) * (size_t) table_size dans une variable et faire une vérification avant d’accéder au tableau D.

En particulier dans le case 2, il semble nécessaire d’utiliser J40__SHOULD pour la condition 0 <= bias_size <= alpha_size <= table_size <= sizeof(int16_t) * (size_t) table_size.

Très beau projet, j’ai pris beaucoup de plaisir à le découvrir~

 
lifthrasiir 2022-09-19

Vous avez lancé un fuzzer, par hasard ? hahaha Comme l'API a été définie relativement tard, on s'est mis tardivement à faire tourner le fuzzer et on ne le lance que maintenant, donc ça va probablement casser à beaucoup d'endroits prévisibles... Pour information, ce point a été identifié pendant le fuzzing et je vais bientôt publier un correctif.

 
xguru 2022-09-14

Waouh, c’est génial. Je vous soutiens toujours dans ce que vous faites !!