Repository navigation
PJA 0.5.2
More of the JPEGs that real files hold are now taken: scans that end early, and JPEGs whose container assumes the tables.
- Scans that end early, a cut download included (the
pjacommand and libpja). Some encoders write the end of a scan before its last bits, and a download cut short leaves a JPEG with no end at all. PJA now reads on with zero bits, as libjpeg does when it displays such a file, rebuilds the JPEG, and keeps a record of what it added so the original comes back byte for byte. The padding includes the restart markers the file's DRI calls for. A repaired file is kept only when it is smaller than the file stored as bytes.- In the sample corpus, 3 of the 4 such files go from 98% to 76–80%.
- In 30 photos cut at random points, 10 are repaired (one cut at 99%: 85.9% → 61.1%) and 20 are smaller as bytes. All 30 come back.
- JPEGs whose container keeps no tables (7-Zip, libpja). Konica's Q-Photo files (
.kqp,.pic) store their JPEG without tables, because their program assumes the standard ones. libpja's filter now gives such a JPEG the standard tables when its container has none. The 10 Konica files of the corpus went through as raw bytes before; now they compress to 52–78%. A JPEG that the standard tables don't fit does not come back the same, and stays raw. - A safer check. Compress verifies its own output with the same size limit that extraction uses. While testing the repairs, a check with a looser limit had let through a file that then would not extract. That never shipped.
- What stays the same. For every other file the output is byte for byte 0.5.1's. The zpaq-std plugin's codecs, streams and ZPAQL are 0.5.1's.
- Old versions. A
.pjaor.7zthat uses these repairs or tables does not open with 0.5.1 or earlier. Every older file opens with 0.5.2.
Downloads
| platform | the pja command |
the zpaq-std plugin | libpja (C library, 7-Zip plugin) |
|---|---|---|---|
| Linux x86-64 | pja-0.5.2-linux-x86_64.tar.gz |
pja-0.5.2-zpaqstd-plugin-linux-x86_64.tar.gz |
pja-0.5.2-lib-linux-x86_64.tar.gz |
| Linux x86 (32-bit) | pja-0.5.2-linux-x86.tar.gz |
pja-0.5.2-zpaqstd-plugin-linux-x86.tar.gz |
pja-0.5.2-lib-linux-x86.tar.gz |
| Linux arm64 | pja-0.5.2-linux-arm64.tar.gz |
pja-0.5.2-zpaqstd-plugin-linux-arm64.tar.gz |
pja-0.5.2-lib-linux-arm64.tar.gz |
| macOS arm64 | pja-0.5.2-macos-arm64.tar.gz |
pja-0.5.2-zpaqstd-plugin-macos-arm64.tar.gz |
pja-0.5.2-lib-macos-arm64.tar.gz |
| Windows x64 (7 and later) | pja-0.5.2-windows-x64.zip |
pja-0.5.2-zpaqstd-plugin-windows-x64.zip |
pja-0.5.2-lib-windows-x64.zip |
| Windows x86 (XP and later) | pja-0.5.2-windows-x86.zip |
pja-0.5.2-zpaqstd-plugin-windows-x86.zip |
pja-0.5.2-lib-windows-x86.zip |
pja-0.5.2-zpaqstd.tar.gz holds the plugin's sources as zpaq-std vendors them, with VENDOR.md. CI builds and checks every binary on its own platform (.github/workflows/release.yml); libpja is checked with its C test and, on Linux x86-64, through a real 7-Zip. SHA256SUMS has the checksums. The Linux builds need glibc 2.34 or later. The macOS ones are not signed: run xattr -d com.apple.quarantine after unpacking.