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

on-topic

Whatever else

ignaloidas
2025-11-05 07:41:26
but it's also not inherently lossy - it's just hard/rare for it to not be
AccessViolation_
2025-11-05 07:42:29
do you mean that if you took a VarDCT JXL, sent that into another JXL encoder, as pixel data, it could theoretically output the exact same blocks and be lossless?
2025-11-05 07:44:42
I think you can go one step further, DCT is a mathematically reversible (lossless) transform. it's just we throw away some of it where we can afford it. but if you don't throw anything away, and don't quantize, I think vardct can in theory be lossless?
2025-11-05 07:45:27
I'm not sure if you can setup quantization tables with 'multiplier values' of 1 so that no coefficients are rounded by being multiplied?
ignaloidas
AccessViolation_ do you mean that if you took a VarDCT JXL, sent that into another JXL encoder, as pixel data, it could theoretically output the exact same blocks and be lossless?
2025-11-05 07:45:51
I mean more that if you had a hypothetical camera sensor that transmitted it's data as a DCT, you could just plug that into VarDCT and it be lossless
AccessViolation_
2025-11-05 07:46:02
ahh right
2025-11-05 07:46:39
wait don't many camera sensors like laptop webcams basically output a stream of JPEGs?
ignaloidas
2025-11-05 07:46:59
MJPEG is a thing, yes
2025-11-05 07:47:24
though they can often output a raw stream as well
2025-11-05 07:47:59
but because USB 2.0 bandwidth is what it is, for anything remotely high res it's MJPEG
AccessViolation_
2025-11-05 07:49:25
ah that makes sense
ignaloidas
2025-11-05 07:51:15
on a semi-related note - there is eUSB2V2 that "solves" this issue by allowing one side of things to effectively be overclocked up to 10x the speed, while the other stays as-is, so that you could have internal cameras that can transmit raw high-res data without needing complex receivers unlike if they used USB 3.0
jonnyawsom3
2025-11-05 07:51:24
And yes we've made MJXL with an FFMPEG hack before
The Thunk
The Thunk <@794205442175402004> in response to https://discord.com/channels/794206087879852103/803645746661425173/1433496087196340375
2025-11-05 10:24:05
Doubled my processing speed on single thread and did a 0.512 GB in 16 minutes and 27 seconds.
2025-11-05 10:30:40
_wb_
2025-11-05 10:44:04
Speed is not what is impressive about it, breaking basic math is
2025-11-05 10:44:46
Even if it would take a billion years per block, it would still be mathematically impossible
Adrian The Frog
2025-11-05 11:28:52
would be really neat to store and retrieve data in the cpu branch prediction between the encoder and decoder i'm sure some security researcher has figured out how to do that
The Thunk
_wb_ Speed is not what is impressive about it, breaking basic math is
2025-11-06 01:28:13
Interesting, what I was doing before was very slow. So, this speed up is huge. I was mostly focused on compressing binary and that is a fringe benefit of my process. So, even though I can lossless compress binary my speed and rate of compression isn't useful? (Compared to other methods?)
jonnyawsom3
2025-11-06 01:45:04
Speed is nice, but if you are achieving such compression, that alone is worth it
Exorcist
ignaloidas can you really tell from looking at the file (ignoring the YCbCr bit) whether it's lossless or not tho?
2025-11-06 05:33:41
_wb_ Speed is not what is impressive about it, breaking basic math is
2025-11-06 05:51:41
I have to more and more believe this is same story as Sloot Digital Coding System, from misunderstanding shared dictionary to intentional cheating
_wb_
2025-11-06 07:52:57
Yep... It's the modern version of alchemy, snake oil and perpetuum mobile inventions, I guess.
AccessViolation_
Exorcist I have to more and more believe this is same story as Sloot Digital Coding System, from misunderstanding shared dictionary to intentional cheating
2025-11-06 09:15:53
so brotli >:3
2025-11-06 09:17:10
(I joke, a compression algorithm with a shared dictionary is perfect for use on the web where a lot of data will be html/js/json)
Exorcist
2025-11-06 12:37:07
There is a more fancy shared dictionary: next-token-prediction language model as the probability distribution of arithmetic coding
2025-11-06 12:39:50
The bit size of every encoded token is the cross entropy of model prediction vs ground truth (one-hot)
The Thunk
Exorcist I have to more and more believe this is same story as Sloot Digital Coding System, from misunderstanding shared dictionary to intentional cheating
2025-11-06 01:51:12
If a dictionary is used you have to account for the space used in the dictionary as overhead. My reports are the actual storage size and do not require a dictionary each block has enough data to self describe and self define back to the original value.
jonnyawsom3
2025-11-06 02:17:46
That's... What they're doing. They're getting it reviewed by someone else
Exorcist
2025-11-06 02:22:23
He think his secret power worth 500 euro
monad
That's... What they're doing. They're getting it reviewed by someone else
2025-11-06 03:28:47
Not likely. The more messages posted, the more they read like a formulaic troll tactic.
LMP88959
2025-11-06 03:44:20
https://www.gamedev.net/forums/topic/11259-mp3-beating-compression/
2025-11-06 03:44:45
if you havent seen this ancient forum thread yet you should haha
Exorcist
2025-11-06 03:50:21
``` Original post by kieren_j Well actually, I posted that infamous first message because thats what my compressor produced - then I found a little (!) problem in my code that meant instead of reading and writing all the bits of a byte, it was only using the first. I didn''t really have the guts to say it went wrong like that... I still feel really bad though. --------------- kieren_j ```
The Thunk
monad Not likely. The more messages posted, the more they read like a formulaic troll tactic.
2025-11-06 03:57:39
I am just updating the chat and potentially interested parties as I make breakthroughs. Since, I last discussed in the chat I am now processing around 1000 blocks a second where as before I was only getting 10 blocks a second. I am not trying to troll anyone. Just enjoying the process and learning as I go. Some people give good constructive feedback. So, I continue to participate in dialogues.
AccessViolation_
2025-11-06 04:22:56
the only feedback you've gotten is that what you've claimed is impossible
2025-11-06 04:23:11
people have been trying to get through to you with this
_wb_
2025-11-06 04:33:17
How did you do the benchmark I asked you to do (taking 1000 blocks of 512 bytes from /dev/random and trying to compress them), if you're not using linux but Windows? I haven't used Windows in 27 years but last time I checked it didn't have a /dev/random...
monad
2025-11-06 04:34:47
I might as well add now that "Linux is not my OS" is a bs excuse. Unlike the safely guarded bit-discarding method, it is open and available to anyone.
Exorcist
2025-11-06 04:37:22
2025-11-06 04:39:34
2025-11-06 04:40:38
This is his first time that he censored his log screenshot to hide the data size If he has the willing to modify the log, he can fake the data size too
_wb_
2025-11-06 04:42:35
looks like <@991011772381163581> deleted all those original messages? Maybe they finally figured out the flaw and are now very embarrassed and hiding the traces
Exorcist
2025-11-06 04:43:55
His log is already censored before he deleted message
The Thunk
_wb_ looks like <@991011772381163581> deleted all those original messages? Maybe they finally figured out the flaw and are now very embarrassed and hiding the traces
2025-11-06 04:44:03
No, I was told not to use that forum. So, now I am in this forum. There is random block generation and it doesn't need to be truly random just random enough. A million blocks is a large enough sample size.
AccessViolation_ the only feedback you've gotten is that what you've claimed is impossible
2025-11-06 04:44:58
That is why I wrote code to test my algorithm. I wouldn't be pursing further if my code was not producing the results I claim.
_wb_
2025-11-06 04:46:28
https://en.wikipedia.org/wiki/Mechanical_Turk#/media/File:Kempelen_chess1.jpg
Exorcist
_wb_ https://en.wikipedia.org/wiki/Mechanical_Turk#/media/File:Kempelen_chess1.jpg
2025-11-06 04:47:34
In the day without computer, at least you need a very clever player for such magic show
The Thunk
_wb_ https://en.wikipedia.org/wiki/Mechanical_Turk#/media/File:Kempelen_chess1.jpg
2025-11-06 04:48:12
I don't think I fit inside the code... If my algorithm didn't work it wouldn't be able to compress a single block. Random bits are not supposed to be compressible.
_wb_
2025-11-06 04:50:48
ok I'll play along one more time. What does this block compress to? Show me a hexdump of the compressed version please. ``` 9961fe4013b95b1de9c2305990fdc817cc9a46d35cb920065a866995d7bd bc87f0d74ce4e10e193f7a9da1d11542e80ef1c14c494628dee873d7e5b8 a93cc5d4532c146c039fb001d15e6308832b43c95e288a5e293de9e564db 571d702c3d4fc386aca22c0e5f3c42643757977048be328579440a15f50f 243bcf670a1c4066c339bc82ea3b0b0326fbd503eef9a08f4cbc1b7c1015 66364c38d3e9eeb809f8bf21464449eb43449b628b317b97e09ef652fe26 e14a4db6fdb70e368bcd128a68dc463ae4b72171fb474eae70140849a947 e195c7d4307cfb2b7c5aa8eca70d93b4c110deffa18ff2bf41e2639a0dee 9e05553361fbb7528c3294a0b723eebb7bc3c0dedbcef1168844bc2690ac 4d49d238dc59e609c5fe0806e295640bac12d2bcc1a9d6042bde35678a42 3fd7cd1327dda3db9c389f6ba95644797ff144ad8b4751f69627ba3e1609 6a11e67e33a64679e1d9ac1e3b86c9428a577cb2f834449f360d43b89cd1 e581ee9edb3d4d5bbf45b0aba3aa5294adddf05db2e7f7518a7af6fa2353 8ef50a7e4b5811e20ae76a42f044231bb7cb8859290b9e0f2172dea2b337 d8716b1ab041da64d0bcb3da8ac6bf9c0204bacbf4789f06984afad2002d 58b678698ec0e80229d71d4be8718aaf2012053aab49a6fa15f163374c95 a151e9eb1d9f71b637df2f5d02d62881280d7e9c95a0b20cc5c40efd23f6 0082 ```
Exorcist
2025-11-06 04:52:08
write your encoded data into file system, and show the file properties by right click menu You claim you are using Windows
2025-11-06 05:03:42
``` <!doctype html> <html> <head> <meta charset="utf-8" /> <title>Download 1024-bit Random File</title> </head> <body> <button id="downloadBtn">Download 1024-bit random file</button> <script> function downloadRandomBitsFile(bits = 1024, filename = 'random-1024bit.bin') { if (bits % 8 !== 0) { throw new Error('bits must be a multiple of 8') } const byteLen = bits / 8 const arr = new Uint8Array(byteLen) crypto.getRandomValues(arr) const blob = new Blob([arr], { type: 'application/octet-stream' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = filename document.body.appendChild(a) a.click() a.remove() setTimeout(() => URL.revokeObjectURL(url), 5000) } document.getElementById('downloadBtn').addEventListener('click', () => { downloadRandomBitsFile(1024, 'random-1024bit.bin') }) </script> </body> </html> ```
2025-11-06 05:04:10
This is a random file generated by `JS_RNG.html`
The Thunk
_wb_ ok I'll play along one more time. What does this block compress to? Show me a hexdump of the compressed version please. ``` 9961fe4013b95b1de9c2305990fdc817cc9a46d35cb920065a866995d7bd bc87f0d74ce4e10e193f7a9da1d11542e80ef1c14c494628dee873d7e5b8 a93cc5d4532c146c039fb001d15e6308832b43c95e288a5e293de9e564db 571d702c3d4fc386aca22c0e5f3c42643757977048be328579440a15f50f 243bcf670a1c4066c339bc82ea3b0b0326fbd503eef9a08f4cbc1b7c1015 66364c38d3e9eeb809f8bf21464449eb43449b628b317b97e09ef652fe26 e14a4db6fdb70e368bcd128a68dc463ae4b72171fb474eae70140849a947 e195c7d4307cfb2b7c5aa8eca70d93b4c110deffa18ff2bf41e2639a0dee 9e05553361fbb7528c3294a0b723eebb7bc3c0dedbcef1168844bc2690ac 4d49d238dc59e609c5fe0806e295640bac12d2bcc1a9d6042bde35678a42 3fd7cd1327dda3db9c389f6ba95644797ff144ad8b4751f69627ba3e1609 6a11e67e33a64679e1d9ac1e3b86c9428a577cb2f834449f360d43b89cd1 e581ee9edb3d4d5bbf45b0aba3aa5294adddf05db2e7f7518a7af6fa2353 8ef50a7e4b5811e20ae76a42f044231bb7cb8859290b9e0f2172dea2b337 d8716b1ab041da64d0bcb3da8ac6bf9c0204bacbf4789f06984afad2002d 58b678698ec0e80229d71d4be8718aaf2012053aab49a6fa15f163374c95 a151e9eb1d9f71b637df2f5d02d62881280d7e9c95a0b20cc5c40efd23f6 0082 ```
2025-11-06 05:04:56
I ran it for intellectual curiosity. It compressed. I don't want to have an issue with reverse engineering so I am keeping the compressed version to myself. I have someone I somewhat trust to evaluate my code. Hopefully I find out within the month. Thank you for taking the time to respond to me. I am not seeking validation from anyone on this discord. Thank you for your constructive feedback.
Exorcist
2025-11-06 05:06:21
Did you compress the ASCII text or binary?
afed
2025-11-06 05:06:31
and compression is one thing, the most difficult part is decompression <:KekDog:805390049033191445>
The Thunk
Exorcist Did you compress the ASCII text or binary?
2025-11-06 05:08:08
Hex is just 4 bits... And, both hex and bits are just numbers... Compressing numbers and decompressing numbers.
afed and compression is one thing, the most difficult part is decompression <:KekDog:805390049033191445>
2025-11-06 05:09:16
Yes, it is a lossless process. I don't think you can compress numbers lossy and have that be useful for files.
Exorcist
The Thunk Hex is just 4 bits... And, both hex and bits are just numbers... Compressing numbers and decompressing numbers.
2025-11-06 05:10:31
You confirm your transform from ASCII text to binary are correct?
2025-11-06 05:10:50
That is the reason to use file system
The Thunk
Exorcist You confirm your transform from ASCII text to binary are correct?
2025-11-06 05:11:21
ASCII is significantly larger per character than 4 bits. Hex is an INT value...
Exorcist You confirm your transform from ASCII text to binary are correct?
2025-11-06 05:13:24
ASCII: 7 bits per character (commonly stored in 8-bit bytes). Hex: not a character encoding — it's a numeral system. Each hex digit represents 4 bits; two hex digits commonly represent one byte (8 bits). UTF‑8: variable-length encoding — 1 to 4 bytes per Unicode code point: 1 byte (8 bits) for U+0000..U+007F (same as ASCII), 2 bytes (16 bits) for U+0080..U+07FF, 3 bytes (24 bits) for U+0800..U+FFFF, 4 bytes (32 bits) for U+10000..U+10FFFF.
Exorcist
2025-11-06 05:13:59
In previous screenshot you read text from cmd, write text to cmd
monad
2025-11-06 05:15:17
\> numerical mumbo jumbo ChatGPT is the compressor.
Exorcist
2025-11-06 05:18:36
I don't want the transform chain [ASCII (used by cmd) -- hex -- binary] I want directly read binary file, directly write binary file
monad
2025-11-06 05:27:26
Meanwhile, real compressors.
The Thunk
Exorcist I don't want the transform chain [ASCII (used by cmd) -- hex -- binary] I want directly read binary file, directly write binary file
2025-11-06 05:28:53
Still optimizing the code working on speed. I want to be able to get similar speeds to MB/s like other compressors. I already did a separate compressor and de-compressor code. Printing the compressed hex and using it to decompress in the de-compressor code and comparing the original input to code 1 and the final output of code 2.
monad
2025-11-06 05:30:01
That's a very verbose way of saying nothing at all.
The Thunk
monad That's a very verbose way of saying nothing at all.
2025-11-06 05:31:15
I have limited development time. I can remake the code to their liking or I can keep experimenting and optimizing the process...
Exorcist
_wb_ If you make an outrageous claim (40% compression on random bits), but aren't willing to share any proof besides "believe me, it's true", it's hard to take it serious. Maybe you don't understand how outrageous the claim actually is but that doesn't make it any more believable.
2025-11-06 05:42:03
The only possible situation is: He confuse - ASCII text annotation of hexadecimal digit (nibble in byte) - hexadecimal digit (nibble) - binary file (byte)
monad
monad Meanwhile, real compressors.
2025-11-06 05:45:12
An amazing result as even sophisticated methods can spectacularly fail given antagonistic data. ```22406 sharnd.0.bin 22614 sharnd.0.bin.rz 22406 per.6 74368 per.6.rz```
_wb_
2025-11-06 05:46:12
Most general data compression schemes have a fallback to just encode raw bytes with some minimal header overhead
2025-11-06 05:46:49
if you don't have that, then yes, random bits can blow up
The Thunk I ran it for intellectual curiosity. It compressed. I don't want to have an issue with reverse engineering so I am keeping the compressed version to myself. I have someone I somewhat trust to evaluate my code. Hopefully I find out within the month. Thank you for taking the time to respond to me. I am not seeking validation from anyone on this discord. Thank you for your constructive feedback.
2025-11-06 05:48:44
OK, keep the compressed version to yourself. Now pass it to your decompressor and check what output you get from it.
2025-11-06 05:52:50
It wouldn't be the first time someone thinks they have found something amazing, only to then understand they missed something big. I remember someone once claimed super lossy image compression performance, outperforming anything else by a factor of 3 or more. Turned out he was measuring compression rate in bytes per pixel while everyone else was using bits per pixel. Oopsie!
2025-11-06 05:53:43
(actually I don't remember this, it's a story I heard from Touradj of something that happened during JPEG 2000 development)
jonnyawsom3
AccessViolation_ the only feedback you've gotten is that what you've claimed is impossible
2025-11-06 06:19:38
We've been chatting in the voice channel occasionally, last night I explained the concept of VarDCT
lonjil
2025-11-06 06:22:34
Who wants to bet the compression he gets is due to counting the hex input as 1 char = 1 byte of data but then checking the binary sized of the "compressed" data buffer?
The Thunk
lonjil Who wants to bet the compression he gets is due to counting the hex input as 1 char = 1 byte of data but then checking the binary sized of the "compressed" data buffer?
2025-11-06 06:57:21
No, its all bits each hex is just 4 bits. Hex is human readable whereas binary is not. The completed code will work on bits only when done and not have the overhead of converting hexadecimal to binary.
Exorcist
2025-11-06 07:12:52
"Trust me bro, I don't know ASM or C or C++, I also don't use hex viewer, but I can transform bits correctly"
monad
2025-11-06 07:51:54
https://www.youtube.com/watch?v=2sRS1dwCotw
AccessViolation_
The Thunk No, I was told not to use that forum. So, now I am in this forum. There is random block generation and it doesn't need to be truly random just random enough. A million blocks is a large enough sample size.
2025-11-06 09:50:42
> There is random block generation and it doesn't need to be truly random just random enough is your compressor tuned to the way your "random enough" random generator works?
The Thunk I ran it for intellectual curiosity. It compressed. I don't want to have an issue with reverse engineering so I am keeping the compressed version to myself. I have someone I somewhat trust to evaluate my code. Hopefully I find out within the month. Thank you for taking the time to respond to me. I am not seeking validation from anyone on this discord. Thank you for your constructive feedback.
2025-11-06 09:53:59
it compressed how well?
2025-11-06 09:54:15
do you see this 40% with your own random data or with any random data from any source?
2025-11-06 09:55:27
if by "it compressed" you just meant "it produced an output" then, yeah
2025-11-06 10:04:57
actually nvm, don't worry about it
lonjil
2025-11-07 08:23:59
Day 1 of working on my super good FPGA video codec: I said that I will be using 18-bit math, since FPGAs tend to have 18-bit multipliers. I'm realizing now that the most annoying part of implementing dct1d will be producing sqrt and cosine values of adequete precision without too big a LUT, without too many LEs, and without spending too many cycles.
veluca
2025-11-07 08:39:37
not planning to unroll the multiplications then, I take it :p
lonjil
2025-11-07 08:47:35
we'll see :p
2025-11-07 08:49:37
the chip I'm using has 144 18-bit multipliers, and there probably aren't *that* many other things I might want to use them for on the same SoC, so I'd feel comfortable using a large chunk of them.
2025-11-07 08:51:44
To start with, I'll use a very advanced tool (Desmos :v) to figure out how many LUT values I actually need.
veluca
2025-11-07 09:06:42
IIRC you can get away with basically N for a N-DCT
2025-11-07 09:07:18
i.e. a N-DCT needs (N/2) constants + those for a (N/2)-DCT
2025-11-07 09:07:30
(exception being the 2-DCT which needs 0)
2025-11-07 09:07:45
at least, that's with the jxl-rs and libjxl impl
2025-11-07 09:08:02
(and something needs a sqrt2)
lonjil
2025-11-07 09:16:59
mm I'll be referencing jxl-rs for this, I think. And jxl-tiny, considering what it's for.
veluca
2025-11-07 09:32:45
pretty sure it uses the same DCT impl
AccessViolation_
2025-11-08 11:24:55
this is such weird statement to me
2025-11-08 11:25:11
<https://www.sony.co.jp/en/Products/LDAC/info/>
RaveSteel
2025-11-08 11:32:58
It is a weird statement because it is not based on reality
2025-11-08 11:34:29
This is the old Debatte of analog vs digital, but extended into lossless vs lossy
AccessViolation_
2025-11-08 11:50:14
what they're saying boils down to "lossy compression of a high-resolution signal is better than lossless compression of a low-resolution signal" which is not a fair comparison to make
2025-11-08 12:00:45
it seems sony never confirmed what LDAC stands for
2025-11-08 12:01:28
it's definitely a lossy codec, though Wikipedia says it's an acronym for "Lossless Digital Audio Codec"
lonjil
AccessViolation_ what they're saying boils down to "lossy compression of a high-resolution signal is better than lossless compression of a low-resolution signal" which is not a fair comparison to make
2025-11-08 12:03:57
Tbf, if the lossy high res has the same bit rate as the lossless low res signal, it's a good comparison if you're goal is to show to shower that higher res is a good idea.
AccessViolation_
2025-11-08 12:06:09
I meant bit rate with resolution
2025-11-08 12:06:12
or bit depth
2025-11-08 12:06:33
in the graphic, they're claiming the top right signal is better than the bottom left signal, essentially
2025-11-08 12:24:37
sony's marketing claims are dubious but the previous editor's statement about them was also false
2025-11-08 12:26:12
also it seems we don't really know what LDAC stands for, apparently some people assume it stands for 'Lossless Digital Audio Codec' which would be categorically wrong
2025-11-08 12:29:11
I could elaborate about the dubious marketing and acronym that suspiciously implies lossless encoding but then I'd have to dig up a bunch of reliable secondary sources that talk about exactly this and I'm too low energy for that right now <:SadCheems:890866831047417898>
2025-11-08 12:35:46
also, huffman coding <:BanHammer:805396864639565834>
jonnyawsom3
AccessViolation_ this is such weird statement to me
2025-11-08 12:49:45
The part at the bottom suggests a bandwidth limit to me. FLAC may be lossless but detail is lost in transmission due to the network/decoder not keeping up. Lossy allows greater range in the same bandwidth Maybe...
AccessViolation_
2025-11-08 12:56:29
there is a bandwidth limit since it's designed for bluetooth yeah, and somewhere else it says lossless encoding is not feasible for bluetooth because of that limit. but as for the claim it's making, it's saying lossy encoding of *high-res audio* is better than lossless encoding of *high-quality* content, and it considers *high-quality audio* to be lower resolution/bit depth than *high-res audio* you can see in the named graph, that the highly quantized ones at the bottom are called "high-quality" and the lesser quantized ones are called "high-res"
jonnyawsom3
2025-11-08 12:57:33
I... Think I understand? High res has larger range, but high quality is quantized less
AccessViolation_
2025-11-08 12:59:22
I think what they're saying is akin to saying a 2000 x 2000 JPEG ("lossy High-Res Audio content") is better than a 1000 x 1000 PNG ("lossless High quality content") that's nearest-neighbor upsampled to 2000 x 2000 again
2025-11-08 01:01:24
which is true, but a lossless representation of a downsampled signal is not to be considered lossless relative to the source
2025-11-08 01:02:57
and unless you're sure what they mean with high-quality and high-res it's really confusing
2025-11-08 01:15:29
also what happened to that ultra hdr article? was it so bad it was decided to just delete it? <:KekDog:805390049033191445>
2025-11-08 01:16:01
oh it's back? I could've sworn I couldn't find it just a few days ago
2025-11-08 01:17:15
oh no right, it was this. so effectively, "yes"
Exorcist
AccessViolation_ this is such weird statement to me
2025-11-08 01:54:03
Key point: They think lossy 192k Hz > lossless 48k Hz
dogelition
AccessViolation_ this is such weird statement to me
2025-11-08 01:54:21
lmao what
2025-11-08 01:55:18
(1) isn't even true either
AccessViolation_
2025-11-08 01:56:02
it isn't?
dogelition
2025-11-08 01:56:26
https://people.xiph.org/~xiphmont/demo/neil-young.html
Exorcist
2025-11-08 01:56:27
Totally bullshit
RaveSteel
2025-11-08 01:58:47
It's marketing for "audiophiles"
2025-11-08 02:01:33
The people at xiph also published a 30 minute explainer some years ago regarding this
2025-11-08 02:02:23
https://wiki.xiph.org/Videos/A_Digital_Media_Primer_For_Geeks
2025-11-08 02:02:25
https://wiki.xiph.org/Videos/Digital_Show_and_Tell
Exorcist
2025-11-08 02:04:01
Most audiophiles are uneducated, can't understand Nyquist-Shannon sampling theorem (why 44k Hz sample point can represent 20k Hz sine wave, won't become triangular wave or square wave)
dogelition
2025-11-08 02:04:39
also, Bluetooth LE Audio is genuinely a great technology lc3 (the mandatory codec) has good quality at low complexity and low latency and auracast is great for sharing audio, accessibility at venues and (soon™) announcements at airports and stuff
2025-11-08 02:04:56
think it obsoletes most if not all the proprietary codecs
RaveSteel
2025-11-08 02:05:26
The only real problem with bluetooth is with its massive quality limiation for bluetooth headsets
2025-11-08 02:05:34
everything else is pretty great
dogelition
2025-11-08 02:05:49
LE Audio fixes this (to some extent)
RaveSteel
2025-11-08 02:06:22
oh, and that one piece of the headset has double the energy usage due to it transmitting audio to the other piece
dogelition
2025-11-08 02:06:44
this isn't actually necessarily true in practice
RaveSteel
2025-11-08 02:07:00
But for the most part is how it is integrated
dogelition
2025-11-08 02:07:11
https://assets.qualcomm.com/rs/385-TWS-803/images/whitepaper-the-evolution-of-true-wireless-technology-2020.pdf
2025-11-08 02:07:25
Quackdoc
AccessViolation_ sony's marketing claims are dubious but the previous editor's statement about them was also false
2025-11-08 02:07:43
not only dubious, it's an outright lie
dogelition
2025-11-08 02:07:49
and there are LE Audio tws that still operate like that instead of acting as 2 devices
RaveSteel
dogelition
2025-11-08 02:07:50
Is there any headset that implements this?
dogelition
2025-11-08 02:08:02
anything that uses a qualcomm soc, presumably?
Quackdoc
Quackdoc not only dubious, it's an outright lie
2025-11-08 02:08:16
LDAC marketing is contingent on the fact that 990 BT audio exists, but not it's feasibility
dogelition also, Bluetooth LE Audio is genuinely a great technology lc3 (the mandatory codec) has good quality at low complexity and low latency and auracast is great for sharing audio, accessibility at venues and (soon™) announcements at airports and stuff
2025-11-08 02:09:02
LC3 chad
2025-11-08 02:09:27
I like how LC3Plus is mostly useless now since they punted all the goodies to LC3
2025-11-08 02:10:03
LC3Plus literally just offers a lower latency and 96khz audio pretty much
dogelition
Quackdoc LC3 chad
2025-11-08 02:12:21
got these 2 days ago, zero issues with le audio so far
2025-11-08 02:12:36
and they support fully parametric 10 band eq (some assembly required)
Quackdoc
2025-11-08 02:13:27
ill have to try them some time, but I dont have anything currently that supports LC3 properly, I just use it for my local speaker setup.
RaveSteel
dogelition anything that uses a qualcomm soc, presumably?
2025-11-08 02:16:37
hm, will have to have a look then for a new pair then
2025-11-08 02:16:59
my current headset, which is 5 years old, has 5x energy usage on the right piece due to aged battery compared to the left piece
2025-11-08 02:17:13
which boils down to an hour max of listening
AccessViolation_
2025-11-08 08:04:51
why do youtube's encoders incorrectly assume they can disproportionally reduce quality in dark areas?
2025-11-08 08:05:31
or does it drop quality equally everywhere regardless of brightness, and we're just more sensitive to those lower brightness differences? I know the latter is true, but I assume encoders usually account for that?
2025-11-08 08:09:02
do they assume dark things are less *important* maybe?
_wb_
2025-11-08 08:17:21
The whole point of the transfer curve in a colorspace is to take the very nonlinear human perception of brightness into account...
2025-11-08 08:19:18
but it's kind of hard to know the actual viewing conditions. If the entire image is dark (not just a dark region in an otherwise bright image), and the room is also dark, then your eyes will adapt and you are much more sensitive than in a condition where bright stuff is also in view
2025-11-08 08:21:24
so if you zoom in on a dark region until your entire screen is only dark stuff, you will not only see more artifacts because of the zooming, but also because of adaptation
2025-11-08 08:25:48
if encoders have to take into account the full dynamic range of humans including adaptation, an insane precision is required in the darks since at some point it's not just cones but also rods and we can almost detect individual photons with those when it's sufficiently dark
AccessViolation_
2025-11-08 08:31:49
hm that makes sense
2025-11-08 08:33:53
still, dark segments in youtube videos are so bad that creators sometimes have to artificially boost the brightness so half the frame's content doesn't get quantized away
2025-11-08 08:35:02
it sort of reminds me of using a low intensity target in jxl
2025-11-08 08:38:23
what you said should apply to encoders in general, but I haven't noticed images with these issues, nor videos of dark areas I've taken myself, so it doesn't really explain why youtube specifically does really bad in dark scenes and more or less fine in well lit scenes
2025-11-08 08:43:10
> we can almost detect individual photons with those when it's sufficiently dark also, that's incredible, I didn't know our eyes were anything close to this sensitive
jonnyawsom3
2025-11-08 10:17:28
Once or twice I've ended up in countryside without a light, it gets to a point you can practically see noise like a camera. Blotchy areas of grey in otherwise pure black
AccessViolation_ or does it drop quality equally everywhere regardless of brightness, and we're just more sensitive to those lower brightness differences? I know the latter is true, but I assume encoders usually account for that?
2025-11-08 10:22:08
The quantizer sees a difference of 1 regardless if it's bright or dark, even though visually the range is weighted 80% towards bright colors There's good demos by the AV1 guys https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Appendix-Variance-Boost.md
Exorcist
AccessViolation_ why do youtube's encoders incorrectly assume they can disproportionally reduce quality in dark areas?
2025-11-09 04:26:56
overfit PSNR
_wb_
2025-11-09 09:15:55
I think there are a few things working together to make video codecs often very bad at dark scenes/regions, turning them into a blocky mess: - the transfer curves typically used (Rec709 etc) don't really have a lot of precision in the darks to begin with - using tv-range instead of full range further reduces the precision - YCbCr is perceptually not a very good colorspace, especially in the darks you actually need the contribution from the chroma components to make gradients etc look good - doing 4:2:0 and using aggressive chroma quantization (both are typical for video codecs) makes this even worse - still too much PSNR optimization in video codecs, and PSNR is basically not sensitive to banding/blocking issues — no per-pixel error metric that doesn't consider the spatial aspect can detect that since these artifacts are creating low per-pixel error yet they are very obvious due to the spatial structure
Hefresh Lashlan
dogelition got these 2 days ago, zero issues with le audio so far
2025-11-09 12:53:43
its cenrosed
dogelition
2025-11-09 12:54:01
that's my name (idk why that shows there)
Hefresh Lashlan
dogelition that's my name (idk why that shows there)
2025-11-09 12:55:41
is there an algorithim that uncencors it?
2025-11-09 12:56:11
pretty sure ai can fill the gaps
AccessViolation_
2025-11-09 01:12:19
AI is not magic, the best it could do in this case is guess
jonnyawsom3
Hefresh Lashlan is there an algorithim that uncencors it?
2025-11-09 02:06:49
... Why would they help you uncensor their own image?
Hefresh Lashlan
... Why would they help you uncensor their own image?
2025-11-09 02:10:39
I thought that maybe they were interested in that
AccessViolation_
2025-11-09 05:28:47
two chatbots (Phind 70B and GPT-4o-mini) claiming JPEG XL supports up to 16-bit per channel 😵‍💫
2025-11-09 05:35:13
oh good
2025-11-09 05:36:33
crazy how JPEG was already so well adopted before it was invented
2025-11-09 05:42:19
both also claim webp supports a bit depth higher of 8 bpc in those tables btw...
jonnyawsom3
AccessViolation_ two chatbots (Phind 70B and GPT-4o-mini) claiming JPEG XL supports up to 16-bit per channel 😵‍💫
2025-11-09 06:12:50
Not *technically* wrong if it meant integers
AccessViolation_
2025-11-09 06:14:17
if it's integers, wouldn't that make it 24-bit for VarDCT and 32-bit (unsigned) for modular?
lonjil
2025-11-09 06:30:22
Just 24-bit
2025-11-09 06:30:49
modular is implemented with fp32 so it only works if the integers aren't too big
jonnyawsom3
2025-11-09 06:31:28
Theoretically there's nothing stopping f64 in Modular, just spec and implementation limits
AccessViolation_
2025-11-09 06:45:14
interesting, I thought Modular supported using i32/u32 internally as it stands
veluca
2025-11-09 06:54:11
it does
2025-11-09 06:54:29
there's some postprocessing in fp32 in libjxl but it doesn't *need* to be done that way
jonnyawsom3
2025-11-09 06:56:30
https://discord.com/channels/794206087879852103/805176455658733570/812257462379872287
AccessViolation_
2025-11-09 07:00:20
> JPEG XL can losslessly represent 32-bit floating point > data. For integer data, in principle up to 31-bit unsigned > integer or 32-bit signed integer data can be stored losslessly, > but the reference implementation libjxl is limited to an > integer precision of 24-bit since it internally uses a 32-bit > float representation in most of the encoding and decoding > implementation.
veluca there's some postprocessing in fp32 in libjxl but it doesn't *need* to be done that way
2025-11-09 07:03:32
is jxl-rs limited to f32 for everything as well, or does it already support integer channels that an encoder could produce in the future?
veluca
2025-11-09 07:04:14
I am not sure I see much of a point of having more than 24 bits, tbh
AccessViolation_
2025-11-09 07:18:17
the only use case I can think of is losslessly recompressing other formats that support larger bit depths. not that I know whether there are any
2025-11-09 07:18:36
like for archival
lonjil
2025-11-09 07:19:01
JPEG 2000 supports lossless up to 38-bit integers 😄
AccessViolation_
2025-11-09 07:21:38
oh damn
veluca I am not sure I see much of a point of having more than 24 bits, tbh
2025-11-09 07:23:21
I can respect this, also knowing you might be the one that would have to write new SIMD code for those bit depths 😅
jonnyawsom3
AccessViolation_ is jxl-rs limited to f32 for everything as well, or does it already support integer channels that an encoder could produce in the future?
2025-11-09 07:23:30
As far as I understood, jxl-rs was targeting Level 5 of the spec for faster decoding in browsers (Using float16 instead of float32). Any extra support is just bonus, but I could be wrong
veluca
As far as I understood, jxl-rs was targeting Level 5 of the spec for faster decoding in browsers (Using float16 instead of float32). Any extra support is just bonus, but I could be wrong
2025-11-09 07:24:22
I don't think we ever *explicitly* decided that, but I will say that if we want to try non-fp32 things out they will be fp16 before fp64 or int32 😛
jonnyawsom3
2025-11-09 07:25:06
Yeah, maybe I was getting mixed up with the simple render pipeline or something
AccessViolation_
2025-11-09 07:25:25
*I have a suggestion* https://doc.rust-lang.org/std/primitive.f128.html
2025-11-09 07:25:27
/j
veluca
2025-11-09 07:25:28
fp16 should be especially good on aarch64, and on x86 we can be fast enough with fp32 on sufficiently modern machines, I believe
AccessViolation_
2025-11-09 07:25:59
f16 would be neat for sure
veluca
2025-11-09 07:26:01
(my laptop does ~75MP/s on a single thread, that's fast enough :P)
2025-11-09 07:26:11
(with libjxl, I mean)
jonnyawsom3
2025-11-09 07:26:54
Clang or MSVC?
veluca
2025-11-09 07:27:09
clang
jonnyawsom3
2025-11-09 07:27:45
Ah good, because Clang is still between 20-30% faster (Or 200-300% for fast lossless)... One day we'll get the github actions using it instead
veluca (my laptop does ~75MP/s on a single thread, that's fast enough :P)
2025-11-09 07:29:02
Meanwhile, my poor poor CPU xD ```JPEG XL decoder v0.12.0 6efa0f5a [_AVX2_] {Clang 20.1.8} Decoded to pixels. 3840 x 2160, geomean: 29.503 MP/s [27.203, 30.894], 20 reps, 0 threads.```
2025-11-09 07:29:18
That's desktop by the way, time has not treated first gen Ryzen well
veluca
2025-11-09 07:29:22
is that vardct?
jonnyawsom3
2025-11-09 07:29:49
Yeah
veluca
2025-11-09 07:29:50
the difference between my desktop and my laptop is not too big (on one thread)
2025-11-09 07:29:54
wow, ok xD
2025-11-09 07:30:25
I guess it is an 8 year old cpu
jonnyawsom3
2025-11-09 07:30:26
I know first gen Ryzen takes 2 clock cycles for AVX2, so that's probably a good chunk of it
veluca
2025-11-09 07:30:50
yeah I believe they only have 128 bit SIMD execution units
jonnyawsom3
2025-11-09 07:31:24
One day I'll do a comparison of my 8 year old phone vs my 8 year old desktop haha
veluca
2025-11-09 07:31:48
will want to try the 9xxx series eventually, those have full 512-bit SIMD execution units IIRC
jonnyawsom3
2025-11-09 07:33:04
Oooh, I know I wanted to see fast-lossless on AVX512 since AVX2 was a 5x speedup, also a threadripper/EPYC since we discovered the libjxl 'port' has worse thread utilization compared to standalone
veluca
2025-11-09 07:33:37
maybe once we're done with the decoder side of jxl-rs we'll start adding some encoders 🙂
jonnyawsom3
2025-11-09 07:35:16
Right now I'm unravelling Jyrki's VarDCT code. I think I just got it performing better than 0.8 (finally), better quality and less density but needs more tuning
AccessViolation_
veluca maybe once we're done with the decoder side of jxl-rs we'll start adding some encoders 🙂
2025-11-09 07:36:44
I hope I might be able to contribute somehow. I probably would have already, I don't really like working in C and I don't know it that well
veluca
2025-11-09 07:37:14
there's plenty to do! 🙂
lonjil
veluca maybe once we're done with the decoder side of jxl-rs we'll start adding some encoders 🙂
2025-11-09 07:37:57
that reminds me, if I have any time between school and the hobby video codec, I want to try to make a slow but flexible encoder that makes decisions using a user provided script (probably Scheme or Lua or something) would make quality vs size tradeoff experiments easier, though you wouldn't get any data on the perf impact it'd have in practice
jonnyawsom3
2025-11-09 07:38:45
Similar to MA trees or something else?
lonjil
2025-11-09 07:39:40
the idea would be that all decisions made by the encoder would be done by a script, so more like the code in libjxl that decides which MA tree to use, decides how much to quantize stuff, etc.
AccessViolation_
2025-11-09 07:40:55
I've been thinking about making specialized encoders for screenshot tools in apps, like for games, where game content is encoded in VarDCT but the UI layer is encoded losslessly and alpha blended on top currently I'd be more interesting in making an analyzer though, something that lets you view block selection and MA tree decisions over the image
2025-11-09 07:42:18
the analyzer also seems easier since it would not necessarily require decoding anything to pixel data, I can use a complete decoder library for that part
veluca
2025-11-09 07:42:42
some things I really want to try out encoder side: - find optimal k-way splits along each MA tree property, maybe for a combination of 2 properties (would make for a very fast modular decoder, and I think it should be quite powerful) - figure out how to train some small neural network to replace the current encoder decisions (biggest issue is figuring out what training data to use...) - try to see if we can use some gradient descent based method to optimize a bitstream more or less from scratch, like https://arxiv.org/abs/2412.00505
jonnyawsom3
I know first gen Ryzen takes 2 clock cycles for AVX2, so that's probably a good chunk of it
2025-11-09 07:45:34
I forgot, I got Sapien to make me the slowest build possible. Emulated AVX (I think) ```JPEG XL decoder v0.12.0 e5943b1a [_EMU128_] {Clang 21.1.4} Decoded to pixels. 3840 x 2160, geomean: 19.515 MP/s [18.772, 20.104], 20 reps, 0 threads.``` ```JPEG XL decoder v0.12.0 6efa0f5a [_AVX2_] {Clang 20.1.8} Decoded to pixels. 3840 x 2160, geomean: 29.503 MP/s [27.203, 30.894], 20 reps, 0 threads.``` Honestly surprised it's not more of a difference, guess that 128bit unit really struggles
veluca some things I really want to try out encoder side: - find optimal k-way splits along each MA tree property, maybe for a combination of 2 properties (would make for a very fast modular decoder, and I think it should be quite powerful) - figure out how to train some small neural network to replace the current encoder decisions (biggest issue is figuring out what training data to use...) - try to see if we can use some gradient descent based method to optimize a bitstream more or less from scratch, like https://arxiv.org/abs/2412.00505
2025-11-09 07:46:45
I know Jon has talked about a JIT MA tree decoder, but it'd cause security scrutiny
veluca
2025-11-09 07:47:17
I also mentioned that a few times
2025-11-09 07:47:31
as one of the things that would be very cool but we'll probably never do 😛
jonnyawsom3
2025-11-09 07:48:15
Also, I found out recently that libjxl does background and screen content detection in the encoder, but screen content doesn't seem to do much and background detection adds dots(?) but then encodes over them anyway (I think)
AccessViolation_
2025-11-09 07:48:54
oh another thing I wanted to explore was recursive patches. for example, for a large text screenshot, you get one layer of patches that has all the letters, and then you patch-copy those onto a new 'free' frame to create patches for common words, and then in the final image you can in some cases replace entire words with a single larger patch instead of with individual letters, which should be cheaper to signal
jonnyawsom3
2025-11-09 07:49:23
Still lots of mysteries to unravel in libjxl, yet alone the new techniques jxl-rs could allow haha
AccessViolation_ oh another thing I wanted to explore was recursive patches. for example, for a large text screenshot, you get one layer of patches that has all the letters, and then you patch-copy those onto a new 'free' frame to create patches for common words, and then in the final image you can in some cases replace entire words with a single larger patch instead of with individual letters, which should be cheaper to signal
2025-11-09 07:50:07
The patch locations are compressed, so I think it'd only be saving bytes compared to compressing the patch frame itself more efficiently (Right now it's an effort 2 encode IIRC)
username
veluca maybe once we're done with the decoder side of jxl-rs we'll start adding some encoders 🙂
2025-11-09 07:50:54
speaking of the decoder side, once it's in a really good or "finished" state it would maybe be cool to look into having [Knusperli](https://github.com/google/knusperli/) like/style decoding for transcoded JPEGs?
jonnyawsom3
2025-11-09 07:52:02
Didn't Jyrki say it was in the original design, but was just too slow?
username
2025-11-09 07:52:10
no/yes
2025-11-09 07:52:26
that was for the VarDCT spec
2025-11-09 07:52:42
I'm just talking about transcoded JPEGs
2025-11-09 07:53:25
the way to decode VarDCT is way more tightly defined then regular JPEGs
AccessViolation_
The patch locations are compressed, so I think it'd only be saving bytes compared to compressing the patch frame itself more efficiently (Right now it's an effort 2 encode IIRC)
2025-11-09 07:53:43
hmm, you might be right. I'm not sure how patch locations for individual letters would be signaled, if they are signaled as the relative distance from the previous patch then the letters from identical words in different places could be LZ77 deduplicated, but if it stores absolute coordinates then LZ77 won't deduplicate those I don't think
jonnyawsom3
username that was for the VarDCT spec
2025-11-09 07:55:17
Ah right, I found the old discussion https://discord.com/channels/794206087879852103/805176455658733570/1345882517005275308
AccessViolation_
2025-11-09 07:56:15
another semi related thing: inter-frame compression of animations where only a thiny bit moves by patch-copying over large chunks that don't move from the previous frame
2025-11-09 07:56:38
would be cool for recompressing some GIFs
jonnyawsom3
AccessViolation_ hmm, you might be right. I'm not sure how patch locations for individual letters would be signaled, if they are signaled as the relative distance from the previous patch then the letters from identical words in different places could be LZ77 deduplicated, but if it stores absolute coordinates then LZ77 won't deduplicate those I don't think
2025-11-09 07:57:09
Right now lossless struggles with low color content, which is what patches usually are due to text. The time doing recursive patches could be spent improving overall compression instead, either making the patch frame a few percent smaller, or the entire image a few percent smaller, instead of saving 1KB~ of compressed coordinate info
2025-11-09 07:57:53
Of course that depends how much text and how many patches, but then that makes the few percent increase in savings too
AccessViolation_ another semi related thing: inter-frame compression of animations where only a thiny bit moves by patch-copying over large chunks that don't move from the previous frame
2025-11-09 07:59:17
We kinda already have that with differential transparency, though libjxl doesn't do it automatically, only by copying existing GIFs/APNGs
AccessViolation_
2025-11-09 08:00:09
maybe, but it wouldn't hurt for me to experiment with this separately (I wasn't suggesting for others to work on this, it was something I would like to explore eventually)
jonnyawsom3
2025-11-09 08:00:19
Also this https://github.com/libjxl/libjxl/issues/3134
AccessViolation_
We kinda already have that with differential transparency, though libjxl doesn't do it automatically, only by copying existing GIFs/APNGs
2025-11-09 08:03:42
nice, I didn't know it did anything like this already
2025-11-09 08:04:00
how's the compression compared to APNGs/GIFs generally? is it competitive? 👀
jonnyawsom3
Right now lossless struggles with low color content, which is what patches usually are due to text. The time doing recursive patches could be spent improving overall compression instead, either making the patch frame a few percent smaller, or the entire image a few percent smaller, instead of saving 1KB~ of compressed coordinate info
2025-11-09 08:04:46
Due to that, only at effort 9 or 10 get gains over GIF. Pallete sorting is a big problem, but for APNG it does pretty well
AccessViolation_
2025-11-09 08:22:51
oh that's not bad
Exorcist
AccessViolation_ another semi related thing: inter-frame compression of animations where only a thiny bit moves by patch-copying over large chunks that don't move from the previous frame
2025-11-09 08:35:22
reinvent motion compensation <:galaxybrain:821831336372338729>
AccessViolation_
2025-11-09 08:35:55
we'll have to, jxl can't natively do that 😔
Exorcist
2025-11-09 08:50:09
> The Patches coding tool exploits such redundancies. It works as follows. Up to four previously coded frames can be ‘saved’, i.e. the frame header indicates to a decoder that the contents of a decoded frame must be buffered for future reference. There are four ‘slots’ available for this. The Patches tool allows referencing these frames, selecting a rectangular region in them, and then adding that ‘patch’ to the current frame in one or more arbitrary positions. Different blend modes are supported, and when there are... <:tfw:843857104439607327>
AccessViolation_
2025-11-09 08:52:21
this is why we need MPEG XL <:Stonks:806137886726553651>
jonnyawsom3
AccessViolation_ this is why we need MPEG XL <:Stonks:806137886726553651>
2025-11-09 08:56:47
https://discord.com/channels/794206087879852103/794206170445119489/1178541355639783424
monad
username speaking of the decoder side, once it's in a really good or "finished" state it would maybe be cool to look into having [Knusperli](https://github.com/google/knusperli/) like/style decoding for transcoded JPEGs?
2025-11-10 02:28:39
knusperli's smoothing behavior looks unnatural. seems an appeal thing over fidelity
Zamarusdz
2025-11-11 04:49:32
Hi, i was wondering if there are options to recompress with a higher effort later down the lane for already processed .jxl? (libjxl) Ho and if there will/could be breaking changes that could make current .jxl decompress differently later?
monad
2025-11-11 05:31:50
no encoders currently optimize existing lossy encodes. different decoders can make different rendering decisions, whether related to bugs or exercising the flexibility of the spec.
Zamarusdz
2025-11-11 05:55:37
Sorry i forgot to precise that it's for lossless compressing.
2025-11-11 05:57:54
And if we don't take into account metadatas as i've backed up those before converting and can set them back. (not sure if this is an option directly using libjxl or if it's out of scope, it's only 1-2kb per metadatas file after all)
_wb_
2025-11-11 07:56:57
For lossless you can already do this, cjxl takes jxl input so you can do things like `cjxl input.ppm -e 1 -d 0 fast.jxl` and then later `cjxl fast.jxl -e 7 -d 0 slow.jxl`
Zamarusdz
2025-11-11 08:16:10
Alright good to know thanks. I'm consistently getting 30% space savings with effort 5 for now!
TheBigBadBoy - 𝙸𝚛
username speaking of the decoder side, once it's in a really good or "finished" state it would maybe be cool to look into having [Knusperli](https://github.com/google/knusperli/) like/style decoding for transcoded JPEGs?
2025-11-11 09:18:54
how does it compare to jpeg2png ?
username
TheBigBadBoy - 𝙸𝚛 how does it compare to jpeg2png ?
2025-11-11 09:47:30
it's wayy more subtle but doesn't have the downside of causing a lot of images to look worse/oversmoothed. only problem is the core JPEG decoder in that project seems to be problematic in some way because it's decodes don't seem to have the right colors for some reason. also it doesn't decode in a high precision like jpegli/libjxl does.
TheBigBadBoy - 𝙸𝚛
2025-11-11 09:55:35
thanks
Meow
2025-11-11 01:29:51
Fake news
2025-11-11 02:00:34
I meant the spammer who faked Trump
Magnap
2025-11-12 07:08:39
is there still a thread going for "lossless examples where other codecs perform better"? I found one but it says only for screenshots
monad
2025-11-12 07:10:22
There is one for high effort. https://discord.com/channels/794206087879852103/1187313089612369991
TheBigBadBoy - 𝙸𝚛
2025-11-12 10:08:56
the difference between avif and jpeg from nintendo.com
2025-11-12 10:09:41
ohhhh I'm stupid
2025-11-12 10:10:06
there's only a difference on my end because I keep forgetting that my viewer has no color management 😭
username
2025-11-12 10:17:30
doesn't their website also serve JXL?
lonjil
2025-11-12 10:18:00
no
username
2025-11-12 10:18:25
huh I remember some random domain of theirs serving JXLs
2025-11-12 10:18:30
guess it's not the main website
lonjil
username guess it's not the main website
2025-11-12 10:28:58
It was cloudinary and someone changed the url from auto to JXL
_wb_
2025-11-12 10:29:15
Nintendo of Europe is a Cloudinary customer so they might serve jxl, not sure if they have it enabled though
AccessViolation_
2025-11-12 10:31:52
will there be a point where existing customers have support implicitly enabled if they have it on auto? instead of having to explicitly enable it? that's how it is now right
2025-11-12 10:32:43
I can't think of any reason not to
_wb_
2025-11-13 08:15:32
I'll give you a reason: we still have lots of contracts where our revenue directly depends on bandwidth consumption. Enabling more efficient formats is shooting ourselves in the foot, our revenue will just go down. So we do that only by default when customers are switching to the new pricing model, which is based on impressions, not just on bandwidth.
AccessViolation_
2025-11-13 09:45:48
ohhh yeah I remember reading about that, I'd forgotten since
2025-11-13 09:45:52
that's completely fair
Quackdoc
_wb_ Nintendo of Europe is a Cloudinary customer so they might serve jxl, not sure if they have it enabled though
2025-11-13 11:32:00
forcing it with a redirector works, but I think some things are under normal scenarios
AccessViolation_
2025-11-15 05:04:51
for all this time I was under the impression that "chroma from luma" was just a different term for chroma subsampling... it's something different
_wb_
2025-11-16 11:04:12
it's predicting chroma from luma, which in jxl we actually only do when there's no chroma subsampling because that just complicates such a prediction.
AccessViolation_
2025-11-16 09:29:13
look what I found, must've fallen off the back of a truck. for legal reasons, I really appreciate the choice of wording and layout, and the positioning of the logos could not have been better if I were to review it critically in a matter that constitutes fair use as recognized by the united states copyright law which is enforced on this social medium
2025-11-16 09:30:34
no one tell them this is on the internet archive <:KekDog:805390049033191445>
2025-11-16 09:31:54
I was actually hoping it was on there "officially" with digital controlled lending so I could reserve it for a while, but no, someone just put it on there as a pdf
RaveSteel
2025-11-16 09:35:24
lol nice
lonjil
2025-11-16 09:49:24
ok no snitching
AccessViolation_
2025-11-16 09:54:19
of course I deeply condemn this
2025-11-16 09:55:14
you wouldn't download an open standard
_wb_ it's predicting chroma from luma, which in jxl we actually only do when there's no chroma subsampling because that just complicates such a prediction.
2025-11-16 10:14:46
presumably this retains a lot more color than chroma subsampling, how competitive is it in terms of compression?
2025-11-16 10:21:22
it doesn't look like I can control these with cjxl
jonnyawsom3
2025-11-16 10:21:41
Control what?
AccessViolation_
2025-11-16 10:21:50
chroma subsampling and chroma from luma
jonnyawsom3
2025-11-16 10:22:02
Subsampling is JPEG transcode only
AccessViolation_
2025-11-16 10:22:23
oh!
2025-11-16 10:23:27
does the format not support it or is it just not in the encoder?
2025-11-16 10:23:56
I really dislike chroma subsampling so you don't hear me complaining either way
jonnyawsom3
2025-11-16 10:29:17
*Technically* you could make a bastardized encoder that does, but you're not meant to
AccessViolation_
2025-11-16 10:30:55
that's actually great
A homosapien
AccessViolation_ presumably this retains a lot more color than chroma subsampling, how competitive is it in terms of compression?
2025-11-16 10:36:28
There's a cool Xiph article explaining chroma from luma for AV1 https://people.xiph.org/~xiphmont/demo/av1/demo1.shtml
AccessViolation_
*Technically* you could make a bastardized encoder that does, but you're not meant to
2025-11-16 10:52:39
is this by using modular tools or can you actually use the coding tools from lossless JPEG transcoding on their own?
2025-11-16 10:53:14
I was under the impression that JPEG transcoding was all or nothing, and that you couldn't use its coding tools on their own
lonjil
2025-11-16 10:53:17
there is not separate lossless jpeg mode
2025-11-16 10:53:21
it's just vardct
2025-11-16 10:53:48
some coding tools won't be available if you use subsampling IIRC
AccessViolation_
2025-11-16 10:56:26
that's interesting
2025-11-16 10:58:04
does this mean we can create otherwise normal JXLs that use Huffman coding instead of ANS <:KekDog:805390049033191445>
2025-11-16 11:00:23
oh you explicitly can lmao > At a high level, JPEG XL’s entropy coding method > works as follows. Every entropy coded stream can use either > prefix coding (Huffman coding) or ANS coding
lonjil
2025-11-16 11:02:02
Huffman is much easier for hardware
lonjil some coding tools won't be available if you use subsampling IIRC
2025-11-16 11:02:43
Double checked the standard. chrome subsampling is only allowed for YCbCr frames 🙂
AccessViolation_
2025-11-16 11:03:33
ah, so they really don't want you to use this for anything other than JPEG compression ^^
jonnyawsom3
AccessViolation_ ah, so they really don't want you to use this for anything other than JPEG compression ^^
2025-11-16 11:07:43
https://discord.com/channels/794206087879852103/803645746661425173/1362825741728874597
AccessViolation_
2025-11-16 11:08:36
> Chroma Subsampling is a sledgehammer when you should be using a scalpel YES thank you
DZgas Ж
2025-11-17 09:04:50
CfL exists as shaders, I use it when the quality is not very good, it works well on AVC as a post-algorithm
2025-11-17 09:05:21
AccessViolation_
2025-11-18 05:51:12
2025-11-18 05:52:54
minesweeper anyone?
2025-11-18 05:59:59
it's interesting to use only one block type for the entire image. it gives you an idea of how the they work because you see the artifacts they produce in places where they usually wouldn't be picked
2025-11-18 06:03:47
you can see how the hornuss transform bases pixels in the 4x4 chunk on the average values in that chunk for example
2025-11-19 07:58:32
> Associated alpha (as in e.g. the OpenEXR image format) is more expressive than unassociated alpha (as in e.g. the PNG image format) since it allows modeling layers with light-emitting but transparent pixels, such as a candle flames or reflections in glass. Such pixels would correspond to an alpha value of zero and color components that are non-zero. what would an alpha of zero and non-zero color values look like?
2025-11-19 08:00:43
I also don't intuitively understand how associated alpha lets things appear emissive while unassociated alpha doesn't
2025-11-19 08:08:44
> what would an alpha of zero and non-zero color values look like? when you do this does the effective transparency become a function of the brightness/intensity of that pixel, and is that why it lets you create an effect of emissiveness maybe?
2025-11-19 08:11:21
basically acting like a different blend mode
Adrian The Frog
2025-11-19 08:16:45
Yes it only becomes useful when layered on something else For modelling light transport, it's very intuitive as well (make a plane in blender, set transparency to the alpha channel and color to the emission channel), and it's very easy to generalize to having three alpha channels (RGB) for filtering effects Once you start getting filtering effects in though the only way to actually be accurate is considering every wavelength individually, but it's close enough for most things
spider-mario
AccessViolation_ I also don't intuitively understand how associated alpha lets things appear emissive while unassociated alpha doesn't
2025-11-19 08:17:27
associated: out = (1−alpha)·bg + fg unassociated: out = (1−alpha)·bg + alpha·fg
2025-11-19 08:17:55
so with alpha=0, associated: out = bg + fg (emissive); unassociated: out = bg
Quackdoc
AccessViolation_ > Associated alpha (as in e.g. the OpenEXR image format) is more expressive than unassociated alpha (as in e.g. the PNG image format) since it allows modeling layers with light-emitting but transparent pixels, such as a candle flames or reflections in glass. Such pixels would correspond to an alpha value of zero and color components that are non-zero. what would an alpha of zero and non-zero color values look like?
2025-11-19 08:48:49
candle light
2025-11-19 08:49:37
another one is something like a gas it has no physical solid, you can't see it unless something is behind it
2025-11-19 08:50:15
it has color and energy but no surface for it to reflect on until you put something behind it
AccessViolation_
spider-mario associated: out = (1−alpha)·bg + fg unassociated: out = (1−alpha)·bg + alpha·fg
2025-11-19 08:58:48
okay I understand that. so basically, it's like allowing to you *add* intensity of the foreground pixels to the background pixels, instead of numerically replacing some ratio of the background pixel intensity with the foreground pixel intensity. and as a result, if you *do* want to replicate this 'partially replace' blending that unassociated alpha does, using associated alpha, your pixels need to already be multiplied by the proportional amount of alpha, hence "premultiplied"
2025-11-19 08:58:59
I think I finally understand, thanks!
2025-11-19 09:05:54
now I also understand why associated is a better term than premultiplied, you don't *need* premultiplication for associated alpha to be useful, if you only have emissive elements you don't do it at all. I'd heard that before but never understood why
2025-11-19 09:16:28
I just noticed that in the captain disillusion video about the alpha channel, in this scene, none of these images are truly transparent, they all have a different transparency checkerboard which implies they're part of the images instead of rendered by the browser. just like how in practice you'll find a considerable amount of images with false transparency <:KekDog:805390049033191445>
spider-mario
2025-11-19 09:37:27
now someone will demand a new metadata chunk in PNG and JXL to declare which size/colour the checkerboard should be
AccessViolation_
2025-11-19 09:47:26
if we're redesigning the alpha system, I propose a new system with an alpha, beta and gamma channel that define the image subject's transparency to alpha, beta and gamma radiation, respectively
spider-mario
2025-11-19 09:53:34
for what it’s worth, OpenEXR supports per-channel alpha (AR, AG, AB)
2025-11-19 09:53:36
https://openexr.com/en/latest/TechnicalIntroduction.html#channel-names
AccessViolation_
2025-11-19 10:23:40
ah that's for filtering like adrian mentioned earlier
2025-11-19 10:23:42
neat
jonnyawsom3
spider-mario now someone will demand a new metadata chunk in PNG and JXL to declare which size/colour the checkerboard should be
2025-11-20 12:28:22
Add a layer of JXL art :>
Adrian The Frog
2025-11-20 03:57:31
would be cool if browsers automatically picked the checkerboard shade that would give the most contrast
Jyrki Alakuijala
2025-11-21 08:54:14
my experience from ~2006 about PNG alpha optimization for Google Maps: ~32 levels is roughly enough, one level needs to be 100 % opaque, one level needs to be 100 % transparent, ideally a few more levels for highest transparency values -- I think I ended up adding 1 (or 3, don't remember) levels more for high transparency values, to get drop shadows without banding
jonnyawsom3
2025-11-21 08:59:48
Very interesting, I didn't know you worked on Maps, yet alone that long ago
AccessViolation_
2025-11-21 09:01:28
you were talking about subsampling the alpha channel right
2025-11-21 09:02:01
i wonder if you could get better gains by doing like 32 transparency levels and palette encoding them, then?
jonnyawsom3
2025-11-21 09:24:09
I had typed out about 5 or 6bit alpha, but pallete should already be doing that either locally or globally, so I don't think it would help much
AccessViolation_
2025-11-21 09:33:20
...you can use bit depths lower than 8 in modular?
2025-11-21 09:33:22
huh
2025-11-21 09:34:25
or do you mean effective bit depth, by not using more than some amount of values
jonnyawsom3
2025-11-21 09:35:37
Both I guess
_wb_
2025-11-22 12:51:01
Both are possible and will end up encoding more or less to the same thing
ignaloidas
2025-11-22 01:28:58
it's a bit different on quantization? With palette you could "quantize" to any free value, which could exploit the non-linear usage of alpha, where some ranges are more used / important than others (where just dropping bit-depth would lead to a consistent drop in precision across the entire range)
_wb_
2025-11-22 01:50:26
Yes, and also it doesn't need to be an integer power of two
AccessViolation_
2025-11-24 09:32:19
NASA's so-called PNG
2025-11-24 09:36:54
actually, this might be Firefox's fault
2025-11-24 09:39:37
yep
2025-11-24 09:53:06
is it possible (or rather probable) for a true lossless image to still show up as 92% quality with imagemagick identify?
jonnyawsom3
2025-11-24 10:04:55
What does that even mean? JPEG quality?
AccessViolation_
2025-11-24 10:07:57
I believe it tries to guess JPEG quality from the artifacts or quantization yeah
2025-11-24 10:14:58
this is also interesting, there are no pixels with a value lower than three in the green channel
2025-11-24 10:20:44
might be an outlier, a different image of theirs doesn't have that
jonnyawsom3
2025-11-24 11:07:11
What's the link to the image?
AccessViolation_
2025-11-24 11:45:03
the png download on this page: https://science.nasa.gov/asset/webb/cats-paw-nebula-nircam-image/
2025-11-24 11:45:28
direct link: <https://assets.science.nasa.gov/content/dam/science/missions/webb/science/2025/07/STScI-01JY2AYZ2PYBDDSMX83K5248DD.jpg/jcr:content/renditions/Full%20Res%20(For%20Display).png>
2025-11-24 11:52:38
they also have a JPEG variant (right) which has much more obvious compression artifacts, but is also reported as having a quality of 92
jonnyawsom3
2025-11-24 12:31:37
> revealing a subset of mini toe bean-reminiscent structures Best NASA quote so far
AccessViolation_
2025-11-24 12:45:10
first signs of arirals
monad
2025-11-25 04:48:08
guys, I think if we all stop working on jxl and pivot to cloning then jxl development will go a lot faster since we can clone Luca
username
AccessViolation_ NASA's so-called PNG
2025-11-25 07:37:37
off-topic but is that [IPvFoo](https://addons.mozilla.org/firefox/addon/ipvfoo/) I spot in the top right of your screenshot? Some other extensions in a similar vein of functionality if you interested include: [HTTP Version Indicator](https://addons.mozilla.org/firefox/addon/http2-indicator/) (shows if a site is using HTTP 1.1 or 2 or 3) [IndicateTLS](https://addons.mozilla.org/firefox/addon/indicatetls/) (shows if a site is using TLS 1.2 or 1.3 or etc)
AccessViolation_
2025-11-25 07:41:20
yes it is :)
lonjil
2025-11-25 07:48:44
how to spot a good website:
Jyrki Alakuijala
AccessViolation_ they also have a JPEG variant (right) which has much more obvious compression artifacts, but is also reported as having a quality of 92
2025-11-26 11:18:34
perhaps YUV420
AccessViolation_ I believe it tries to guess JPEG quality from the artifacts or quantization yeah
2025-11-26 11:20:13
imagemagick looks at the quantization matrices -- it is possible to fool it by sending a very fine quantization matrix and then not use -3,-2,-1, 1, 2, 3 -- and compress a lot with crappy quality but get 100 as a reported quality
AccessViolation_
2025-11-26 11:30:01
interesting
2025-11-26 11:30:35
so that PNG was definitely derived from a lossy compressed image then :/
jonnyawsom3
2025-11-26 11:43:06
A PNG doesn't have quant matrices though
AccessViolation_
2025-11-26 11:44:35
from what I know identify looks at the pixel data directly, I assumed Jyrki meant that it estimates the matrices from those
lonjil
2025-11-26 11:49:04
It doesn't, it looks at the quant tables of JPEGs
2025-11-26 11:49:13
from testing, it seems to *always* report 92 for PNGs
Jyrki Alakuijala
lonjil from testing, it seems to *always* report 92 for PNGs
2025-11-26 12:26:33
imagemagick's identify looks at the quant matrices, the image can be fully black (the same pixels) and exactly the same for different qualities, still image magick will compute something resembling the original encoding quality
lonjil
2025-11-26 12:40:19
I know, I'm saying it always reports 92 for PNG files, which of course don't have any quant matrices.
AccessViolation_
2025-11-26 01:29:19
oh, well that's confusing
_wb_
2025-11-26 02:49:10
ah yeah for PNG files and I guess other lossless formats, it pretends it is quality 92 so that will also be the quality it uses by default when you convert png to jpeg, since the default is to keep the quality
2025-11-26 02:50:44
which kind of makes sense, if you want to avoid generation loss then it's better to avoid requantizing with a different quant table, though of course even better is not to decode to pixels and then encode from pixels again
AccessViolation_
2025-11-26 03:03:31
wait, so you're saying it reports that quality for PNGs so that the last three steps in the PNG -> JPEG -> PNG -> JPEG pipeline are lossless?
2025-11-26 03:03:53
or am I misunderstanding
username
AccessViolation_ or am I misunderstanding
2025-11-26 03:06:36
"default is to keep the quality" I don't think refers to anything lossless I assume it's just so that converting between different lossy formats has a similar relative quality level
AccessViolation_
2025-11-26 03:07:32
oh got it
DZgas Ж
Traneptora ``` ffmpeg -y -i "THE AMAZING DIGITAL CIRCUS: PILOT [HwAPLk_sQ3w].mkv" -vf "zscale=w=128:h=-1:f=spline36,format=gbrp,crop=128:64" -frames:v 1 -update 1 OUT2.png ```
2025-11-27 03:08:06
"format=gbrp", yes, this, It's just hilarious that without this parameter you can't save RGB24 downscale. It's literally "YUV420 in core" for anything when converting video to PNG the ffmpeg.
Exorcist
2025-11-28 12:44:11
spider-mario
2025-11-28 10:10:20
when suddenly, suspenders
AccessViolation_
2025-11-28 10:44:28
I like how Nano Banana Pro looks sort of like a traditional image codec generation loss test
2025-11-28 10:46:33
a couple of them do
2025-11-28 10:47:52
giggling at the thought of putting lossless WebP in there, calling it something else and seeing how many people get suspicious
spider-mario
AccessViolation_ I like how Nano Banana Pro looks sort of like a traditional image codec generation loss test
2025-11-28 11:04:53
some in the comments have hypothesised that what we’re seeing is the “this is AI-generated” watermark
2025-11-28 11:05:06
which sounds plausible
cioute
lonjil how to spot a good website:
2025-11-28 02:29:52
?
AccessViolation_
AccessViolation_ giggling at the thought of putting lossless WebP in there, calling it something else and seeing how many people get suspicious
2025-11-28 03:53:28
uh lossy WebP I mean <:galaxybrain:821831336372338729>
Magnap
2025-11-28 09:08:26
<@1028567873007927297> you might find this paper interesting re noise shaping https://doi.org/10.1109/ICIP.2010.5651757
2025-11-28 09:14:15
They set up spatial noise shaping as a convex optimization problem: minimize the l1 norm (for sparsity) of the transform coefficients (wavelet for them since they're working with JPEG 2000) subject to the spatial error staying below a certain level per pixel, which means you can allow more error in places where it's less noticeable due to masking
2025-11-28 09:20:49
Also they have this whole complicated scheme for it but I'm pretty sure the problem they set up is linear, and I bet a couple iterations of an interior point method would do wonders
2025-11-28 09:29:56
(but ig technically what you want to solve is the integer linear problem where you're looking for the best quantized values, and maybe that's why they're doing their whole "let's see which bits we can zero out" thing?)
Meow
Exorcist
2025-11-29 10:13:20
Earlier versions of lossy WebP would turn it to some nice smokes
jonnyawsom3
2025-11-29 02:35:05
We know what we must do https://x.com/dimenpsyonal/status/1994440264086147391
lonjil
2025-11-29 02:42:29
effort 11 takes it to 54 bytes
TheBigBadBoy - 𝙸𝚛
We know what we must do https://x.com/dimenpsyonal/status/1994440264086147391
2025-11-29 04:17:44
where is the 186B SVG ?
AccessViolation_
lonjil effort 11 takes it to 54 bytes
2025-11-29 04:46:40
> Some manual tweaking takes it down to 42 bytes: `data:image/jxl;base64,/wq6Euh8YAASCAYBAGwASzhD2c0D1fBK9HQNJxh05Qk9XQQAuvIEIMEA` fitting that into a URL the length of a sentence is such a flex. it's a crazy feeling that these few characters form the whole image