JPEG XL

Info

rules 58
github 38694
reddit 688

JPEG XL

tools 4270
website 1813
adoption 22069
image-compression-forum 0
glitch-art 1071

General chat

welcome 3957
introduce-yourself 294
color 1687
photography 3532
other-codecs 25116
on-topic 26652
off-topic 23987

Voice Channels

General 2578

Archived

bot-spam 4577

tools

Quackdoc
2025-01-24 06:52:24 python is such a mess. I hate it and everything that uses it
2025-01-24 06:52:27 aur time
Demiurge
2025-01-24 07:00:48 Python2 is gone
Quackdoc
2025-01-24 07:06:03 python2 is in the aur still :D
Demiurge
2025-01-25 05:22:09 The last version is 5 years ago
2025-01-25 05:24:42 It's dead Jim
Quackdoc
2025-01-25 05:53:34 well, there is a reason why python is detested for making applications
Demiurge
2025-01-25 10:14:02 I thought it was loved
2025-01-25 10:14:18 It's Python after all
Quackdoc
2025-01-25 10:45:18 https://tenor.com/view/wheeze-wheeze-laugh-nikkal-kundhal-nikkalkundhal-gif-23223780
Traneptora
2025-01-30 07:28:30 update: it's a known bug still (haasn is busy) but now it has this: https://code.videolan.org/videolan/libplacebo/-/issues/331
gb82
2025-02-16 05:56:16 u might be able to compile the C implementation using a wasm target? idk
𐑛𐑦𐑕𐑣𐑸𐑥𐑩𐑯𐑦 | 最不調和の伝播者 | 異議の元素
2025-02-16 07:03:52 I don't want to have Node.js bindings, only vanilla ESM ones
spider-mario
2025-02-20 01:47:48 (why Élevé and not Élevée?)
_wb_
2025-02-20 04:26:34 what's the context for this question?
spider-mario
2025-02-20 04:27:03 <@814115494021300285> 's name
_wb_
2025-02-20 04:29:06 oh. Right, it's la lumière...
2025-02-20 04:30:42 I misread it as élève tbh
𐑛𐑦𐑕𐑣𐑸𐑥𐑩𐑯𐑦 | 最不調和の伝播者 | 異議の元素
2025-02-20 04:30:55 well I'm not a girl, so I purposefully chose that...
2025-02-20 04:31:26 ~~honestly you're the first person to ask that at all, wonder why others hadn't yet~~
spider-mario
2025-02-20 04:34:35 right, but adjectives in French agree with the grammatical gender of the noun they apply to (here, lumière, which is feminine), regardless of the gender of the underlying person that the noun might be referring to
2025-02-20 04:35:22 « une grande personne » refers to a tall person, who might be a man
2025-02-20 04:36:39 (using this example reminds me of https://youtu.be/nc5LaNcTAfU?t=22s)
_wb_
2025-02-20 04:39:11 This is easy for me to get confused about, since in Dutch and English it's different (although Dutch/English have less grammatical gender than French). In French you say "sa barbe" even though the owner of the beard is male, while in English you say "his beard" (and in Dutch "zijn baard").
spider-mario
2025-02-20 04:40:07 oh, yes, only the gender of the possessed thing and not the possessor
2025-02-20 04:40:15 (in German, you need to take _both_ into account…)
2025-02-20 04:41:07 although as far as adjectives are concerned, I believe it’s the same in German as in French
2025-02-20 04:41:15 ein grosses Mädchen
𐑛𐑦𐑕𐑣𐑸𐑥𐑩𐑯𐑦 | 最不調和の伝播者 | 異議の元素
2025-02-21 09:21:03 ~~I'm too tired to correct pronoun usage XD~~
2025-02-21 09:22:10 hence purposefully breaking the grammar to perhaps make the assumption go away, which worked mostly flawlessly so far
2025-02-21 09:24:12 wonder if it's viable to use Emscripten, then write my own glue layer to get rid of any Node.js dependency ~~SSIMULACRA2 feels like the current best to both consider speed and result neutrality~~
gb82
2025-02-21 10:09:17 Woah ur in the fosstoast server lol
AccessViolation_
2025-02-21 11:40:32 i wish the singular 'hen' in dutch was more commonly used as a gender neutral pronoun (e.g. "hen loopt") <https://nl.wiktionary.org/wiki/hen>
2025-02-21 11:42:32 it sounds wrong, but i've slowly been adopting it into my vocabulary and i'm getting used to saying it now
2025-02-21 11:45:38 now i'm using it when the gender of the person that's talked about isn't clear. it already sounds passable in cases like "ik ken hen niet" but in "hen is onbekend" it still sounds fairly awkward to me
2025-02-21 11:47:46 gotta love the wrong and the right pronouns both feeling wrong but for different reasons 🥲
2025-02-21 11:48:24 at least in english it works out with 'they'
_wb_
2025-02-22 07:54:39 "die" is a good gender-neutral or nonbinary pronoun in Dutch. It works without requiring grammatically awkward plural-for-singular constructions. "Ik ken die niet" and "die is onbekend" both sound just fine.
damian101
2025-02-22 12:53:20 Fucking Romans had to ruin everything with their grammatical genders.
AccessViolation_
2025-02-22 02:56:49 ohh yeah that's a good one
2025-02-22 02:56:52 never thought of that
Traneptora
2025-02-25 10:13:59 Hebrew is my favorite because verbs also have gender conjugation
2025-02-25 10:14:22 So past and future tense actually care about gender, number, and person
2025-02-25 10:15:03 and present tense cares about gender and number, like adjectives, but not person
2025-02-25 10:15:28 Unless it's first person. Then gender isn't a thing
2025-02-25 10:16:07 still is in present tho
𐑛𐑦𐑕𐑣𐑸𐑥𐑩𐑯𐑦 | 最不調和の伝播者 | 異議の元素
2025-02-26 11:13:52 JPEG X Language XD
2025-02-26 11:14:11 btw is jpegli still in a separate repo?
RaveSteel
2025-02-26 12:15:41 Yes
damian101
2025-02-26 01:19:00 Still? It's probably gonna stay there, and still needs to properly separated from the JXL project...
AccessViolation_
2025-02-26 08:45:20 in case you think it was always like that and are suggesting it be merged into the libjxl one: it was originally part of the libjxl repo and was separated into its own thing a little while ago. if you knew this and i misinterpreted your message feel free to ignore :p
𐑛𐑦𐑕𐑣𐑸𐑥𐑩𐑯𐑦 | 最不調和の伝播者 | 異議の元素
2025-02-26 08:46:59 ~~I know that it was split into a separate repo a while ago~~
2025-02-26 08:47:23 Nixpkgs still hasn't get round to package `jpegli` in a standalone process yet
jonnyawsom3
2025-02-26 09:25:31 When encoding floats to JXL, is `--intensity_target` the only way to avoid crushed blacks with cjxl? I suppose there's also `--disable_perceptual_optimizations` but from what I recall it severely increases filesize as expected
Quackdoc
2025-02-26 09:28:30 messing with intensity_target can royally bung up decoding for users so that would be not great
jonnyawsom3
2025-02-26 09:36:57 Yeah
damian101
2025-02-26 10:48:39 Really? Are there broken JXL decoders that don't consider peak intensity metadata and just assume some intensity target when decoding XYB?
2025-02-26 10:48:54 Because otherwise that should be no issue at all as long as source colorspace is SDR.
2025-02-26 10:49:23 Or did something change across decoder versions?
Meow
2025-02-27 01:50:37 Yet it's much easier to use cjpegli and djpegli via the libjxl release on Windows
2025-02-27 01:51:44 I can't build successfully from the jpegli repo on Windows
Quackdoc
2025-02-27 03:46:30 im not sure I follow, `intensity_target` in jxl specifies how bright the luminance value of `1.0` is. I don't know how decoders handles this, but each colorspace reasonably expects a general value for this. if you encode an sRGB image with an intensity_target of `1000` the decoder when tonemapping should try to make this reasonable when decoding
2025-02-27 03:46:37 imo anyways
2025-02-27 03:47:42 this is doubly important when doing sdr->hdr or hdr->sdr
2025-02-27 03:49:06 i just realized `intensity_target` could have interesting uses when targeting colorspaces like scRGB
2025-02-27 03:54:15 for instance this is jxl-oxide when decoding an image normally, and one with a target_intensity of 2000
2025-02-27 03:56:18 note in occulante the image is explicitly being requested to tonemap to sRGB
2025-02-27 03:59:10 tho this isn';t what I think it would look like
Tirr
2025-02-27 04:00:56 maybe jxl-oxide should ignore intensity_target when decoding sdr to sdr (I thought it already skips it though), not sure around intensity_target of sdr transfer
Quackdoc
2025-02-27 04:04:45 it's hard to say, realistically, SDR and HDR aren't persay all that different here. In fact I would argue using terms like HDR and SDR here is overcomplicating the situation by using poorly defined terms
2025-02-27 04:05:27 it would be ideal for a program to know the "intended reference brightness" of various colorspaces
2025-02-27 04:06:30 that being said, doesn't jxl have a boolean that specifies whether a transfer is relative to display max?
Tirr
2025-02-27 04:32:26 I vaguely remember there's something like that
_wb_
2025-02-27 07:40:17 What's your float workflow? One thing to be careful with is assumptions about transfer functions, e.g. if you just use ImageMagick to convert between PPM and PFM, it will use the sRGB transfer curve for both, while libjxl interprets PPM as sRGB by default and PFM as Linear sRGB by default...
jonnyawsom3
2025-02-27 10:07:27 That would explain why I was getting much darker images in Irfanview. I'm using a 16bit EXR Blender render, converted to PFM with FFMPEG. Though, I had seen the low quality dark areas on a sample EXR and an 8bit PNG input too. I'll try setting it to sRGB tonight and see what happens
Quackdoc
2025-02-27 10:43:40 when working with exr I use oiiotool
2025-02-27 10:43:54 or really whenever I need more accurate conversions
2025-02-27 10:45:16 I think If it is true, don't do tone mapping if false then do it since the pixel would logically be nits
2025-02-27 10:45:32 unless I am misinterpreting it ofc
jonnyawsom3
2025-02-27 10:50:26 I need to open an issue for Blender, the render buffer is only f16, so none of the 32bit export options actually work properly. Just increase filesize for 16bit content
Quackdoc
2025-02-27 10:50:48 oof
Traneptora
2025-03-03 09:47:09 ffmpeg doesn't default to linear for pfm, but you can always linearize first
jonnyawsom3
2025-03-07 06:28:23 Used FFMPEG directly but still got the same issue. As soon as it's a JXL, the image decodes far darker and using lossy doesn't seem to take into account the wider range, so anything dark gets set to a single value instead
Traneptora
2025-03-07 10:16:50 if the image is darker it may be a TRC issue
2025-03-07 10:17:02 like linear light is being interpreted as sRGB or something
jonnyawsom3
2025-03-07 10:56:32 It seems to be a few issues compounding. FFMPEG is encoding the EXR files to 16bit int JXLs and IrfanView doesn't color manage above 8bit. Importing the EXR to Krita and saving it as a lossless JXL, then viewing in either Krita or Waterfox works
2025-03-07 11:01:22 Ah... The dithering is a little... Eager, too
2025-03-07 11:07:09 ```Input #0, exr_pipe, from 'C:\Users\jonat\Downloads\16F.exr': Duration: N/A, bitrate: N/A Stream #0:0: Video: exr, gbrapf32le(unknown/unknown/linear), 2048x2048 [SAR 1:1 DAR 1:1], 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (exr (native) -> jpegxl (libjxl)) Press [q] to stop, [?] for help Output #0, image2, to 'test.jxl': Metadata: encoder : Lavf61.9.100 Stream #0:0: Video: jpegxl, rgba64le(pc, gbr/unknown/linear, progressive), 2048x2048 [SAR 1:1 DAR 1:1], q=2-31, 200 kb/s, 25 fps, 25 tbn JPEG XL image, 2048x2048, lossy, 16-bit RGB+Alpha```
2025-03-07 11:09:25 Main annoyance is PFM doesn't support Alpha, so I can't use the 0.9 cjxl to get the correct bpp
2025-03-07 11:13:10 ```JPEG XL encoder v0.11.0 0185fcd [AVX2,SSE2] Encoding [Modular, lossless, effort: 5] Compressed to 19394.5 kB (36.992 bpp). 2048 x 2048, 1.274 MP/s [1.27, 1.27], , 1 reps, 16 threads. PeakPagefileUsage: 448.5 MiB Wall time: 0 days, 00:00:03.365 (3.37 seconds) User time: 0 days, 00:00:00.796 (0.80 seconds) Kernel time: 0 days, 00:00:05.531 (5.53 seconds) JPEG XL encoder v0.9.1 b8ceae3 [AVX2,SSE4,SSSE3,SSE2] Encoding [Modular, lossless, effort: 5] Compressed to 12349.3 kB (23.554 bpp). 2048 x 2048, 0.757 MP/s [0.76, 0.76], 1 reps, 16 threads. PeakPagefileUsage: 416.6 MiB Wall time: 0 days, 00:00:05.609 (5.61 seconds) User time: 0 days, 00:00:01.031 (1.03 seconds) Kernel time: 0 days, 00:00:24.765 (24.77 seconds)```
2025-03-07 11:46:47 ```JPEG XL encoder v0.9.1 b8ceae3 [AVX2,SSE4,SSSE3,SSE2] Encoding [Modular, lossless, effort: 9] Compressed to 9010.5 kB (17.186 bpp). 2048 x 2048, 0.006 MP/s [0.01, 0.01], 1 reps, 16 threads. PeakPagefileUsage: 989.4 MiB Wall time: 0 days, 00:12:31.794 (751.79 seconds) User time: 0 days, 00:01:14.406 (74.41 seconds) Kernel time: 0 days, 00:11:39.718 (699.72 seconds)``` Seems like a bit of tuning for floats could be done. `-g 0` performs best because of group palette`
couleur
2025-03-27 12:34:28 are there tools that try out difference image encoders to find out which is best at losslessly compressing a specific image
2025-03-27 12:34:40 from my experience it's not always the same
2025-03-27 12:34:51 when testing around with jxk avif png webp
HCrikki
2025-03-27 01:28:24 not the same according to what factors, do specific encoders not generate actually lossless images ?
2025-03-27 01:33:18 this? https://github.com/WangXuan95/Image-Compression-Benchmark
2025-03-27 01:34:17 do note it seems to not have the latest versions of codecs (libjxl at 0.9 - 0.10 was a massive improvement), but you could swap in your own
juliobbv
2025-04-04 04:43:16 so, random question: why is the standalone 🧈 tool is called `butteraugli_main` and not just `butteraugli`?
2025-04-04 04:43:48 is it to distinguish google's from libjxl's implementations?
A homosapien
2025-04-04 04:55:08 afaik libjxl's butteraugli is more updated than google's butteraugli
𝕰𝖒𝖗𝖊
2025-04-05 03:35:14 google's butteraugli was problematic on my last try
Crite Spranberry
2025-04-05 04:52:41 hi
juliobbv
2025-04-05 05:07:13 Yeah, but I mean, where did the `_main` suffix come from? Any interesting backing story? That's my question basically.
Crite Spranberry
2025-04-05 05:07:46 _main could just be the branch name
2025-04-05 05:07:49 or well main
2025-04-05 05:07:52 _(branch)
A homosapien
2025-04-05 05:11:50 Yeah that's probably the most likely story
_wb_
2025-04-05 06:21:38 I think it's just because it has a main() function, i.e. a standalone command line tool, as opposed to a function used internally in an encoder or benchmarking tool, or a library API.
juliobbv
2025-04-06 07:19:44 interesting, that makes more sense
2025-04-06 07:19:59 IIRC butter predates the master -> main branch renaming effort
Demiurge
2025-04-07 08:43:33 Glad effort is being spent where it really matters
Crite Spranberry
2025-04-10 05:37:25 few steps away from XP
BlueSwordM
2025-04-10 03:11:03 <@794205442175402004> Have you ever thought of adding intensity_target to ssimulacra2? I believe it would be a great way to make the metric a lot more flexible in harsher viewing conditions.
damian101
2025-04-10 05:51:17 if you want to increase intensity_target beyond default, it would need to extrapolate, though, like butteraugli
2025-04-10 05:51:48 for lower you could also just lower exposure...
2025-04-10 06:10:17 I assume the goal is to increase the weight for distortion in dark areas of ssimu2?
2025-04-10 06:11:13 Actually, does ssimu2 even take luminance directly into account? Or is all luminance weighting done by the XYB transfer?
2025-04-10 06:11:24 I think that XYB transfer is modifiable, though.
2025-04-10 06:20:04 XYB luminance is perceptually much closer to sRGB and other traditional SDR transfer functions than to PQ, or Oklab luma: https://www.desmos.com/calculator/jsseulfqad
2025-04-10 06:22:25 PQ overdoes it, however, because it assumes no environment light. But still, it is much more perceptually uniform than sRGB or Gamma 2.4 in my experience, I use it for a lot of processing.
2025-04-10 06:35:12 Like, 1% vs 100% luminance means factor ~50 for 100 nits PQ for contrast perception relative to linear light, while for XYB it's only factor ~17.
2025-04-10 06:42:53 Here relative to Gamma 2.2 instead of linear: https://www.desmos.com/calculator/yanochba5n
_wb_
2025-04-10 07:31:09 Yes, changing the intensity target has an effect on the effective tf
2025-04-10 07:33:53 The way it is now, it looks like ssimu2 is giving lower scores than it should on HDR images. Also cjxl has a similar behavior where d1 is a higher quality on HDR input than on SDR images, at least that is how it looks to me.
2025-04-10 07:34:59 I am not sure what ssimu2 does on PQ input, it may be that just like cjxl it sets the intensity target to 10000 automatically
Lumen
2025-04-10 07:35:00 people complain that ssimu2 gives good score on low luminosity when the image looks really bad
_wb_
2025-04-10 07:36:26 You mean dark images?
Lumen
2025-04-10 07:37:02 pretty much yes
2025-04-10 07:37:08 that is why blue was asking I believe
_wb_
2025-04-10 07:38:12 I think it may assume 255 nits for SDR white, so if you have a dark image but view it on a 500 nits display in a dark room, there will be more artifacts visible than what ssimu2 assumes will be visible
2025-04-10 07:39:07 It's also quite possible that there just weren't enough dark images in the corpora I used to tune ssimu2.
Quackdoc
2025-04-10 07:43:46 ~~ssimu2 custom tunes for luminance when~~
Lumen
2025-04-10 07:46:53 if someone give me a formula to plug somewhere
2025-04-10 07:46:56 there can be a vship version fast
damian101
2025-04-10 08:06:55 Well-mastered still images usually utilize the full dynamic range, while dark scenes in movies don't. And bright areas make detail in neighbouring dark areas harder to see.
_wb_
2025-04-10 08:09:55 Right, effectively in a dark movie scene, if it takes long enough, your eyes readapt to a lower overall brightness which makes artifacts much more visible than if the dark frame would be only a part of a larger image that goes brighter in other parts.
Demiurge
2025-04-10 09:27:28 libjxl also has the same problem of disproportionately blurring and messing up darker regions. https://afontenot.github.io/image-formats-comparison/#pont-de-quebec&AV1=m&JPEGXL=m
spider-mario
2025-04-10 10:38:45 for a laugh, check out JPEG XR on that image
2025-04-10 10:39:01 (any bitrate)
CrushedAsian255
2025-04-11 06:43:19 does intensity target just modify the psychovisual modelling?
damian101
2025-04-11 10:40:51 I believe for butteraugli it just changes at what peak brightness content is mapped into LMS colorspace.
spider-mario
2025-04-11 01:45:34 right, an sRGB image with `[(0, 0, 0), (118, 118, 118), (255, 255, 255)]` will be mapped to luminances of `[0, 18, 100]` if intensity_target is 100, or to `[0, 36, 200]` if it’s 200
2025-04-11 01:45:48 for PQ input, it makes no difference (it’s always the absolute luminance that the PQ signal implies)
jonnyawsom3
2025-04-11 01:59:00 That makes sense why setting it to 1000 stops crushed blacks. The values are mapped from the 0-20 range to 0-200, so they get quantized more like the bright areas without intensity_target.... I think
CrushedAsian255
2025-04-11 02:21:26 Oh so it’s how many nits full-scale translates into?
spider-mario
2025-04-11 02:21:55 strictly speaking, in the jxl spec, it’s just “an upper bound of the luminances found in the image”, to guide tone mapping
2025-04-11 02:22:02 but yes, cjxl also uses it to interpret SDR input, mapping (1, 1, 1) to that
CrushedAsian255
2025-04-11 02:22:40 Why doesn’t it just do max(image) to find the upper bound?
2025-04-11 02:22:56 Or is it like the upper bound of what *could* be in the image?
spider-mario
2025-04-11 02:23:52 it’s ideally the actual maximum in the image (so that the viewer doesn’t have to compute it on the fly), but it’s allowed to just be an upper bound estimate (so that the encoding process doesn’t have to involve computing it either)
CrushedAsian255
2025-04-11 02:25:47 So a SDR image that only goes to 0.5 should ideally have it set to 127 nits?
spider-mario
2025-04-11 02:37:11 yes, theoretically
2025-04-11 02:37:33 although current djxl, when decoding this to sRGB, would then remap such an image to use the 0-1 range in the output
damian101
2025-04-11 03:14:10 SDR transfer functions are relative...
2025-04-11 03:14:45 I think so
spider-mario
2025-04-11 04:28:17 right, the exact function would be max(luminance(linearise(rgb)) for rgb in image) – is that what you mean?
2025-04-11 04:28:30 I understood max(image) as a figurative simplification
Jyrki Alakuijala
2025-05-12 05:06:25 there is the cubic root compression in JPEG XL XYB and log compression in Butteraugli XYB, depends which one you use
damian101
2025-05-12 05:12:25 Didn't know that...
Jyrki Alakuijala
2025-05-12 05:13:41 both are biased: cbrt(energy + C) and log(energy + C)
2025-05-12 05:13:57 they fit not so badly until few hundred nits
2025-05-12 05:14:14 then JPEG XL is kludged to follow log through manipulation of the adaptive quantization
2025-05-12 05:14:29 but computation is cbrt (or two multiplications in expansion)
2025-05-12 05:15:46 https://github.com/libjxl/libjxl/blob/52aaea503e5e8ec25094472377aab4b2cde96652/lib/jxl/enc_adaptive_quantization.cc#L148C7-L148C49 shows this kludge that makes cbrt and log the same
2025-05-12 05:16:12 it is some additional entropy in the adaptive quantization map, but speeds up the decoding
Traneptora
2025-05-13 01:41:09 what part of the encode process would you say is "adaptive quantization"? are you referring to the HFMult?
2025-05-13 01:41:41 or rather, determining it?
Jyrki Alakuijala
2025-05-13 08:25:59 The code in libjxl that resides in enc_adaptive_quantization.cc
bonnibel
2025-05-30 05:20:27 would baugli or ssimu2 be appropriate metrics for comparing color quantization + dithering algorithms on a dataset?
A homosapien
2025-05-30 05:46:06 PNGquant uses MSE internally I think
_wb_
2025-05-30 08:58:35 Worth trying but at least for ssimu2 it was not tuned based on datasets including such images (or not much at least, iirc TID2013 does have some of that)
bonnibel
2025-05-30 10:59:10 I'll be comparing the original images with versions quantized down to 256 colors. MSE/PSNR is the most common metric in the literature, but I figure probably not the most appropriate to test error diffusion dithering. You're trying to create the illusion of a higher color resolution, but the per-pixel error will always be worse than just mapping every pixel to the nearest colour in the palette
_wb_
2025-05-31 06:36:29 Dithering and noise are notoriously difficult things for any metric...
Quackdoc
2025-05-31 06:38:00 AI metrics when
_wb_
2025-05-31 06:38:34 There already are quite a few
Quackdoc
2025-05-31 06:39:27 ~~ok yeah but good ones~~ [av1_dogelol](https://cdn.discordapp.com/emojis/867794291652558888.webp?size=48&name=av1_dogelol)
Kupitman
2025-05-31 09:46:17 av1_dogelol...
𝕰𝖒𝖗𝖊
2025-07-25 03:17:04 I've just rebuilt `ssimulacra2` and `butteraugli_main` (from `libjxl`) and they don't work with JPG (XYB) images and I am 100% sure that I have been using them with XYB images.
2025-07-25 03:17:10 What can be my potential problem?
2025-07-25 03:17:49 Tried building everything statically. Tried using `libjpeg.so` from `google/jpegli` Tried `libjpeg.so` from `libjxl`
2025-07-25 03:18:02 Tried `lcms2` or `skcms`
2025-07-25 04:03:33 Maybe git upstream problem. Tests fail: ``` 99% tests passed, 5 tests failed out of 8169 The following tests FAILED: 2819 - CodecTest.TestRoundTrip (Failed) 2833 - JpegliTest.JpegliSRGBDecodeTest (Failed) 2834 - JpegliTest.JpegliGrayscaleDecodeTest (Failed) 2835 - JpegliTest.JpegliXYBEncodeTest (Failed) 2836 - JpegliTest.JpegliDecodeTestLargeSmoothArea (Failed) ```
2025-07-25 06:49:14 Yes, another version worked.
2025-07-25 06:49:32 Hope this info is helpful for the devs
2025-07-25 06:56:12 I will try to pinpoint the exact commit with the problem
2025-07-26 12:32:53 Detect codec by signature. ([#4268](https://github.com/libjxl/libjxl/pull/4268)) This is the problematic commit
2025-07-26 12:33:37 ``` ssimulacra2 ref.jpg dis.jpg -5.08811768 ``` ``` ssimulacra2 ref.jpg dis.jpg Could not decode distorted image: temp.jpg ```
2025-07-26 12:34:01 Only breaks JPG with XYB, standard JPG is not affected.
2025-07-26 01:06:48 I'll try to fix it. I guess it doesn't check: ```C {0xFF, 0xD8, 0xFF, 0xE2}, // JPEG with XYB ICC ```
2025-07-26 01:07:11 all XYB files I checked, show this signature.
2025-07-26 01:11:54 I am trying RN. I'll open a PR
jonnyawsom3
2025-07-26 01:12:21 The last two values signify an APP2 marker/ICC profile
𝕰𝖒𝖗𝖊
2025-07-26 01:12:26 Yes
2025-07-26 01:12:56 I learned it, and it's indicated in the `xxd` output
2025-07-26 01:13:14 ``` xxd jpg_q99.jpg | head -n 4 00000000: ffd8 ffe2 02e0 4943 435f 5052 4f46 494c ......ICC_PROFIL 00000010: 4500 0101 0000 02d0 6a78 6c20 0440 0000 E.......jxl .@.. ```
2025-07-26 01:14:31 ``` ssimulacra2 test.jpg temp.jpg -5.08811768 ``` Yes, fixed it
Jyrki Alakuijala
2025-09-28 05:05:42 I used butteraugli for helping to compare dithering of the delta palette design, and to automatically find candidate solutions that produced low pnorm*bpp values
gb82
2025-10-12 11:23:35 https://giannirosato.com/blog/post/oavif/
2025-10-12 11:24:14 let me know what u all think – esp <@794205442175402004> , I’d be interested to hear how Cloudinary does TQ (I’m sure u have models that are much better)
_wb_
2025-10-12 11:35:17 Looks interesting, I think we did similar things (though probably a bit dumber, and some things differently) before we started switching to an approach where a simple AI model is directly producing the q setting that is predicted to hit target metric scores (that is, it produces predicted metric scores for all q settings given an image as input)
2025-10-12 11:37:41 In any of these approaches though, the weak spot remains having a metric that avoids any content bias. With AIC-4 we want to try to make such a metric or at least understand better which of the existing metrics is best at that, but it is hard and we just started.
jonnyawsom3
2025-10-12 11:40:03 I didn't know there was a SSIMU2 fork with half the memory usage, wonder if we could port any of those improvements back to the libjxl version
gb82
2025-10-13 12:13:12 that sounds super smart to me, I'm sure that model is giving very good results
2025-10-13 12:13:45 yeah I wrote it based on another older (slower) Zig implementation so let me know if you have any questions
2025-10-13 12:14:14 it ditches some ssimu2 features but it is 99.97% accurate according to my testing so I think it is decent for TQ
_wb_
2025-10-13 06:25:42 The error will be much smaller than the error between ssimu2 and actual subjective quality, so I wouldn't worry about it.
Lumen
2025-10-13 06:39:45 Honestly the zig implementation is far from what s achievable in memory usage
2025-10-13 06:40:25 Using some tricks for my hip implem I was able to reduce vram usage from 32 planes to 12 by changing to a tile based computation
2025-10-13 06:40:50 Reducing the memory bandwidth needed at the same time which sped up computation
2025-10-13 06:41:24 But it's a nice start already to ditch useless things and leads to great savings already
2025-10-13 06:45:16 Basically 12 planes represents the source, the distorted and a single temporary image (3 plane) all multiplied by 4/3 due to preloading the multiscale
gb82
2025-10-13 07:08:42 what you've done with vship is truly amazing; im really inspired by it. if you have documentation for any of this outside of the code, I'd be very interested in implementing pretty much everything you've done
2025-10-13 07:12:59 honestly it might just be time for me to look at the vship code
Lumen
2025-10-13 07:14:20 The new code with this optimization is quite convoluted but not unreadable either It would great if I could create a research paper detailing everything that I did for vship
gb82
2025-10-13 07:15:04 that would be genuinely awesome
2025-10-13 07:15:21 I've defaulted to blog posts for everything, I think even that may suffice
Lumen
2025-10-13 07:15:47 Truue though I dont have a fancy website like yours ^^
gb82
2025-10-13 07:16:15 zola was really easy and fun to set up, highly recommend
2025-10-13 07:16:23 now I can just write Markdown and press publish
spider-mario
2025-10-13 08:46:30 same here, I set up a blog with Hugo and push it to GitHub Pages
veluca
2025-10-13 11:10:16 same, use it for www.olimpiadi-informatica.it and it's a pretty good experience
lonjil
2025-10-14 09:55:55 I think I'll be writing my new blog using Typst's improved HTML output in v0.14.
veluca
2025-10-14 10:38:53 (feels like we are going a bit off topic, but I am very excited about typst's html output too)
Mia
2025-10-24 12:13:12 May be interested in <https://github.com/Glomzzz/typsite>
lonjil
2025-10-24 12:13:36 indeed!
Magnap
2025-12-04 08:18:42 <@206628065147748352> is jxl-oxide intended to support bitstream level 10? If so I have found an overflowing multiplication (or rather, if so then the overflowing multiplication I found is relevant), and I can send you a PR once the OOM-killer gives me back my laptop (was trying to decode the test case with djxl 😅 not a libjxl bug to be clear, it's just a huge image and Firefox is taking up most of my RAM)
2025-12-04 08:42:07 (tried again with empty RAM and djxl decodes it to pixels as expected)
2025-12-04 09:08:55 Not gonna upload it here because I don't feel like taking the risk of DoSing discord, but it's a cute little 2792 B 4.3 Gpx image 😅 it already locked up my thumbnail daemon 😶
jonnyawsom3
2025-12-04 09:22:20 I don't think that's a bug, Oxide just uses more memory
Magnap
2025-12-04 09:25:09 The bug is that it can't handle a 2^32 px or bigger image because it multiplies the width and height as 32-bit integers
jonnyawsom3
2025-12-04 09:25:39 Ah right
lonjil
2025-12-04 10:01:14 what exactly are the dimension limits of level 10?
Magnap
2025-12-04 10:11:17 2^30 pixels on either axis, but at most 2^40 pixels²
lonjil
2025-12-04 10:11:36 ah
jonnyawsom3
2025-12-04 10:12:18 1.1 TP roughly
Magnap
2025-12-04 10:15:08 I made a 44 kB or so image like that (2^20 pixels on each side), but libjxl won't even try to decode it, and while I have reasonable faith in my code, I don't have quite enough to think it's actually an issue or limitation in libjxl rather than me writing an invalid file
veluca
2025-12-04 10:27:59 > won't even try to decode it
2025-12-04 10:28:02 what does that mean?
2025-12-04 10:29:00 I guesstimate libjxl will need ~4TB of memory just to store the output, so I would _guess_ you don't have enough memory and the allocation of the output buffer fails
jonnyawsom3
2025-12-04 10:30:23 I thought we had streaming output for PPM, but apparently only cjxl does streamed PPM input and JXL output
2025-12-04 10:31:10 Not that you want to write 4TB of PPM anyway
2025-12-04 10:31:42 I know Oxide has cropped decoding, so you could try that on an area
veluca
2025-12-04 10:38:36 eh, you still need >200 gb to store DC buffers and the like, unless jxl-oxide is smart with those (which would surprise me somewhat)
Magnap
2025-12-04 10:40:21 I've shut my laptop down for the night, but something along these lines yes, maybe "failed to allocate picture buffer" but I don't remember it verbatim
veluca
2025-12-04 10:41:14 yeah makes sense
jonnyawsom3
2025-12-04 11:23:18 This is lossless modular (I think?) so it would 'only' have to parse the TOC and then selectively load groups in the region
veluca
2025-12-05 12:18:10 ah, so *in theory* jxl-rs should be able to (eventually) decode it
2025-12-05 12:18:27 if you memory map the output, at least
jonnyawsom3
2025-12-05 12:35:00 Something I just realised is that you have the choice of non-progressive but cropped decode, or fully progressive but not cropped. Since the Squeeze of either progressive lossless or progressive DC would mean decoding the entire image to use the residuals. Either that or some nightmarish code to figure out the regions required for a cropped unsqueeze
veluca
2025-12-05 12:38:07 I thought a long while about that, I don't think there's any way to decode a rect in a squeezed image without decoding everything above and to the left
lonjil
2025-12-05 12:42:39 isn't there still the group size limit? so even on a really big image there's a limit of how much you need to decode for any given crop
veluca
2025-12-05 01:23:19 yes, but problem is that global squeeze is not particularly group-friendly
2025-12-05 01:23:38 and in particular, it needs the group above and left to decode correctly a group
jonnyawsom3
2025-12-05 01:26:49 There's non-global squeeze?
veluca
2025-12-05 01:43:34 you can do squeeze on each group, yeah
2025-12-05 01:43:48 won't help for progressiveness though
jonnyawsom3
2025-12-05 02:15:33 Since I don't think there's a way to see the squeeze channels currently, I've made a very ramshackle example of cropped squeeze decoding Fake 'steps' are on the left side. Green is target area, red is group overhead required to decode it (the green in the steps isn't really relevant) Still saves a lot, and this is only a 1080p image with default 256 groups instead of 128, so it could do a lot better
2025-12-05 02:18:59 Hmm, wait I think I see what you mean. The squeeze is only 2x1 or 1x2 averages, but the predictors and MA tree still need accurate starting values to propagate though the rest of the group correctly, so they'll continually need the values from the neighboring block
2025-12-05 02:29:30 Still, best case you only decode the first group of every channel, worst case it's decoding the full image anyway
_wb_
2025-12-05 08:49:21 the squeeze tendency term also complicates things since it needs more neighbors than just the 2x1/1x2 that is being squeezed into 1x1
Magnap
2025-12-05 09:11:20 You can also have patches applied from anywhere on a really large previous reference frame even if the final image is small, I think. A reference frame which could itself be made with patches from previous large reference frames etc. But, modeling this as a dependency DAG, I think a sufficiently smart decoder could do a depth-first tree traversal and would only need to keep as many groups in memory as the height of the DAG plus a constant, at the cost of duplicated decoding work
Marcin
2026-02-19 01:57:35 Hi. I would like to ask if something changed in state of support losslessly transcode jpeg->jxl, i.e. lack of support due to the nature of the pipeline. I read that specialized bitstream filter (?) is needed, but no work is planned in this matter. Do I think correctly?
RaveSteel
2026-02-19 02:00:22 Are you asking if support of lossless transcoding is present outside of libjxl?
Marcin
2026-02-19 02:01:48 Yes. in ffmpeg specifically.
RaveSteel
2026-02-19 02:03:47 FFMpeg does not support JXL transcoding yet, no. As for the future, maybe <@853026420792360980> has something planned?
jonnyawsom3
2026-02-19 02:06:36 ~~FFMPEG MJPEG to MJXL transcoding~~
RaveSteel
2026-02-19 02:07:40 If only
_wb_
2026-02-19 03:41:33 ffmpeg is one of the few libraries where the concept of jpeg recompression would actually fit in the architecture, I think... but someone still needs to implement that, of course.
Traneptora
2026-02-19 04:58:40 I don't know if bitstream filters have the ability to change the codec ID
_wb_
2026-02-19 05:06:46 probably some things will have to be added/changed, but at least there's a concept of bitstream filters, which is not something that exists in, say, ImageMagick