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 bynvjpeg2kEncodewhen 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 bynvjpeg2kCreateornvjpeg2kCreateV2. See thenvjpeg2kEncoderCreate()documentation for details, including the lifetime and thread-safety requirements.Added
nvjpeg2kDecodeParamsSetDecodeComponentsto 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_componentsinnvjpeg2kEncodeParamsSetNLTInfoagainst the component count configured throughnvjpeg2kEncodeParamsSetEncodeConfig.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
nvjpeg2kEncodeParamsSetEncodeConfigwithNVJPEG2K_STATUS_INVALID_PARAMETER.Fixed a memory leak when
nvjpeg2kEncodeStateCreatefails.When an
nvjpeg2k*Create*function fails, it now sets the caller’s handle toNULLinstead of leaving it unchanged, so the handle can safely be passed to the matching*Destroyfunction.Fixed
nvjpeg2kStreamParseandnvjpeg2kStreamParseFileleaving the metadata of a previously parsed bitstream queryable when the new input is rejected before parsing starts.Fixed a file handle leak when
nvjpeg2kStreamParseFilefails.Fixed a CUDA stream leak when
nvjpeg2kDecodeStateCreatefails.Added validation of the
nvjpeg2kImage_tsupplied to decode and encode. ANULLplane pointer, a pitch too small to hold one row of the corresponding component, or a pitch that is not a multiple of the size ofpixel_typeis now rejected withNVJPEG2K_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
nvjpeg2kDecodeParamsSetDecodeAreareturning 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
nvjpeg2kStreamGetImageComponentInfoover-reporting a subsampled component’s dimensions on an image whose origin is not a multiple of that component’sXRsiz/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_FAILEDwhen 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.nvjpeg2kEncodeParamsSetNLTInfonow requiresnum_componentsto be 0 or equal to the configured component count.nvjpeg2kStreamGetResolutionComponentDimnow returnsNVJPEG2K_STATUS_INVALID_PARAMETERfor a stream whose parse did not complete, matching the othernvjpeg2kStreamGet*functions. It previously returnedNVJPEG2K_STATUS_SUCCESSwith dimensions read from a partial parse.nvjpeg2kDecodeParamsSetDecodeAreacoordinates are relative to the decoded image rather than to the codestream’s reference grid. This only affects images with a non-zeroXOsiz/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.nvjpeg2kDecodeParamsSetDecodeAreanow rejects an empty area (start >= endon either axis) withNVJPEG2K_STATUS_INVALID_PARAMETER. Such an area was previously accepted. Setting all four coordinates to 0 still disables the decode area.nvjpeg2kStreamGetImageInfonow reportsnvjpeg2kImageInfo_t::tile_width/tile_heightas the nominal tile sizeXTsiz/YTsiz(Annex B.3), rather thanXTsiz - XTOsiz/YTsiz - YTOsiz. Usenvjpeg2kStreamGetTileComponentDimfor 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).
nvjpeg2kEncodeParamsSetEncodeConfignow clears any previous NLT type 3 configuration, sonvjpeg2kEncodeParamsSetNLTInfomust 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 withNVJPEG2K_STATUS_INVALID_PARAMETER.Forced RGB output (
nvjpeg2kDecodeParamsSetRGBOutput) on a YCbCr stream with NLT type 3 is now rejected by the decode call withNVJPEG2K_STATUS_JPEG_NOT_SUPPORTEDwherever 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
nvjpeg2kEncodeParamsSetEncodeConfigwithNVJPEG2K_STATUS_JPEG_NOT_SUPPORTEDinstead of failing later innvjpeg2kEncode.With
mct_modeset to 1, components 0 to 2 that differ in signedness are now rejected bynvjpeg2kEncodeParamsSetEncodeConfigwithNVJPEG2K_STATUS_JPEG_NOT_SUPPORTED. Such images were previously encoded with incorrect output.NVJPEG2K_QUALITY_TYPE_Q_FACTORnow 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:
nvjpeg2kDecodeParamsSetRGBOutputnow 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
nvjpeg2kDecodeParamsSetRGBOutputis set to 1.Fixed conversion when using
nvjpeg2kDecodeParamsSetRGBOutputfor 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_FP16for streams with every componentBDnlt = 16. The decoded sample is the IEEE-754 half whose bit pattern matches the inverse signed-magnitude integer.NVJPEG2K_FP32for streams with every componentBDnlt\(\in \{16, 32\}\).BDnlt = 16components are widened on-device via__half2float;BDnlt = 32components are bit-reinterpreted asfloat.Only HTJ2K codestreams with the reversible (5/3) wavelet transform are supported. NLT type 3 on a subset of components is also rejected.
New
nvjpeg2kStreamGetComponentNLTInfoAPI exposes the per-component NLT type andBDnltfrom 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_FP16for input with every componentBDnlt = 16. The half bit pattern is interpreted as the signed-magnitude integer the NLT type 3 forward transform expects.NVJPEG2K_FP32for input with every componentBDnlt\(\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
nvjpeg2kEncodeParamsSetNLTInfoAPI 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:
nvjpeg2kEncodeParamsSetQualityhas been removed, along with support for lossy encode in combination with reversible wavelet transform. Usenvjpeg2kEncodeParamsSpecifyQualityfor lossy encode.
v0.9.1#
Bug Fixes:
Fixed a bit stuffing issue in the High Throughput JPEG 2000 encoder.
Deprecated Features:
nvjpeg2kEncodeParamsSetQualityis 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
nvjpeg2kBitstreamTypeasnvjpeg2kBitstreamType_thas been added for consistency with rest of the APIs.Additional definition for
nvjpeg2kProgOrderasnvjpeg2kProgOrder_thas been added for consistency with rest of the APIs.
Deprecated Features:
nvjpeg2kEncodeParamsSetQualityis 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#
This release provides important security updates for CVE-2024-0142, CVE-2024-0143, CVE-2024-0144, CVE-2024-0145 and is recommended for all users.
To view any published security bulletins for NVIDIA products, see the NVIDIA product security page (https://www.nvidia.com/en-us/security/).
For more information regarding NVIDIA’s security vulnerability remediation policies, see (https://www.nvidia.com/en-us/security/psirt-policies/)
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 ofnvjpeg2kEncodeConfig_t)to valid no of precincts inprecinct_width, andprecinct_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_thave been renamed -precint_widthrenamed toprecinct_widthto fix typo.precint_heightrenamed toprecinct_heightto fix typo.enable_custom_precinctsrenamed tonum_precincts_initto better reflect the behavior.
v0.7.5#
This release provides important security updates for CVE-2023-31027 and is recommended for all users.
To view any published security bulletins for NVIDIA products, see the NVIDIA product security page (https://www.nvidia.com/en-us/security/).
For more information regarding NVIDIA’s security vulnerability remediation policies, see (https://www.nvidia.com/en-us/security/psirt-policies/)
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.