Cannot compress a gray float image with lossless compression
Hello,
I cannot use lossless compression with a specific image. Lossy compression works on the same image. The library returns an error when calling JxlEncoderProcessOutput.
To reproduce the issue, you can clone this repository: https://github.com/afichet/jxl_lossless_lossy
git clone https://github.com/afichet/jxl_lossless_lossy.git
cd jxl_lossless_lossy
mkdir build
cd build
cmake ..
make
./test_jxl ../data/dc.pfm
The problematic file is provided in data/dc.pfm.
The file is a 32 bits gray float image.
Environment
- OS: Arch Linux
- Compiler version: clang 14.0.6
- CPU type: x86_64
- cjxl/djxl version string: v0.7.0
I had to use the following on the 0.7 branch:
- https://github.com/libjxl/libjxl/pull/2030
Hi,
Thanks for the patch! Now that cjxl loads pfm using your branch, I can provide more concise steps to reproduce the error I am having with this specific file:
curl https://raw.githubusercontent.com/afichet/jxl_lossless_lossy/master/data/dc.pfm --output dc.pfm
Using cjxl in lossless mode crash the program:
./tools/cjxl dc.pfm dc_lossless.jxl -d 0
JPEG XL encoder v0.7.0 6c6b1175 [AVX3,AVX2,SSE4,SSSE3,Unknown]
Read 2048x2048 image, 16777234 bytes, 254.7 MP/s
Encoding [Modular, lossless, effort: 7],
JxlEncoderProcessOutput failed.
But I don't have an issue with lossy compression:
./tools/cjxl dc.pfm dc_lossy.jxl -d 1
JPEG XL encoder v0.7.0 6c6b1175 [AVX3,AVX2,SSE4,SSSE3,Unknown]
Read 2048x2048 image, 16777234 bytes, 867.7 MP/s
Encoding [VarDCT, d1.000, effort: 7],
Compressed to 640597 bytes (1.222 bpp).
2048 x 2048, 15.83 MP/s [15.83, 15.83], 1 reps, 36 threads.
Indeed I can reproduce the issue here:
% cjxl dc.pfm dc_lossless.jxl -d 0
JPEG XL encoder v0.7.0 [AVX2,SSE4,SSSE3,Unknown]
./lib/extras/dec/color_hints.cc:54: No color_space/icc_pathname given, assuming sRGB
Read 2048x2048 image, 16777234 bytes, 1296.2 MP/s
Encoding [Modular, lossless, effort: 7],
./lib/jxl/fields.cc:730: JXL_FAILURE: No feasible selector for 195695
./lib/jxl/fields.cc:488: JXL_RETURN_IF_ERROR code=1: ok_
./lib/jxl/fields.cc:633: JXL_RETURN_IF_ERROR code=1: CanEncode(fields, &extension_bits, &total_bits)
./lib/jxl/enc_modular.cc:1196: JXL_RETURN_IF_ERROR code=1: Bundle::Write(stream_headers_[stream_id], writer, layer, aux_out)
./lib/jxl/enc_frame.cc:1386: JXL_RETURN_IF_ERROR code=1: modular_frame_encoder->EncodeStream( get_output(0), aux_out, kLayerModularGlobal, ModularStreamId::Global())
./lib/jxl/encode.cc:496: Failed to encode frame
JxlEncoderProcessOutput failed.
current git HEAD gives:
% tools/cjxl /tmp/dc.pfm dc_lossless.jxl -d 0
JPEG XL encoder v0.9.0 27f0ffaf [AVX2,SSE4,SSSE3,Unknown]
./lib/extras/dec/color_hints.cc:54: No color_space/icc_pathname given, assuming sRGB
Read 2048x2048 image, 16777234 bytes, 1098.3 MP/s
Encoding [Modular, lossless, effort: 7],
./lib/jxl/encode.cc:263: Only JXL_BIT_DEPTH_FROM_PIXEL_FORMAT is implemented for float types.
./lib/jxl/encode.cc:1847: Invalid input bit depth
JxlEncoderAddImageFrame() failed.
EncodeImageJXL() failed.
related: https://github.com/libjxl/libjxl/pull/2093
Thanks for bringing this up!
Works fine now.