v0.8.3
What's Changed
Features
- Fused parallel JPEG encoder with optimized Huffman tables — a single-pass symbol stream architecture that captures DCT symbols during parallel quantization, merges frequency counts to build optimal Huffman tables, then remaps in parallel. On a 3840x2160 4:2:0 Q85 image: 4.43x speedup (36.4ms to 8.2ms) with 0.52% smaller output from R-D post-quantization optimization. API:
EncoderConfig::encode_bytes_parallel(). Requiresparallelfeature, RGB8 input, baseline mode (08eb559)- Quality-scaled R-D lambda drops trailing coefficients where bit savings exceed perceptual cost
- Symbol stream (4 bytes/symbol) is 8x smaller than coefficient storage, fits in L3 cache
- Chunked parallelism at physical core count avoids SMT contention
Bug Fixes
- Fix out-of-bounds access in progressive scanline buffer for single-component (grayscale) JPEGs —
buffered_rgbstored 1 byte/pixel but BGR8, RGBA8/BGRA8, and RGBA-f32 output paths assumed 3 bytes/pixel (8868898, fixes #26) - Reject height=0 (DNL mode) in
read_info()since header-only probing cannot resolve deferred height (8868898) - Fix false positive in
fuzz_differentialtarget — zune-jpeg returns grayscale natively (64 bytes for 8x8) while zenjpeg returns requested RGB (192 bytes), causing length-mismatch assertion. Now expands grayscale to RGB before comparison (268d5a2, fixes #27) - Remove 4
#[arcane]-annotated SIMD functions containingunimplemented!()(wasm_idct_int_8x8,wasm_ycbcr_to_rgb,neon_idct_int_8x8,neon_ycbcr_to_rgb) that would have panicked at runtime if dispatched (1ea2488)
Fuzz Hardening
- Add fuzz infrastructure with differential target (zenjpeg vs zune-jpeg), roundtrip target, and decode-only target (292e6fc)
- Add minimized regression seeds for the progressive scanline off-by-one crash (ad627ba)
- Upgrade fuzz zune-jpeg 0.4 to 0.5, restore progressive coverage in differential target (04379c0)
- Move curated fuzz seeds to
fuzz/seeds/, gitignore bulk corpus (7f043aa)
Internal
- Bump zencodec to 0.1.13
- Resolve clippy warnings for all-features builds
- Gitignore tooling noise, exclude noise files from packages
Full Changelog: v0.8.2...v0.8.3