OpenImageIO v2.2.6.1 Release Notes

Release Date: 2020-09-01 // over 3 years ago
  • ๐Ÿš€ Release 2.2 (1 Sept 2020) -- compared to 2.1

    ๐Ÿ†• New minimum dependencies:

    • pybind11 >= 2.4.2
    • ๐Ÿ‘ openjpeg >= 2.0 (if JPEG-2000 support is desired) #2555 (2.2.2)

    ๐Ÿ†• New major features and public API changes:

    • ๐Ÿ‘Œ Improved IOProxy support:
      • ImageInput and ImageOutput now have direct API level support for IOProxy
        in their open() and create() calls, as well as a new set_ioproxy()
        method in these classes. #2434 (2.2.0)
      • ImageBuf can now specify a proxy upon construction for reading, and for
        writing via a set_write_ioproxy() method that applies to subsequent
        write call. #2477 (2.2.1).
      • DPX input now supports IOProxy. #2659 #2665 (2.2.5)
      • ImageCache (and ImageBuf backed by ImageCache) entries that use IOProxy
        are careful not to fully "close" their proxies when trying to reclaim
        space in the file cache (that would be bad, since the proxy can't be
        re-opened). #2666 (2.2.5)
    • ๐Ÿ‘Œ Improved support for multi-subimage files:
      • oiiotool: Nearly all operations now allow an optional :subimages=...
        modifier that restricts the operation to be performed on only a subset
        ๐Ÿ‘€ of named or indexed subimages. See docs for details. #2582
      • Python ImageBuf.write() variety added that takes an open
        ImageOutput. This is the key to writing a multi-subimage file (such
        as a multi-part OpenEXR) using the Python ImageBuf interface. #2640
        (2.2.4)
      • Fixes to --croptofull and -o with multi-subimages. #2684 (2.2.6)
    • Python bindings:
      • Python bindings have been added for missing ParamValue constructors.
        We previously exposed the PV constructors from just a plain int, float,
        or string, but there wasn't an easy way to construct from arbitrary
        data like there is in C++. Now there is. #2417 (2.2.0)
      • ParamValueList.attribute(), when being passed attributes containing
        multiple values, now can have those values passed as Python lists and
        numpy arrays (previously they had to be tuples). #2437 (2.1.11/2.2.0)
      • ImageBufAlgo.color_range_check() is now available to the Python
        bindings (was previously only C++). #2602 (2.2.3)
      • New variety of ImageBuf.write() that takes an open ImageOutput.
        This is the key to writing a multi-subimage file (such as a multi-part
        OpenEXR) using the Python ImageBuf interface. #2640 (2.2.4)
    • ImageBuf:
      • Easier direct use of IOProxy with ImageBuf: constructor and reset()
        for file-reading ImageBuf now take an optional IProxy* parameter,
        and a new set_write_ioproxy() method can supply an IOProxy for
        subsequent write(). #2477 (2.2.1)
      • Add ImageBuf::setpixel() methods that use cspan instead of ptr/len.
        #2443 (2.1.10/2.2.0)
      • Add "missing" reset() varieties so that every IB constructor has a
        corresponding reset() with the same parameters and vice versa. #2460
    • ImageBufAlgo:
      • New repremult() is like premult, but will not premult when alpha is
        zero. #2447 (2.2.0)
      • New max() and min() functions take the pixel-by-pixel maximum
        or minimum of two images. #2470 (2.2.1)
    • ColorConfig: add OCIO "role" accessors. #2548
    • ๐Ÿ‘ Low-res I/O of images to terminals that support full color and Unicode
      characters. Just output to a file ending in ".term", and it will convert
      (on certain terminals) to an image displayed directly in the terminal.
      #2631 (2.2.4)
      Try:
      oiiotool myfile.exr -o out.term

    ๐ŸŽ Performance improvements:

    • ๐ŸŽ Greatly improved TextureSystem/ImageCache performance in highly threaded
      situations where access to the cache was a main bottlenecks. In renders of
      scenes with lots of texture access, with dozens of threads all contending
      ๐Ÿ‘€ for the cache, we are seeing some cases of 30-40% reduction in total
      render time. In scenes that are less texture-bottlenecked, or that don't
      ๐Ÿ‘‰ use huge numbers of threads, the improvement is more modest. #2433 (2.2.0)

    ๐Ÿ›  Fixes and feature enhancements:

    • oiiotool:
      • Intelligible error messages (rather than crashes) if you attempt to
        create an image too big to fit in memory. #2414 (2.2.0)
      • --create and --proxy take an additional optional modifier:
        :type=name that specifies the type of buffer to be created (the
        0๏ธโƒฃ default, as usual, is to create an internal float-based buffer). #2414
        (2.2.0)
      • -o optional argument :type=name is a new (and preferred) synonym
        for what used to be :datatype=. #2414 (2.2.0)
      • --autotrim now correctly trims to the union of the nonzero regions
        of all subimages, instead of incorrectly trimming all subimages to the
        nonzero region of the first subimage. #2497 (2.2.1.2)
      • --subimage now has an optional :delete=1 modifier that causes the
        0๏ธโƒฃ operation to delete one named or indexed subimage (versus the default
        behavior of extracing one subimage and deleting the others). #2575
        (2.2.3)
      • The list of dependent libraries (part of oiiotool --help) now
        correctly reports the OpenEXR version. #2604 (2.2.3)
      • Fix: --eraseattrib did not correctly apply to all subimages when
        -a or :allsubimages=1 were used. #2632 (2.2.4)
    • ImageBuf / ImageBufAlgo:
      • Huge ImageBuf allocation failures (more than available RAM) now are
        caught and treated as an ImageBuf error, rather than crashing with an
        ๐Ÿ‘ป uncaught exception. #2414 (2.2.0)
      • ImageBuf constructors that are passed an ImageSpec (for creating an
        allocated writable IB or "wrapping" a user buffer) now check that the
        spec passed has enough information to know the size of the buffer
        (i.e., it will be recognized as an error if the width, height, depth,
        channels, or data type have not been set validly). #2460
      • Fix: ImageBuf::getchannel() did not honor its wrap parameter.
        #2465 (2.2.1/2.1.12)
      • Fix: IBA::reorient() and IBA::computePixelHashSHA1() did not honor
        their nthreads parameter. #2465 (2.2.1/2.1.12)
      • resample() has been modified to more closely match resize by using
        clamp wrap mode to avoid a black fade at the outer edge of the
        resampled area. #2481
      • Fix: ImageBuf::get_pixels() did not honor the stride parameters.
        #2487. (2.1.12/2.2.1)
      • Fix resize() to avoid a crash / stack overflow in certain cases of
        very big images and very large filter kernels. #2643 (2.2.4)
      • Minor improvements to ImageBuf error formatting. #2653 (2.2.5)
    • ImageCache / TextureSystem / maketx:
      • New IC/TS attribute "trust_file_extensions", if nonzero, is a promise
        that all files can be counted on for their formats to match their
        extensions, which eliminates some redundant opens and format checks
        in the IC/TS and can reduce needless network/filesystem work. Use with
        caution! #2421 (2.2.0)
      • texture3d() fixed some cases where derivative results were not
        correctly copied to the outputs. #2475 (2.2.1)
      • maketx/IBA::make_texture: better error detection and messages when
        ๐Ÿ‘ using "overscan" textures with formats that can't support it properly.
        (Punchline: only OpenEXR textures can do it.) #2521 (2.2.0)
      • Fix possible redundant tile reads in multithread situations (harmless,
        but makes for redundant I/O). #2557 (2.2.2)
    • Python:
      • Fixed a bug that lost certain string arguments, especially when passing
        a TypeDesc as its string equivalent. #2587 (2.1.16/2.2.3)
      • Fixed broken bindings of ImageSpec.erase_attribute. #2654
        (2.1.19/2.2.6)
      • Fix missing ImageInput.read_image(). #2677 (2.1.19/2.2.6)
    • ๐Ÿ›  Exif read: guard better against out of range offsets, fixes crashes when
      reading jpeg files with malformed exif blocks. #2429 (2.1.10/2.2.0)
    • ๐Ÿ›  Fix: ImageSpec::erase_attribute() did not honor its searchtype
      parameter. #2465 (2.2.1/2.1.12)
    • ๐Ÿ›  Fix: Some ColorProcessor::apply() methods were not using their chanstride
      parameters correctly. #2475 (2.1.12)
    • ๐Ÿ›  Fix: iinfo return code now properly indicates failures for files that
      can't be opened. #2511 (2.2.2/2.1.13)
    • DPX:
      • IOProxy reading is now supported. #2659 (2.2.5)
      • DPX: Add support for reading DPX files from IOProxy (such as from a
        memory buffer). #2659 #2665 (2.1.19/2.2.6)
    • HDR files:
      • Improve performance when reading HDR files out of order (when combined
        with ImageCache, observed to speed up out-of-order HDR reading by 18x).
        #2662 (2.2.5)
    • JPEG:
      • Fix resolution unit metadata that was not properly set in JPEG output.
        #2516 (2.2.2/2.1.13)
      • Fix loss of 'config' info upon close/reopen. #2549 (2.2.2)
    • OpenEXR:
      • Add support for reading and writing float vector metadata. #2459 #2486
      • Fix bug in the channel sorting order when channels are "X" and
        "Y" (was reversing the order by confusing "Y" for "luminance"). #2595
        (2.1.16/2.2.3)
      • We no longer automatically rename the "worldToNDC" attribute to
        "worldtoscreen" and vice versa. #2609 (2.2.4)
    • PNG:
      • Fix loss of 'config' info upon close/reopen. #2549 (2.2.2)
      • Add output configuration hint "png:filter" to control PNG filter
        options. #2650 (2.2.5)
      • Improved propagation of PNG write errors. #2655 (2.2.5)
      • Tell libpng to turn off sRGB profile check, which has a known problem of
        false positives. #2655 (2.2.5)
      • New output option "png:filter" allows control of the PNG filter
        options. #2650 (2.1.19/2.2.6)
    • Raw images:
      • Support for new Canon .cr3 file, but only if you build against
        libraw >= 0.20.0 developer snapshot. #2484 (2.2.1) #2613 (2.2.4)
      • RAW input: set the "raw:flip" attribute if the underlying libraw did a
        reorientation. #2572 (2.1.15/2.2.3)
      • Avoid errors (in libraw) that resulted from multiple threads opening
        raw files at the same time. #2633 (2.2.4)
    • RLA:
      • Additional sanity checks and error checks/messages for detecting files
        that might be first mistaken for RLA files, but actually are not.
        #2600 (2.2.3)
    • TIFF:
      • Internal improvements to handling metadata retrieval for certain
        unusual tags. #2504 (2.2.2/2.1.13)
      • Fix subtle bug when reading Exif directory in the header. #2540
        (2.2.2)
    • Video files:
      • Fix possible infinite loop in the FFMpeg-based reader. #2576
        (2.1.15/2.2.3)

    Developer goodies / internals:

    • ๐Ÿ“œ argparse.h:
      • Complete overhaul of ArgParse to make it more like Python argparse.
        ๐Ÿ“š Please read the extensive comments in argparse.h for documentation.
        ๐Ÿ“œ For now, the old ArgParse interface still works, but is considered
        ๐Ÿ—„ deprecated. #2531 (2.2.2) #2618 #2622 (2.2.4)
    • attrdelegate.h:
      • New as_vec<> method returns the whole attribute as a std::vector.
        #2528 (2.2.2)
    • filesystem.h:
      • Catch previously uncaught exceptions that could happen in certain
        Filesystem utility calls. #2522 (2.2.2/2.1.13)
      • New write_text_file() convenience function for opening, writing, and
        closing a text file all in one step. #2597 (2.2.3)
    • fmath.h:
      • clamp() is 2x faster. #2491 (2.1.12/2.2.2)
      • Very minor fix to OIIO::clamp(), shouldn't affect normal use with
        ๐Ÿ›  floats at all, but fixed a subtle quasi-bug in OSL. #2594 (2.1.15/2.2.3)
      • madd() is improved especially on platforms without fma hardware
        #2492 (2.1.12/2.2.2)
      • Perf improvements to fast_sin, fast_cos #2495 (2.1.12/2.2.2)
      • New safe_fmod() is faster than std::fmod. #2495 (2.1.12/2.2.2)
      • New fast_neg is faster than simple negation in many cases, if you
        don't care that -(0.0) is 0.0 (rather than a true -0.0). #2495
        (2.1.12/2.2.2)
      • Add vint4, vint8, and vint16 versions of clamp(). #2617 (2.2.4)
    • oiioversion.h:
      • Fix typo that left the OIIO_VERSION_RELEASE_TYPE symbol undefined.
        #2616 (2.2.4/2.1.16)
      • Add new OIIO_MAKE_VERSION(maj,min,patch) macro that constructs the
        ๐Ÿš€ proper single integer code for a release version. #2641 (2.2.4/2.1.17)
    • paramlist.h:
      • New ParamValueList::find_pv() method that is similar to find() but
        returns a pointer rather than an iterator and nullptr if the attribute
        is not found. #2527 (2.2.2/2.1.13)
      • Add get_indexed() method to ParamValueList and AttrDelegate. #2526
        (2.2.2/2.1.13)
    • platform.h:
      • OIIO_PRETTY_FUNCTION definition is more robust for weird compilers
        (will fall back to __FUNCTION__ if all else fails). #2413 (2.2.0)
      • OIIO_ALIGN definition is more robust, will fall back to C++11
        alignas when not a compiler with special declspecs (instead of being
        a compile time error!). #2412 (2.2.0)
      • A variety of OIIO_PRAGMA_... macros have been added to help deal
        with compiler-specific pragmas. #2467 (2.2.1)
    • simd.h:
      • vfloat3 has added a normalize(), length(), and length2()
        methods, to more closely match the syntax of Imath::Vec3f. #2437
        (2.1.11/2.2.0)
      • fix errors in vbool == and !=. #2463 (2.1.11/2.2.1)
      • Add float3 versions of abs, sign, ceil, floor, and round (they already
        existed for float4, float8, float16, but not float4). #2612 (2.2.4)
      • Improved support for ARM NEON SIMD (caveat: this is still not well
        โœ… tested). #2614 (2.2.4)
      • Improve performance for many float8/int8 functions and operators when
        โš™ running on only 4-wide hardware, by using two 4-wide instructions
        โช instead of reverting to scalar. #2621
    • span.h:
      • Allow the constructor from std::vector to allow vectors with custom
        allocators. #2533 (2.2.2)
    • strutil.h / ustring.h:
      • New Strutil::concat() and ustring::concat() concatenate two
        ๐Ÿ–จ strings, more efficiently than sprintf("%s%s") by avoiding any
        unnecessary copies or temporary heap allocations. #2478 (2.2.1)
      • Strutil::upper() and lower() return all-upper and all-lowercase
        versions of a string (like to_lower and to_upper, but not in-place
        modifications of the existing string). #2525 (2.2.2/2.1.13)
      • Strutil::repeat() has been internally rewritten to more efficient by
        avoiding any unnecessary copies or temporary heap allocations. #2478
        (2.2.1)
    • typedesc.h:
      • TypeDesc has additional helpers of constexpr values TypeFloat2,
        TypeVector2, TypeVector4, TypeVector2i, TypePointer. #2592 (2.1.16/2.2.3)
    • unordered_map_concurrent.h:
      • Fix missing decrement of size() after erase(). #2624 (2.2.4)
    • ๐Ÿ’… More reshuffling of printf-style vs fmt-style string formatting. #2424
      (2.2.0) #2649 (2.2.4)
    • ๐Ÿ— Internals: changed a lot of assertions to only happen in debug build mode,
      ๐Ÿš€ and changed a lot that happen in release builds to only print the error
      but not force a termination. #2435 (2.1.11/2.2.0)
    • Internals: Replaced most uses of boost::thread_specific_ptr with C++11
      thread_local. #2431 (2.2.0)
    • oiiotool: Big overhaul and simplification of internals. #2586 #2589 (2.2.3)

    ๐Ÿ— Build/test system improvements and platform ports:

    • ๐Ÿ‘ท CMake build system and scripts:
      • New non-default CMake build flag EXTRA_WARNINGS, when turned on, will
        cause gcc and clang to compile with -Wextra. This identified many new
        โš  warnings (mostly about unused parameters) and fixes were applied in
        #2464, #2465, #2471, #2475, #2476. (2.2.1)
      • FindOpenColorIO.cmake now correctly discerns the OCIO version (2.2.1),
        and now sets up a true imported target. #2529 (2.2.2)
      • FindOpenEXR.cmake has better detection of debug openexr libraries.
        #2505 (2.2.2/2.1.13)
      • Additional cmake controls to customize required vs optional
        dependencies: REQUIRED_DEPS (list of dependencies normally optional
        that should be treated as required) and OPTIONAL_DEPS (list of
        dependencies normally required that should be optional). The main use
        case is to force certain optional deps to be required for your studio,
        ๐Ÿ— to be sure that missing deps are a full build break, and not a
        ๐Ÿ— successful build that silently lacks features you need. #2507
        (2.2.2/2.1.13)
      • Fix exported cmake config file, it was not ensuring that the Imath
        headers properly ended up in the config include path. #2515
        (2.2.2/2.1.13)
      • Change all CMake references to PACKAGE_FOUND to Package_Found (or
        ๐Ÿ“ฆ whatever capitalization matches the actual package name). #2569 (2.2.2)
      • The exported CMake config files now set cmake variable
        ๐Ÿ”Œ OpenImageIO_PLUGIN_SEARCH_PATH #2584 (2.1.16/2.2.3)
      • Improved hints printed about missing dependencies. #2682 (2.2.6)
    • ๐Ÿ‘ Dependency version support:
      • Pybind11 is no longer auto-downloaded. It is assumed to be
        ๐Ÿ— pre-installed. A script src/build-scripts/build_pybind11.bash is
        provided for convenience if you lack a system install. #2503 (2.2.2)
        โฌ†๏ธ Bump the minimum pybind11 version that we accept, to 2.4.2 #2453,
        ๐Ÿ›  and add fixes to allow support of pybind11 2.5. #2637 (2.2.4)
      • fmt libray: Un-embed fmt headers. If they are not found on the system
        ๐Ÿ— at build time, they will be auto-downloaded. #2439 (2.2.0)
      • Support for building against libraw 0.20. #2484 (2.2.1) #2580 (2.2.3)
      • Build properly against OpenColorIO's current master (which is the
        in-progress work on OCIO v2). #2530 (2.2.2)
      • Fix static boost to not overlink on Windows. #2537 (2.2.2)
      • Fix build breaks against TOT libtiff master, which had #define
        clashes with our GPSTag enum values. #2539 (2.2.2)
      • Ensure compatibility and clean builds with clang 10. #2518 (2.2.2/2.1.3)
      • Support verified for gcc 10, added to CI tests. #2590 (2.2.3)
      • Support for Qt 5.15. #2605 (2.2.3)
      • Fixes to support OpenColorIO 2.0. #2636 (2.2.4)
      • Build against more recent versions of fmtlib. #2639 (2.2.4)
      • Included scripts to download and build libtiff #2543 (2.1.13/2.2.2),
        PugiXML #2648 (2.2.4), zlib, libpng, libjpeg-turbo. #2663 (2.2.5)
      • Minor fixes for libheif 1.8. #2685 (2.2.6)
      • Add a build_libtiff.bash script to make it easy to build the libtiff
        dependency. #2543 (2.1.13/2.2.2)
      • "tinyformat" is no longer used, even optionally. We have switched
        entirely to fmtlib, which is more similar to the upcoming C++20
        std::format. #2647 (2.2.4)
    • โœ… Testing and Continuous integration (CI) systems:
      • Mostly retire TravisCI for ordinary Linux x64 and Mac builds, now we
        ๐Ÿณ rely on GitHub Actions CI. Nightly test added. Use ASWF docker images
        ๐Ÿ”ง to test exactly against VFX Platform 2019 and 2020 configurations.
        #2563 (2.2.2) #2579 (2.2.3)
      • Add Travis test for arm64 (aka aarch64) builds. This is still a work
        โœ… in progress, and not all testsuite tests pass. #2634 (2.2.4)
      • Our CI tests now have a "bleeding edge" matrix entry that tests against
        ๐Ÿ— the current TOT master build of libtiff, openexr (#2549), and pybind11
        (#2556). (2.2.2)
      • GitHub CI tests, when they fail, leave behind an "artifact" tar file
        โœ… containing the output of the tests, so that they can be easily
        downloaded and inspected (or used to create new reference output).
        #2606 (2.2.4)
      • CI Mac tests switch to Python 3.8. (2.2.4)
      • Windows CI switched from using Vcpkg to building its own dependencies.
        #2663 (2.2.5)
      • Testing of TGA now assumes the test images are in the oiio-images
        project, not separately downloaded (the download location disappeared
        from the net). #2512 (2.2.2)
      • Beef up OpenEXR compliance tests, many more examples from
        openexr-images, including many corrupted image failure cases. #2607
        (2.2.4)
    • ๐Ÿ‘ Progress on support for using Conan for dependency installation. This is
      ๐Ÿšง experimental, it can't yet build all dependencies. Work in progress.
      #2461 (2.2.1)
    • โšก๏ธ The version of gif.h that we embed for GIF output has been updated.
      #2466 (2.2.1)
    • The farmhash functions have been cleaned up to be more careful that none
      of their internal symbols are left visible to the linker. #2473 (2.2.1)
    • ๐Ÿš€ Clarification about .so name versioning: In supported releases, .so
      contains major.minor, but in master (where ABI is not guaranteed stable,
      we name major.minor.patch). #2488 (2.2.1)
    • Protect against certain compiler preprocessor errors for user programs
      that include strutil.h but also include fmt on its own. #2498.
      (2.1.12/2.2.2)
    • ๐Ÿ— Build: All the build_foo.bash helper scripts now use set -ex to ensure
      that if any individual commands in the script fails, the whole thing will
      exit with a failure. #2520 (2.2.2/2.1.3)
    • ๐Ÿ›  Fix compiler warning about incorrect extra braces. #2554 (2.2.2)
    • ๐Ÿ— All build-scripts bash scripts now use /usr/bin/env to find bash. #2558
      (2.2.2)
    • Avoid possible link errors by fully hiding IBA functions taking IplImage
      parameters, when no OpenCV headers are encountered. #2568 (2.2.2)
    • โš  In (obsolete) FindOpenImageIO.cmake, avoid CMake warnings by changing
      the name OPENIMAGEIO_FOUND -> OpenImageIO_FOUND. #2578 (2.2.3)
    • ๐Ÿšš Moved headers that are not part of OIIO's supported public API, but that
      still must be installed to be transitively included, do a "detail"
      subdirectory. #2648 (2.2.4)
    • ๐Ÿ›  Fix many Mingw compiler warnings. #2657 (2.1.19/2.2.5)
    • Windows: Improve Strutil::get_rest_arguments() handling of long path
      ๐Ÿ’… syntax ("\\?\" style). #2661 (2.1.19/2.2.6)
    • ๐Ÿ›  Fix compilation error with armv7 + x86. #2660 (2.2.6)

    ๐Ÿ“š Notable documentation changes:

    • Many enhancements in the ImageBuf chapter. #2460 (2.1.11/2.2.0)
    • The LICENSE-THIRD-PARTY.md file has been reorganized to be clearer,
      grouping parts with identical licenses. #2469 (2.2.1) And renamed to
      "THIRD-PARTY.md" to avoid confusing GitHub's reporting of the project's
      license. (2.2.6)
    • ๐Ÿ“š Many fixes to the new readthedocs documentation, especially fixes to
      section cross-references and links.
    • ๐Ÿ‘Œ Improved INSTALL instructions. (2.2.2/2.1.13)
    • ๐Ÿ›  Fix a variety of breaks on ReadTheDocs. #2581
    • ๐Ÿ‘Œ Improve the way we discuss optional modifiers.
    • Document the PNG output controls for compression level. #2642 (2.2.4)
    • ๐Ÿ›  Lots of spell check / typo fixes in docs and comments. #2678 (2.2.6)
    • ๐Ÿ INSTALL.md: remove misleading old Windows build instructions. #2679 (2.2.6)
    • ๐Ÿ†• New file .git-blame-ignore-revs lists the hashes of commits that only
      performed bulk reformatting, so that they don't misattribute authorship
      or modification date. Everybody do this in your local repo:
      git config blame.ignoreRevsFile .git-blame-ignore-revs
      #2683 (2.2.6)