Release Notes#

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 Platforms Supported.

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.

    • Upto 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.