mirror of
https://github.com/RGBCube/serenity
synced 2026-01-13 01:40:59 +00:00
JPEGs can store a `restart_interval`, which controls how many
minimum coded units (MCUs) apart the stream state resets.
This can be used for error correction, decoding parts of a jpeg
in parallel, etc.
We tried to use
u32 i = vcursor * context.mblock_meta.hpadded_count + hcursor;
i % (context.dc_restart_interval *
context.sampling_factors.vertical *
context.sampling_factors.horizontal) == 0
to check if we hit a multiple of an MCU.
`hcursor` is the horizontal offset into 8x8 blocks, vcursor the
vertical offset, and hpadded_count stores how many 8x8 blocks
we have per row, padded to a multiple of the sampling factor.
This isn't quite right if hcursor isn't divisible by both
the vertical and horizontal sampling factor. Tweak things so
that they work.
Also rename `i` to `number_of_mcus_decoded_so_far` since that
what it is, at least now.
For the test case, I converted an existing image to a ppm:
Build/lagom/bin/image -o out.ppm \
Tests/LibGfx/test-inputs/jpg/12-bit.jpg
Then I resized it to 102x77px in Photoshop and saved it again.
Then I turned it into a jpeg like so:
path/to/cjpeg \
-outfile Tests/LibGfx/test-inputs/jpg/odd-restart.jpg \
-sample 2x2,1x1,1x1 -quality 5 -restart 3B out.ppm
The trick here is to:
a) Pick a size that's not divisible by the data size width (8),
and that when rounded to a block size (13) still isn't divisible
by the subsample factor -- done by picking a width of 102.
b) Pick a huffman table that doesn't happen to contain the bit
pattern for a restart marker, so that reading a restart marker
from the bitstream as data causes a failure (-quality 5 happens
to do this)
c) Pick a restart interval where we fail to skip it if our calculation
is off (-restart 3B)
Together with #22987, fixes #22780.
|
||
|---|---|---|
| .. | ||
| AK | ||
| JSSpecCompiler | ||
| Kernel | ||
| LibAudio | ||
| LibC | ||
| LibCompress | ||
| LibCore | ||
| LibCpp | ||
| LibCrypto | ||
| LibDiff | ||
| LibEDID | ||
| LibELF | ||
| LibGfx | ||
| LibGL | ||
| LibGLSL | ||
| LibIMAP | ||
| LibJS | ||
| LibLocale | ||
| LibMarkdown | ||
| LibPDF | ||
| LibRegex | ||
| LibSQL | ||
| LibTest | ||
| LibTextCodec | ||
| LibThreading | ||
| LibTimeZone | ||
| LibTLS | ||
| LibTTF | ||
| LibUnicode | ||
| LibVideo | ||
| LibWasm | ||
| LibWeb | ||
| LibWebView | ||
| LibXML | ||
| Spreadsheet | ||
| UserspaceEmulator | ||
| Utilities | ||
| CMakeLists.txt | ||