github AcademySoftwareFoundation/openexr v3.5.0

4 hours ago
  • Support for lossless compression via Zstandard

    • Introduces ZSTD_COMPRESSION/EXR_COMPRESSION_ZSTD enum
    • Features a custom data prep stage that includes ByteShuffle, optional Delta Encoding, and custom data reordering.
    • Universal lossless support: Works for all image types (including Deep) and supports all OpenEXR pixel/data types.
    • Deep image gains: Extensive testing with Deep scanlines shows a 20–30% size reduction compared to ZIPS based on image channels (with the best gains on Deep Alpha and Deep ID).
    • Flat image file size: Achieves comparable compressed sizes to ZIPS.
    • Flat image speed: Delivers slightly faster compression and decompression speeds compared to ZIPS
    • Introduces a new dependency on the zstd library; a vendored version (v1.5.7) is provided as a fallback if no installed version is present.
  • Support for lossy compression based on the High Throughput JPEG 2000 (HTJ2K) standard.

    • The LJ2K compressor uses the same JPEG 2000 constraints and codec library (OpenJPH) as HTJ2K256, but with lossy coding, producing smaller files at the cost of distortion.
    • LJ2K should generally offer reduced file sizes and higher throughput compared to DWA.
    • Currently supports 16-bit HALF, 32-bit FLOAT and 32-bit UINT channels. Lossy coding is currently applied only to RGB channels; other channels are losslessly coded.
    • The amount of distortion is controlled via a quality level parameter that ranges from 1 to 150.
    • As with DWA, lossy RGB channels are first transformed to a non-linear perceptual domain before coding. The transformation is log-based when the sample's magnitude is greater than 1, and power-law otherwise.
  • Improved support for the colorInteropID standard attribute as a mechanism to identify the color space of the RGB images:

    • Added support for colorInteropID to command-line tool exrstdattr.
    • Added API functions to validate color metadata in the header to both the C++ and core APIs.
    • Extended the exrinfo command-line tool to print warnings regarding header color metadata.
    • Added helper functions to convert between chromaticities and colorInteropID.
    • Added Python bindings for all new functions.
    • See An ID for Color Interop
      and Identifying the Color Space of OpenEXR Files for details.
  • Support for a cache for a (de)compression context in the core decode pipeline.

    • This is a backwards compatible change (i.e. older versions of code compiled against previous headers will still work), with the exception that it does add the requirement that application code actually use the provided initializer when defining exr_decode_pipeline_t objects.
  • For the OpenEXR python module:

    • Support for the idManifest attribute and object
    • Support for multithreaded read and write
    • Support for reading/writing from/to BytesIO object
    • Add setMaxImageSize/setMaxTileSize functions
  • Other changes:

    • AcesInputFile/AcesOutputFile and exr2aces as marked as deprecated and will be removed in a future release.
    • Improved handling of many channels
    • All Imath headers are now included internally via #include <Imath/...>
    • Remove iex_debugTrap() function (was not used)
    • Improved ChannelList Iterator API
    • Fixed a bug that with DWA compression that could silently produce corrupted files.
  • Also of note:

    • The vendored version of deflate is 1.26
    • The vendored version of OpenJPH is 0.32.0
    • The minimum required version of OpenJPH is 0.32.0

Security

This release addresses the following security vulnerabilities:

  • OSS-Fuzz 514487287 Floating-point-exception in part_exceeds_memory_limits
  • OSS-Fuzz 514423826 Divide-by-zero in part_exceeds_memory_limits
  • OSS-Fuzz 513282267 Timeout in openexr_exrgaps_fuzzer
  • OSS-Fuzz 512988066 Out-of-memory in openexr_exrgaps_fuzzer

See CHANGES.md for more details.

Contributors

Don't miss a new openexr release

NewReleases is sending notifications on new releases.