Skip to content

Releases

PJA 0.9.8

Choose a tag to compare

@github-actions github-actions released this 08 Nov 04:47

A safer heap for the Windows libraries.

  • Windows libraries: libpja (the 7-Zip codec), the zpaq-std plugin and every Windows DLL now keep 16 bytes after each memory block. FreePascal's 32-bit code can read 2 bytes past the end of an array of 16-bit values; FreePascal's own heap always has room there, but the libraries use the process heap, which may end a block exactly where the memory ends. On Windows XP a 32-bit library built the same way (PPA's) failed now and then with "Data Error" in 7-Zip. PJA's 0.9.7 library did not fail in the same test (8 of 8 extractions in 7-Zip on XP), and 0.9.8's does not either; the fix closes the gap before it can show.
  • Nothing else changes: the same .pja files, streams, and the 31 zpaq-std codecs with their ZPAQL. The 7-Zip plugin reports 0.98.
  • CI now keeps each Windows build's binaries (pja.exe, the plugin, libpja), to test them in a VM before a release.
  • README: shorter, with the details moved to the wiki; the wiki is up to date with 0.9.7 (every command, JPEG 2000, zpaq-std 2.6.0's -sa).

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.9.8-linux-x86_64.tar.gz pja-0.9.8-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.9.8-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.9.8-linux-x86.tar.gz pja-0.9.8-zpaqstd-plugin-linux-x86.tar.gz pja-0.9.8-lib-linux-x86.tar.gz
Linux arm64 pja-0.9.8-linux-arm64.tar.gz pja-0.9.8-zpaqstd-plugin-linux-arm64.tar.gz pja-0.9.8-lib-linux-arm64.tar.gz
macOS arm64 pja-0.9.8-macos-arm64.tar.gz pja-0.9.8-zpaqstd-plugin-macos-arm64.tar.gz pja-0.9.8-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.9.8-windows-x64.zip pja-0.9.8-zpaqstd-plugin-windows-x64.zip pja-0.9.8-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.9.8-windows-x86.zip pja-0.9.8-zpaqstd-plugin-windows-x86.zip pja-0.9.8-lib-windows-x86.zip

pja-0.9.8-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.

PJA 0.9.7

Choose a tag to compare

@github-actions github-actions released this 07 Nov 07:15

The flush beside the work.

  • Faster writes, as safe. Since 0.9.5 every output reaches the disk before it takes its name (a power cut leaves the old file or the whole new one). That flush waits on the disk: about 16 ms a file on a SATA SSD, 4.9 s of the 37 s pja x -th 1 took on 151 photos. pja a and pja x now hand each file's write (flush, rename, the directory's flush) to a thread of their own and go on with the next file: 151 photos extracted on one thread 40.7 s → 36.2 s. The same files, lines in the same order, --json and exit code; the run ends only when every write has. Not with --no-sync, -n or --stats; PJA_SYNC_INLINE=1 writes inline as before.
  • Nothing else changes: the same .pja files, streams, and the 31 zpaq-std codecs with their ZPAQL (the plugin is 0.9.6's but for its version number). The 7-Zip plugin reports 0.97.
  • Checked: every suite on native and 32-bit with the same stream hashes; CI on all six platforms; Windows 10 (pja.exe selftest 42/42, 172 files back byte for byte with and without the write thread, the same lines).
  • Benchmarks in the README and the wiki are now measured with zpaq-std 2.6.0, which ships PJA 0.9.6 with pja2k in its -sa: JPEG 2000 in a zpaq archive 92.51% of its size.

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.9.7-linux-x86_64.tar.gz pja-0.9.7-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.9.7-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.9.7-linux-x86.tar.gz pja-0.9.7-zpaqstd-plugin-linux-x86.tar.gz pja-0.9.7-lib-linux-x86.tar.gz
Linux arm64 pja-0.9.7-linux-arm64.tar.gz pja-0.9.7-zpaqstd-plugin-linux-arm64.tar.gz pja-0.9.7-lib-linux-arm64.tar.gz
macOS arm64 pja-0.9.7-macos-arm64.tar.gz pja-0.9.7-zpaqstd-plugin-macos-arm64.tar.gz pja-0.9.7-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.9.7-windows-x64.zip pja-0.9.7-zpaqstd-plugin-windows-x64.zip pja-0.9.7-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.9.7-windows-x86.zip pja-0.9.7-zpaqstd-plugin-windows-x86.zip pja-0.9.7-lib-windows-x86.zip

pja-0.9.7-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.

PJA 0.9.6

Choose a tag to compare

@github-actions github-actions released this 07 Nov 02:40

JPEG 2000 for zpaq-std, HTJ2K, and a faster JPEG 2000 path.

  • HTJ2K (High-Throughput JPEG 2000, .jph, .jhc, DICOM frames). Each HT code-block's segments are decoded and written again exactly as their encoder ended them (OpenJPH, Grok, OpenHTJ2K, Kakadu), and stored in the smaller of two new modes of stream version 8:
    • mode 3: the code-blocks' values through a context-mixing model;
    • mode 4, for lossless codestreams: the pixels, through the pixel models.
HTJ2K, real files codestreams saved
Netflix Meridian 4K cinema frames (Kakadu) 148 10.4%
DICOM from public PACS and test sets (OpenJPH) 385 8.6 - 22.5%
UHD photo in PDFs (Kakadu) 4 13.9%
all 716 real codestreams (460 MB) 716 11.2%
photos made with OpenJPH and Grok, lossless and lossy 78 26.7%
  • JPEG 2000 for zpaq-std: pja2k. A new codec, index 30 of the plugin, for Part 1 JPEG 2000 files (JP2, JPX, JPM, MJ2, codestreams), with a ZPAQL decoder (51,521 bytes): any zpaq extracts its blocks without the plugin (checked with zpaq 7.15). About 7.7% saved on 113 real codestreams. It takes the decisions' model (mode 1) only; HTJ2K and the pixel modes stay as bytes in it. With zpaq-std 2.3.0: -sae:pja:pja2k or -sat:pja:pja2k.
  • Faster JPEG 2000. SIMD copies (SSE4.1, AVX2) of the models, fewer branches, the two modes of a lossless codestream coded side by side, a file's frames or layers on several threads, and -th threads shared by file size (a large file is no longer left on one thread at the end). 113 real codestreams (150 MB) at -th 8: 303 s → 136 s to compress (-55%), 83 s → 51 s to extract (-38%); Motion JPEG 2000 7 to 8 times faster. Tiled codestreams of 2 MB or more are cut in slices of 1 MiB instead of 4 MiB (more threads; 8.47% → 8.42% saved on that set); every other stream is byte for byte 0.9.5's.
  • Stable. The formats of 0.9.0 and 0.9.5 are unchanged: the same .pja for JPEG and JPEG-LS, the thirty zpaq-std codecs and their ZPAQL. New and fixed from now on (doc/STABILITY.md): stream version 8's modes 3 and 4, and the codec pja2k with its stream and ZPAQL. 7-Zip shows the plugin's version as 0.96.
  • Checked: 900 of 924 HTJ2K codestreams of every encoder taken and given back byte for byte (the rest kept as bytes), about 2.1 million damaged HT inputs with no crash or hang; pja2k through libzpaq on 113 real codestreams; the same streams on all six platforms and on 32-bit; Windows 10 (pja.exe selftest 42/42, 7-Zip 25.01 with the plugin, zpaq-std 2.3.0 with pja2k and zpaq 7.15 extracting it without the plugin).

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.9.6-linux-x86_64.tar.gz pja-0.9.6-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.9.6-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.9.6-linux-x86.tar.gz pja-0.9.6-zpaqstd-plugin-linux-x86.tar.gz pja-0.9.6-lib-linux-x86.tar.gz
Linux arm64 pja-0.9.6-linux-arm64.tar.gz pja-0.9.6-zpaqstd-plugin-linux-arm64.tar.gz pja-0.9.6-lib-linux-arm64.tar.gz
macOS arm64 pja-0.9.6-macos-arm64.tar.gz pja-0.9.6-zpaqstd-plugin-macos-arm64.tar.gz pja-0.9.6-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.9.6-windows-x64.zip pja-0.9.6-zpaqstd-plugin-windows-x64.zip pja-0.9.6-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.9.6-windows-x86.zip pja-0.9.6-zpaqstd-plugin-windows-x86.zip pja-0.9.6-lib-windows-x86.zip

pja-0.9.6-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.

PJA 0.9.5

Choose a tag to compare

@github-actions github-actions released this 06 Nov 19:53

JPEG 2000, and the last speed for the stable formats.

  • JPEG 2000. PJA now recompresses JP2, J2K/J2C, JPX, JPM, MJ2 and JPH files byte for byte, as codec stream version 8. Each codestream is taken apart and put back exactly (packet headers, the MQ coder and the way each encoder ends its segments: OpenJPEG, JasPer, Kakadu 2.0-8.0, LuraTech, Adobe, Aware, ECW), and stored in the smallest of three modes:
    • mode 1: the coefficients' decisions through a context-mixing model: about 8% smaller on real files;
    • mode 2, for complete lossless codestreams: the pixels, with an image model, and the codestream regenerated from them: scanned 1-bit book pages about 70% smaller (better than JBIG1);
    • mode 0: as bytes (HTJ2K, Part 2, damaged files).
113 real JPEG 2000 codestreams (150 MB: Internet Archive, Library of Congress, OSGeo, Helioviewer, Sentinel-2, DICOM) size
bzip2 -9 / bzip3 100.18% / 100.05%
zip -9, gzip -9, xz -9e, 7-Zip -mx=9 99.76 - 99.81%
zstd --ultra -22, brotli -q 11, zpaq -m5 99.56 - 99.72%
PJA 0.9.5 91.53%
  • Faster, the same bytes. The raw-byte model (metadata, ICC profiles) in C, the largest files first, JPEG-LS's two models at once, a large file's headers on threads, and a thread wait that no longer sleeps 100 ms: the 78-file corpus -47% to compress and -45% to extract, JPEG-LS -29%, a JPEG with a large ICC profile -54%, short files on several threads up to 7 times faster.
  • For people who want to help. pja report FILE writes a bug report (no image data, no metadata contents) and a prefilled issue link; pja info shows a file's structure and what PJA does with it; pja t checks .pja files without writing; pja bench, pja selftest (built-in samples on every CPU path), --version, --cpu=plain|sse41|avx2, --stats and --json. An internal error now says it is a bug and how to report it. See doc/CLI.md and the issue form.
  • Durable writes. An output is flushed to the disk before it takes its name (and its directory after), so a power cut leaves the old file or the whole new one; --no-sync skips it. Ctrl-C, a kill, a closed terminal or a closed pipe delete the temporaries being written; leftovers from a killed run are reported, and --clean-temps deletes them (PJA's own, old, of a process that is gone, never through a link).
  • Stable. The formats of 0.9.0 are unchanged: the command writes the same .pja files for JPEG and JPEG-LS, and the thirty zpaq-std codecs and their ZPAQL are 0.9.0's. Stream version 8 (modes 0, 1 and 2) joins what is fixed (doc/STABILITY.md). libpja answers PJA_E_VERSION for what a newer PJA wrote, and the 7-Zip plugin says "Unsupported Method" for it instead of "Data Error"; 7-Zip now shows the plugin's version as 0.95 (it said 0.05).
  • Checked: every JPEG 2000 file taken in a 2,300-codestream corpus comes back byte for byte, the 57 OpenJPEG conformance codestreams included; about a million damaged inputs with no crash or hang; Windows 10 (pja.exe, 7-Zip 25.01 with the plugin, zpaq-std 2.3.0 with and without the plugin).

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.9.5-linux-x86_64.tar.gz pja-0.9.5-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.9.5-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.9.5-linux-x86.tar.gz pja-0.9.5-zpaqstd-plugin-linux-x86.tar.gz pja-0.9.5-lib-linux-x86.tar.gz
Linux arm64 pja-0.9.5-linux-arm64.tar.gz pja-0.9.5-zpaqstd-plugin-linux-arm64.tar.gz pja-0.9.5-lib-linux-arm64.tar.gz
macOS arm64 pja-0.9.5-macos-arm64.tar.gz pja-0.9.5-zpaqstd-plugin-macos-arm64.tar.gz pja-0.9.5-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.9.5-windows-x64.zip pja-0.9.5-zpaqstd-plugin-windows-x64.zip pja-0.9.5-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.9.5-windows-x86.zip pja-0.9.5-zpaqstd-plugin-windows-x86.zip pja-0.9.5-lib-windows-x86.zip

pja-0.9.5-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.

PJA 0.9.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 21:21

The formats are fixed. A .pja, a 7-Zip archive with PJA or a zpaq-std block written by 0.9.0 or any earlier release opens in every release after it, and none of these formats changes again: doc/STABILITY.md lists them (the .pja file, the codec streams 5, 6 and 7, the filter's streams and the C interface, the 7-Zip methods, and the thirty zpaq-std codecs with their index, stream, ZPAQL size and release). 1.0.0 will add 7-Zip method IDs of PJA's own; archives with today's experimental IDs keep opening. A new kind of file (JPEG 2000 is being studied) would come as a new stream version beside these.

  • A thread the system refuses no longer ends PJA. Under a real limit (systemd's TasksMax), pja a -th 16 died with "EThread: Failed to create new thread", and the 7-Zip plugin answered "Can't allocate required memory". Both now go on with the threads they get, down to none but the main one, with the same output.
  • No truncated output on FAT or exFAT. A new output is written to a temporary and takes its name only if the name is free. That used hard links, which FAT and exFAT (camera cards, USB sticks) do not have, so there the file was written in place and a run cut short left it truncated. On Linux it now uses renameat2(RENAME_NOREPLACE), which they support.
  • PATCH's bounds (a repaired JPEG) saturate instead of raising an overflow for an absurd declared size.
  • Checked before fixing the formats: 1,500 damaged segments through the ten 8 codecs' ZPAQL decoders (no hang, no crash); a JPEG with 270 MB after it, round trip past 256 MiB; 135,730 damaged .pja, 18,348 damaged JPEG and JPEG-LS files and 15,994 damaged 7-Zip archives (no crash, no hang, nothing taken that did not come back).
  • The same bytes. The streams and the zpaq-std codecs are 0.8.0's; the command writes the same .pja files.
  • Benchmarks: the compressors table now has Lepton and brunsli too (README and the wiki).

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.9.0-linux-x86_64.tar.gz pja-0.9.0-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.9.0-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.9.0-linux-x86.tar.gz pja-0.9.0-zpaqstd-plugin-linux-x86.tar.gz pja-0.9.0-lib-linux-x86.tar.gz
Linux arm64 pja-0.9.0-linux-arm64.tar.gz pja-0.9.0-zpaqstd-plugin-linux-arm64.tar.gz pja-0.9.0-lib-linux-arm64.tar.gz
macOS arm64 pja-0.9.0-macos-arm64.tar.gz pja-0.9.0-zpaqstd-plugin-macos-arm64.tar.gz pja-0.9.0-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.9.0-windows-x64.zip pja-0.9.0-zpaqstd-plugin-windows-x64.zip pja-0.9.0-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.9.0-windows-x86.zip pja-0.9.0-zpaqstd-plugin-windows-x86.zip pja-0.9.0-lib-windows-x86.zip

pja-0.9.0-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.

PJA 0.8.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 15:47

Ten new codecs in the zpaq-std plugin: every decoder -sa uses, 3 to 8% smaller and 2 to 6% faster in zpaq 7.15.

  • The 8 codecs. pja78, pjax78, pjals8, pjall8, pjalsx8 and their z (pja7z8, pjax7z8, pjalsz8, pjallz8, pjalsxz8) are the codec named without the 8, with the same streams, the same files and the same memory, and a ZPAQL decoder compiled with the compiler's new opt=3: functions inlined where that saves bytes, one operand passed through a register in place of a temporary, and return values kept in a register. Every zpaq-std block carries its decoder, so the saving repeats in each block.
codec ZPAQL before 8
pja7 / pja78 35,104 32,954
pja7z / pja7z8 35,829 33,603
pjax7 / pjax78 35,211 33,197
pjax7z / pjax7z8 35,987 33,949
pjalso / pjals8 24,076 22,430
pjalszo / pjalsz8 24,724 23,046
pjallo / pjall8 15,058 13,901
pjallzo / pjallz8 15,693 14,517
pjalsxo / pjalsx8 25,623 24,611
pjalsxzo / pjalsxz8 26,278 25,244
  • Faster without the plugin. libzpaq (zpaq 7.15's engine) on the same data: 30 photos 69.3 -> 68.0 s, 18 MPO and 12-bit JPEGs 216.4 -> 206.2 s, 67 subsampled JPEG-LS 180.8 -> 170.4 s; every file back.
  • Checked on Windows XP: the original zpaq 7.15 (32-bit, no plugin) extracts archives written with pja78, pjax78, pjals8, pjall8 and pjalsx8 byte for byte, and the x86 plugin round-trips every file with each of the ten.
  • Nothing else changes. zpaq-std's -sa takes the 8 codecs in place of pja7, pjax7, pjall, pjals, pjalsx (and their z, and the o codecs) once it ships this plugin; those stay to read older archives. The .pja format and the streams are 0.7.0's: the command writes the same bytes. The wiki's zpaq-std plugin page has the codec families and names.

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.8.0-linux-x86_64.tar.gz pja-0.8.0-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.8.0-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.8.0-linux-x86.tar.gz pja-0.8.0-zpaqstd-plugin-linux-x86.tar.gz pja-0.8.0-lib-linux-x86.tar.gz
Linux arm64 pja-0.8.0-linux-arm64.tar.gz pja-0.8.0-zpaqstd-plugin-linux-arm64.tar.gz pja-0.8.0-lib-linux-arm64.tar.gz
macOS arm64 pja-0.8.0-macos-arm64.tar.gz pja-0.8.0-zpaqstd-plugin-macos-arm64.tar.gz pja-0.8.0-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.8.0-windows-x64.zip pja-0.8.0-zpaqstd-plugin-windows-x64.zip pja-0.8.0-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.8.0-windows-x86.zip pja-0.8.0-zpaqstd-plugin-windows-x86.zip pja-0.8.0-lib-windows-x86.zip

pja-0.8.0-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.

PJA 0.7.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 03:33

Six new codecs in the zpaq-std plugin: the JPEG-LS and lossless JPEG decoders at half the size, and more than twice as fast in zpaq 7.15.

  • The o codecs. pjalso, pjallo and pjalsxo, and their z (pjalszo, pjallzo, pjalsxzo), are pjals, pjall and pjalsx with the same streams, the same files and the same memory, and a ZPAQL decoder compiled with zpaqlc's opt=2, which until now only the version 7 codecs had. Every zpaq-std block carries its decoder, so this pays off in small groups and in groups split for zpaq 7.15 to extract in parallel.
codec ZPAQL before o
pjals / pjalso 55,989 24,076
pjall / pjallo 30,508 15,058
pjalsx / pjalsxo 60,776 25,623
pjalsz / pjalszo 32,984 24,724
pjallz / pjallzo 18,003 15,693
pjalsxz / pjalsxzo 36,110 26,278
  • Faster to extract without the plugin. libzpaq (zpaq 7.15's engine) on the same data: JPEG-LS 78.5 -> 36.2 s, lossless JPEG 2.8 -> 1.2 s, subsampled JPEG-LS 410.9 -> 178.6 s, every file back.
  • Checked on Windows XP: the original zpaq 7.15 (32-bit, no plugin) extracts archives written with the o codecs byte for byte, and the x86 plugin round-trips every file with each of the six.
  • Nothing else changes. zpaq-std's -sa takes the o codecs in place of pjall, pjals and pjalsx once it ships this plugin; those stay to read older archives. The other fourteen codecs, their ZPAQL, the .pja format and the streams are 0.6.4's: the command writes the same bytes. The wiki's zpaq-std plugin page has the codec families and names.

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.7.0-linux-x86_64.tar.gz pja-0.7.0-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.7.0-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.7.0-linux-x86.tar.gz pja-0.7.0-zpaqstd-plugin-linux-x86.tar.gz pja-0.7.0-lib-linux-x86.tar.gz
Linux arm64 pja-0.7.0-linux-arm64.tar.gz pja-0.7.0-zpaqstd-plugin-linux-arm64.tar.gz pja-0.7.0-lib-linux-arm64.tar.gz
macOS arm64 pja-0.7.0-macos-arm64.tar.gz pja-0.7.0-zpaqstd-plugin-macos-arm64.tar.gz pja-0.7.0-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.7.0-windows-x64.zip pja-0.7.0-zpaqstd-plugin-windows-x64.zip pja-0.7.0-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.7.0-windows-x86.zip pja-0.7.0-zpaqstd-plugin-windows-x86.zip pja-0.7.0-lib-windows-x86.zip

pja-0.7.0-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.

PJA 0.6.4

Choose a tag to compare

@github-actions github-actions released this 05 Nov 00:51

Fixes from a code audit of the command, the library, the 7-Zip and zpaq-std plugins and the build. None of them lost data: PJA verifies everything before it writes it.

  • A valid repair was refused. A JPEG cut short whose filler came out longer than what was left was stored as bytes, and with --no-verify it was written as a .pja that did not extract. Now it is taken (a 70% cut of a corpus photo: 85.07% instead of 88.6%), and a repaired JPEG is always checked, even with --no-verify. .pja files written before, that one included, extract.
  • Verification stopped at 256 MiB of a file's raw part; it now goes as far as the file.
  • A thread the system refused left the threads already started running on freed memory. The bands left now run on the caller's thread, with the same stream.
  • The 7-Zip filter could write a record past its size limit that its own decoder refuses; lossless JPEGs no longer get tables they do not use; a failed filter B stops the stream.
  • libpja kept about 18 MB of models for every host thread that called it; a few sets are now kept for the next call, the rest freed. Null output pointers are refused.
  • JPEG-LS files with small components in an interleaved scan crashed the parser; a component coded twice is refused when compressing; fill bytes before a marker are taken.
  • JPEG: scans grow by doubling (more than 1024 go as bytes); MPO offsets are read in 64 bits on 32-bit systems.
  • The command: two inputs with the same output (a.jpg and a.jpeg, or one name from two folders) overwrote each other, now the later one fails; a write cut short no longer leaves a truncated file under the final name (except on FAT/exFAT); -n refuses what the real run would; long names and \ in Linux names work.
  • zpaq-std plugin: pjall's memory estimate counted one band for large lossless JPEGs; pjax counted the host's scans but not its parts'. The codecs, their streams and their ZPAQL are 0.6.0's.
  • macOS: the zpaq-std plugin is now pja.so (zpaq-std loads codecs/<name>.so); rename an earlier pja.dylib. libpja's install name is no longer an absolute build path.
  • The same bytes. The format and the streams are 0.6.3's; the only new outputs are the repairs above and JPEGs of over 1024 scans, now stored as bytes. Checked on Linux x86-64, x86 and arm64, Windows x64 and x86, and macOS arm64.

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.6.4-linux-x86_64.tar.gz pja-0.6.4-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.6.4-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.6.4-linux-x86.tar.gz pja-0.6.4-zpaqstd-plugin-linux-x86.tar.gz pja-0.6.4-lib-linux-x86.tar.gz
Linux arm64 pja-0.6.4-linux-arm64.tar.gz pja-0.6.4-zpaqstd-plugin-linux-arm64.tar.gz pja-0.6.4-lib-linux-arm64.tar.gz
macOS arm64 pja-0.6.4-macos-arm64.tar.gz pja-0.6.4-zpaqstd-plugin-macos-arm64.tar.gz pja-0.6.4-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.6.4-windows-x64.zip pja-0.6.4-zpaqstd-plugin-windows-x64.zip pja-0.6.4-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.6.4-windows-x86.zip pja-0.6.4-zpaqstd-plugin-windows-x86.zip pja-0.6.4-lib-windows-x86.zip

pja-0.6.4-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.

PJA 0.6.3

Choose a tag to compare

@github-actions github-actions released this 02 Nov 00:30

Fixes from fuzzing the command and the 7-Zip plugin. None of them lost data: PJA verifies everything before it writes it.

  • Repairing a damaged JPEG could take minutes. The filler for a scan cut short went back and forth between "data after the scan" and "scan cut short", decoding the whole file each time (104 s for a 91 KB file). Now well under a second; a cut progressive scan with a restart every few blocks takes seconds at most. The same files are repaired as with 0.6.2.
  • A JPEG-LS without its EOI was taken and then failed verification (nothing written). It is now refused when parsed and stored as it is.
  • The 7-Zip filter went quadratic on a JPEG cut short in a solid block followed by text (32 MB: 22.8 s, up to 512 MB of memory). Now 0.17 s and 32 MB at most.
  • libpja: thread counts are 1 to 64 in every export, and a thread pool that fails half-built stops the threads it started. The Windows heap refuses a size that would overflow its header.
  • x86 without SSE2. The 32-bit builds' C now targets any 686 (-march=i686): PJA x86 runs on a Pentium III or Athlon XP again. The same bytes; the SSE4.1 and AVX2 paths still go by cpuid.
  • The same bytes. The format, the streams and the zpaq-std plugin's codecs are 0.6.2's: 1,207 files of every test set give the same streams. Checked: 212,168 damaged .pja and 25,854 damaged .7z archives with no crash, and on Windows 10 with 7-Zip 25.01, the x86 library out of memory (an error, not a crash) and 7zFM (no errors).

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.6.3-linux-x86_64.tar.gz pja-0.6.3-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.6.3-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.6.3-linux-x86.tar.gz pja-0.6.3-zpaqstd-plugin-linux-x86.tar.gz pja-0.6.3-lib-linux-x86.tar.gz
Linux arm64 pja-0.6.3-linux-arm64.tar.gz pja-0.6.3-zpaqstd-plugin-linux-arm64.tar.gz pja-0.6.3-lib-linux-arm64.tar.gz
macOS arm64 pja-0.6.3-macos-arm64.tar.gz pja-0.6.3-zpaqstd-plugin-macos-arm64.tar.gz pja-0.6.3-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.6.3-windows-x64.zip pja-0.6.3-zpaqstd-plugin-windows-x64.zip pja-0.6.3-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.6.3-windows-x86.zip pja-0.6.3-zpaqstd-plugin-windows-x86.zip pja-0.6.3-lib-windows-x86.zip

pja-0.6.3-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.

PJA 0.6.2

Choose a tag to compare

@github-actions github-actions released this 01 Nov 18:10

The 7-Zip plugin no longer crashes 7-Zip's file manager.

  • 7zFM crashed testing or extracting from inside an archive. Reported on the packJPG forum thread: opening a PJA or PJA1 archive in 7-Zip's file manager and pressing Test crashed it (0.5.1 to 0.6.1, x64 and x86); the context menu and 7z.exe worked. The cause, found with a debugger on Windows 10 and 7-Zip 25.01: FreePascal 3.2.2's heap, in a DLL, deletes its lock when the thread that loaded the DLL ends, and 7zFM loads its codecs from such a short-lived thread; PJA's threads then entered a deleted critical section. libpja and the zpaq-std plugin now take their memory from the process heap on Windows (pas/pjaheap.pas). Checked in 7zFM, x64 and x86: no errors.
  • "Not a valid Win32 application". That message comes from putting the x86 pja.dll in a 64-bit 7-Zip's Codecs folder: the x64 build goes with 64-bit 7-Zip, the x86 one with 32-bit 7-Zip (the README and doc/LIBRARY.md now say so).
  • The same bytes. The format, the streams and the zpaq-std plugin's codecs are 0.6.1's; nothing changes on Linux or macOS.

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.6.2-linux-x86_64.tar.gz pja-0.6.2-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.6.2-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.6.2-linux-x86.tar.gz pja-0.6.2-zpaqstd-plugin-linux-x86.tar.gz pja-0.6.2-lib-linux-x86.tar.gz
Linux arm64 pja-0.6.2-linux-arm64.tar.gz pja-0.6.2-zpaqstd-plugin-linux-arm64.tar.gz pja-0.6.2-lib-linux-arm64.tar.gz
macOS arm64 pja-0.6.2-macos-arm64.tar.gz pja-0.6.2-zpaqstd-plugin-macos-arm64.tar.gz pja-0.6.2-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.6.2-windows-x64.zip pja-0.6.2-zpaqstd-plugin-windows-x64.zip pja-0.6.2-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.6.2-windows-x86.zip pja-0.6.2-zpaqstd-plugin-windows-x86.zip pja-0.6.2-lib-windows-x86.zip

pja-0.6.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.