diff --git a/src/OpenColorIO/CMakeLists.txt b/src/OpenColorIO/CMakeLists.txt index 26b4bb4cf..4c6db157e 100755 --- a/src/OpenColorIO/CMakeLists.txt +++ b/src/OpenColorIO/CMakeLists.txt @@ -150,6 +150,7 @@ set(SOURCES transforms/builtins/BuiltinTransformRegistry.cpp transforms/builtins/ColorMatrixHelpers.cpp transforms/builtins/OpHelpers.cpp + transforms/builtins/AppleCameras.cpp transforms/builtins/ArriCameras.cpp transforms/builtins/CanonCameras.cpp transforms/builtins/Displays.cpp diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 03119d12b..3d2a86398 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -247,7 +247,7 @@ static constexpr unsigned LastSupportedMajorVersion = OCIO_VERSION_MAJOR; // For each major version keep the most recent minor. static const unsigned int LastSupportedMinorVersion[] = {0, // Version 1 - 3 // Version 2 + 4 // Version 2 }; } // namespace @@ -5231,6 +5231,16 @@ void Config::Impl::checkVersionConsistency(ConstTransformRcPtr & transform) cons throw Exception("Only config version 2.3 (or higher) can have " "BuiltinTransform style 'DISPLAY - CIE-XYZ-D65_to_DisplayP3'."); } + if (m_majorVersion == 2 && m_minorVersion < 4 + && ( 0 == Platform::Strcasecmp(blt->getStyle(), "APPLE_LOG_to_ACES2065-1") + || 0 == Platform::Strcasecmp(blt->getStyle(), "CURVE - APPLE_LOG_to_LINEAR") ) + ) + { + std::ostringstream os; + os << "Only config version 2.4 (or higher) can have BuiltinTransform style '" + << blt->getStyle() << "'."; + throw Exception(os.str().c_str()); + } } else if (ConstCDLTransformRcPtr cdl = DynamicPtrCast(transform)) { diff --git a/src/OpenColorIO/transforms/builtins/AppleCameras.cpp b/src/OpenColorIO/transforms/builtins/AppleCameras.cpp new file mode 100644 index 000000000..9f5f94611 --- /dev/null +++ b/src/OpenColorIO/transforms/builtins/AppleCameras.cpp @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + + +#include + +#include + +#include "ops/matrix/MatrixOp.h" +#include "transforms/builtins/AppleCameras.h" +#include "transforms/builtins/BuiltinTransformRegistry.h" +#include "transforms/builtins/ColorMatrixHelpers.h" +#include "transforms/builtins/OpHelpers.h" + + +namespace OCIO_NAMESPACE +{ + +namespace APPLE_LOG +{ + +void GenerateAppleLogToLinearOps(OpRcPtrVec & ops) +{ + auto GenerateLutValues = [](double in) -> float + { + constexpr double R_0 = -0.05641088; + constexpr double R_t = 0.01; + constexpr double c = 47.28711236; + constexpr double beta = 0.00964052; + constexpr double gamma = 0.08550479; + constexpr double delta = 0.69336945; + const double P_t = c * std::pow((R_t - R_0), 2.0); + + if (in >= P_t) + { + return float(std::pow(2.0, (in - delta) / gamma) - beta); + } + else if (in < P_t && in >= 0.0) + { + return float(std::sqrt(in / c) + R_0); + } + else + { + return float(R_0); + } + }; + + CreateHalfLut(ops, GenerateLutValues); + +} + +} // namespace APPLE_LOG + +namespace CAMERA +{ + +namespace APPLE +{ + +void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept +{ + { + auto APPLE_LOG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) + { + APPLE_LOG::GenerateAppleLogToLinearOps(ops); + + MatrixOpData::MatrixArrayPtr matrix + = build_conversion_matrix(REC2020::primaries, ACES_AP0::primaries, ADAPTATION_BRADFORD); + CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); + }; + + registry.addBuiltin("APPLE_LOG_to_ACES2065-1", + "Convert Apple Log to ACES2065-1", + APPLE_LOG_to_ACES2065_1_Functor); + } + { + auto APPLE_LOG_to_Linear_Functor = [](OpRcPtrVec & ops) + { + APPLE_LOG::GenerateAppleLogToLinearOps(ops); + }; + + registry.addBuiltin("CURVE - APPLE_LOG_to_LINEAR", + "Convert Apple Log to linear", + APPLE_LOG_to_Linear_Functor); + } +} + +} // namespace APPLE + +} // namespace CAMERA + +} // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/transforms/builtins/AppleCameras.h b/src/OpenColorIO/transforms/builtins/AppleCameras.h new file mode 100644 index 000000000..52f6a9d57 --- /dev/null +++ b/src/OpenColorIO/transforms/builtins/AppleCameras.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + + +#ifndef INCLUDED_OCIO_APPLE_CAMERAS_H +#define INCLUDED_OCIO_APPLE_CAMERAS_H + + +#include + + +namespace OCIO_NAMESPACE +{ + +class BuiltinTransformRegistryImpl; + +namespace CAMERA +{ + +namespace APPLE +{ + +void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept; + +} // namespace APPLE + +} // namespace CAMERA + +} // namespace OCIO_NAMESPACE + +#endif // INCLUDED_OCIO_APPLE_CAMERAS_H diff --git a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp index ed5f8fd25..d828f11ac 100644 --- a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp +++ b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp @@ -11,6 +11,7 @@ #include "OpBuilders.h" #include "Platform.h" #include "transforms/builtins/ACES.h" +#include "transforms/builtins/AppleCameras.h" #include "transforms/builtins/ArriCameras.h" #include "transforms/builtins/BuiltinTransformRegistry.h" #include "transforms/builtins/CanonCameras.h" @@ -109,6 +110,7 @@ void BuiltinTransformRegistryImpl::registerAll() noexcept ACES::RegisterAll(*this); // Camera support. + CAMERA::APPLE::RegisterAll(*this); CAMERA::ARRI::RegisterAll(*this); CAMERA::CANON::RegisterAll(*this); CAMERA::PANASONIC::RegisterAll(*this); diff --git a/tests/cpu/CMakeLists.txt b/tests/cpu/CMakeLists.txt index 896bb3f92..3f6a65038 100755 --- a/tests/cpu/CMakeLists.txt +++ b/tests/cpu/CMakeLists.txt @@ -161,6 +161,7 @@ set(SOURCES ScanlineHelper.cpp Transform.cpp transforms/builtins/ACES.cpp + transforms/builtins/AppleCameras.cpp transforms/builtins/ArriCameras.cpp transforms/builtins/CanonCameras.cpp transforms/builtins/ColorMatrixHelpers.cpp diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index abb003bdd..ed81b7240 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -2103,12 +2103,12 @@ OCIO_ADD_TEST(Config, version) { OCIO_CHECK_THROW_WHAT(config->setVersion(2, 9), OCIO::Exception, "The minor version 9 is not supported for major version 2. " - "Maximum minor version is 3"); + "Maximum minor version is 4"); OCIO_CHECK_NO_THROW(config->setMajorVersion(2)); OCIO_CHECK_THROW_WHAT(config->setMinorVersion(9), OCIO::Exception, "The minor version 9 is not supported for major version 2. " - "Maximum minor version is 3"); + "Maximum minor version is 4"); } { @@ -9471,4 +9471,4 @@ OCIO_ADD_TEST(Config, create_from_config_io_proxy) OCIO_REQUIRE_ASSERT(proc); OCIO_CHECK_NO_THROW(proc->getDefaultCPUProcessor()); } -} \ No newline at end of file +} diff --git a/tests/cpu/transforms/BuiltinTransform_tests.cpp b/tests/cpu/transforms/BuiltinTransform_tests.cpp index 1667034bb..32b8200b0 100644 --- a/tests/cpu/transforms/BuiltinTransform_tests.cpp +++ b/tests/cpu/transforms/BuiltinTransform_tests.cpp @@ -429,6 +429,10 @@ AllValues UnitTestValues { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-CINEMA-108nit-7.2nit-P3lim_1.1", { { 0.5f, 0.4f, 0.3f }, { 0.22214814f, 0.21179835f, 0.15639816f } } }, + { "APPLE_LOG_to_ACES2065-1", + { { 0.5f, 0.4f, 0.3f }, { 0.153334766f, 0.083515430f, 0.032948254f } } }, + { "CURVE - APPLE_LOG_to_LINEAR", + { { 0.5f, 0.4f, 0.3f }, { 0.198913991f, 0.083076466024f, 0.0315782763f } } }, { "ARRI_ALEXA-LOGC-EI800-AWG_to_ACES2065-1", { { 0.5f, 0.4f, 0.3f }, { 0.401621427766f, 0.236455447604f, 0.064830001192f } } }, { "ARRI_LOGC4_to_ACES2065-1", diff --git a/tests/cpu/transforms/builtins/BuiltinTransformRegistry_tests.cpp b/tests/cpu/transforms/builtins/BuiltinTransformRegistry_tests.cpp index cbd3c9e79..2ad0b246f 100644 --- a/tests/cpu/transforms/builtins/BuiltinTransformRegistry_tests.cpp +++ b/tests/cpu/transforms/builtins/BuiltinTransformRegistry_tests.cpp @@ -96,7 +96,7 @@ OCIO_ADD_TEST(Builtins, read_write) // builtin transforms. static constexpr char CONFIG_BUILTIN_TRANSFORMS[] { -R"(ocio_profile_version: 2.3 +R"(ocio_profile_version: 2.4 environment: {}