Release Notes#

v0.9.0#

New Features:

  • Added Zstandard decode support.

  • Added Deflate and Zstandard encode support.

  • Added nvtiffEncodeParamsSetPredictor() to select the encoder predictor.

  • nvtiffEncodeParamsSetTag() can now write arbitrary TIFF tags, except the image-layout tags nvTIFF writes itself. LONG8, SLONG8, and IFD8 field types require BigTIFF.

Performance Improvements:

  • Uncompressed (None) encode is faster, especially for single-strip, single-tile and large-strip output, which previously slowed down sharply as strip size grew.

  • LZW encode is up to 1.5x faster.

Breaking Changes:

  • nvCOMP versions earlier than 6.0 are no longer supported.

  • For Linux deb/rpm packages, libnvtiff.so and libnvtiff_static.a are now installed in <libdir>/libnvtiff0-cuda-<N>/ instead of libnvtiff0-{dev,devel}-cuda-<N>/ and libnvtiff0-static-cuda-<N>/.

Bug Fixes:

  • Improved consistency of error codes returned by the encoder.

  • Fixed issue where nvtiff.h did not compile as C.

  • Fixed issue where tiled JPEG encode failed, or wrote undersized edge tiles, when the image size was not a multiple of the tile size.

  • Fixed issue where striped encodes with horizontal differencing failed for images with 65536 or more rows.

  • Fixed CUDA misaligned-address error in tiled encodes of 8-bit RGBA input with horizontal differencing.

  • Fixed issue where LZW striles of 4 GiB or more produced corrupt output.

  • Fixed issue where the bitstream size and write functions reported a stale result after a failed nvtiffEncodeFinalize().

  • Fixed issue where a malformed NDPI JPEG with a truncated SOF component table was accepted as valid.

  • Fixed issue where the LZW decoder truncated lengths and offsets of large striles to 32-bit types.

  • Fixed issue where reusing an encoder for LZW with a predictor leaked GPU memory when the new batch had fewer images than the previous one.

Upcoming Changes:

  • The next release, 0.10, will include a redesign of the encode and metadata APIs to support additional features and better performance. Parts of the decode API and the layout of the public headers may change as well.

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.8.0#

New Features:

  • Decoder
    • PackBits-compressed TIFF decode is now supported, including striped and tiled images and ROI decode.

  • Encoder
    • Tiled output is now supported for uncompressed (None), LZW, and JPEG encodes through nvtiffEncodeParamsSetImageGeometry(). Tile width and height must be positive multiples of 16.

    • JPEG compression is now supported for unsigned 8-bit grayscale and RGB input through nvJPEG. JPEG options can be controlled with nvtiffEncodeParamsSetJpegOptions() and include quality, optimized Huffman coding, and RGB chroma subsampling.

    • JPEG output defaults to one full-height strip and uses quality 90, optimized Huffman disabled, and 4:2:0 chroma subsampling. None and LZW retain the existing approximately 8 KiB strip default.

Bug Fixes:

  • Encoder metadata writing no longer mutates inline strip/tile offsets when the same finalized encode result is written more than once.

  • Fixed tiled LZW corruption and CUDA alignment failures when compressed tiles expand beyond their raw size.

Performance Improvements:

  • LZW decode performance is improved for images with large strips/tiles.

  • Batched region decode reshape now handles non-uniform regions in a single batched launch, reducing overhead for ROI and strile decode workloads.

  • TIFF file output performance is improved across compression modes, with additional gains for single-strip and single-tile output.

Platform Support:

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

API Breaking Changes:

  • nvtiffStreamGetTagInfo() and nvtiffStreamGetTagValue() now take a generic uint16_t tag id and accept any TIFF tag (previously limited to three GeoTIFF tags of nvtiffTag_t).

  • The nvtiffStreamGetTagInfoGeneric and nvtiffStreamGetTagValueGeneric variants have been removed; their behavior is now provided by the canonical names above.

  • Images are now addressed by IFD offset: Every API that took a uint32_t image_id now takes a size_t ifd_offset (the byte offset of the IFD): nvtiffStreamGetImageInfo(), nvtiffStreamGetImageGeometry(), nvtiffStreamGetTagInfo(), nvtiffStreamGetTagValue(), nvtiffStreamGetNumberOfTags(), and nvtiffStreamHasTag(). Decode requests address images the same way through nvtiffDecodeRegion_t’s ifd_offset field. An ifd_offset of 0 resolves to the first IFD, so existing single-image call sites that passed 0 keep working. Any valid IFD offset is addressable directly, including SubIFDs.

  • Unified decode API: The separate single-image decode entry points are replaced by one offset/region-addressed call. nvtiffDecode() now takes a nvtiffDecodeParams_t plus an nvtiffImage_t array (one output descriptor per region) and a CUDA stream, and decodes the configured region set as a single batch. Regions are configured with the new nvtiffDecodeParamsSetRegions(); a fresh params object decodes the first full image. nvtiffDecodeCheckSupported() is the dry-run form (same inputs, no stream) and additionally accepts a NULL image_out as a request-only probe. An incompatible multi-region request is rejected with NVTIFF_STATUS_BATCH_INCOMPATIBLE rather than silently split.

  • Parsing is now lazy: nvtiffStreamParseFromFile() / nvtiffStreamParse() are renamed to nvtiffStreamOpenFromFile() / nvtiffStreamOpen() and validate only the TIFF header; each IFD is parsed on first access. Behavior change: a structural/content error in an individual IFD now surfaces as NVTIFF_STATUS_BAD_TIFF when that IFD is first accessed (a getter, chain traversal, or decode) rather than at open time. The error is cached so repeated access fails identically; nvtiffDecodeCheckSupported() can be used as a pre-flight probe.

  • Stream management: nvtiffStreamCreate has been removed, instead nvtiffStreamOpenFromFile() or nvtiffStreamOpen() allocate the handle. nvtiffStreamDestroy is renamed to nvtiffStreamClose().

  • Added: nvtiffStreamGetHeader(), returning nvtiffStreamHeader_t: the TIFF variant and the first image’s first_ifd_offset.

  • Added: nvtiffStreamGetNextIFDOffset(), for a single-step IFD chain walk. Reports “no image” (end of chain) with the NVTIFF_NO_IMAGE sentinel.

  • Removed: nvtiffStreamGetBitstreamOffset, nvtiffStreamGetNumImages, nvtiffStreamParseFromFileEx, nvtiffStreamParseEx, nvtiffStreamParseFromParentStream (SubIFDs are now reached by addressing their offset within the same stream). The previous decode entry points nvtiffDecodeImage, nvtiffDecodeImageEx, nvtiffDecodeRange, nvtiffDecodeParamsSetROI, and the old whole-file nvtiffDecode signature are removed, superseded by the unified nvtiffDecode() / nvtiffDecodeParamsSetRegions() described above.

v0.7.0#

New Features:

  • Decoder
    • Decoding planar JPEG images is now supported.

    • Parsing Hamamatsu NDPI images larger than 4GB is now supported.

    • Decoding Hamamatsu NDPI images with dimensions exceeding 65536 x 65536 is now supported.

    • The following new APIs have been added:
      • nvtiffStreamParseFromFileEx() - Extended parsing with pagination / bitstream offset support.

      • nvtiffStreamParseEx() - Extended parsing from memory with pagination / bitstream offset support.

      • nvtiffStreamParseFromParentStream() - Create child streams from a parent stream.

      • nvtiffStreamGetBitstreamOffset() - Get bitstream offset for an image.

      • nvtiffStreamGetNumberOfTags() - Get the number of tags for an image.

      • nvtiffStreamHasTag() - Check if a specific tag exists.

    • Generic IFD parsing/decoding (e.g. SubIFDs) is now possible with these new APIs.

Bug Fixes:

  • Fixed a bug in LZW decode for images created by a non-standard encoder.

  • Fixed minor bug related to BigTIFF IFD parsing.

  • JPEG hardware decoder is now properly enabled for very large images whose strips/tiles are smaller than 16k x 16k.

Performance Improvements:

  • Strip/tile loading optimizations
    • nvtiffDecodeImage() and nvtiffDecodeImageEx() are up to 2x faster, especially for images with many strips/tiles.

    • For maximal performance, nvtiffStreamParse() should be used in conjunction with page-locked (pinned) memory.

    • For small ROI in a very large image, memory-mapped buffers or nvtiffStreamParseFromFile() should be used.

  • LZW decoding optimizations
    • Updated kernels better utilize the GPU, leading to a 10-50% speedup in kernel time (not including strip/tile loading).

    • These optimizations respect CUDA green contexts.

  • Decoding ROIs in Hamamatsu NDPI images is now significantly faster and uses less memory due to a virtual tiling optimization.

Planned Deprecations:

  • In the next release, we plan on unifying the various decode APIs into a single API, which would support batched decoding, ROI, format conversion, and combinations of these features. This means that nvtiffDecode(), nvtiffDecodeRange(), nvtiffDecodeImage(), nvtiffDecodeImageEx(), and nvtiffDecodeParamsSetROI() would all be removed.

  • nvtiffDecodeCheckSupported() will have a modified signature to align with the new decode API.

  • nvtiffTag_t and APIs using it will be deprecated. These APIs will be replaced by their generic tag variants.

v0.6.0#

New features:

nvtiffGetProperty() API to retrieve nvTIFF version.

  • Decoder
    • Empty JPEG strips/tiles are filled with white pixels as described in https://openslide.org/formats/philips/.

    • The following new APIs have been added:
    • Horizontal predictor now works with signed integer data type.

  • Encoder
    • The following new APIs have been added:
    • Horizontal differencing predictor is now available and enabled by default, which improves compression ratios for LZW-encoded TIFFs.

Bug Fixes:

  • Fixed a misaligned memory access error which could happen when decoding uncompressed images with multiple planes.

  • nvTIFF is now more robust when decoding malformed TIFF bitstreams and metadata.

  • Encoder now correctly writes TIFF files containing a single strip.

  • Encoder now returns an error if there is not enough memory, instead of potentially looping indefinitely.

  • Encoder now properly writes Big TIFF files.

Performance improvements:

  • Encoder now uses significantly (~10x) less memory and runs faster (~1.5 to 3x).

Breaking Changes:

  • nvTIFF binaries for CUDA 11 are no longer supported.

  • The following APIs have been removed -

nvtiffStreamGetFileInfo(nvtiffStream_t tiff_stream, nvtiffFileInfo_t *file_info);

nvTiffEncodeCtx_t *nvTiffEncodeCtxCreate(int dev,
                unsigned int imagesMax,
                unsigned int stripsPerImageMax,
                size_t memLimit=0);

void nvTiffEncodeCtxDestroy(nvTiffEncodeCtx_t *ctx);

int nvTiffWriteFile(const char *fname,
                int tiffVer,
                unsigned int nImages,
                unsigned int nrow,
                unsigned int ncol,
                unsigned int rowsPerStrip,
                unsigned short samplesPerPixel,
                unsigned short *bitsPerSample,
                unsigned int photometricInt,
                unsigned int planarConf,
                unsigned long long *stripSize,
                unsigned long long *stripOffs,
                unsigned char      *stripData,
                unsigned short sampleFormat);

int nvTiffEncode(nvTiffEncodeCtx_t *ctx,
                unsigned int nrow,
                unsigned int ncol,
                unsigned int pixelSize,
                unsigned int rowsPerStrip,
                unsigned int nImages,
                unsigned char **images_d,
                unsigned long long stripAllocSize,
                unsigned long long *stripSize_d,
                unsigned long long *stripOffs_d,
                unsigned char      *stripData_d,
                cudaStream_t stream=0);

int nvTiffEncodeFinalize(nvTiffEncodeCtx_t *ctx,
                cudaStream_t stream);

v0.5.1#

New features:

  • CUDA 13 support.

  • Fixed an issue in nvtiffEncodeParamsSetGeoKeyDOUBLE API observed with certain Geokeys of type double.

  • Fixed an issue with nvtiffStreamGetGeoKeyDOUBLE API observed when retrieving data from a non-zero start offset.

  • Improved error handling in nvtiffDecode API when the tiff file does not have any image data.

Deprecated Features:

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

  • The following APIs are deprecated and will be removed in the next release. Use APIs defined in the Encode API Reference section for TIFF encode.

nvtiffStreamGetFileInfo(nvtiffStream_t tiff_stream, nvtiffFileInfo_t *file_info);

nvTiffEncodeCtx_t *nvTiffEncodeCtxCreate(int dev,
                unsigned int imagesMax,
                unsigned int stripsPerImageMax,
                size_t memLimit=0);

void nvTiffEncodeCtxDestroy(nvTiffEncodeCtx_t *ctx);

int nvTiffWriteFile(const char *fname,
                int tiffVer,
                unsigned int nImages,
                unsigned int nrow,
                unsigned int ncol,
                unsigned int rowsPerStrip,
                unsigned short samplesPerPixel,
                unsigned short *bitsPerSample,
                unsigned int photometricInt,
                unsigned int planarConf,
                unsigned long long *stripSize,
                unsigned long long *stripOffs,
                unsigned char      *stripData,
                unsigned short sampleFormat);

int nvTiffEncode(nvTiffEncodeCtx_t *ctx,
                unsigned int nrow,
                unsigned int ncol,
                unsigned int pixelSize,
                unsigned int rowsPerStrip,
                unsigned int nImages,
                unsigned char **images_d,
                unsigned long long stripAllocSize,
                unsigned long long *stripSize_d,
                unsigned long long *stripOffs_d,
                unsigned char      *stripData_d,
                cudaStream_t stream=0);

int nvTiffEncodeFinalize(nvTiffEncodeCtx_t *ctx,
                cudaStream_t stream);

v0.5.0#

New features:

  • Native support for Blackwell.

  • Decoder
    • JPEG 2000 compression is supported (via nvJPEG2000).

    • Generic APIs to retrieve any tag contents from a TIFF file.

  • Encoder
    • New version of the encoder APIs with the following features -
      • Ability to reuse nvtiffEncoder_t object when compressing multiple TIFF files.

      • Support for geotiff meta data.

Deprecated Features:

  • The following APIs are deprecated and will be removed in the next release

nvtiffStreamGetFileInfo(nvtiffStream_t tiff_stream, nvtiffFileInfo_t *file_info);

nvTiffEncodeCtx_t *nvTiffEncodeCtxCreate(int dev,
                unsigned int imagesMax,
                unsigned int stripsPerImageMax,
                size_t memLimit=0);

void nvTiffEncodeCtxDestroy(nvTiffEncodeCtx_t *ctx);

int nvTiffWriteFile(const char *fname,
                int tiffVer,
                unsigned int nImages,
                unsigned int nrow,
                unsigned int ncol,
                unsigned int rowsPerStrip,
                unsigned short samplesPerPixel,
                unsigned short *bitsPerSample,
                unsigned int photometricInt,
                unsigned int planarConf,
                unsigned long long *stripSize,
                unsigned long long *stripOffs,
                unsigned char      *stripData,
                unsigned short sampleFormat);

int nvTiffEncode(nvTiffEncodeCtx_t *ctx,
                unsigned int nrow,
                unsigned int ncol,
                unsigned int pixelSize,
                unsigned int rowsPerStrip,
                unsigned int nImages,
                unsigned char **images_d,
                unsigned long long stripAllocSize,
                unsigned long long *stripSize_d,
                unsigned long long *stripOffs_d,
                unsigned char      *stripData_d,
                cudaStream_t stream=0);

int nvTiffEncodeFinalize(nvTiffEncodeCtx_t *ctx,
                cudaStream_t stream);

v0.4.0#

New features:

  • Support for arm sbsa and jetson.

  • Python wheels (binaries only) are available on PyPI.

  • nvtiffStreamParse() API added to support TIFF files already on host memory.

  • nvtiffDecodeImage() API added which can decode a single image from a TIFF file. It also supports region of interest for decoding and also provides the ability to select output format.

Breaking Changes:

  • nvtiff-*.whl which was posted as part of nvTIFF github samples is no longer supported. Python API support for nvTIFF will be available in a future nvImageCodec release.

  • CentOS 7 is no longer supported.

v0.3.1#

v0.3.0#

New features:

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

  • APIs to retrieve GeoTIFF metadata.

  • TIFF files with the following characteristics can now be decoded -

    • TIFF files with multiple images having different properties.

    • Pixel data can be organized as tiles.

    • Planar Configuration can now be Planar Separate.

    • Up to 8 samples per pixel in Planar Contiguous mode.

    • JPEG compression (via nvJPEG).

    • Color space can be Palette or Transparency Mask.

Breaking Changes:

  • nvTiff.h renamed to nvtiff.h

  • Following APIs have been dropped

    • nvTiffFile_t *nvTiffOpen

    • void nvTiffClose

    • void nvTiffDumpRaw

    • void nvTiffPrint

    • void nvTiffH2DAsync

    • int nvTiffDecode

    • int nvTiffDecodeRange

    • int nvTiffDecodeRange

v0.2.0#

New features:

  • New API added to support zlib decode with nvCOMP Library.

  • Encoder/Decoder supports 16bit and fp32 pixel formats.

  • Hopper (sm90) support is added.

Deprecated Features:

The following APIs will be removed in next release

  • nvTiffFile_t NVTIFFAPI *nvTiffOpen

  • void NVTIFFAPI nvTiffClose

  • void NVTIFFAPI nvTiffDumpRaw

  • void NVTIFFAPI nvTiffPrint

  • void NVTIFFAPI nvTiffH2DAsync

  • int NVTIFFAPI nvTiffDecode

  • int NVTIFFAPI nvTiffDecodeRange

  • int NVTIFFAPI nvTiffDecodeRange

Note

This release tar ball / Windows files will be updated to new installer packages soon.

v0.1.0#

  • First release of the nvTIFF library.

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