Skip to content

PJA 0.5.2

Choose a tag to compare

@github-actions github-actions released this 31 Oct 05:58
· 142 commits to main since this release

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 pja command 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 .pja or .7z that 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.