J40: ตัวถอดรหัส JPEG XL
(github.com/lifthrasiir)JPEG XL เป็นฟอร์แมตไฟล์ภาพยุคถัดไปที่ถูกทำให้เป็นมาตรฐานในชื่อ ISO/IEC 18181 เคยมีโพสต์ขึ้นบน GeekNews อยู่ครั้งหนึ่งเหมือนกัน https://th.news.hada.io/topic?id=3788
ช่วงนี้ดูเหมือนว่าจะมีการเพิ่มการรองรับในเครื่องมือที่เกี่ยวข้องกับภาพแทบทุกตัว ยกเว้นเบราว์เซอร์ และเพราะตัวอ้างอิงอย่าง libjxl มีคุณภาพสูง หลายกรณีจึงนำมันไปใช้ตรง ๆ กันเลย อย่างไรก็ตาม ตัว libjxl เองเป็นซอฟต์แวร์ขนาดค่อนข้างใหญ่ที่เขียนด้วย C++ มีโค้ดอยู่หลายแสนบรรทัด จึงไม่ได้คอมไพล์กันง่าย ๆ อีกทั้ง libjxl ถูกสร้างขึ้นก่อนที่จะมีสเปก ทำให้มีหลายจุดที่สเปกกับ libjxl ไม่ตรงกันพอสมควร (ถึงขั้นว่ายังเป็นแบบนี้แม้หลังมาตรฐานออกแล้วก็ตาม...) ยิ่งไปกว่านั้น การสร้างตัวเข้ารหัส JPEG XL นั้นง่ายกว่าเพราะรองรับแค่บางฟีเจอร์ก็พอได้ แต่ตัวถอดรหัสจำเป็นต้องรองรับทุกฟีเจอร์ จึงอยู่มาพักใหญ่ ๆ ที่นอกจาก libjxl แล้ว ก็ไม่มีตัวถอดรหัสที่ถอดได้แม้แต่พิกเซลเดียวเลย
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 แล้วหรือยังครับ 555 เนื่องจาก API ถูกตัดสินใจค่อนข้างช้า เลยเพิ่งมาเริ่มรัน fuzzer เอาตอนนี้ คิดว่าน่าจะพังในจุดที่คาดเดาได้หลายจุด... อ้างอิงจากเรื่องนี้ เราตรวจพบระหว่างกระบวนการ fuzzing และกำลังจะส่งแพตช์แก้ไขในเร็ว ๆ นี้ครับ
ว้าว เจ๋งมากเลยครับ เป็นกำลังใจให้กับสิ่งที่คุณทำอยู่เสมอครับ!!