Skip to content

PJA 0.1.0

Choose a tag to compare

@github-actions github-actions released this 30 Oct 00:29
· 169 commits to main since this release

A new model for pja a, stream version 7, with its core in C: 3.1% smaller than 0.0.8 on photos and about 1.6 times as fast.

  • Stream version 7. The coefficient model is redone in C
    (pas/pjav7c.c, SSE2 with SSE4.1 and AVX2 copies chosen at run time):
    every edge's nonzero count before its flags, direct interior signs, the
    interior count as a bit length; contexts from the luma block under a
    chroma block and from the Cb block at Cr's place; predictions for the
    edge and DC signs; and tuned counters and mixers. The work around the
    model (FF scan, BLAKE3 chunks, the Huffman scan reader and writer) is
    in C too (pas/pjasysc.c). Neither calls any library. Everything
    measured and tried is in doc/CODEC.md.
  • How much. On the 151 photos: 56,939,009 bytes against 0.0.8's
    58,788,017 (72.61% of the JPEGs against 74.96%); compressing, verifying
    as by default, 73.7 s against 118.6 s on one thread and 10.2 s against
    17.0 s on eight; extracting, 36.2 s against 57.3 s and 5.3 s against
    8.1 s. The 78-file corpus 70.39% (72.08%), MPO 73.38% (74.13%),
    arithmetic-coded JPEG 74.59% (76.50%), generated JPEGs 73.73% (75.61%),
    12-bit JPEG 88.14% (88.34%); lossless JPEG and JPEG-LS as before.
  • Same everywhere. The streams are the same byte for byte with and
    without SSE2, SSE4.1, AVX2 or the assembly, on every platform and with
    any number of threads; CI checks it on all six.
  • --fast is still accepted and changes nothing: the new model is
    faster than the old fast one. pja x reads every version's .pja.
  • Building now needs a C compiler too: pas/build_c.sh (gcc or
    clang, native or cross).
  • The zpaq-std plugin has no C and does not use version 7; its
    streams, its ZPAQL and what each codec takes are 0.0.6's. One change:
    on macOS its exported names carry the leading underscore dlsym looks
    for there (found by zpaq-std).

Downloads

platform the pja command the zpaq-std plugin
Linux x86-64 pja-0.1.0-linux-x86_64.tar.gz pja-0.1.0-zpaqstd-plugin-linux-x86_64.tar.gz (pja.so)
Linux x86 (32-bit) pja-0.1.0-linux-x86.tar.gz pja-0.1.0-zpaqstd-plugin-linux-x86.tar.gz (pja.so)
Linux arm64 pja-0.1.0-linux-arm64.tar.gz pja-0.1.0-zpaqstd-plugin-linux-arm64.tar.gz (pja.so)
macOS arm64 pja-0.1.0-macos-arm64.tar.gz pja-0.1.0-zpaqstd-plugin-macos-arm64.tar.gz (pja.dylib)
Windows x64 (7 and later) pja-0.1.0-windows-x64.zip pja-0.1.0-zpaqstd-plugin-windows-x64.zip (pja.dll)
Windows x86 (XP and later) pja-0.1.0-windows-x86.zip pja-0.1.0-zpaqstd-plugin-windows-x86.zip (pja.dll)

pja-0.1.0-zpaqstd.tar.gz has the plugin's sources as zpaq-std vendors them, with VENDOR.md. The command's archives carry pja (or pja.exe), the README, the license, NOTICE and the command's manual (CLI.md). Every binary is built and checked by CI on its own platform (.github/workflows/release.yml); SHA256SUMS has the checksums. The Linux builds need glibc 2.34 or later; the macOS ones are not signed (xattr -d com.apple.quarantine pja after unpacking).
Also checked before publishing, with these very binaries: Windows 10, 64-bit and 32-bit, the same streams as Linux for every sample of the repository and every file back (28 of 28 checks each, wildcards included); Windows XP SP3, 32-bit, every sample back byte for byte through wildcards from cmd (38 of 38); the 32-bit plugin on XP, every sample through a codec back (36 of 38; the other two, as designed, through none); the macOS plugin exports _zpaqstd_codecs_v1.