| Index | index by Group | index by Distribution | index by Vendor | index by creation date | index by Name | Mirrors | Help | Search |
| Name: openhtj2k-devel | Distribution: openSUSE Tumbleweed |
| Version: 0.27.0 | Vendor: openSUSE |
| Release: 1.1 | Build date: Wed Nov 11 09:10:44 2026 |
| Group: Productivity/Graphics/Convertors | Build host: reproducible |
| Size: 40393 | Source RPM: openhtj2k-0.27.0-1.1.src.rpm |
| Packager: https://bugs.opensuse.org | |
| Url: https://github.com/osamu620/OpenHTJ2K | |
| Summary: Development files for openhtj2k | |
This package contains openhtj2k, an implementation of ITU-T Rec.814 | ISO 15444-15 (a.k.a. HTJ2K).
BSD-3-Clause
* Wed Nov 11 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.27.0:
Added:
* openhtj2k_decoder::is_truncated(): after a decode, whether the codestream
lacked data of the image, which then holds only the data there was. It is
true when the codestream ends before its EOC marker (a truncated file or
download), when a tile has no data, or when a packet or a code-block's data
runs past the bytes there are. Image libraries can use it to tell a partial
image from a whole one.
Fixed:
* A codestream cut short now decodes from the data it holds, wherever the cut
falls after the marker code of its first SOT marker segment, and one
warning reports it ("codestream ends before its EOC marker").
* A code-block length that runs over a tile-part boundary (a malformed
codestream) drops that code-block's data in the packet and decodes the
rest, with the "malformed input" warning as before; its bytes used to be
decoded in part, which failed the decode.
* Tue Nov 10 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.26.0:
Added:
* Qweights=flat (openhtj2k_encoder::set_qfactor_weights(1)) turns off the
visual weights of the Qfactor path, for scientific or other non-visual
data. Every subband weight is 1 at every Qfactor, so the steps are
MSE-optimal, as the guideline's are from Qfactor=97 up; without the MCT
every component is independent data with unit colour gain. The Qfactor
still sets the reference step, so a Qfactor gives larger files and smaller
errors: on an 8-bit RGB image, 28-54% more bits and 2.6-3.8 dB more PSNR at
Qfactor=30 to 90. The default, Qweights=visual, is unchanged.
estimate_qfactor --weights flat recovers the Qfactor of such files.
Changed:
* Qfactor on sub-sampled (4:2:0 or 4:2:2) colour input follows version 2.0 of
the JPEG Qfactor guideline, "Controlling JPEG 2000 image quality using a
single parameter (Qfactor)" (ISO/IEC JTC 1/SC 29/WG 1 N101553). Its chroma
weights include the gain of upsampling the component for display, 2 for
4:2:0 and 1.4142 for 4:2:2, on every subband including LL; the encoder used
the version 1.0 weights, which leave it out. Below Qfactor=97 the chroma
steps of such files are finer by up to 2 (4:2:0) or 1.4142 (4:2:2) times,
so the files are larger: a 1024x1024 4:2:0 test image grows by 41% at
Qfactor=30, 23% at 75 and 9% at 90. Output for gray, gray + alpha and 4:4:4
colour input, and all output without Qfactor, is byte-identical. The
experimental analytic weighting (Qcsf=mannos|daly) applies the same gain to
sub-sampled components. estimate_qfactor follows the new weights, so on a
sub-sampled file written by 0.25.0 or earlier it finds the Qfactor from the
luminance component only and reports a mismatch on the chroma components.
Fixed:
* On the single-tile reuse path (invoke_line_based_stream_reuse() and
invoke_line_based_direct() after enable_single_tile_reuse(true)), a frame
whose headers differed from the previous frame's could decode with the
previous frame's step sizes, packet order or line-decoder sizes. The
decoder rebuilt its reused structure only when a few header values changed
(SIZ, part of COD, the first QCD step size, and the numbers of COC, QCC and
RGN segments); it ignored the rest of the main header, the tile-part
headers and the resolution reduction. It now compares a hash of every
marker segment that shapes the tile, in the main header and the tile-part
headers, together with the reduction. A frame whose tile-part header gives
a component another number of decomposition levels, which 0.25.0 refused,
now decodes as well. Frames with unchanged headers reuse the structure as
fast as before (29.5 ms per 4K frame). (#545)
* Every source file includes the standard headers it uses, so the library and
tools build with standard libraries that no longer bring one header in
through another, such as the libc++ of current Emscripten releases
(std::strtoull in jpip_response.cpp).
* Thu Nov 05 2026 Bernhard M. Wiedemann <bwiedemann@suse.de>
- Update to 0.25.0:
* Library prints nothing; errors are exceptions, warnings go to a
message handler; internals are in namespace open_htj2k
* Hardened decoding of malformed and truncated input (bounded memory
and set-up work, out-of-bounds reads/writes, hangs)
* Encoder writes JP2 files; many encoder crash and overflow fixes
* Installs a CMake package: find_package(openhtj2k CONFIG)
* New OPENHTJ2K_TARGET_CPU option for portable x86-64 builds
* See https://github.com/osamu620/OpenHTJ2K/blob/v0.25.0/CHANGELOG
- Build with -DOPENHTJ2K_TARGET_CPU=generic instead of -march=native
to make the build reproducible and portable
- Drop openhtj2k-0.3.0-tiff.patch, merged upstream
* Mon Jun 01 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.19.0:
* New WebTransport browser viewer for live RFC 9828 streams
* Substantial encoder and decoder performance gains
* Broad WASM and JPIP-viewer improvements
* See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.19.0
* Tue Apr 28 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.18.5:
* Fix heap out-of-bounds access in tile-part dispatch
* See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.18.5
* Tue Apr 28 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.18.4:
* Fix heap buffer overflow vulnerability in PPM packet header parsing
* See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.18.4
* Fri Apr 24 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.18.3:
* https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.18.3
* Wed Apr 22 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.18.2:
* https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.18.2
* Mon Apr 20 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.15.1:
* HT block decoding stack buffer overflow
* https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.15.1
* Mon Apr 20 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.15.0:
* https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.15.0
* Tue Apr 14 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.14.0:
* See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.14.0
* Mon Apr 13 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.13.2:
* Closes the 3.9 ms live-vs-offline decode gap on M3 Max, bringing the live
RTP receiver from ~50 fps to ~60 fps on 4K 4:2:2 HT at 1.7 bpp with
- -threads 2
* Mon Apr 13 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.13.1:
* RTP receiver: Fix -DOPENHTJ2K_RTP=ON build on macOS
* Mon Apr 13 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.13.0:
See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.13.0
* Mon Apr 13 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.12.0:
See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.12.0
* Mon Apr 13 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.11.1:
* Update the RTP receiver capability claim from "sustains 4K @ 30 fps" to
"sustains 4K @ 60 fps on modern x86-64 with --threads 2", to reflect the
v4-perf work that shipped in 0.11.0
* Mon Apr 13 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.11.0:
See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.11.0
* Mon Apr 13 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.10.0:
See https://github.com/osamu620/OpenHTJ2K/releases/tag/v0.10.0
* Fri Apr 10 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.9.1:
* Fix Psot=0 backward EOC scan in j2k_tile_part::read()
(source/core/coding/coding_units.cpp) stepping by 2 bytes per iteration
instead of 1. The scan only inspected byte pairs starting at even offsets
within the tile-part body; codestreams whose 0xFF 0xD9 EOC marker happened
to land at an odd offset were silently mis-decoded, falling back to the
last two bytes, then over-advancing the input cursor by one byte and
producing SOT marker segment expected but D900 is found. Surfaced against
real-world 4K 4:2:2 1.7-bpp broadcast HTJ2K captures where roughly half of
all frames had an odd-offset EOC.
* Fri Apr 10 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.9.0:
Performance:
* HT block decoder: nibble-packed sigma representation for SPP/MRP passes,
replacing byte-per-sample storage; halves memory traffic in significance
propagation and magnitude refinement
* HT block decoder: branchless VLC unstuff eliminates short-circuit branches;
CTZ-based SPP/MRP with branchless bit importers halve branch misses
* HT block decoder: fused dequantize pass with vectorized kappa computation
and specialized 9/7 cascade; removes a separate dequant loop
* HT block decoder: vectorize Emax computation in cleanup decode
* AVX2: add 4-quad 16-bit decode path for HT block decoder
* AVX-512: expand coverage to FDWT vertical lifting and all color transform
functions (forward/inverse ICT and RCT)
* AVX-512: masked stores for vertical DWT tail columns, eliminating scalar
fallback for non-multiple-of-16 widths
* NEON: port nibble-packed sigma SPP/MRP, add irrev 5/3 (ATK) IDWT kernels
(horizontal and vertical), add 16-bit HT cleanup decode path (pLSB > 16)
* WASM: port nibble-packed sigma SPP/MRP to WASM SIMD decoder
* Vectorize PPM interleave output (SSE4.1 / NEON) and PGM/PGX byte-packing
in decoder CLI
* ThreadPool: lock-free get() via atomic index; skip pool overhead entirely
in single-threaded mode
* ThreadPool: replace std::queue<std::function<void()>> with a fixed-size
32 K-slot InlineTask ring buffer with cache-line aligned head/tail; eliminates
per-task heap allocation from std::deque chunk management and std::function
type-erased storage. 32-byte inline storage with memcpy fast path for
trivially-copyable lambdas (all hot-path captures); relocate-trampoline slow
path for non-trivial captures
* DWT batch path: eliminate per-tile per-level Xext / Yext copy buffer.
* In-place horizontal DWT now handles all rows (including the first and last
row of each tile) by prepending DWT_LEFT_SLACK = 8 floats and appending
DWT_RIGHT_SLACK = SIMD_PADDING = 32 floats of border slack to every
j2k_subband / j2k_resolution::i_samples allocation; the user-visible
pointer is offset by DWT_LEFT_SLACK. Removes a per-row memcpy round-trip
for the boundary rows
* DWT: replace scalar PSE-fill loops with constant-pattern SIMD reflection
(vpermps on AVX2 / AVX-512, vrev64q + vextq on NEON, i32x4_shuffle
on WASM SIMD); covers idwt_1d_row_inplace, idwt_1d_sr_inplace, and
fdwt_1d_sr_inplace. Drops the PSEo() modulo + branch on the hot path
* coding_units: flatten unique_ptr<unique_ptr<T>[]> double-indirection in
pband, subbands, precincts, and resolution to single-allocation
* flat arrays via operator new[] + placement-new (matching the existing
j2k_codeblock pattern). Reduces N+1 heap allocations to 1 per container
and improves cache locality
* coding_units: embed tagtree by value in j2k_precinct_subband,
eliminating two heap allocations per precinct-subband
* decoder: hoist per-tile scratch vectors (band_h, tile_x_off, tile_w,
row_ptrs, accum) out of the multi-tile scatter loop in
decode_line_based_stream; reduces O(numTiles.x × numTiles.y) heap
allocations to a constant 5
Bug Fixes:
* Fix AVX2 pack_i32_to_u8: signed values were incorrectly clamped to zero
by packus; now clamps via max(0) before packing
* Fix fused dequant SIMD overshoot race condition with branchless VLC/MEL
* Fix WASM wasm_u16x8_shl → wasm_i16x8_shl in 16-bit decode path
* Fix WASM 16-bit HT decode regression and DC level shift
* Fix intermittent DFS/ATK test failures: zero full stride×height in LL
resolution buffer
* Fix segfault when /dev/null used as decoder output
* Suppress all compiler warnings in native and WASM builds
* Fix four memory leaks on exception paths: ~j2k_tile_component now finalizes
line_dec / line_enc so aligned_mem_alloc'd sub-resources are released
even if finalize_*() was never called explicitly; init_line_decode
validates DWT direction before allocating state arrays (fail-fast);
create_compressed_buffer NULL-checks the realloc result instead of
losing the original pointer; the four decoder.cpp invoke variants
validate tile count before allocating raw new int32_t[] output buffers
(was leaking on the validation throw)
* coding_units: add RAII placement_new_array_guard<T> and apply it at all
five placement-new array construction sites (codeblocks, pband, subbands,
precincts, resolution); partial construction failures now unwind cleanly
instead of leaving the destructor calling ~T on uninitialized memory
* ThreadPool: replace silent ring overflow under NDEBUG (assert-only) with
a std::runtime_error throw in both push_task and push_batch; raise
RING_CAP from 8192 to 32768 to comfortably hold the worst-case 4K-tile
encode burst (a single precinct can enqueue ~5-8 K codeblock tasks
back-to-back via push_batch before workers begin draining)
WASM:
* Node.js v24 compatibility: rewrite module loader to evaluate Emscripten JS
as CJS via new Function(), pass .wasm binary directly via wasmBinary
option, bypassing Emscripten's fetch()-based loader
* Add ~137 WASM conformance tests (HT Profile 0, Profile 1, HiFi) using
node open_htj2k_dec.mjs decode + native imgcmp comparison
* Align index.html ESM exports with updated wrapper API
* Tue Apr 07 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.8.0:
New Features:
* Add JPH file format decoding with automatic colorspace detection. The decoder
now accepts .jph input files, parses the JP2 box structure (signature →
ftyp → jp2h → jp2c), extracts the embedded J2K codestream, and reads the
colr box EnumCS field. When EnumCS is 18 (YCbCr) and the output is PPM,
YCbCr→RGB conversion (BT.601) is applied automatically — no -ycbcr flag
needed. The explicit -ycbcr bt601|bt709 flag still overrides the
auto-detected standard.
* Move JPH box parsing (parse_jph_boxes, get_color_space) into the library
(jph.hpp / jph.cpp) and expose it via decoder.hpp; the app-layer
now calls the library API instead of duplicating box-parsing logic.
Performance:
* AVX-512 IDWT: add 9 new functions (idwt_avx512.cpp) covering horizontal
lifting (irrev 9/7 and rev 5/3) and vertical deinterleave / lifting steps;
dispatched when OPENHTJ2K_TRY_AVX2 && __AVX512F__ — falls back to AVX2
on non-AVX-512 x86-64 CPUs with no code change required
* NEON: vextq+carry optimization for horizontal IDWT eliminates per-row
boundary-extension copies; irrev 9/7 lossy: batch −8 %, streaming −34 %;
rev 5/3 lossless: −10 %
* AVX2: widen HT cleanup decode MagSgn path to full 256-bit in
ht_cleanup_decode, processing 8 coefficients per iteration instead of 4
* FDWT: optimize streaming cascade and adv_step_f to reduce per-row
overhead; add SIMD dispatch (AVX2/NEON) for the reversible 5/3 adv_step_f
vertical lifting step
Bug Fixes:
* Fix segfault on truncated JPH/J2K codestreams: guard box and marker
parsers against premature end-of-stream
* Fix streaming decoder vertical upsampling for subsampled components
(e.g. 4:2:0 / 4:2:2): chroma rows are now correctly replicated when the
output stride does not match the subsampled component height
* Fix scalar color transform fallback guard: condition now matches the
dispatch table order, preventing wrong-path selection on non-AVX2 / non-NEON
builds
WASM:
* Vectorize fused YCbCr→RGB color transforms and interleave step in
color_wasm.cpp using WASM SIMD 128-bit intrinsics; add
OPENHTJ2K_ENABLE_WASM_SIMD build flags for the new translation unit
* Add YCbCr→RGB conversion (BT.601 / BT.709) to the Node.js decoder CLI
(open_htj2k_dec.mjs)
* Auto-detect YCbCr colorspace from JPH inputs in index.html; update
dropzone UI with JPH support note and local-decode privacy text; promote
privacy notice to a standalone banner
* Tue Apr 07 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.7.1:
* Fix undefined behaviour in ht_magref_decode (scalar and NEON paths):
left-shifting a negative int32_t value is UB in C++; combined into a single
unsigned-arithmetic shift (static_cast<int32_t>((0xFFFFFFFEU | ...) <<
pLSB))
* Work around clang-18 code-generation bug: clang 18 miscompiles certain
inline functions in coding_units.cpp when building for AArch64 NEON,
producing wrong decoder output. Add -fno-inline to coding_units.cpp when
CMAKE_CXX_COMPILER_VERSION < 19 and the compiler is Clang. Clang 19+, GCC,
and MSVC are unaffected. All 445 conformance tests pass on both clang-18 and clang-20.
* Fix streaming encoder (-i file.pgx,...) rejecting subsampled (4:2:2, 4:2:0,
etc.) PGX inputs. PgxStreamReader now accepts component files whose
dimensions are integer sub-multiples of the luma component, computes the
correct XRsiz/YRsiz factors for the SIZ marker, seeks each chroma file to
the correct row (y / YRsiz), and skips redundant push_line_enc calls for
chroma on luma rows that carry no new chroma data.
* Tue Apr 07 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.7.0:
JPEG 2000 Part 2: DFS and ATK kernel support:
* Add encoder and decoder support for Part 2 Downsampling Factor Structures
(DFS) markers
* Add decoder support for arbitrary ATK (Arbitrary Transform Kernel) DWT
kernels: irreversible 9/7-based and reversible 5/3-based ATK
* Add scalar FDWT and AVX2 IDWT implementations for ATK kernels
* Add 5 conformance test cases for Part 2 DFS+ATK bitstreams (all pass)
* Fix AVX2 dequantize: use transformation == 1 (not truthy) to distinguish
lossless from ATK kernels (transformation >= 2 is lossy but truthy)
* Fix ATK finalize downshift: (transformation==1)?0:FRACBITS-bitdepth
* Fix bounds-safe color transform dispatch for ATK (transformation >= 2)
* Fix LL0 subband dimensions for DFS codestreams in streaming decode
* Fix ATK encode OOB color dispatch; add line-based DFS/ATK tests
Decoder:
* -reduce now respects DFS markers: the maximum reduce level is clamped to
the number of consecutive bidirectional DWT levels, preventing nonsensical
HONLY/VONLY reduced-resolution outputs
* Fix PPM output for subsampled (4:2:2) codestreams: the streaming path
correctly upsamples chroma with nearest-neighbour interpolation; the batch
write_ppm path uses a scalar fallback for mismatched component dimensions
* Add experimental -ycbcr bt601|bt709 flag: converts YCbCr to RGB during
PPM output using full-range ITU-R BT.601 or BT.709 coefficients
(fixed-point 2^14); handles 4:2:2 nearest-neighbour chroma upsampling;
applies to PPM output only
Encoder:
* Fix streaming (line-based) path for PGX input: a new PgxStreamReader
opens one file per component and reads rows on demand; previously PGX input
always triggered "Failed to open input file for streaming"
WASM:
* Fix 4:2:2 chroma subsampling in invoke_decoder_to_rgba() WASM wrapper
* Add YCbCr→RGB conversion buttons (BT.601 / BT.709) to the web demo at
https://htj2k-demo.pages.dev/
* Modernize button styling in the web demo
* Tue Apr 07 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.6.0:
WASM:
* Add invoke_decoder_stream() C export: streaming line-based decode via
callback, eliminating the 96 MB W×H×C int32 output buffer entirely
* Add invoke_decoder_to_rgba() C export: converts decoded samples to a
packed uint8/uint16 big-endian buffer inside WASM, eliminating the JS
per-sample pixel loop
* Add open_htj2k_dec.mjs: Node.js CLI decoder built on the WASM library;
supports J2C / J2K / JPH input, PGM / PPM / PGX output, --reduce,
- -num_threads, and --iter options
* Fix WASM SIMD build: add -O3 -flto to SIMD object compilation
* Fix open_htj2k_dec.mjs: compute correct output dimensions when --reduce > 0
* Update index.html to use the new streaming and RGBA export APIs
Performance (native):
* Fused MCT + finalize: color inverse transform and int32 output writeback
combined into a single pass, eliminating an intermediate float buffer
* In-place horizontal IDWT: eliminates ext_buf memcpy per row
* NEON: port lossy dequantize fast path; fix color_neon build failure
* NEON: 2× unroll idwt_level_src_fn interleave loop
* IDWT cascade: eliminate redundant get_dl / is_lp calls in hot loop
* AlignedLargePool: extend macOS support; route file I/O buffers through pool
Stack-allocate Eline / rholine scratch arrays; route large buffers through
* AlignedLargePool to reduce heap fragmentation
* Use aligned AVX2 loads (_mm256_load_ps) where 32-byte alignment is
guaranteed, replacing unaligned variants in hot DWT paths
Portability:
* Lower minimum compiler requirement from C++17 to C++11
* Replace all [[nodiscard]] / [[maybe_unused]] raw attributes with
OPENHTJ2K_NODISCARD / OPENHTJ2K_MAYBE_UNUSED macros that expand
to the real attributes under C++17 and to nothing under C++14/11
* Replace if constexpr with plain if in HT block decoding (all four
variants: generic, AVX2, NEON, WASM)
* ThreadPool: split pre-C++17 enqueue() into separate C++14 and C++11
branches using std::decay_t and typename std::decay<T>::type
respectively
* Remove pre-existing malformed #define[[maybe_unsed]] line in utils.hpp
* All three standard levels (C++11, C++14, C++17) verified
* Tue Apr 07 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.5.1:
WASM SIMD:
* Add color transform vectorization: new color_wasm.cpp with all 8
color transform functions (forward/inverse RCT and ICT, integer and
float-domain variants) implemented using WASM SIMD 128-bit intrinsics,
processing 4 elements per iteration
* Tue Apr 07 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.5.0:
WASM SIMD:
* Complete separation of WASM-SIMD from NEON: dedicated source files
(fdwt_wasm.cpp, idwt_wasm.cpp, ht_block_encoding_wasm.cpp,
ht_block_decoding_wasm.cpp) guarded solely by
OPENHTJ2K_ENABLE_WASM_SIMD; no NEON flag is used in WASM builds
* Translate HT block encoding and decoding to native WASM-SIMD intrinsics
(v128_t); encoder state classes in ht_block_encoding_wasm.hpp
* Add dedicated WASM fwd_buf implementation in ht_block_decoding.hpp
subprojects/CMakeLists.txt: compile library twice — scalar build
linked to libopen_htj2k.js, SIMD build linked to libopen_htj2k_simd.js
Performance:
* IDWT: eliminate redundant memcpy in idwt_level_src_fn; remove hp_tmp
scratch buffer; reduce streaming ring buffer depth from 12 to 8
* IDWT: vectorize LP/HP interleave with AVX2 (unpacklo/hi + permute2f128)
and NEON; vectorize 5/3 reversible vertical lifting steps with AVX2
* FDWT/IDWT: AVX2 and NEON odd-width interleave/deinterleave fixes
* Decoder finalization: AVX2 and NEON paths for float→int32 conversion
in decode_line_based_stream; NEON ds==0 fast path; 16-element/iter loop
* NEON: 2× unroll reversible vertical lifting steps and FDWT deinterleave
* DWT cascade: specialize 5/3 path; fix O(n²) scan-window growth
* HT block decoding: skip sigma stores for single-pass codeblocks;
skip redundant memset for single-pass codeblocks
* Allocation: eliminate per-codeblock allocation storm in
j2k_precinct_subband; replace per-strip and per-resolution allocation;
hoist tree_path vector out of per-codeblock loop; replace per-block
all_segments std::vector with stack array in htj2k_decode()
* ThreadPool: batch-push tasks, reserve marker list, combine ring buffer
and predecoded pool; pre-fault ring/prefetch buffers; reduce
task-queue thundering herd
* LB encoder: overlap DWT computation with HT block encoding
* Eliminate bulk ring_buf/prefetch_buf zeroing; zero only empty regions
* Replace scratch array memset with per-row 8-byte guard zeros
Fixes:
* Fix O(n²) scan window growth in DWT cascade 5/3 specialization
* Add include for std::swap in fdwt.cpp and idwt.cpp
* Tue Mar 31 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.4.1:
* Introduce a temporary workaround for the line-based validation test in
Windows ARM64.
* Tue Mar 31 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.4.0:
New APIs:
* Add invoke_line_based() decoder API: row-by-row output via callback
using per-subband ring buffers; avoids full-image intermediate allocation
* Add invoke_line_based_stream() decoder API: multi-tile scatter path
assembling full-width output rows from per-tile strip buffers
* Add encode_line_based_stream() encoder API: push-row streaming encoder
driven by a user-supplied source callback
* Add lb_compare utility to validate line-based output against invoke()
Architecture:
* Change sprec_t from int32_t to float: DWT pipeline now operates
natively in float32, eliminating integer↔float round-trip conversions
* fdwt_2d_state / idwt_2d_state: new stateful streaming DWT classes
that process one row at a time for the line-based encode/decode paths
* Line-based mode is now the default for encoder and decoder apps;
the previous full-image (batch) path is selected with the -batch flag
Performance:
* AVX2 horizontal DWT: 2× loop unrolling on all lifting step loops
* NEON: full float32 horizontal and vertical DWT kernels
* ICT/RCT color transforms: AVX2 and NEON variants with runtime dispatch
* LB decoder: pipeline MCT+clamp of row Y with pool pull of row Y+1,
achieving 18–23 % throughput improvement at T≥4 threads
* Encoder: per-thread cblk_data_pool bump allocator replaces per-block
malloc/free in the HTCOT hot path; PSE scratch buffer hoisted out
of per-tile DWT calls
Build / Tests:
* Decoder and encoder apps reject unknown command-line flag names
* Introduce OPENHTJ2K_EXPORT macro, removing duplicated __declspec
guards from encoder.hpp
* Add lb_stream_validation.cmake: conformance tests for
invoke_line_based_stream() across all HT profile-0/1 and HF bitstreams
* Remove redundant lb_* cmake test files (duplicate of non-lb equivalents);
* CTest count reduced from 480 to 277
* WASM: dark UI redesign, SIMD badge, decode-time display, GitHub link
* Mon Jan 19 2026 Michael Vetter <mvetter@suse.com>
- Update to 0.3.1:
* Add Windows ARM + MSVC support to CI workflow
* Mon Jul 28 2025 Michael Vetter <mvetter@suse.com>
- Add openhtj2k-0.3.0-tiff.patch:
make pkg-config based requires for the devel package actually
match our libtiff package
* Mon Jul 28 2025 Michael Vetter <mvetter@suse.com>
- Update to 0.3.0:
* SOVERSION is introduced for versioning of shared library
- Drop openhtj2k-0.2.9-soversion.patch
* Thu Jul 24 2025 Michael Vetter <mvetter@suse.com>
- Add openhtj2k-0.2.9-soversion.patch:
Add so versioning
* Mon Jul 07 2025 Michael Vetter <mvetter@suse.com>
- Update to 0.2.9:
* Fix bug for the wrong stride of dwt coefficients.
* Add HEAP32 into EXPORTED_RUNTIME_METHODS for was-build.
* Wed Nov 27 2024 Michael Vetter <mvetter@suse.com>
- Update to 0.2.8:
* Fix incorrect packet parsing for RPCL, PCRL, CPRL
* Introduce stride access into DWT
* Change cmake configuration for MinGW environments
* Fri Jun 14 2024 Michael Vetter <mvetter@suse.com>
- Update to 0.2.7:
* Refactor non-SIMD HT cleanup decoding
* Fix CMakeLists.txt for windows-latest runner (GitHub actions)
* Fix PGX parsing
* Thu Jun 13 2024 Michael Vetter <mvetter@suse.com>
- Update to 0.2.6:
* Fix unnecessary assignment of pass_length in packet header parsing
* Remove CR (=0xd) from the delimiter in imgcmp
* Fri Jan 19 2024 Michael Vetter <mvetter@suse.com>
- Update to 0.2.5:
* Fix memory leak in decoder with '-reduce' parameter greater
than actual DWT levels
* Fix buffer overrun with image width which is not multiple
of vector length in IDWT and block-decoding for ARM NEON
* Improve UI for WASM demo
* Enable WASM SIMD (using NEON)
* Fix wrong line break in encoder usage (#162)
* Fri Jan 19 2024 Michael Vetter <mvetter@suse.com>
- Update to 0.2.4:
* small fix for wasm wrapper
* Fri Jan 19 2024 Michael Vetter <mvetter@suse.com>
- Update to 0.2.3:
* Experimental support of emscripten
* Fix compilation error on aarch64 with gcc
* Small editorial changes
* Mon Nov 27 2023 Michael Vetter <mvetter@suse.com>
- Update to 0.2.2:
* Fix compilation errors in aarch64 and gcc 9 or earlier
* Mon Nov 13 2023 Michael Vetter <mvetter@suse.com>
- Update to 0.2.1:
* Add installation part to CMakeLists.txt (#154)
* Allow space between comma separated input file names
* Thu Nov 02 2023 Michael Vetter <mvetter@suse.com>
- Initial package of OpenHTJ2K 0.2 for openSUSE
/usr/include/open_htj2k /usr/include/open_htj2k/interface /usr/include/open_htj2k/interface/decoder.hpp /usr/include/open_htj2k/interface/encoder.hpp /usr/include/open_htj2k/interface/openhtj2k_message.hpp /usr/include/open_htj2k/interface/planar_output_desc.hpp /usr/lib64/cmake/openhtj2k /usr/lib64/cmake/openhtj2k/openhtj2k-config-version.cmake /usr/lib64/cmake/openhtj2k/openhtj2k-config.cmake /usr/lib64/cmake/openhtj2k/openhtj2k-targets-release.cmake /usr/lib64/cmake/openhtj2k/openhtj2k-targets.cmake /usr/lib64/libopenhtj2k.so /usr/lib64/pkgconfig/open_htj2k.pc
Generated by rpm2html 1.8.1
Fabrice Bellet, Thu Nov 12 22:37:20 2026