From 8ee775cbbf1ccc336cc92c45f621c886f91e8593 Mon Sep 17 00:00:00 2001 From: Todica Ionut Date: Tue, 11 Aug 2026 19:51:32 +0300 Subject: [PATCH 1/4] exrinput zstd Signed-off-by: Todica Ionut --- src/openexr.imageio/exrinput.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/openexr.imageio/exrinput.cpp b/src/openexr.imageio/exrinput.cpp index b830ed54b7..38bcf2f2fb 100644 --- a/src/openexr.imageio/exrinput.cpp +++ b/src/openexr.imageio/exrinput.cpp @@ -447,6 +447,9 @@ OpenEXRInput::PartInfo::parse_header(OpenEXRInput* in, #endif #ifdef IMF_HTJ2K32_COMPRESSION case Imf::HTJ2K32_COMPRESSION: comp = "htj2k32"; break; +#endif +#ifdef IMF_ZSTD_COMPRESSION + case Imf::ZSTD_COMPRESSION: comp = "zstd"; break; #endif default: break; } From ae9c471f9466886ca94d99fa3f9fa1b9572fbcc1 Mon Sep 17 00:00:00 2001 From: Todica Ionut Date: Tue, 11 Aug 2026 19:55:03 +0300 Subject: [PATCH 2/4] exrinput_c ZSTD Signed-off-by: Todica Ionut --- src/openexr.imageio/exrinput_c.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/openexr.imageio/exrinput_c.cpp b/src/openexr.imageio/exrinput_c.cpp index 1b2c56847a..8022568e66 100644 --- a/src/openexr.imageio/exrinput_c.cpp +++ b/src/openexr.imageio/exrinput_c.cpp @@ -577,6 +577,9 @@ OpenEXRCoreInput::PartInfo::parse_header(OpenEXRCoreInput* in, #endif #ifdef IMF_HTJ2K32_COMPRESSION case EXR_COMPRESSION_HTJ2K32: comp = "htj2k32"; break; +#endif +#ifdef IMF_ZSTD_COMPRESSION + case ZSTD_COMPRESSION: comp = "zstd"; break; #endif default: break; } From fc3b65344058425caedfcec92c26694e91f4a902 Mon Sep 17 00:00:00 2001 From: Todica Ionut Date: Tue, 11 Aug 2026 20:01:37 +0300 Subject: [PATCH 3/4] exroutput.cpp zstd Signed-off-by: Todica Ionut --- src/openexr.imageio/exroutput.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/openexr.imageio/exroutput.cpp b/src/openexr.imageio/exroutput.cpp index 3b3c29ffaa..f86aedabe6 100644 --- a/src/openexr.imageio/exroutput.cpp +++ b/src/openexr.imageio/exroutput.cpp @@ -950,6 +950,14 @@ OpenEXROutput::spec_to_header(ImageSpec& spec, int subimage, if (Strutil::istarts_with(comp, "zip")) { header.zipCompressionLevel() = (qual >= 1 && qual <= 9) ? qual : 4; } +#endif +#if OPENEXR_CODED_VERSION >= 30500 + // OpenEXR 3.5.0 and later allow us to pick the quality level. We've found + // that 5 is a great tradeoff between size and speed, so that is our + // default. + if (Strutil::istarts_with(comp, "zstd")) { + header.zstdCompressionLevel() = (qual >= 1 && qual <= 22) ? qual : 5; + } #endif if (Strutil::istarts_with(comp, "dwa") && qual > 0) { #if OPENEXR_CODED_VERSION >= 30103 @@ -1204,6 +1212,10 @@ OpenEXROutput::put_parameter(const std::string& name, TypeDesc type, #ifdef IMF_HTJ2K32_COMPRESSION else if (Strutil::iequals(str, "htj2k32")) header.compression() = Imf::HTJ2K32_COMPRESSION; +#endif +#ifdef ZSTD_COMPRESSION + else if (Strutil::iequals(str, "zstd")) + header.compression() = Imf::ZSTD_COMPRESSION; #endif } return true; From b2c87b3c02460d395957b9083a849c1c11774e11 Mon Sep 17 00:00:00 2001 From: Todica Ionut Date: Tue, 11 Aug 2026 20:10:25 +0300 Subject: [PATCH 4/4] builtinplugins.rst zstd Signed-off-by: Todica Ionut --- src/doc/builtinplugins.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/doc/builtinplugins.rst b/src/doc/builtinplugins.rst index 74a3cf3d06..7a99036efb 100644 --- a/src/doc/builtinplugins.rst +++ b/src/doc/builtinplugins.rst @@ -1566,8 +1566,9 @@ The official OpenEXR site is http://www.openexr.com/. * - ``compression`` - string - one of: ``"none"``, ``"rle"``, ``"zip"``, ``"zips"``, ``"piz"``, - ``"pxr24"``, ``"b44"``, ``"b44a"``, ``"dwaa"``, ``"dwab"``, ``"htj2k256"`` or ``"htj2k32"``. + ``"pxr24"``, ``"b44"``, ``"b44a"``, ``"dwaa"``, ``"dwab"``, ``"htj2k256"``, ``"htj2k32"`` or ``"zstd"``. (``"htj2k256"`` and ``"htj2k32"`` are only supported with OpenEXR 3.4 or later.) + (``"zstd"`` are only supported with OpenEXR 3.5 or later.) If the writer receives a request for a compression type it does not recognize or is not supported by the version of OpenEXR on the system, it will use ``"zip"`` by default. For ``"dwaa"`` and @@ -1577,6 +1578,9 @@ The official OpenEXR site is http://www.openexr.com/. compression, a level from 1 to 9 may be appended (the default is ``"zip:4"``), but note that this is only honored when building against OpenEXR 3.1.3 or later. + For ``"zstd"`` compression, a level from 1 to 22 may be appended (the default is + ``"zstd:5"``), but note that this is only honored when building + against OpenEXR 3.5.0 or later. * - ``textureformat`` - string - ``"Plain Texture"`` for MIP-mapped OpenEXR files, ``"CubeFace