Repository navigation
Releases
PJA 0.9.8
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
.pjafiles, 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
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 1took on 151 photos.pja aandpja xnow 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,--jsonand exit code; the run ends only when every write has. Not with--no-sync,-nor--stats;PJA_SYNC_INLINE=1writes inline as before. - Nothing else changes: the same
.pjafiles, 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.exeselftest 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
pja2kin 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
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:pja2kor-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
-ththreads 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
.pjafor 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 codecpja2kwith 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;
pja2kthrough libzpaq on 113 real codestreams; the same streams on all six platforms and on 32-bit; Windows 10 (pja.exeselftest 42/42, 7-Zip 25.01 with the plugin, zpaq-std 2.3.0 withpja2kand 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
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 FILEwrites a bug report (no image data, no metadata contents) and a prefilled issue link;pja infoshows a file's structure and what PJA does with it;pja tchecks.pjafiles without writing;pja bench,pja selftest(built-in samples on every CPU path),--version,--cpu=plain|sse41|avx2,--statsand--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-syncskips 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-tempsdeletes 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
.pjafiles 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 answersPJA_E_VERSIONfor 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
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 16died 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
.pjafiles. - 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
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,pjalsx8and 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 newopt=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
-satakes 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.pjaformat 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
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,pjalloandpjalsxo, and their z (pjalszo,pjallzo,pjalsxzo), arepjals,pjallandpjalsxwith the same streams, the same files and the same memory, and a ZPAQL decoder compiled with zpaqlc'sopt=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
-satakes the o codecs in place ofpjall,pjalsandpjalsxonce it ships this plugin; those stay to read older archives. The other fourteen codecs, their ZPAQL, the.pjaformat 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
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-verifyit was written as a.pjathat 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..pjafiles 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.jpganda.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);-nrefuses 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 loadscodecs/<name>.so); rename an earlierpja.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
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
.pjaand 25,854 damaged.7zarchives 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
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.exeworked. 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.dllin a 64-bit 7-Zip'sCodecsfolder: the x64 build goes with 64-bit 7-Zip, the x86 one with 32-bit 7-Zip (the README anddoc/LIBRARY.mdnow 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.