16 puntos por lifthrasiir 2022-09-14 | 3 comentarios | Compartir por WhatsApp

JPEG XL es un formato de archivo de imagen de próxima generación estandarizado como ISO/IEC 18181. Incluso una vez apareció en GeekNews. https://es.news.hada.io/topic?id=3788

Últimamente parece que se está agregando soporte en todas las herramientas relacionadas con imágenes excepto en los navegadores, y como la implementación de referencia, libjxl, tiene muy buena calidad, en muchos casos se usa tal cual. Pero libjxl en sí es un software bastante grande, con cientos de miles de líneas en C++, así que no es sencillo de compilar, y como libjxl se creó primero y la especificación se hizo después, hay bastantes partes en las que la especificación y libjxl no coinciden (incluso después de la estandarización, sigue siendo así...). Además, hacer un codificador JPEG XL es relativamente fácil porque basta con soportar solo algunas funciones, pero un decodificador tiene que soportar todas las funciones, así que durante bastante tiempo no existió ningún otro decodificador aparte de libjxl que pudiera decodificar siquiera un solo píxel.

J40 es un proyecto que empecé para intentar resolver esa situación y también como una especie de rehabilitación después de dejar el trabajo, y me tomó nada menos que 4 meses... En su estado actual, J40 implementa (tomando prestada la expresión de Jon Sneyers) alrededor del 80% de toda la especificación en C99, y si hubiera sabido que iba a crecer tanto, habría sido mejor escribirlo en Rust desde el principio. En fin, espero que este proyecto pueda ser de ayuda para quienes estén interesados en JPEG XL.

3 comentarios

 
qwerty 2022-09-17

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

Creo que aquí habría que verificar los valores negativos~~

También en la función j40__ans_table parece que habría que guardar sizeof(int16_t) * (size_t) table_size en una variable y validarlo antes de acceder al arreglo D.

En especial en el case 2, parece necesario usar J40__SHOULD para la condición 0 <= bias_size <= alpha_size <= table_size <= sizeof(int16_t) * (size_t) table_size.

Estuve viendo el proyecto, está genial~

 
lifthrasiir 2022-09-19

¿Por casualidad corrieron el fuzzer? jajaja Como la API se definió relativamente tarde, empezamos a correr el fuzzer también tarde y recién ahora lo estamos haciendo, así que probablemente falle bastante en lugares previsibles... Como referencia, esto se confirmó durante el proceso de fuzzing y planeamos subir una corrección pronto.

 
xguru 2022-09-14

Guau, qué genial. ¡Siempre apoyo lo que haces!!