Release Notes#

v0.12.0#

New Features:

  • Added decode and encode support for images with more than four components, up to the JPEG 2000 limit of 16384. Device and pinned memory scale linearly with the component count.

  • Added NVJPEG2K_STATUS_TILE_TOO_LARGE, returned by nvjpeg2kEncode when the encoded data of a tile exceeds 4 GB, the largest tile-part length the Psot field (ISO/IEC 15444-1 Table A.5) can express. Re-encode with smaller tiles. The values of the existing status codes are unchanged.

  • Added nvjpeg2kEncoderCreate, which creates an encoder that uses the allocators and memory padding of a library handle created by nvjpeg2kCreate or nvjpeg2kCreateV2. See the nvjpeg2kEncoderCreate() documentation for details, including the lifetime and thread-safety requirements.

  • Added nvjpeg2kDecodeParamsSetDecodeComponents to decode a subset of an image’s components. Most of the decoding work and device memory then scale with the number of components decoded rather than with the image’s component count. The whole codestream is still parsed, and each tile’s compressed data is still copied to the device in full.

Bug Fixes:

  • Hardened codestream parsing against malformed input. Most invalid streams are now rejected with NVJPEG2K_STATUS_BAD_JPEG.

  • Fixed decoding of progression order changes signaled across multiple tile-part headers (Annex A.6.6).

  • Fixed decoding of overlapping progression order changes (Annex A.6.6).

  • Improved validation of the handles passed to the C API.

  • Added validation of num_components in nvjpeg2kEncodeParamsSetNLTInfo against the component count configured through nvjpeg2kEncodeParamsSetEncodeConfig.

  • Improved validation of encode parameters. Values the encoder cannot handle are now rejected with NVJPEG2K_STATUS_INVALID_PARAMETER.

  • Images whose component dimensions do not match a supported subsampling factor are now rejected by nvjpeg2kEncodeParamsSetEncodeConfig with NVJPEG2K_STATUS_INVALID_PARAMETER.

  • Fixed a memory leak when nvjpeg2kEncodeStateCreate fails.

  • When an nvjpeg2k*Create* function fails, it now sets the caller’s handle to NULL instead of leaving it unchanged, so the handle can safely be passed to the matching *Destroy function.

  • Fixed nvjpeg2kStreamParse and nvjpeg2kStreamParseFile leaving the metadata of a previously parsed bitstream queryable when the new input is rejected before parsing starts.

  • Fixed a file handle leak when nvjpeg2kStreamParseFile fails.

  • Fixed a CUDA stream leak when nvjpeg2kDecodeStateCreate fails.

  • Added validation of the nvjpeg2kImage_t supplied to decode and encode. A NULL plane pointer, a pitch too small to hold one row of the corresponding component, or a pitch that is not a multiple of the size of pixel_type is now rejected with NVJPEG2K_STATUS_INVALID_PARAMETER.

  • Fixed integer overflows on images whose tile grid extends beyond 2^32 on the reference grid. Such images could report zero tiles and fail to parse, and a windowed decode could omit a tile.

  • Fixed tile grid handling for images with a non-zero tile grid origin (Annex B.3). Such images could previously report zero-sized tiles or fail to decode.

  • Fixed nvjpeg2kDecodeParamsSetDecodeArea returning incorrect pixels for images with a non-zero image origin. The decode area is now interpreted relative to the decoded image, as documented, so (0, 0) is the first decoded pixel rather than the reference grid origin.

  • Fixed nvjpeg2kStreamGetImageComponentInfo over-reporting a subsampled component’s dimensions on an image whose origin is not a multiple of that component’s XRsiz / YRsiz.

  • Fixed incorrect tile placement in the output for a subsampled component of a multi-tile image whose origin is not a multiple of that component’s XRsiz / YRsiz.

  • Fixed decoding of a Part 1 (non-HTJ2K) image failing with NVJPEG2K_STATUS_EXECUTION_FAILED when a tile contains no samples of a subsampled component.

Behavior Changes:

  • Progression order changes for a tile must now be signaled from its first tile-part header onwards (Annex A.6.6). Streams that do not are rejected with NVJPEG2K_STATUS_BAD_JPEG; they previously decoded with incorrect output.

  • nvjpeg2kEncodeParamsSetNLTInfo now requires num_components to be 0 or equal to the configured component count.

  • nvjpeg2kStreamGetResolutionComponentDim now returns NVJPEG2K_STATUS_INVALID_PARAMETER for a stream whose parse did not complete, matching the other nvjpeg2kStreamGet* functions. It previously returned NVJPEG2K_STATUS_SUCCESS with dimensions read from a partial parse.

  • nvjpeg2kDecodeParamsSetDecodeArea coordinates are relative to the decoded image rather than to the codestream’s reference grid. This only affects images with a non-zero XOsiz / YOsiz, where such an area previously had to be offset by the origin by hand (and an area starting at the first decoded pixel was rejected outright). Callers that compensated for this must drop the offset.

  • nvjpeg2kDecodeParamsSetDecodeArea now rejects an empty area (start >= end on either axis) with NVJPEG2K_STATUS_INVALID_PARAMETER. Such an area was previously accepted. Setting all four coordinates to 0 still disables the decode area.

  • nvjpeg2kStreamGetImageInfo now reports nvjpeg2kImageInfo_t::tile_width / tile_height as the nominal tile size XTsiz / YTsiz (Annex B.3), rather than XTsiz - XTOsiz / YTsiz - YTOsiz. Use nvjpeg2kStreamGetTileComponentDim for the actual size of a given tile, which differs from the nominal one wherever a tile is clipped by the image boundary.

  • The encoder now accepts images whose total codestream exceeds 4 GB. A single tile-part is still limited to 4 GB by the Psot field (ISO/IEC 15444-1 Table A.5).

  • nvjpeg2kEncodeParamsSetEncodeConfig now clears any previous NLT type 3 configuration, so nvjpeg2kEncodeParamsSetNLTInfo must be called again after it. Previously the old settings were kept. Without that call, the image is encoded without NLT type 3, and FP16 or FP32 input is rejected with NVJPEG2K_STATUS_INVALID_PARAMETER.

  • Forced RGB output (nvjpeg2kDecodeParamsSetRGBOutput) on a YCbCr stream with NLT type 3 is now rejected by the decode call with NVJPEG2K_STATUS_JPEG_NOT_SUPPORTED wherever the conversion would apply. Such a decode previously succeeded but returned the components unconverted, with 4:2:0 or 4:2:2 chroma left at its subsampled resolution in planes that had to be sized for the upsampled output.

  • A configuration that uses the irreversible (9/7) wavelet at a precision above 16 bits, which the encoder does not support, is now rejected by nvjpeg2kEncodeParamsSetEncodeConfig with NVJPEG2K_STATUS_JPEG_NOT_SUPPORTED instead of failing later in nvjpeg2kEncode.

  • With mct_mode set to 1, components 0 to 2 that differ in signedness are now rejected by nvjpeg2kEncodeParamsSetEncodeConfig with NVJPEG2K_STATUS_JPEG_NOT_SUPPORTED. Such images were previously encoded with incorrect output.

  • NVJPEG2K_QUALITY_TYPE_Q_FACTOR now applies the per-subband visual weights of the HTJ2K white paper’s Q-factor method, so the chroma and high-frequency subbands, to which the eye is least sensitive, are quantized more coarsely. Up to Q-factor 90, encoded images are typically 12 to 24% smaller at similar visual quality, or at better visual quality below Q-factor 40, with the savings tapering off toward Q-factor 97.

Platform Support:

  • CUDA 12 is not supported on RHEL 10, SLES 16 / openSUSE 16, Ubuntu 26.04, Debian 13, Fedora 44, Kylin 11, and Debian 12 on sbsa. Due to a packaging issue, CUDA 12 installers are provided for these distributions. They are not supported and can be ignored.

v0.11.0#

New Features:

  • nvjpeg2kDecodeParamsSetRGBOutput now converts YCbCr → RGB for 4:4:4 chroma subsampling when the JP2 color space is sYCC, in addition to the previously supported 4:2:2 and 4:2:0 subsampling ratios. Supported pixel types: NVJPEG2K_UINT8, NVJPEG2K_UINT16, NVJPEG2K_INT16.

  • Improved precision of YCbCr -> RGB color conversion for green channel, when image is encoded with sYCC and nvjpeg2kDecodeParamsSetRGBOutput is set to 1.

  • Fixed conversion when using nvjpeg2kDecodeParamsSetRGBOutput for signed types.

  • NLT type 3 (signed-magnitude binary complement, ISO/IEC 15444-2 Annex A.4.10) streams can now be decoded. Supported destination types:

    • NVJPEG2K_FP16 for streams with every component BDnlt = 16. The decoded sample is the IEEE-754 half whose bit pattern matches the inverse signed-magnitude integer.

    • NVJPEG2K_FP32 for streams with every component BDnlt \(\in \{16, 32\}\). BDnlt = 16 components are widened on-device via __half2float; BDnlt = 32 components are bit-reinterpreted as float.

    • Only HTJ2K codestreams with the reversible (5/3) wavelet transform are supported. NLT type 3 on a subset of components is also rejected.

  • New nvjpeg2kStreamGetComponentNLTInfo API exposes the per-component NLT type and BDnlt from the parsed marker.

  • NLT type 3 (signed-magnitude binary complement, ISO/IEC 15444-2 Annex A.4.10) streams can now be encoded. Supported input types:

    • NVJPEG2K_FP16 for input with every component BDnlt = 16. The half bit pattern is interpreted as the signed-magnitude integer the NLT type 3 forward transform expects.

    • NVJPEG2K_FP32 for input with every component BDnlt \(\in \{16, 32\}\).

    • Only HTJ2K codestreams with the reversible (5/3) wavelet transform are supported. All components must use NLT type 3 (mixing is rejected), and all NLT type 3 components must share the same BDnlt.

  • New nvjpeg2kEncodeParamsSetNLTInfo API configures per-component NLT type 3 encode settings.

  • The HT encoder now supports wide code blocks (code-block width up to 128) with the reversible (5/3) wavelet transform. This is currently supported only when NLT type 3 is enabled; plain (non-NLT) HTJ2K encode remains limited to a code-block width of 64.

Platform Support:

  • WSL installers are no longer supported. For the current list of supported distributions, see Platforms Supported.

v0.10.0#

New Features:

  • Images with Color Specification method = 3 can now be decoded.

  • Images with invalid number of tile partitions (one smaller than real value) can now be decoded.

  • HTJ2K images with refinement passes (significance propagation and magnitude refinement) can now be decoded.

  • HTJ2K decoding speed is increased by 10-50%, depending on image and hardware.

Breaking Changes:

  • nvjpeg2kEncodeParamsSetQuality has been removed, along with support for lossy encode in combination with reversible wavelet transform. Use nvjpeg2kEncodeParamsSpecifyQuality for lossy encode.

v0.9.1#

Bug Fixes:

  • Fixed a bit stuffing issue in the High Throughput JPEG 2000 encoder.

Deprecated Features:

  • nvjpeg2kEncodeParamsSetQuality is deprecated and will be removed in the next release.

  • Support for lossy encode in combination with reversible wavelet transform is deprecated and will be removed in the next release.

Breaking Changes:

  • nvJPEG2000 binaries for CUDA 11 are no longer supported.

v0.9.0#

New Features:

  • Added HT encoder support with optimized wavelet transform.

  • New quality settings added:
    • Quantization step.

    • Q-Factor (JPEG like quality).

    • New API (nvjpeg2kEncodeParamsSpecifyQuality) which allows to set it.

  • .jph file format is supported(note that nvJPEG2000 as of this release supports a single cleanup pass for HTJ2K decode).

  • CUDA 13 support.

  • Native support for Blackwell.

  • Fixed encoding error when working on tiny random images.

  • Additional definition for nvjpeg2kBitstreamType as nvjpeg2kBitstreamType_t has been added for consistency with rest of the APIs.

  • Additional definition for nvjpeg2kProgOrder as nvjpeg2kProgOrder_t has been added for consistency with rest of the APIs.

Deprecated Features:

  • nvjpeg2kEncodeParamsSetQuality is deprecated and will be removed in the next release.

  • Support for lossy encode in combination with reversible wavelet transform is deprecated and will be removed in the next release.

  • nvJPEG2000 binaries for CUDA 11 are deprecated and will be removed in the next release.

v0.8.1#

v0.8.0#

  • Tegra/Jetson support added.

  • Python wheels for installing nvJPEG2000 library through pip.

  • Decoder

    • Decoder supports interleaved output format. Can be enabled using nvjpeg2kDecodeParamsSetOutputFormat.

    • New API (nvjpeg2kStreamParseFile) which accepts file name as input has been added.

    • Number of layers that can be decoded increased from 20 to 32.

    • Bitstreams with COC marker can be decoded as long as the parameters are same across all components.

    • Fixed a bug which could cause the decoder to crash when multiple tiles and custom precincts are enabled with RPCL, PCRL, CPRL pogression orders.

  • Encoder

    • Custom precincts are supported. Set num_precincts_init (part of nvjpeg2kEncodeConfig_t)to valid no of precincts in precinct_width, and precinct_height.

    • Encoder accepts images in interleaved format. Can be enabled using nvjpeg2kEncodeParamsSetInputFormat.

  • Support for Centos/RHEL 7 is deprecated and will be dropped in future releases.

  • Breaking Changes

    • The following fields in nvjpeg2kEncodeConfig_t have been renamed -

      • precint_width renamed to precinct_width to fix typo.

      • precint_height renamed to precinct_height to fix typo.

      • enable_custom_precincts renamed to num_precincts_init to better reflect the behavior.

v0.7.5#

  • This release provides important security updates for CVE-2023-31027 and is recommended for all users.

  • Arm sbsa support added.

  • Inverse wavelet transform optimizations. Up to 20% improvement in single image decode throughput observed for RGB HTJ2K bitstreams.

  • Bitstreams with QCC marker can now be decoded.

  • Bitstreams with COM marker in the tile header can now be decoded.

v0.7.0#

  • High throughput JPEG 2000 code streams can now be decoded. All code-blocks have to be HT code-blocks with one HT set and no refinement.

  • CUDA 12 support - Binaries for both CUDA 11 and CUDA 12 are available.

  • Extended allocator support which accepts cuda streams and context information.

  • Memory Padding APIs for both pinned and device memory have been added.

  • Fixed multiple issues which were causing the decoder to hang or crash.

  • Fixed an issue which was causing the encoder to error out when compressing random data.

v0.6.0#

  • Decoder

    • 4k digital cinema profile support.

    • JPEG 2000 bitstreams with predictable termination enabled can be decoded.

    • Hopper(sm90) support is added.

    • Fixed an issue in the quantization information parser. This was causing decode output corruption in some cases.

    • Fixed a horizontal clipping issue seen with nvjpeg2kDecodeImage(), when an area of interest was decoded.

  • Encoder

    • Fixed an issue which was resulting in wrong output when no of components = 4 and mct mode was enabled.

v0.5.0#

  • Decoder

    • JPEG 2000 bitstreams with last partition length set to 0 can be decoded.

    • JPEG 2000 bitstreams with cdef jp2 header can be decoded.

    • Bitstream corruption checks have been relaxed.

  • Encoder

    • Multi-tile encoding.

    • All progression orders are supported.

    • Performance improvements for lossy encoding.

v0.4.0#

  • JPEG2000 encode support added. See Encoder for details.

  • Encode/Decode support added for 420/422 formats with alpha channel (yuva420p).

  • nvJPEG2000 is now available on WSL-Ubuntu.

v0.3.0#

  • Bitstreams with 422 and 420 chroma sub-sampling are supported.

  • RGB output support for images with 420 and 444 chroma sub-sampling.

  • New nvjpeg2kDecodeImage API added.

  • Inverse discrete wavelet transform performance improvements.

v0.2.0#

  • New API added for Tile/Resolution based decode.

  • Tiles can be partially decoded by specifying an area of interest.

  • Tiles with multiple partitions are supported.

  • All progression orders are supported.

  • Bitstreams with up to 20 layers can be decoded.

v0.1.0#

  • nvJPEG2000 is now available on Microsoft Windows 10 and Windows Server 2019.

  • Bitstreams with multiple tiles are now supported. Each tile can have a single tile partition.

  • RLCP progression order is supported.

  • Fixed an intermittent issue which was causing the library to produce incorrect decode output.

v0.0.1#

  • First release of the nvJPEG2000 library.

  • Refer to the NVIDIA nvJPEG2000 section of the documentation for the list of features supported.