JPEG XL

Info

rules 57
github 35276
reddit 647

JPEG XL

tools 4225
website 1655
adoption 20712
image-compression-forum 0

General chat

welcome 3810
introduce-yourself 291
color 1414
photography 3435
other-codecs 23765
on-topic 24923
off-topic 22701

Voice Channels

General 2147

Archived

bot-spam 4380

libjxl

veluca
2022-05-17 11:26:16
it has only 2 nonzeros
2022-05-17 11:26:36
that *has* to have been deliberate
dds
2022-05-17 11:26:42
yes, it's from the 3x3
veluca
2022-05-17 11:26:47
yep
2022-05-17 11:27:26
what I mean is: 0/1/4 are the only rows that touch the 3x3, and 2 make sense, so the 3rd one can't have been hand-picked
dds
2022-05-17 11:27:51
the order of the rows doesn't make sense to me! if you had that 0/1/4 together earlier then the normalisation step would need to do less
veluca
2022-05-17 11:27:53
rather we probably chose various candidates for things that make sense for the other two and picked whatever was left for the 3rd
2022-05-17 11:28:27
I think it's such that in a 4x4 order the two weird pixels are still in pos [0, 1] and [1, 0]
dds
2022-05-17 11:30:27
it's a bit of a shame really
2022-05-17 11:33:33
hand-wavingly, normalisation makes writing a 'fast AFV' implementation more cumbersome, e.g. if you do it by using the structure of the matrix i posted, then multiply by the triangular normalisation matrix. So the fewer off-diagonal entries in the normalisation matrix the better
veluca
2022-05-17 11:34:27
well, permuting rows is very cheap, at least ๐Ÿ™‚
dds
2022-05-17 11:37:57
actually scratch what I said - it makes no difference as most of the rows are mutually orthogonal anyway. There are only 3 off-diagonal entries when you normalise, which is not a great hardship
veluca
2022-05-17 11:38:29
well, all of the rows are, no? (at least as written in the spec)
2022-05-17 11:38:48
but yeah, you probably can factor the 13x13 part
dds
2022-05-17 11:41:21
i meant pre-normalisation, which is where the structure is - e.g. see both versions of row 5 a few comments ago
2022-05-17 11:41:55
factoring the 13x13 is how i originally found the butterflies / things I thought were sub-transforms to begin with
2022-05-17 11:44:00
less importantly, did you consider doing a graph transform for the whole 8x8 block, rather than a 4x4?
veluca
2022-05-17 11:44:12
consider, yes
2022-05-17 11:44:23
but IIRC we decided it was going to be too slow
2022-05-17 11:44:40
although admittedly we could have implemented it in less than quadratic ๐Ÿ˜‰
2022-05-17 11:45:22
(I'm not sure if a butterfly-ized 4x4 transform would be meaningfully faster than the one we now have)
dds
2022-05-17 11:48:35
i think i'm more sure....! are you trying to incite me to write code? ๐Ÿ˜›
2022-05-17 11:48:54
c'mon, you're doing a schoolbook matrix multiply which includes multiplies by zero
veluca
2022-05-17 11:51:00
yup but it's SIMDfied and very pipeline-able
2022-05-17 11:51:12
IDK
2022-05-17 11:51:24
I never tried ๐Ÿ˜„ it's not a significant fraction of the running time anyway
Traneptora
2022-05-19 12:31:21
What's the status on: https://github.com/libjxl/libjxl/pull/1366
novomesk
2022-05-22 08:21:32
MSYS2 developer needs help to review his patch for static build: https://github.com/msys2/MINGW-packages/issues/11697#issuecomment-1133898272
w
2022-05-24 05:10:49
any 0 duration animated should only be outputting 1 image right? jxldecoder api only gives 1 image but djxl makes an apng
_wb_
2022-05-24 05:13:14
coalesced decoding should give only 1 frame, non-coalesced decoding should give all layers
w
2022-05-24 05:19:18
how would i make it so djxl only makes 1 frame png
_wb_
2022-05-24 05:22:53
Could be that djxl is a bit buggy and doesn't do the right thing
w
2022-05-24 05:25:41
oh
Traneptora
2022-05-24 02:33:30
in theory you could always interpret an APNG just as a PNG though, since PNG is forwards compatible, right?
ziemek.z
2022-05-24 08:18:35
Here's a GIF from Samsung's Smart Select (thanks <@770059673583484928> for attaching it below with Nitro!) Encode it. Losslessly, lossily, it doesn't matter. Open the resulting JXL file with GIMP. Everything's OK, right? But now try opening it with Chrome or Windows Gallery via jxl-winthumb. Well... technically it will work, but watch the animation go nuts in Chrome or view those borked frames individually in Windows Gallery. Oh, and I almost forgot: try decoding that JXL back to GIF or even to APNG or WebP. GOOD LUCK.
Cool Doggo
ziemek.z Here's a GIF from Samsung's Smart Select (thanks <@770059673583484928> for attaching it below with Nitro!) Encode it. Losslessly, lossily, it doesn't matter. Open the resulting JXL file with GIMP. Everything's OK, right? But now try opening it with Chrome or Windows Gallery via jxl-winthumb. Well... technically it will work, but watch the animation go nuts in Chrome or view those borked frames individually in Windows Gallery. Oh, and I almost forgot: try decoding that JXL back to GIF or even to APNG or WebP. GOOD LUCK.
2022-05-24 08:26:38
_wb_
2022-05-24 08:56:50
I suppose the implementation of animated jxl could use some more love
2022-05-24 09:00:24
It's just not very appealing to work much on that - it's almost always better to use video codecs than animated image codecs, so it's a somewhat pointless exercise. We don't really want to replace GIF with JXL...
2022-05-24 09:01:41
I mean, GIF is still a thing because it's pretty much supported by anything in the world, being that old. But if you're willing to give up that level of interoperability, you can just as well use av1 or whatever.
ziemek.z
2022-05-24 10:36:59
I just wanted to be consistent and have *everything* from my screenshot collection (23,318 PNGs + 3,423 JPGs + 5 GIFs) on my backup DVD in JPEG XL. Thankfully I can count all GIFs on the fingers of one hand (literally), so that's not a problem โ€“ I just didn't include them in the backup.
w
2022-05-24 11:20:01
djxl makes the n layer 0 duration jxl an apng with n frames and some default minimum duration which I assume is wrong
ziemek.z
ziemek.z Failing pipelines are: `arm-linux-gnueabihf`, `aarch64-linux-gnu` (both normal and lowprecision), `vcpkg / x64-windows-static`, `vcpkg / x86-windows-static`.
2022-05-28 12:58:04
OH COME ON, VCPKG STILL FAILS
veluca
2022-05-28 01:12:22
with msvc22?
2022-05-28 01:12:52
or do you mean the gh pipeline?
ziemek.z
veluca or do you mean the gh pipeline?
2022-05-28 01:44:19
Yes, the latest commit
2022-05-28 01:47:32
Try running the pipeline in your fork
yurume
2022-06-01 04:15:45
is it possible to disable the palette transform in cjxl? I tried `--palette=0` but it didn't work.
_wb_
2022-06-01 05:03:14
Try --palette=0 -X 0 -Y 0
2022-06-01 05:03:39
Otherwise it might still do channel palette
chafey
2022-06-02 07:28:13
Has the experimental/fast_lossless been integrated into libjxl yet? if not, is there a plan?
_wb_
2022-06-02 08:09:44
Probably post 1.0
2022-06-02 08:10:50
Since it requires a totally different code path, which seems to be a bit risky to add at this point if we want to stabilize things...
2022-06-02 08:11:28
But yes, at some point I want the fastest lossless encode settings to do that
Smily
2022-06-09 04:22:43
Hi! jpeg xl looks really cool, so I've been trying to see if I could use it for a hobby Golang project. Any idea how feasible that would be? The ideal solution would be transpiling libjxl into Go with ccgo or cxgo, but maybe that's crazy talk. On the other hand, the transpiled sqlite I've been using works great. Less ideally a cgo wrapper wiuld make sense, or even just calling cjxl directly, but there's probably more overhead to those approaches ๐Ÿค”
veluca
2022-06-09 04:25:21
depending on what you want to do I'd consider just writing a oneshot encoding/decoding in C/C++ and wrapping those
2022-06-09 04:25:37
if you need more fine-grained interactions that could be hard
2022-06-09 04:25:45
transpiling is ... probably not an option
2022-06-09 04:26:07
(happy to be shown otherwise though)
Smily
2022-06-09 04:58:36
I was thinking of generating thumbnails for a photo gallery / google photos style application. The idea was to generate e.g. a 1024px or 512px progressive JPEG XL, split it up by the ... progressive uhh boundaries / checkpoints (FF0A in regular jpeg?), and store each of these "levels" next to each other in a sqlite database with an index. Compared to just e.g. generating 5 separate thumbnail files on the file system as you would normally do, my hypothesis is that it would 1) take up way less space as only one full image would need to be stored, 2) be faster to read for smaller thumbnail sizes as sqlite would do fewer syscalls than reading separate files, 3) be faster to generate due to 1), and 4) be really cool ๐Ÿ™‚
2022-06-09 04:59:44
This hinges a bit on jxl operations not having a lot of overhead, which is why integrating as directly as possible is probably a good idea ๐Ÿ™‚
veluca
2022-06-09 05:10:07
I think you're best off writing a couple of specific c wrappers that would allow you to just do ~5 calls for each operation
2022-06-09 05:11:10
(also I had experiences with DBs-as-a-filesystem and i can say I strongly recommend against doing it but up to you :P)
Smily
2022-06-09 05:12:36
Yeah I might try that first and then fall back to just calling cjxl if I find I'm fighting C compilers too much ๐Ÿ˜…
veluca (also I had experiences with DBs-as-a-filesystem and i can say I strongly recommend against doing it but up to you :P)
2022-06-09 05:13:54
It's a hobby project, so the worst that can happen is that I waste some time and learn a lesson ๐Ÿ˜
veluca
2022-06-09 05:14:44
Fair enough, fair enough ;)
Smily
2022-06-09 05:14:49
Banking on this https://www.sqlite.org/fasterthanfs.html
2022-06-09 05:26:52
Thanks for the help! ๐Ÿ™‚
Pashi
2022-06-10 03:19:20
For some reason cjxl cannot read a jxl o_O
2022-06-10 03:21:15
Do I really have to decode it into a different format with djxl first before I reencode it? Isnโ€™t that dumb? What if I want to transcode a lossless image to a lossy one? And the source is jxl? Why would libjxl tools not be smart enough to decode a jxl image? 0_o
_wb_
2022-06-10 04:42:29
cjpeg also doesn't take jpeg input, and cwebp doesn't take webp input
BlueSwordM
_wb_ cjpeg also doesn't take jpeg input, and cwebp doesn't take webp input
2022-06-10 05:11:01
Actually, mozjpeg can take a JPEG input just fine, and CWebP can take a WebP input just fine ๐Ÿ™‚ cwebp: `Supported input formats: WebP, JPEG, PNG, PNM (PGM, PPM, PAM), TIFF`
2022-06-10 05:11:32
So yeah, I do think cjxl should support JXL input ๐Ÿ˜„
_wb_
2022-06-10 05:13:48
Ok, but what should it do with it?
2022-06-10 05:14:08
Decode to pixels? Transcode losslessly?
2022-06-10 05:14:51
We don't have code yet to do lossless transcode jpegtran style
BlueSwordM
_wb_ Decode to pixels? Transcode losslessly?
2022-06-10 05:17:45
Decode to pixels, that's perfectly fine ๐Ÿ˜„
2022-06-10 05:18:25
Just add that: "JXL input is supported, but lossless transcoding of JXL to JXL is currently not supported", or something similar.
Pashi
2022-06-10 02:11:38
If someone wants to transcode a lossless image to a lossy one. They should not have to convert the image to another format first...
2022-06-10 02:12:23
Just makes no sense... regardless of what others are doing...
2022-06-10 02:13:53
"X behaves like that too" doesnโ€™t change at all the fact that it's ridiculous
2022-06-10 02:15:02
Can webp even do lossless?
2022-06-10 02:16:10
I don't really have an opinion on whether cjxl should have a webp decoder or not.
2022-06-10 02:16:31
But you would expect it to be able to decode its own format...
2022-06-10 02:17:05
It already has a jxl decoder but it isnโ€™t smart enough to use it.
2022-06-10 02:18:36
Especially with the minimal generation loss being one of its touted features, it's surprising that you have to first turn it into another intermediate format before reencoding like png or ppm
_wb_
2022-06-10 02:28:04
I'm not opposing this, but please note that cjxl/djxl are just example applications. Eventually, most jxl encoding would not happen using these tools, but directly in whatever application you are using (which probably still uses libjxl behind the scenes, of course)
JendaLinda
2022-06-10 03:05:21
Command line tools will be always useful. Most applications probably won't be exposing more advanced features.
diskorduser
2022-06-10 03:16:06
Isn't image magick enough?
Pashi
2022-06-10 04:35:34
Agreed wb and arun
2022-06-10 04:35:52
Also I hear graphicsmagick is maybe better than imagemagick
2022-06-10 04:37:00
It's not a big dealio but it is mildly annoying and bizarre
2022-06-10 04:38:09
Also is cjxl_ng any good? Can that accept jxl input?
_wb_
2022-06-10 05:31:41
The _ng tools use the api, the current/old tools were made before the api existed
2022-06-10 05:31:55
Eventually cjxl_ng should become cjxl
JendaLinda
2022-06-10 05:43:48
Imagemagick is so overwhelming. In my experience, simple programs built for the task often do a better job (or provide more precise control) than complex programs that are trying to do everything.
2022-06-10 05:44:44
Does cjxl_ng support lossless compression? I was unable to make it working. Or am I doing something wrong?
2022-06-10 05:46:27
"-distance 0" did a lossy compression and "-distanec 0 - modular" produced a very big file, bigger than the original PNG
_wb_
2022-06-10 05:48:03
Hm, that's not right. Maybe file a bug report
JendaLinda
2022-06-10 05:59:18
A little correction. If I use only either "-distance 0" or "-quality 100", cjxl_ng won't produce any file. I'm using the version from package v0.7.0 ab775e2
Pashi
2022-06-10 06:27:28
I noticed there hasnโ€™t been a release in some time so I have been using git. I hope jxl or something that builds on jxl takes over the world soon. Would be nice to have our phones use it instead of heif
BlueSwordM
Pashi I noticed there hasnโ€™t been a release in some time so I have been using git. I hope jxl or something that builds on jxl takes over the world soon. Would be nice to have our phones use it instead of heif
2022-06-10 06:32:46
Anyway, if you don't care too much about lossless JPEG transcoding and animation, you can use ffmpeg directly to transcode JXL to JXL ๐Ÿ˜„
Pashi
2022-06-10 06:39:40
Are there any good tools for windows I can recommend to people for transcoding and compacting their images with JXL?
diskorduser
2022-06-10 07:59:45
Xnconvert
Pashi
2022-06-11 01:07:46
Seems pretty cool.
2022-06-11 01:11:35
What is the next usecase that libjxl will be further optimized for?
2022-06-12 11:31:22
How come the Windows builds do not include the actual shared lib .dll but only has the "example programs?" That's kind of weird for a library to not actually have the library.
2022-06-12 12:12:12
Also for some reason cheetah is giving me smallest files.
2022-06-12 12:41:31
Is there any situation where the default effort level 7 produces smaller files than the faster level 4?
2022-06-12 12:42:26
Level 4 seems to produce the same quality as higher levels at a much smaller filesize
yurume
2022-06-12 01:14:38
it is definitely possible, mostly because that effort level is not what people normally think of
fab
2022-06-12 01:20:55
cjxl is not updated
2022-06-12 01:21:04
since 4 months
2022-06-12 01:21:34
no sharpness improvement
2022-06-12 01:21:57
it will be abandoned
2022-06-12 01:22:20
as is not good even fo simple sceenshots
Pashi
2022-06-12 01:22:46
Ah I see, effort 4:cheetah is a little bit more noticeably blocky in some images. So it's trading filesize for more blockiness.
fab
2022-06-12 01:22:48
in genal cjxlng with way less effot
2022-06-12 01:22:59
like default is 3
2022-06-12 01:23:16
like cpu 6 aomenc but x2 faster
2022-06-12 01:23:35
the quality is way better
Pashi
2022-06-12 01:23:46
libjxl is being updated, but apparently not enough for it to have a new "release" in a long time.
fab
2022-06-12 01:23:58
the image looked from far
2022-06-12 01:24:11
look like they have better bitdepth
Pashi
2022-06-12 01:25:11
I am using the git version since it seems to have been a long time since the last release. At least, a long time for a piece of experimental software that aims to be the next JPEG.
fab
2022-06-12 01:25:33
seven month
Pashi
2022-06-12 01:25:42
New/experimental software like this typically gets new releases often, like dav1d
fab
Pashi New/experimental software like this typically gets new releases often, like dav1d
2022-06-12 01:26:34
yes but 0.6.1 is not that good
Pashi
2022-06-12 01:27:15
I haven't compared 061 with latest git so I can't tell how big the changes are. Apparently not big enough to warrant a release.
fab
2022-06-12 01:27:39
like at 0.451 0.600 bpp
Cool Doggo
Pashi I haven't compared 061 with latest git so I can't tell how big the changes are. Apparently not big enough to warrant a release.
2022-06-12 01:27:51
most of the changes since then don't effect much encoding wise
fab
2022-06-12 01:27:52
o 0.390 butter
2022-06-12 01:28:03
also ringing
2022-06-12 01:28:30
with xnview the quality at q80 is good
2022-06-12 01:28:57
but jpeg xl in general it tends to produce an heatmap
2022-06-12 01:29:20
and reduce the sharpness
2022-06-12 01:29:26
at least not
2022-06-12 01:29:55
but it gives less hot images if you use nornal effort
2022-06-12 01:31:16
ffmpeg -i input.mp4 output.apng ffmpeg -i C:\Users\Use\Videos\e\a.mp4 C:\Users\Use\Videos\e\a.apng -f apng output.png for %i in (C:\Users\Use\Videos\e\*.apng) do cjxl_ng_main "%i" "%i.jxl" for %i in (C:\Users\Use\Documents\vvvf\*.png) do cjxl_ng_main "%i" "%i.jxl" for %i in (C:\Users\Use\Videos\l\*.jpg) do cjxl_ng_main --effort 8 --lossless_jpeg=0 "%i" "%i.jxl" for %i in (D:\video\june\phone\Camera\Camera\jpg\*.png) do cjxl_ng_main "%i" "%i.jxl" ffmpeg -i input.mp4 output.apng
Pashi
2022-06-12 01:31:25
Everyone wants a super efficient and responsive image codec like this to replace all legacy formats and be supported in all image viewers and web browsers and cell phones... Especially if it can losslessly crush existing jpeg.
fab
2022-06-12 01:31:28
2022-06-12 01:32:31
yes but they have to garantee a big enough improvement
2022-06-12 01:33:07
Pashi
2022-06-12 01:33:29
It's kind of odd, considering, if cjxl is supposed to be an example program demonstrating how to use the library, why doesn't it use the library? And only cjxl_ng uses it, but is less tested and experimental?
fab
2022-06-12 01:33:43
472x480
Pashi It's kind of odd, considering, if cjxl is supposed to be an example program demonstrating how to use the library, why doesn't it use the library? And only cjxl_ng uses it, but is less tested and experimental?
2022-06-12 01:33:51
cjxl doesn't use the api
Cool Doggo
2022-06-12 01:33:56
cjxl (iirc) is eventually being replaced by cjxl_ng
fab
2022-06-12 01:33:57
jon said it
2022-06-12 01:34:53
even lossless jpg transcode you can get 475 to 400kb
2022-06-12 01:34:56
with cjxlng
2022-06-12 01:35:03
at effort 3
2022-06-12 01:35:11
default one
2022-06-12 01:35:22
i don't know if it also fo losslessjpgxl
Pashi
2022-06-12 01:35:33
Isn't it strange that cjxl didn't use the api to begin with, if it was meant to be an example of how to use the API?
2022-06-12 01:35:57
Something doesn't add up somewhere
fab
2022-06-12 01:37:06
they were too bugs
2022-06-12 01:37:27
yurume discovered them
2022-06-12 01:37:42
and joined as sdibaska
2022-06-12 01:37:52
he's very active
Pashi
2022-06-12 01:37:54
And if such a basic command line program as cjxl_ng can't easily use the API, and is still experimental with bugs and weird behavior, then is it even a reasonable expectation to expect web browsers to be able to adopt it?
fab
Pashi And if such a basic command line program as cjxl_ng can't easily use the API, and is still experimental with bugs and weird behavior, then is it even a reasonable expectation to expect web browsers to be able to adopt it?
2022-06-12 01:38:24
like some images fo example this
2022-06-12 01:38:47
effort 8
2022-06-12 01:39:02
it doesn't even look sharp enough
2022-06-12 01:39:09
2022-06-12 01:39:16
no different than avif
2022-06-12 01:40:06
the wood looks weird
2022-06-12 01:40:56
animation are unconposite frames
Pashi
2022-06-12 01:42:53
Anyways sorry for asking so many questions, just thinking out loud and getting confused.
fab
2022-06-12 01:43:41
It's not really animated jxl, it's concatenated still files
Pashi
2022-06-12 01:44:17
Some things just don't add up...
fab
2022-06-12 01:45:27
JPEG XL thing is not lacking of low bitrate perfomance
2022-06-12 01:45:45
https://ewww.io/2022/06/02/what-in-the-world-is-an-avif/
Pashi
2022-06-12 01:47:14
Yes, it's just a little bit perplexing to me. Like it seems unfair or unreasonable to demand or expect that other, more complex pieces of software should incorporate libjxl support if even an example program like cjxl has a hard time using the actual libjxl API.
fab
2022-06-12 01:47:24
Pashi Yes, it's just a little bit perplexing to me. Like it seems unfair or unreasonable to demand or expect that other, more complex pieces of software should incorporate libjxl support if even an example program like cjxl has a hard time using the actual libjxl API.
2022-06-12 01:48:02
hope for cjxl in android
2022-06-12 01:48:28
and aom 3.4.0 rc1 alreasy exist june1
2022-06-12 01:49:20
https://aomedia.googlesource.com/
Cool Doggo
Pashi It's kind of odd, considering, if cjxl is supposed to be an example program demonstrating how to use the library, why doesn't it use the library? And only cjxl_ng uses it, but is less tested and experimental?
2022-06-12 01:50:01
(btw)
fab
2022-06-12 01:52:20
people will still use compression and so at 1.0 they need to finalize the encoder
2022-06-12 01:52:36
at least without animation tricks
Pashi
Cool Doggo (btw)
2022-06-12 02:01:53
Oh now that I'm rereading that it makes more sense
2022-06-12 02:04:00
So the API didn't exist at first and there was no shared lib, only cjxl/djxl it sounds like?
tufty
2022-06-12 02:05:09
hello, I'm trying to fix up libvips jxl write with float data and I have a dumb question! it looks like the libjxl tools always turn on JxlColorEncodingSetToLinearSRGB() for float data I guess this assumes 0 - 255, is that right?
2022-06-12 02:07:35
I ask because libvips supports both float sRGB (0 - 255, gamma, float data) and scRGB (0 - 1, linear) I suppose I should convert everything to float linear 0 - 255, but I wanted to double check I had a quick look at the docs but I couldn't find this point being discussed (probably missed it)
2022-06-12 02:19:33
Sorry, one more question, I suppose non-linear float JXL is a possibility, looking at the API Is this something I should allow for?
_wb_
Pashi It's kind of odd, considering, if cjxl is supposed to be an example program demonstrating how to use the library, why doesn't it use the library? And only cjxl_ng uses it, but is less tested and experimental?
2022-06-12 02:59:00
The codec was designed first, then the api. So we had a cjxl/djxl a long time before we had an api.
Pashi Yes, it's just a little bit perplexing to me. Like it seems unfair or unreasonable to demand or expect that other, more complex pieces of software should incorporate libjxl support if even an example program like cjxl has a hard time using the actual libjxl API.
2022-06-12 03:01:18
The decode api is more mature than the encode api. We expect more applications to need decode than encode, including browsers.
tufty hello, I'm trying to fix up libvips jxl write with float data and I have a dumb question! it looks like the libjxl tools always turn on JxlColorEncodingSetToLinearSRGB() for float data I guess this assumes 0 - 255, is that right?
2022-06-12 03:02:24
No float is 0.0 to 1.0
tufty
_wb_ No float is 0.0 to 1.0
2022-06-12 03:04:08
great! thank you and always linear? or is it an error not to call JxlColorEncodingSetToLinearSRGB with float data?
_wb_
2022-06-12 03:04:41
Linear by default
2022-06-12 03:04:57
But you can give data with other tf if you want
tufty
2022-06-12 03:05:24
should I allow for that in my decoder? how can I tell if the person doing the encoding wrote linear data?
_wb_
2022-06-12 03:06:54
Decode side, you get pixel data and a (possibly synthesized) icc profile that describes how to interpret it, including the tf
tufty
2022-06-12 03:08:00
ah I didn't realize it synthesised profiles if necessary that's great, thank you very much
fab
2022-06-12 03:11:46
if you look at resolution cjxl will be obsolete by a week
2022-06-12 03:11:56
if you look at bpp not
2022-06-12 03:12:01
you can keep it
2022-06-12 03:12:38
but better using the final version
2022-06-12 03:15:21
https://discord.com/channels/794206087879852103/794206087879852106/985485293991907338
2022-06-12 03:15:30
we continue to chat
_wb_
2022-06-12 03:15:32
Fab you produce words, but I have a hard time making any sense out of them.
fab
2022-06-12 03:16:16
the question is
2022-06-12 03:16:17
https://discord.com/channels/794206087879852103/804324493420920833/985516870939574324
2022-06-12 03:16:22
https://discord.com/channels/794206087879852103/794206087879852106/985485293991907338
Pashi
2022-06-12 07:56:20
-q 92 -e 4 is about the same as -q 90 -e 7
2022-06-12 07:56:26
But much faster obviously.
2022-06-12 07:57:07
Efforts higher than 4 don't seem to be worth it.
2022-06-12 07:57:23
Just a waste of time and CPU
2022-06-12 08:01:49
Without giving any extra benefit in terms of economy of compression at all
2022-06-12 08:02:26
Seems to maybe help a little bit with lossless mode maybe though?
_wb_
2022-06-12 08:04:11
It depends a lot on the image
2022-06-12 08:04:52
E.g. if your image benefits from patches, like a screenshot with text on it, then e7 will be noticably better than e6
2022-06-12 08:05:27
But if the image doesn't benefit from patches, then yes sure the search for them is just a waste of time
2022-06-12 08:06:21
Higher effort _should_ give better quality per bit _in general_
2022-06-12 08:07:13
And it _should_ also give more consistent results as effort gets higher
2022-06-12 08:07:42
These are hard things to test though, so at the moment the only certainty is that slower settings are slower
Pashi
2022-06-12 08:19:13
Well if the faster settings only perform a subset of the work the higher settings do, and don't do anything novel that the slower settings don't do, then the slower settings will never produce larger files for the same fidelity
2022-06-12 08:20:01
I compressed a picture of a handwritten note and it didn't seem to benefit from patches.
2022-06-12 08:20:20
Using the lossy dct encoder at least
Pashi Well if the faster settings only perform a subset of the work the higher settings do, and don't do anything novel that the slower settings don't do, then the slower settings will never produce larger files for the same fidelity
2022-06-12 08:21:31
I'm aware this probably isnโ€™t how it works and the faster settings probably are not a strict subset of the work the slower settings do.
2022-06-12 08:38:57
would be nice if jpegxl.io used https://github.com/chafey/libjxl-js for crippled browsers like Apple and Firefox
_wb_
Pashi Well if the faster settings only perform a subset of the work the higher settings do, and don't do anything novel that the slower settings don't do, then the slower settings will never produce larger files for the same fidelity
2022-06-12 08:52:45
They mostly do different things, slower settings are not aiming at smaller filesize but at more accurately reaching the distance target (and also trying to be smaller)
monad
Pashi I compressed a picture of a handwritten note and it didn't seem to benefit from patches.
2022-06-12 10:20:10
cjxl looks for recurring, highly similar patterns to encode them just once, like deriving a sprite sheet to reproduce parts of the image content. Currently, it looks for high-contrast patterns, targeting text. Patches like these won't work well on photographs in general, which don't tend to feature such strict repetition.
Hello71
2022-06-13 12:38:51
dumb float question: there are (roughly) the same number of floating-point values in [0.0,1.0] as [1.0,MAX], right?
yurume
2022-06-13 12:41:31
yeah, for float (IEEE 754 binary32) there are 0x3f800000 numbers >= 0 & < 1 and 0x40000000 (finite) numbers >= 1
Hello71
2022-06-13 04:19:40
hm, that's more than i thought. the "missing" ones are subnormal?
Pashi
_wb_ But if the image doesn't benefit from patches, then yes sure the search for them is just a waste of time
2022-06-13 09:37:00
Suggestion: something like a 'tune' flag or a "screenshot" mode and/or "synthetic" mode and "photo" mode, some way to provide the encoder with a hint about what sort of image it's encoding, to help it decide how to encode the image. Or maybe just make the encoder smart enough to be able to tell what sort of image it is compressing and make it better at avoiding wasting time on algorithms that won't improve compression density.
2022-06-13 09:40:49
If the default speed is 7, and 7 is a waste of time for the majority of images (photographs), maybe the encoder should try to determine whether it's appropriate to use a potentially expensive algorithm
2022-06-13 09:41:00
Like looking for tiles
2022-06-13 09:41:25
I don't know if tiles are actually expensive though, just hypothetically speaking here
_wb_
2022-06-13 09:51:51
Shouldn't be that expensive when it's a photo
Pashi
2022-06-14 04:31:32
Well either way the difference in compression density between 4 and 7 seems to be marginal (but I haven't extensively tested it yet). I have noticed however that cheetah produces more JPEGesque macroblocking
_wb_
2022-06-14 07:08:28
how are you measuring? you shouldn't just look at filesize โ€” cheetah will likely produce less consistent quality, so it might be similar size but it could be a worse image...
fab
2022-06-14 07:12:02
Cjxl is better using 7
2022-06-14 07:12:19
Cjxlng 3 could be enough
2022-06-14 07:12:31
As cjxlng uses faster tools
2022-06-14 07:12:59
Though don't know when patches get enabled in cjxlng
2022-06-14 07:13:13
Does the equivalent of aom have patches
2022-06-14 07:13:27
Or you have to do 4 speeds slower?
_wb_
2022-06-14 07:13:50
cjxlng and cjxl will just have the same effort settings, no difference there
2022-06-14 07:14:04
``` ClassA_8bit_CAFE_2048x2560_8b_RGB.ppm.png Encoding kPixels Bytes BPP E MP/s D MP/s Max norm pnorm BPP*pnorm Bugs ------------------------------------------------------------------------------------------------------------ jxl:3 2048 905443 3.5368867 23.042 17.424 1.72588944 0.71976041 2.545711020841 0 jxl:4 2048 905461 3.5369570 23.745 19.899 1.72588944 0.71976041 2.545761628995 0 jxl:5 2048 777557 3.0373320 10.248 19.540 1.80541682 0.77316090 2.348346369324 0 jxl:6 2048 777298 3.0363203 9.616 19.619 1.88469470 0.77710328 2.359534479215 0 jxl:7 2048 777412 3.0367656 4.342 19.388 1.71217620 0.75627939 2.296643264439 0 jxl:8 2048 791701 3.0925820 0.537 21.409 1.50374460 0.69845216 2.160020614894 0 jxl:9 2048 797286 3.1143984 0.083 17.657 1.22554004 0.68475227 2.132591408450 0 Aggregate: 2048 817087 3.1917452 3.754 19.235 1.64053283 0.73197577 2.336280134829 0 ```
2022-06-14 07:14:24
these type of results are typical
2022-06-14 07:14:37
note that more effort does not imply less bytes
fab
2022-06-14 07:15:12
And patches at what Speed get enabled in cjxlng
_wb_
2022-06-14 07:15:15
it does improve max norm / pnorm per byte
fab
2022-06-14 07:15:16
Effort sorry
_wb_
2022-06-14 07:15:22
same as in cjxl
fab
2022-06-14 07:15:28
7?
2022-06-14 07:15:51
Squurrrll is also a name you consider
2022-06-14 07:16:29
So same speed as same effort
2022-06-14 07:16:45
Wonder what's the difference in tools
_wb_
2022-06-14 07:17:20
7 for vardct mode, 5 for modular mode, iirc
2022-06-14 07:17:49
there is no difference in the actual encode/decode code between cjxl/djxl and cjxl_ng/djxl_ng
2022-06-14 07:19:15
it's just that cjxl/djxl call the code directly (so their binaries don't depend on libjxl, and effectively contain a kind of statically linked libjxl), while cjxl_ng/djxl_ng use the library api (so their binaries will be very small and dynamically depend on libjxl for all the heavy lifting)
f1ac
2022-06-14 10:22:15
a dummy question, I have a synthetic linear float image, values can sometimes be above 1.0. I'm trying to convert it to HDR JXL using JxlColorEncodingSetToLinearSRGB() and then overwriting transfer function with JxlTransferFunction::JXL_TRANSFER_FUNCTION_PQ will converted image be displayed correctly, or do I need to apply inverse PQ to the pixels before conversion? will values of 1.0 correspond to max HDR brightness? what will happen to pixels with values above 1.0?
_wb_
2022-06-14 11:31:39
if you set the tf to pq, the encoder will think you are passing it data in pq
2022-06-14 11:32:55
if your data is linear, why not just encode it as linear?
2022-06-14 11:33:12
are you interested in lossy or lossless compression?
2022-06-14 11:34:31
what happens with values above 1.0 or below 0.0 is they will be outside the sRGB gamut and/or brighter than the nominal max brightness / darker than black
f1ac
_wb_ if your data is linear, why not just encode it as linear?
2022-06-14 11:45:19
Chrome only shows JXL files in HDR if they have PQ/HLG curve, so I'm trying to convert linear files to lossles PQ JXLs
2022-06-14 11:47:56
and this where I'm in doubt, should input be linear, should it have preapplied PQ or inverse PQ
2022-06-14 11:49:20
can't visually determine how to do it correctly because images are synthetic
2022-06-14 12:05:18
if I specify PQ and pass linear data, images look like near-blacks are elevated compared to passing linear data with linear gamma
2022-06-14 12:10:00
I guess I need to apply PQ curve prior to conversion, just wanted to be sure
eddie.zato
2022-06-14 04:51:49
I'm not sure where to report this, so I commented on it in the exiv2 repo for now: https://github.com/Exiv2/exiv2/issues/2233#issuecomment-1155447694
Traneptora
2022-06-14 08:30:18
Why is stuff like `size_t ReadHybridUintClustered(size_t ctx, BitReader* JXL_RESTRICT br) {` defined in a header file?
2022-06-14 08:30:33
It's not inlined, so I don't see why it can't have a stub in a header file and then be defined in the corresponding `.cc` file
2022-06-14 08:35:51
or rather, why is that entire class defined in a header file?
2022-06-14 08:36:12
maybe this is my lack of C++ knowledge getting to me but shouldn't that stuff be defined below in implementation files?
veluca
2022-06-14 08:37:39
it was inlined in the past
Traneptora
2022-06-14 08:37:50
ah that makes sense
Pashi
_wb_ how are you measuring? you shouldn't just look at filesize โ€” cheetah will likely produce less consistent quality, so it might be similar size but it could be a worse image...
2022-06-15 03:47:15
I am using my eyes mostly and the zoom button :) cheetah produces smaller files actually and slightly worse quality but if you just raise the quality setting until the quality matches then the filesize also matches AND you get way faster results! :)
2022-06-15 03:47:42
But I haven't tested a large corpus of images
2022-06-15 03:49:13
But so far it looks like the default effort is a waste of effort for the most part. Could be way faster and still have the same compression density.
eddie.zato
2022-06-15 03:53:55
It seems that `cjxl` sometimes can't detect exif in png files. Should I fill a bug?
Traneptora
eddie.zato It seems that `cjxl` sometimes can't detect exif in png files. Should I fill a bug?
2022-06-15 04:01:52
what's the difference between these two PNG files?
2022-06-15 04:03:30
one uses zTXt and one uses tEXt, but I don't see how cjxl doesn't recognize one but does the other
2022-06-15 04:04:00
since the output length is the same for both
eddie.zato
2022-06-15 04:05:28
This is the same file, but the exif is written with different tools, `exiv2` and `exiftool`.
veluca
2022-06-15 05:01:42
I don't think we handle compressed text chunks in cjxl, but I might be wrong
eddie.zato
2022-06-15 06:05:22
So, it should be a "feature request" then? ๐Ÿ˜„
monad
Pashi I am using my eyes mostly and the zoom button :) cheetah produces smaller files actually and slightly worse quality but if you just raise the quality setting until the quality matches then the filesize also matches AND you get way faster results! :)
2022-06-15 06:29:01
These observations aren't guaranteed in general. Decreasing a distance target can help avoid results that are too low-quality, but low efforts can still sacrifice bytes in both coding efficiency and producing too high-quality results.
Hello71
Traneptora It's not inlined, so I don't see why it can't have a stub in a header file and then be defined in the corresponding `.cc` file
2022-06-15 01:11:54
functions defined in c++ classes are automatically inline (under the language rules), otherwise they would almost certainly be illegal due to multiple definitions. whether they're actually inlined is implementation-specific
2022-06-15 01:14:35
if i were to guess, i would say that gcc probably inlines these kinds of functions too aggressively. it could be a factor in lto being more effective on c++ than c: if a medium-sized function is used once per file in 3 files, it should probably be inlined; if it is used once per file in 100 files, it should probably not be inlined
2022-06-15 01:18:18
also, the inline specifier is neither necessary nor sufficient for gcc to actually inline. putting the function in a header file simply means that gcc *can* inline if it wants to. otherwise, gcc cannot inline it without lto
2022-06-15 01:19:36
example of gcc inlining even without `inline`: https://gcc.godbolt.org/z/3P5Yxzn8n
veluca
2022-06-15 02:49:11
yep but compilers are *more likely* to inline things that are `inline`
2022-06-15 02:49:32
and also, it was actually `__attribute__((always_inline))` or whatever the spelling is ๐Ÿ˜›
SleepyJoe
2022-06-15 04:18:44
Hi, I'm not sure if this is the channel to ask this, but I have encoded an apng file with distance 0.0, but when I decoded to a list of png, there seemed to be a loss of information. I assume this is not expected, right?
_wb_
2022-06-15 04:22:53
how do you decode?
Traneptora
2022-06-15 04:26:33
iirc djxl only decodes back to `apng`
SleepyJoe
2022-06-15 04:27:37
I decoded just with: djxl img.jxl img.png
Traneptora
2022-06-15 04:28:18
also how did you compare the frames?
SleepyJoe
2022-06-15 04:28:36
It says, at djxl --help, that it just decodes to png, jpg and ppm/pfm
Traneptora
2022-06-15 04:28:54
that should probably be updated
SleepyJoe
2022-06-15 04:29:29
Using open-cv with python, it worked with other cases: cv2.imread(img.png, cv2.imread_unchanged)
Traneptora
2022-06-15 04:30:02
can you post the sample?
SleepyJoe
2022-06-15 04:31:24
The .jxl file right?
Traneptora
2022-06-15 04:31:43
no, the original apng
SleepyJoe
2022-06-15 04:46:50
The file is 70MiB, discord doesn't allow this size, is there anywhere else I can send?
Traneptora
SleepyJoe The file is 70MiB, discord doesn't allow this size, is there anywhere else I can send?
2022-06-15 04:49:53
try running this: ``` ffmpeg -i original.png -c rawvideo -f hash - 2>/dev/null cjxl -d 0 original.png interim.jxl djxl interim.jxl test.png ffmpeg -i test.png -c rawvideo -f hash - 2>/dev/null ```
2022-06-15 04:49:57
and let me know what output you get
SleepyJoe
2022-06-15 05:21:21
Switching original.png by my apng?
Traneptora
SleepyJoe Switching original.png by my apng?
2022-06-15 05:29:04
yes
SleepyJoe
2022-06-15 05:35:14
ffmpeg -i IMG_MONOCHROME2.apng -c rawvideo -f hash - 2>/dev/null cjxl IMG_MONOCHROME2.apng interim.jxl djxl interim.jxl IMG_MONOCHROME2.png ffmpeg -i test.png -c rawvideo -f hash - 2>/dev/null SHA256=543bd0f74847bf10d83c116cb058639864212568fc81ac02fdbcec41408ab448 JPEG XL encoder v0.6.1 a205468 [AVX2,SSE4,Scalar] Read 1890x2457 image, 64.4 MP/s Encoding [VarDCT, d1.000, squirrel], 4 threads. Compressed to 249739 bytes (0.007 bpp/frame). 1890 x 2457, 0.06 MP/s [0.06, 0.06], 1 reps, 4 threads. JPEG XL decoder v0.6.1 a205468 [AVX2,SSE4,Scalar] Read 249739 compressed bytes. Decoded to pixels. 1890 x 2457, 0.94 MP/s [0.94, 0.94], 1 reps, 4 threads. Allocations: 36637 (max bytes in use: 4.561156E+09)
_wb_
2022-06-15 05:38:07
Change that last ffmpeg command, it has the wrong input filename
SleepyJoe
2022-06-15 05:41:59
ffmpeg -i IMG_MONOCHROME2.apng -c rawvideo -f hash - 2>/dev/null cjxl IMG_MONOCHROME2.apng interim.jxl djxl interim.jxl IMG_MONOCHROME2.png ffmpeg -i IMG_MONOCHROME2.png -c rawvideo -f hash - 2>/dev/null SHA256=543bd0f74847bf10d83c116cb058639864212568fc81ac02fdbcec41408ab448 JPEG XL encoder v0.6.1 a205468 [AVX2,SSE4,Scalar] Read 1890x2457 image, 54.0 MP/s Encoding [VarDCT, d1.000, squirrel], 4 threads. Compressed to 249739 bytes (0.007 bpp/frame). 1890 x 2457, 0.05 MP/s [0.05, 0.05], 1 reps, 4 threads. JPEG XL decoder v0.6.1 a205468 [AVX2,SSE4,Scalar] Read 249739 compressed bytes. Decoded to pixels. 1890 x 2457, 0.90 MP/s [0.90, 0.90], 1 reps, 4 threads. Allocations: 36637 (max bytes in use: 4.561156E+09)
Hello71
veluca yep but compilers are *more likely* to inline things that are `inline`
2022-06-15 05:49:35
after playing with it a little, i think gcc (12) treats functions defined in classes as if they were declared/defined with inline, both for language and for optimization purposes
_wb_
SleepyJoe ffmpeg -i IMG_MONOCHROME2.apng -c rawvideo -f hash - 2>/dev/null cjxl IMG_MONOCHROME2.apng interim.jxl djxl interim.jxl IMG_MONOCHROME2.png ffmpeg -i IMG_MONOCHROME2.png -c rawvideo -f hash - 2>/dev/null SHA256=543bd0f74847bf10d83c116cb058639864212568fc81ac02fdbcec41408ab448 JPEG XL encoder v0.6.1 a205468 [AVX2,SSE4,Scalar] Read 1890x2457 image, 54.0 MP/s Encoding [VarDCT, d1.000, squirrel], 4 threads. Compressed to 249739 bytes (0.007 bpp/frame). 1890 x 2457, 0.05 MP/s [0.05, 0.05], 1 reps, 4 threads. JPEG XL decoder v0.6.1 a205468 [AVX2,SSE4,Scalar] Read 249739 compressed bytes. Decoded to pixels. 1890 x 2457, 0.90 MP/s [0.90, 0.90], 1 reps, 4 threads. Allocations: 36637 (max bytes in use: 4.561156E+09)
2022-06-15 05:52:51
why are you getting no output from that last ffmpeg command? Also, try cjxl -d 0 -e 2 (when not doing lossless, you cannot expect the hash to match)
Hello71
2022-06-15 05:55:48
interestingly, clang *doesn't*: `class foo { public: static int f() { ... } }` and `class foo { public: static inline int f() { ... } }` are sometimes optimized differently
SleepyJoe
_wb_ why are you getting no output from that last ffmpeg command? Also, try cjxl -d 0 -e 2 (when not doing lossless, you cannot expect the hash to match)
2022-06-15 05:57:36
You're right, I think it's because each frame is written separately in its own file, like so: img-00.png, ...
Traneptora
SleepyJoe You're right, I think it's because each frame is written separately in its own file, like so: img-00.png, ...
2022-06-15 06:02:07
it shouldn't be
2022-06-15 06:02:44
> Encoding [VarDCT, d1.000, squirrel], 4 threads. you didn't set `-d 0`
_wb_
2022-06-15 06:04:33
Oh
2022-06-15 06:04:42
This is a really old cjxl/djxl
Traneptora
2022-06-15 06:04:49
yea, I was about to mention
_wb_
2022-06-15 06:04:54
The one that doesn't know about apng yet
Traneptora
2022-06-15 06:05:02
well then, that would do it <:kek:857018203640561677>
SleepyJoe
2022-06-15 06:05:16
Also, I specified the bits per sample of 10, thus , since my original image is 10 bits, but png only supports either 8 or 16, so that could also be a problem
veluca
Hello71 interestingly, clang *doesn't*: `class foo { public: static int f() { ... } }` and `class foo { public: static inline int f() { ... } }` are sometimes optimized differently
2022-06-15 06:05:26
yeah, I was somewhat more familiar with clang (well, llvm, I think the inliner is there) so that's what I talked about ๐Ÿ˜›
SleepyJoe
2022-06-15 06:06:15
Yes, I was using the 0.6.1 version commit, specifically
2022-06-15 06:10:01
Is it better to use a recent commit?
_wb_
2022-06-15 06:22:15
Yes, best to use the latest git version
2022-06-16 05:09:46
Haha well yes it has been too long since we made a release
SleepyJoe
2022-06-16 10:22:51
Will you jump to the 1.0.0 in the next release?
Traneptora
2022-06-16 11:18:59
that's the plan
tr7zw
2022-06-17 01:05:21
Out of curiosity, with the current release it's not possible to for example re-encode a lossless jxl to a lower quality copy because cjxl can't read in jxl files? (without going jxl -> png -> jxl)
_wb_
tr7zw Out of curiosity, with the current release it's not possible to for example re-encode a lossless jxl to a lower quality copy because cjxl can't read in jxl files? (without going jxl -> png -> jxl)
2022-06-17 05:05:15
Sure this is possible, just have to use imagemagick or ffmpeg or gimp or vips or ... ๐Ÿ˜…
novomesk
_wb_ Sure this is possible, just have to use imagemagick or ffmpeg or gimp or vips or ... ๐Ÿ˜…
2022-06-17 07:35:50
or gwenview
SleepyJoe
2022-06-17 06:12:21
I think there is a bug, decoding a .jxl multi-frame image to .apng (original is also .apng)
2022-06-17 06:12:47
Can I send the output?
Traneptora
2022-06-17 07:14:18
sure
SleepyJoe I think there is a bug, decoding a .jxl multi-frame image to .apng (original is also .apng)
2022-06-17 07:14:39
if you've updated to git master libjxl and there's still that issue, feel free to provide a sample
2022-06-17 07:14:47
first try the same thing I suggested earlier
2022-06-17 07:15:02
this, I mean https://discord.com/channels/794206087879852103/804324493420920833/986673916305088512
SleepyJoe
2022-06-17 07:40:37
It didn't finish decoding
2022-06-17 07:40:47
Or writing
Traneptora
SleepyJoe It didn't finish decoding
2022-06-17 09:31:15
wdym it didn't finish? post output
SleepyJoe
2022-06-18 12:26:09
(Sorry, wasn't able to post earlier) % djxl img.jxl img.apng JPEG XL decoder v0.7.0 89215e7 [AVX3,AVX2,SSE4,SSSE3,Emu128] Read 47746120 compressed bytes. Decoded to pixels. ./lib/jxl/image_bundle.cc:34: JXL_CHECK: metadata_->color_encoding.IsGray() == c_current.IsGray() [1] 4053 illegal hardware instruction (core dumped) djxl img.jxl img.apng
Traneptora
SleepyJoe (Sorry, wasn't able to post earlier) % djxl img.jxl img.apng JPEG XL decoder v0.7.0 89215e7 [AVX3,AVX2,SSE4,SSSE3,Emu128] Read 47746120 compressed bytes. Decoded to pixels. ./lib/jxl/image_bundle.cc:34: JXL_CHECK: metadata_->color_encoding.IsGray() == c_current.IsGray() [1] 4053 illegal hardware instruction (core dumped) djxl img.jxl img.apng
2022-06-18 03:04:12
what's the source of your djxl binary? was it compiled with mingw-w64?
2022-06-18 03:05:00
if I had to guess, it's most likely compiled with MinGW, which incorrectly emits aligned instructions for avx2 when there's no alignment guarantee
2022-06-18 03:06:20
you have to compile highway with `-Wa,-muse-unaligned-vector-move`
2022-06-18 03:27:23
that's done with clang, so I believe so
_wb_
SleepyJoe (Sorry, wasn't able to post earlier) % djxl img.jxl img.apng JPEG XL decoder v0.7.0 89215e7 [AVX3,AVX2,SSE4,SSSE3,Emu128] Read 47746120 compressed bytes. Decoded to pixels. ./lib/jxl/image_bundle.cc:34: JXL_CHECK: metadata_->color_encoding.IsGray() == c_current.IsGray() [1] 4053 illegal hardware instruction (core dumped) djxl img.jxl img.apng
2022-06-18 05:47:33
Looks like a bug, assert is failing. Is the image grayscale?
SleepyJoe
2022-06-18 08:47:38
Pretty sure it is, yes, but I can double check
Traneptora what's the source of your djxl binary? was it compiled with mingw-w64?
2022-06-18 08:49:20
I compiled it with cmake, like the main readme shows
_wb_
2022-06-18 10:50:53
Does it work if you decode to other formats like jpeg or pgm?
SleepyJoe
2022-06-18 11:16:15
No, same error message appears
2022-06-18 11:19:35
I can send the file through online file sharing if you want to test
2022-06-18 11:32:35
The os I'm working on is Linux
veluca
2022-06-18 12:23:13
at least you can trust it as much as you trust me ๐Ÿ˜›
Traneptora
SleepyJoe I compiled it with cmake, like the main readme shows
2022-06-18 02:40:48
can you upload a sample?
SleepyJoe
2022-06-18 02:43:04
It's too big for discord, where do I upload?
2022-06-18 03:01:29
Thank you. Here https://fileupload.ggc-project.de/download/62b3969e414f2915/#uA1nlC4QulQgL90dHLFRRQ
Traneptora
2022-06-18 03:20:31
<@388756576824983553> there's also `https://0x0.st`
2022-06-18 03:20:35
which is very helpful
2022-06-18 03:21:59
I can reproduce the assert failure
SleepyJoe
Traneptora <@388756576824983553> there's also `https://0x0.st`
2022-06-18 03:24:06
For sharing?
Traneptora
2022-06-18 03:24:11
yea
2022-06-18 03:24:22
`curl -F'@file.png' https://0x0.st`
2022-06-18 03:24:30
uploads it from the CLI, and it returns a link to the file
2022-06-18 03:24:45
file size is <256 MB, it disallows some stuff like `.exe` and `.jar` but otherwise it works
2022-06-18 03:24:59
it only lasts temporarily, between 30 days and a year depending on file size
2022-06-18 03:25:09
and if you upload the same file again it returns the same link since it keeps track of the hash
SleepyJoe
2022-06-18 03:25:31
Nice, thanks
Traneptora
2022-06-18 03:25:56
also, I reproduced your bug
2022-06-18 03:26:49
I'll open a bug report
SleepyJoe Nice, thanks
2022-06-18 03:35:04
https://github.com/libjxl/libjxl/issues/1517
_wb_ Looks like a bug, assert is failing. Is the image grayscale?
2022-06-18 03:39:18
it is grayscale, and it's a bug in the APNG encoder, since if you discard the decoded pixels it exits without issue
2022-06-18 03:39:29
I reproduced it on a very small sample and opened the above issue
spider-mario
2022-06-18 08:16:47
FYI, SIGILL is just how our asserts die
Traneptora
2022-06-18 08:33:56
why not SIGABRT?
spider-mario
2022-06-19 09:55:00
uh, looking at the code again, I get the impression that it should be SIGTRAP https://github.com/libjxl/libjxl/blob/c4262565e8de611f593bf2c6f4a24aeb55d38afb/lib/jxl/base/status.h#L127-L141
veluca
2022-06-19 09:59:48
Built-in Function: void __builtin_trap (void) This function causes the program to exit abnormally. GCC implements this function by using a target-dependent mechanism (such as intentionally executing an illegal instruction) or by calling abort. The mechanism used may vary from release to release so you should not rely on any particular implementation.
2022-06-19 09:59:49
well
2022-06-19 10:00:41
maybe we should replace it with a call to `abort()`
spider-mario
2022-06-19 10:05:16
or maybe `raise(SIGTRAP)`
2022-06-19 10:05:51
(or, yeah, `abort` will do)
veluca
2022-06-19 10:06:15
isn't raise Unix-like specific?
spider-mario
2022-06-19 10:32:04
probably
BlueSwordM
2022-06-20 01:07:17
Trying to build libjxl statically is a bit more difficult than I though: `ld.lld: error: attempted static link of dynamic object libz.so.1.2.11 clang-13: error: linker command failed with exit code 1 (use -v to see invocation)` It's the only thing that fails.
_wb_
2022-06-20 04:03:39
I guess you need a libz.a
Traneptora
BlueSwordM Trying to build libjxl statically is a bit more difficult than I though: `ld.lld: error: attempted static link of dynamic object libz.so.1.2.11 clang-13: error: linker command failed with exit code 1 (use -v to see invocation)` It's the only thing that fails.
2022-06-20 04:44:39
you can always add `-Wl,-Bdynamic -lz -Wl,-Bstatic`
2022-06-20 04:44:51
which will dynamically link libz.so
Hello71
2022-06-20 07:36:43
but you can't dynamically link into a static binary anyways
novomesk
2022-06-21 08:08:22
Recently, my AVIF Qt plugin got approximately 10% faster by avoiding unnecessary conversion between pixel formats. Beside RGBA, I get pixels as BGRA (on little endian) or ARGB (on big endian) from libavif. JPEG XL Qt plugin could be faster too when libjxl API supports more pixel formats. I think something like that is planned for 1.0, isn't it?
Traneptora
Hello71 but you can't dynamically link into a static binary anyways
2022-06-21 02:30:27
well you need to link *some* things dynamically
2022-06-21 02:30:34
like libc.so
2022-06-21 02:30:56
I figured a 'static binary' on linux usually means except for some basics like libc and libz
novomesk Recently, my AVIF Qt plugin got approximately 10% faster by avoiding unnecessary conversion between pixel formats. Beside RGBA, I get pixels as BGRA (on little endian) or ARGB (on big endian) from libavif. JPEG XL Qt plugin could be faster too when libjxl API supports more pixel formats. I think something like that is planned for 1.0, isn't it?
2022-06-21 02:31:27
Yea, and they're also planning on supporting planar
2022-06-21 02:31:34
I'm not sure if it's a 1.0 milestone though
BlueSwordM
Traneptora I figured a 'static binary' on linux usually means except for some basics like libc and libz
2022-06-21 02:53:17
Yeah, that's about it. It's only zlib that is being a bit annoying, it'd be nice if it could be built statically since it is downloaded anyway.
_wb_
novomesk Recently, my AVIF Qt plugin got approximately 10% faster by avoiding unnecessary conversion between pixel formats. Beside RGBA, I get pixels as BGRA (on little endian) or ARGB (on big endian) from libavif. JPEG XL Qt plugin could be faster too when libjxl API supports more pixel formats. I think something like that is planned for 1.0, isn't it?
2022-06-21 03:14:42
Feel free to make a header-only api update pull request for this. It should be easy enough to implement any output pixel format, so I think once we know which ones are needed and what the api should be, it shouldn't take too much effort to add things there.
190n
Traneptora I figured a 'static binary' on linux usually means except for some basics like libc and libz
2022-06-21 03:32:43
it is possible, and sometimes valuable, to make binaries that are completely static
novomesk
_wb_ Feel free to make a header-only api update pull request for this. It should be easy enough to implement any output pixel format, so I think once we know which ones are needed and what the api should be, it shouldn't take too much effort to add things there.
2022-06-21 05:44:42
Would it be possible for example to extend JxlPixelFormat to contain new char channel_order[8]; member? (decoding API breaking change) It would allow generic description of various formats. You can mention that only certain combinations are supported now, but later you can extend the list. It would be used this way: pixel_format.num_channels = 5; pixel_format.channel_order[0] = 'C'; pixel_format.channel_order[1] = 'M'; pixel_format.channel_order[2] = 'Y'; pixel_format.channel_order[3] = 'K'; pixel_format.channel_order[4] = 'A';
Hello71
2022-06-21 07:55:25
is this interleaved only
novomesk
2022-06-21 09:52:43
I don't know what preferences have those who use planar. Maybe they would like to have multiple output buffers.
Hello71
2022-06-22 02:54:51
i think the idea/hope is to have an API which can be generalized to planar output
2022-06-22 02:54:54
see also https://github.com/libjxl/libjxl/issues/993
_wb_
2022-06-22 05:27:51
Maybe planar is better added by extending the function to set buffers for extrachannels to also work for individual color channels
novomesk
_wb_ Maybe planar is better added by extending the function to set buffers for extrachannels to also work for individual color channels
2022-06-22 08:43:29
That would be convenient/comfortable to use. But will it be faster to get data that way than getting pixels as RGBA first and converting on application's side afterwards?
_wb_
2022-06-22 10:34:30
In jxl the internal data is planar RGB for lossless/non-xyb, planar XYB for lossy/xyb
2022-06-22 10:36:21
It is converted to interleaved only at the end, when doing color conversion and conversion to integers
2022-06-22 10:39:20
CMS color conversion takes an interleaved row and produces an interleaved row, but that's done with floats so we can still choose in the conversion to ints whether to keep it interleaved or go back to planar
2022-06-22 10:40:55
Basically we could just have 3 pointers, 3 row strides, and 3 pixel strides for the final step from interleaved floats to output pixelformats
2022-06-22 10:43:00
So in planar each pointer would point to a different buffer and the pixel strides would be 1, while in interleaved they would point to different offsets in the same buffer and the pixel stride would be 3 (for rgb) or 4 (for rgba).
2022-06-22 10:44:29
<@179701849576833024> <@604964375924834314> does that make sense?
spider-mario
2022-06-22 11:42:23
at first glance, it seems to
novomesk
2022-06-22 11:43:34
In some cases, there is a padding at the end of each row (except the last), so the new row starts at aligned address.
spider-mario
2022-06-22 11:46:39
oh, right
veluca
2022-06-22 12:15:51
but that's what the row stride is for, no?
novomesk
2022-06-22 12:25:04
yes, actually I like row stride term more than alignment.
Traneptora
_wb_ Maybe planar is better added by extending the function to set buffers for extrachannels to also work for individual color channels
2022-06-22 05:57:02
my current idea for this is to add `enum JxlColorPlane` with values like `ALL, RED, GREEN, BLUE, LUMA, CB, CR, CYAN, MAGENTA, YELLOW, EXTRA`
2022-06-22 05:57:45
and you'd keep the current SetDecoderOutputBuffer for backward API/ABI compat
2022-06-22 05:57:58
but you'd add an extra SetDecoderOutputBufferPlane, which takes an argument of enum JxlColorPlane
2022-06-22 05:58:08
if you pass *ALL* you'll receieve packed/interleaved output
2022-06-22 05:58:18
which is the current default
2022-06-22 05:58:46
if you pass RED, GREEN, BLUE, etc. you'll receieve only those planes
2022-06-22 05:59:26
the decoder will reject LUMA, CB, and CR unless this is a reconstructed JPEG, or this is grayscale, in which case it will allow LUMA
2022-06-22 05:59:37
You might also simply not want to allow YCbCr
2022-06-22 06:00:21
Does this make sense to anyone else? Should I open an issue for this proposal?
Hello71
2022-06-23 06:33:20
sounds plausible to me, but i know very little about colors. i assume `ALL=0`
2022-06-23 06:35:23
i'm not sure how important it is to disallow nonsensical combinations, such as requesting RED and CB and YELLOW. maybe such cases could also be supported, but just run slower. it could theoretically be useful to get, say, LUMA, RED, GREEN, BLUE. in either case, maybe it would be useful to have an API to query which combinations are supported.
2022-06-23 06:36:22
also, what would be the behavior if you call both SetDecoderOutputBuffer and SetDecoderOutputBufferPlane? do you get both ALL and whatever other colors?
2022-06-23 06:37:46
actually, your proposal does not seem to cover the order of interleaved channels. how would that be integrated? would it use JxlColorPlane?
_wb_
2022-06-23 06:53:38
RGB and CMY are just the same thing in jxl, the only difference is in the icc profile
Traneptora
Hello71 actually, your proposal does not seem to cover the order of interleaved channels. how would that be integrated? would it use JxlColorPlane?
2022-06-25 01:16:17
it doesn't, it would be for planar only
_wb_ RGB and CMY are just the same thing in jxl, the only difference is in the icc profile
2022-06-25 01:17:39
I see, so maybe you wouldn't have CMY, just ALL, RED, GREEN, BLUE, EXTRA, and optionally Y, Cb, or Cr
2022-06-25 01:20:05
maybe Y you'd always have for the purpose of grayscale
Hello71 also, what would be the behavior if you call both SetDecoderOutputBuffer and SetDecoderOutputBufferPlane? do you get both ALL and whatever other colors?
2022-06-25 01:20:33
SetDecoderOutputBuffer would become SetDecoderOutputBufferPlane(ALL) externally
2022-06-25 01:21:30
I figure it would error out if you tried to call SetDecoderOutputBufferPlane in invalid ways
2022-06-25 01:22:47
that's one option, another option is if you set a plane incompatible with the previous options, then nothing happens
2022-06-26 06:10:13
I'm getting what I think is a bug in libjxl, but I'm not sure
2022-06-26 06:11:13
if I attempt to encode a 3840x2160 image that's 16-bit RGBA (64-bit total), it fails to set the basic info unless I set the codestream level to 10 first
2022-06-26 06:13:26
but I'm not sure how my client is supposed to be able to know that it's supposed to do this before I set the basic info.
2022-06-26 06:14:30
`JxlEncoderSetCodestreamLevel` doesn't support `-1` yet
2022-06-26 06:14:55
and setting the basic info includes a level verification check
2022-06-26 06:15:02
which will fail
2022-06-26 06:15:13
I feel like the only way to work around this is to set the level to 10 no matter what
2022-06-26 06:16:48
in this case, level10 is required because `alpha_bits > 12` but I don't want to duplicate all of the same checks that libjxl already has
2022-06-26 06:17:41
basically, I'm in a catch-22
2022-06-26 06:17:55
I call JxlEncoderGetRequiredCodestreamLevel requires basic info to be set to provide any meaningful info
2022-06-26 06:18:22
JxlEncoderSetBasicInfo includes a level check, which will cause it to fail if level10 is required and level5 is the current setting
2022-06-26 06:19:00
it sounds like what I actually have to do is set the level to 10, then populate JxlEncoderSetBasicInfo, and then *after that* set the level to what it's actually supposed to be
_wb_
2022-06-26 06:43:16
I think we just need to implement SetCodestreamLevel -1
Traneptora
2022-06-26 06:43:31
and let that be the default
2022-06-26 06:43:47
that way you can populate the basic info without setting it first, and then check afterward
_wb_ I think we just need to implement SetCodestreamLevel -1
2022-06-27 05:51:14
https://github.com/libjxl/libjxl/pull/1538
Jyrki Alakuijala
Traneptora Does this make sense to anyone else? Should I open an issue for this proposal?
2022-06-28 08:48:41
An issue will make sure that it gets discussed with all the people who understand that domain -- these discord discussions can be missed by some of our experts.
Traneptora
Jyrki Alakuijala An issue will make sure that it gets discussed with all the people who understand that domain -- these discord discussions can be missed by some of our experts.
2022-06-28 06:48:53
https://github.com/libjxl/libjxl/issues/1542
Deleted User
2022-07-01 08:37:35
Hello, I am currently working on my bachelor thesis where I am comparing image compression codecs on a system based on the QNX operating system. Unfortunately the proprietary compiler for QNX only supports C++99 Do you think it would be possible to somehow compile libjxl using C++99 for QNX?
veluca
2022-07-01 11:24:13
this is a bit of a crazy idea, but... have you tried compiling libjxl to webassembly and webassembly to c with wasm2c?
Hello71
2022-07-01 02:15:44
give a developer a browser, everything looks like wasm?
2022-07-01 02:16:29
from https://stackoverflow.com/questions/5050349/is-there-a-way-to-compile-c-to-c-code, https://github.com/JuliaComputingOSS/llvm-cbe seems to be maintained
2022-07-01 02:17:28
well, sort of maintained
veluca
2022-07-01 02:19:43
oh I didn't know of llvm-cbe
Hello71
2022-07-01 02:19:44
i'm pretty sure both the original c++ implementation and several after that were implemented using translation to C
veluca
2022-07-01 02:19:51
yes
2022-07-01 02:19:59
it *has* been more than 20 years though ๐Ÿ˜‰
Hello71
2022-07-01 02:21:51
libjxl doesn't use exceptions, so theoretically it should be amenable to C translation. the trouble is that nobody cares about such things anymore because everyone (sensible) uses gcc or llvm for new platforms anyways
2022-07-01 02:22:34
https://stackoverflow.com/questions/34168433/am-i-able-to-use-c11-in-qnx says that c++11 was available on qnx in 2015
2022-07-01 02:23:11
https://www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.qnxsdp.migration/topic/cpp_apps.html says "We support only C++11 and C++14 with libc++. Using older or new standards (C++98, C++03, C++1z (17)) may result in compilation errors. If these are absolutely required, it might be possible to do with some toolchain changes using libstdc++."
Deleted User
2022-07-01 04:29:44
yeah thanks for the help but the system I'm working on only has a really outdated license of QNX that really only supports c++99
2022-07-01 04:30:18
I have looked into it more and it seems I will have to port parts of the system to linux to get it to work
2022-07-01 04:31:10
I also want to add avif and heif to the comparison as well so I guess I would have run into the same problems anyway with these libraries
Hello71
2022-07-01 11:31:21
fwiw, i don't think there exists a c++99. there is c99 and c++98
2022-07-01 11:31:39
and c89 which is also basically c90
w
2022-07-03 01:06:43
does cjxl save encoder settings in the file
2022-07-03 01:06:53
has someone already asked this
yurume
2022-07-03 01:11:23
you can _guess_ particular settings, but in general no such metadata exists to my knowledge
w
2022-07-03 01:15:33
i would like to have the encoder version and parameters
2022-07-03 01:15:53
might be even more useful if/when lossless jxl recompression is added
Hello71
2022-07-03 02:34:15
i think jxl developers tried very hard to minimize header size, even (in hindsight) at significant expense to minimal parsers; adding a bunch of metadata by default would defeat the purpose imo
2022-07-03 02:35:27
it might be okay to have some off-by-default option to store encoder settings; that might also satisfy some people who want to know whether some image was compressed using the lossless setting or not
2022-07-03 02:36:28
otoh this is arguably dubious info to begin with, as explained in the issue. if you want to know if an image could be losslessly recompressed to be smaller, the proper way to do it is to just try to do it and see if it gets smaller, not to make some guess based on the previous parameters
yurume
2022-07-03 02:57:33
agreed, many compression formats did have some sort of encoder metadata in one way or two, hoping to be useful, and I haven't seen any tool that took advantage of them
vtorri
2022-07-03 10:51:05
hello
2022-07-03 10:51:20
is it possible to disable the build of jxl_emcc.exe ?
Kleis Auke
vtorri is it possible to disable the build of jxl_emcc.exe ?
2022-07-03 11:37:55
https://github.com/libjxl/libjxl/commit/3171add7cf986934d15706e586720fdeb9de5f90
vtorri
2022-07-03 11:48:06
<@208917283693789185> and with cmake ?
Kleis Auke
vtorri <@208917283693789185> and with cmake ?
2022-07-03 11:58:30
After that commit the `jxl_emcc` executable is no longer build (unless you target Emscripten and build without `-DJPEGXL_ENABLE_TOOLS=0`). Sorry for not being clear.
vtorri
2022-07-03 12:27:22
thank you
_wb_
2022-07-03 12:50:57
We could invent an isobmf box for encoder version/settings, or invent an exif/xmp field for it...
2022-07-03 12:51:20
No guarantees that it will exist or be correct, of course
Traneptora
2022-07-03 04:04:24
you could also just have an extension in the codestream too
2022-07-03 04:04:26
if you wanted
_wb_
2022-07-03 09:45:00
That's also an option, but I guess a new box would be easier to parse
JendaLinda
2022-07-04 07:45:03
jxlinfo can tell if JXL is possibly lossless by checking if the original profile is used. What exactly is original profile? Does it mean that XYB color transformation was not used?
Traneptora
JendaLinda jxlinfo can tell if JXL is possibly lossless by checking if the original profile is used. What exactly is original profile? Does it mean that XYB color transformation was not used?
2022-07-05 03:57:56
that's exactly correct
2022-07-05 03:58:06
"uses original profile" means XYB is not used
2022-07-05 03:58:18
"possibly lossless" in this case means it's encoded using settings that can be used in lossless mode
2022-07-05 03:58:30
most importantly, modular mode is used without XYB
2022-07-05 03:58:55
although it's not signalled whether the encoder modified any data when it did the encode, which is why it's *possibly* lossless
2022-07-05 03:59:46
if it's done with VarDCT but the original profile is used, that's still guarnateed lossy since VarDCT cannot be used for bitexact lossless mode
w
2022-07-05 12:22:52
has there been any decoder improvements since 0.6.1?
2022-07-05 12:23:17
i guess i can keep waiting until 1.0...
Traneptora
w has there been any decoder improvements since 0.6.1?
2022-07-05 05:58:54
pretty sure it's much faster now than it was
2022-07-05 05:59:00
the API is a lot better, I can say that for certain
Pashi
2022-07-06 05:30:47
"A new release needs to be maintained," says who? What? No it doesn't. I don't think anyone expects 0.6 to be maintained after 0.7 or 1.0 comes out. Seems like a terrible excuse. Seems like a very bad idea to wait so long without making a release.
2022-07-06 05:33:28
All that people want right now is a good reliable decoder library that satisfies all of the needs of common web browsers (probably also things like progressive decoding and lqip)
2022-07-06 05:34:12
The decoder is more important than the encoder as far as adoption goes right now, at least at this point.