Skip to content

v3.4.0

Latest
Compare
Choose a tag to compare
@cary-ilm cary-ilm released this 05 Sep 17:36
· 5 commits to main since this release
v3.4.0

OpenEXR v3.4 introduces a new, additional compression option to the OpenEXR file format for lossless compression with High Throughput JPEG-2000 (HTJ2K) encoding:

  • A new HTJ2K compressor uses the High-Throughput (HT) block coder. It supports the full range of OpenEXR features, including 16-bit and 32-bit floating-point image channels, both scanline and tiled.

  • The HT block coder is standardized in Rec. ITU-T T.814 and ISO/IEC 15444-15. It is royalty-free, widely used in cinema and distribution servicing, and implemented in both commercial and open-source toolkits.

  • In experiments, we've found that HTJ2K produces smaller files, and depending on the nature of the image data, is one of the fastest compression types available in OpenEXR.

  • Integration with OpenEXR uses the OpenJPH open-source library. For ease in managing the dependency, the OpenEXR CMake configuration supports automatically fetching and building OpenJPH internally, or linking against an external installation.

  • OpenEXR supports two new compression types with distinct space/time trade-offs:

    • htj2k256 -- encodes/decodes chunks of 256 scanlines, producing slightly smaller file size than htj2k32.

    • htj2k32 -- encodes/decodes chunks of 32 scanlines, better suited to multi-threading, so it offers significantly faster encoding and decoding (4-6x in some cases) than htj2k256, with a slight increase in file size.

  • All existing OpenEXR compression options remain unchanged. This new feature simply extends the range of compression types available.

  • Software compiled with OpenEXR v3.4 will be able to read HTJ2K compressed OpenEXRs without any code changes. Software that writes files may automatically support the new type, but may need a small update to make the new type available as a user option.

  • ⚠️ This is a backwards-compatible extension to the OpenEXR file format. Files written with OpenEXR v3.4 will be readable by applications built against previous releases, unless they use the new htj2k32 or htj2k256 compression options.

  • ⚠️ This feature was first introduced for evaluation in February, 2025 via the htj2k-beta branch with a single 256 scanlines/chunk compression option, with the 32-scanline option added more recently. Application software written during this evaluation period will need to change IMF_HTJ2K_COMPRESSION to IMF_HTJ2K256_COMPRESSION, although files written with the earlier evaluation version should still read properly.

Other New Features:

  • New colorInteropID standard attribute

  • New bytes attribute type

    • Designed to hold an arbitrary binary blob of metadata.

    • The OpenEXR library forces no interpretations of the attribute contents; it is strictly application-dependent.

    • The attribute also holds a typeHint string which applications can use to suggest the intended interpretation of the contents,
      but it is strictly informational.

  • 🔧 TBB as a global thread provider

    • A new cmake option -DOPENEXR_USE_TBB=ON switches the internals of the thread pool to use TBB by default.
    • Building with this option adds a link dependency on the OneAPI TBB distribution.
  • 🔧 Vendored libdeflate

    • OpenEXR v3.4 now ships with a bundled distribution of the libdeflate library, replacing the previous "auto-fetch" mechanism.
    • By default, building OpenEXR will use a system installation of libdeflate as before, but if none is found, the build will use the internal copy of libdeflate.
    • Use -DOPENEXR_USE_INTERNAL_DEFLATE=ON to force the use of the internal vendored version.

Bug fixes:

  • 🐛 Using openexr via cmake add_subdirectory now works properly.

Changes to the OpenEXR Python module:

  • 🐍 🐛 The Python module now allows an empty part name for a single-part file
  • 🐍 🐛 The header_only option for Python module's OpenEXR.File now works properly.
  • 🐍 📦 ⚠️ pypi distributions now add support for Python 3.13 and drop support for Python 3.7.