Skip to content

Conversation

@KelSolaar
Copy link
Contributor

@KelSolaar KelSolaar commented Aug 18, 2025

A draft PR to start parking the current work, so far:

  1. Updated the sub-module to use https://github.com/ampas/aces, allowed to fix the ACEStransformID of the ARRI transforms. References ARRI LogC4 ACES ID typo #157.
  2. Enabled the Rec.709 Gamma 2.2 display rendering transforms. References Where is sRGB 2.2 Gamma Display? #145.
  3. Implement support for DJI D-Log - D-Gamut transforms. References Add DJI color space from aces-input #146.
  4. AMF support via official transforms.json file. amf_transform_ids atttribute support implemented. References Update color spaces to use new attributes #154
  5. Virtual Display Views & Shared Views. References Add a virtual_display to the ACES configs #133
  6. Mirrored displays implemented. References Display color spaces should mirror rather than clamp negatives #153
  7. interop_id atttribute support implemented. References Update color spaces to use new attributes #154
  8. Viewing rules support implemented. References Add viewing rules to the ACES configs #148
  9. File rules support implemented. References Expand the file rules to handle integer formats #155

Latest artifacts are here: https://github.com/AcademySoftwareFoundation/OpenColorIO-Config-ACES/actions/runs/18078454050

…the *ARRI* transforms.

Closes AcademySoftwareFoundation#157.

Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
Closes AcademySoftwareFoundation#145.

Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
@carolalynn
Copy link

thanks for this Thomas, nice start :D

nitpick, should probably spell out gamma for the new display: "Gamma 2.2 Rec.709 - Display"

log_side_slope = 1.0 / 3.89616
log_side_offset = 2.27752 / 3.89616
lin_side_slope = 0.9892
lin_side_offset = 0.0108
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was debating whether we should specify linearSlope or not? If we don't specify it, the slope of the extrapolated curve will be:
0.256662970719888 * 0.9892 / ( np.log(10.) * (0.9892 * 0.00758078675 + 0.0108) ) = 6.02568346

I don't object to going with what you have here, it will be quite close to the published value. Their intent was probably that the slope would be continuous.

I do like the way you used the log-to-lin as the definitive version and recalculated as needed rather than simply using the rounded values from the lin-to-log direction in their white paper!

@KelSolaar
Copy link
Contributor Author

KelSolaar commented Sep 6, 2025

I added (initial) support to inject the AMF components via the new transforms.json file:

Key Metrics

Metric Previous Config New Config Change
Total Transforms 57 57 ±0
Total AMF Components 195 239 +45
Enhanced Transforms 0 15 +15

Status Legend

Symbol Status Description
🟢 Unchanged Same AMF components in both configurations
🟠 Enhanced Additional AMF components from transforms.json
🔴 New Transform Not present in previous configuration

Enhanced Transforms Detail

ACES 1.3 Reference Gamut Compression 🟠

Status: Enhanced (+2 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 4 +2 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW urn:ampas:aces:transformId:v1.5:InvLMT.Academy.ReferenceGamutCompress.a1.v1.0
🟢 NEW urn:ampas:aces:transformId:v1.5:LMT.Academy.ReferenceGamutCompress.a1.v1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:InvLook.Academy.ReferenceGamutCompress.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:Look.Academy.ReferenceGamutCompress.a2.v1

ACEScc 🟠

Status: Enhanced (+8 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 10 +8 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_ACEScc.a1.0.0
🟢 NEW ACEScsc.ACES_to_ACEScc.a1.0.1
🟢 NEW ACEScsc.ACES_to_ACEScc.a1.0.3
🟢 NEW ACEScsc.ACEScc_to_ACES.a1.0.0
🟢 NEW ACEScsc.ACEScc_to_ACES.a1.0.1
🟢 NEW ACEScsc.ACEScc_to_ACES.a1.0.3
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_ACEScc.a1.0.3
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACEScc_to_ACES.a1.0.3
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Academy.ACES_to_ACEScc.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Academy.ACEScc_to_ACES.a2.v1

ACEScct 🟠

Status: Enhanced (+4 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 6 +4 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_ACEScct.a1.0.3
🟢 NEW ACEScsc.ACEScct_to_ACES.a1.0.3
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_ACEScct.a1.0.3
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACEScct_to_ACES.a1.0.3
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Academy.ACES_to_ACEScct.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Academy.ACEScct_to_ACES.a2.v1

ACEScg 🟠

Status: Enhanced (+8 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 10 +8 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_ACEScg.a1.0.0
🟢 NEW ACEScsc.ACES_to_ACEScg.a1.0.1
🟢 NEW ACEScsc.ACES_to_ACEScg.a1.0.3
🟢 NEW ACEScsc.ACEScg_to_ACES.a1.0.0
🟢 NEW ACEScsc.ACEScg_to_ACES.a1.0.1
🟢 NEW ACEScsc.ACEScg_to_ACES.a1.0.3
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_ACEScg.a1.0.3
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACEScg_to_ACES.a1.0.3
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Academy.ACES_to_ACEScg.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Academy.ACEScg_to_ACES.a2.v1

ARRI LogC4 🟠

Status: Enhanced (+1 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 3 +1 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW urn:ampas:aces:transformId:v1.5:IDT.ARRI.ARRI-LogC4.a1.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Arri.ACES_to_LogC4.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Arri.LogC4_to_ACES.a2.v1

Apple Log 🟠

Status: Enhanced (+1 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 3 +1 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW urn:ampas:aces:transformId:v1.5:IDT.Apple.AppleLog_BT2020.a1.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Apple.ACES_to_AppleLog_BT2020.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Apple.AppleLog_BT2020_to_ACES.a2.v1

BMDFilm WideGamut Gen5 🟠

Status: Enhanced (+2 components)

Configuration Count Change Summary
Previous Config 3 Baseline configuration
New Config 5 +2 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_BMDFilm_WideGamut_Gen5.a1.v1
⚪ EXISTING urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.BMDFilm_WideGamut_Gen5_to_ACES.a1.v1
🟢 NEW urn:ampas:aces:transformId:v1.5:IDT.BlackmagicDesign.BMDFilm_WideGamut_Gen5.a1.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Academy.ACES_to_BMDFilm_WideGamut_Gen5.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Blackmagic.BMDFilm_WideGamut_Gen5_to_ACES.a2.v1

CanonLog2 CinemaGamut D55 🟠

Status: Enhanced (+4 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 6 +4 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_CLog2_CGamut.a1.v1
🟢 NEW ACEScsc.CLog2_CGamut_to_ACES.a1.v1
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_CLog2_CGamut.a1.1.0
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.CLog2_CGamut_to_ACES.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Canon.ACES_to_CLog2_CGamut.a1.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Canon.CLog2_CGamut_to_ACES.a1.v1

CanonLog3 CinemaGamut D55 🟠

Status: Enhanced (+4 components)

Configuration Count Change Summary
Previous Config 2 Baseline configuration
New Config 6 +4 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_CLog3_CGamut.a1.v1
🟢 NEW ACEScsc.CLog3_CGamut_to_ACES.a1.v1
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_CLog3_CGamut.a1.1.0
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.CLog3_CGamut_to_ACES.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Canon.ACES_to_CLog3_CGamut.a1.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Canon.CLog3_CGamut_to_ACES.a1.v1

Log3G10 REDWideGamutRGB 🟠

Status: Enhanced (+3 components)

Configuration Count Change Summary
Previous Config 3 Baseline configuration
New Config 6 +3 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_Log3G10_RWG.a1.v1
🟢 NEW ACEScsc.Log3G10_RWG_to_ACES.a1.v1
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_Log3G10_RWG.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.Log3G10_RWG_to_ACES.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Red.ACES_to_Log3G10_RWG.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Red.Log3G10_RWG_to_ACES.a2.v1

S-Log3 S-Gamut3 🟠

Status: Enhanced (+3 components)

Configuration Count Change Summary
Previous Config 3 Baseline configuration
New Config 6 +3 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_SLog3_SGamut3.a1.v1
🟢 NEW ACEScsc.SLog3_SGamut3_to_ACES.a1.v1
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_SLog3_SGamut3.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.SLog3_SGamut3_to_ACES.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.ACES_to_SLog3_SGamut3.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.SLog3_SGamut3_to_ACES.a2.v1

S-Log3 S-Gamut3.Cine 🟠

Status: Enhanced (+3 components)

Configuration Count Change Summary
Previous Config 3 Baseline configuration
New Config 6 +3 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW ACEScsc.ACES_to_SLog3_SGamut3Cine.a1.v1
🟢 NEW ACEScsc.SLog3_SGamut3Cine_to_ACES.a1.v1
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_SLog3_SGamut3Cine.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.SLog3_SGamut3Cine_to_ACES.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.ACES_to_SLog3_SGamut3Cine.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.SLog3_SGamut3Cine_to_ACES.a2.v1

S-Log3 Venice S-Gamut3 🟠

Status: Enhanced (+1 components)

Configuration Count Change Summary
Previous Config 3 Baseline configuration
New Config 4 +1 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_SLog3_Venice_SGamut3.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.SLog3_Venice_SGamut3_to_ACES.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.ACES_to_Venice_SLog3_SGamut3.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.Venice_SLog3_SGamut3_to_ACES.a2.v1

S-Log3 Venice S-Gamut3.Cine 🟠

Status: Enhanced (+1 components)

Configuration Count Change Summary
Previous Config 3 Baseline configuration
New Config 4 +1 components added

Detailed Component Changes

Status AMF Component ID
🟢 NEW urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.ACES_to_SLog3_Venice_SGamut3Cine.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v1.5:ACEScsc.Academy.SLog3_Venice_SGamut3Cine_to_ACES.a1.1.0
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.ACES_to_Venice_SLog3_SGamut3Cine.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Sony.Venice_SLog3_SGamut3Cine_to_ACES.a2.v1

V-Log V-Gamut 🟠

Status: Enhanced (+0 components)

Configuration Count Change Summary
Previous Config 3 Baseline configuration
New Config 2 +0 components added, -1 removed

Detailed Component Changes

Status AMF Component ID
🔴 REMOVED urn:ampas:aces:transformId:v1.5:IDT.Panasonic.VLog_VGamut.a1.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Panasonic.ACES_to_VLog_VGamut.a2.v1
⚪ EXISTING urn:ampas:aces:transformId:v2.0:CSC.Panasonic.VLog_VGamut_to_ACES.a2.v1

Unchanged Transforms

A total of 42 transforms remain identical between configurations, demonstrating the stability of the core ACES implementation.

View complete list of unchanged transforms (42)
Transform Name AMF Components
ACES 2.0 - HDR 1000 nits (P3 D60 in P3 D65) 2
ACES 2.0 - HDR 1000 nits (P3 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 1000 nits (P3 D65) 2
ACES 2.0 - HDR 1000 nits (Rec.2020 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 1000 nits (Rec.2020) 2
ACES 2.0 - HDR 108 nits (P3 D60 in P3 D65) 2
ACES 2.0 - HDR 108 nits (P3 D65) 2
ACES 2.0 - HDR 2000 nits (P3 D60 in P3 D65) 2
ACES 2.0 - HDR 2000 nits (P3 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 2000 nits (P3 D65) 2
ACES 2.0 - HDR 2000 nits (Rec.2020 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 2000 nits (Rec.2020) 2
ACES 2.0 - HDR 4000 nits (P3 D60 in P3 D65) 2
ACES 2.0 - HDR 4000 nits (P3 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 4000 nits (P3 D65) 2
ACES 2.0 - HDR 4000 nits (Rec.2020 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 4000 nits (Rec.2020) 2
ACES 2.0 - HDR 500 nits (P3 D60 in P3 D65) 2
ACES 2.0 - HDR 500 nits (P3 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 500 nits (P3 D65) 2
ACES 2.0 - HDR 500 nits (Rec.2020 D60 in Rec.2020 D65) 2
ACES 2.0 - HDR 500 nits (Rec.2020) 2
ACES 2.0 - SDR 100 nits (P3 D60 in P3 D65) 2
ACES 2.0 - SDR 100 nits (P3 D65) 2
ACES 2.0 - SDR 100 nits (Rec.709 D60 in P3 D65) 2
ACES 2.0 - SDR 100 nits (Rec.709 D60 in Rec.2020 D65) 2
ACES 2.0 - SDR 100 nits (Rec.709 D60 in Rec.709 D65) 2
ACES 2.0 - SDR 100 nits (Rec.709) 2
ADX10 1
ADX16 1
ARRI LogC3 (EI800) 1
D-Log D-Gamut 2
DaVinci Intermediate WideGamut 1
Display P3 - Display 4
Display P3 HDR - Display 8
G2.2 Rec.709 - Display 4
P3-D65 - Display 8
Rec.1886 Rec.709 - Display 4
Rec.2100-HLG - Display 4
Rec.2100-PQ - Display 36
ST2084-P3-D65 - Display 24
sRGB - Display 4

@KelSolaar KelSolaar added this to the OCIO 2.5 configs milestone Sep 6, 2025
@KelSolaar
Copy link
Contributor Author

KelSolaar commented Sep 18, 2025

@doug-walker: Looking at void ColorSpace::setInterchangeAttribute(const char* attrName, const char* value) to set the amf_transform_ids, the function only supports a string but we have colorspaces with many IDs, how do we want to handle this?

Related, the ColorSpace::setInterchangeAttribute method does not seem to serialise the amf_transform_ids, I can definitely see the code being called here (and the values are dumped into the JSON intermediate representation):

3832948#diff-e17ff4163377869bcdd6dd04f154f281577a71238455ec71908ad85f05889b57R268-R272

    {
      "name": "P3-D65 - Display",
      "family": "Display",
      "description": "Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D65, mirror neg. values\n\nAMF Components\n--------------\nACEStransformID: urn:ampas:aces:transformId:v2.0:Output.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1\nACEStransformID: urn:ampas:aces:transformId:v2.0:InvOutput.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1\nACEStransformID: urn:ampas:aces:transformId:v2.0:Output.Academy.P3-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1\nACEStransformID: urn:ampas:aces:transformId:v2.0:InvOutput.Academy.P3-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1\nACEStransformID: urn:ampas:aces:transformId:v2.0:Output.Academy.Rec709-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1\nACEStransformID: urn:ampas:aces:transformId:v2.0:InvOutput.Academy.Rec709-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1\nACEStransformID: urn:ampas:aces:transformId:v2.0:Output.Academy.Rec709-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1\nACEStransformID: urn:ampas:aces:transformId:v2.0:InvOutput.Academy.Rec709-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1",
      "from_reference": {
        "transform_type": "BuiltinTransform",
        "style": "DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D65 - MIRROR NEGS"
      },
      "reference_space": "REFERENCE_SPACE_DISPLAY",
      "encoding": "sdr-video",
      "categories": "file-io",
      "aliases": [
        "p3d65_display",
        ""
      ],
      "interop_id": "g26_p3d65_display",
      "interchange_mapping": {
        "amf_transform_ids": "urn:ampas:aces:transformId:v2.0:Output.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1, urn:ampas:aces:transformId:v2.0:InvOutput.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1, urn:ampas:aces:transformId:v2.0:Output.Academy.P3-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1, urn:ampas:aces:transformId:v2.0:InvOutput.Academy.P3-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1, urn:ampas:aces:transformId:v2.0:Output.Academy.Rec709-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1, urn:ampas:aces:transformId:v2.0:InvOutput.Academy.Rec709-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1, urn:ampas:aces:transformId:v2.0:Output.Academy.Rec709-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1, urn:ampas:aces:transformId:v2.0:InvOutput.Academy.Rec709-D60_48nit_in_P3-D65_Gamma2pt6.a2.v1"
      },
      "transforms_data": [
        {
          "ordering": "430",
          "aces_transform_id": "urn:ampas:aces:transformId:v2.0:Output.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1",
          "colorspace": "",
          "legacy": "FALSE",
          "builtin_transform_style": "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D65_2.0",
          "linked_display_colorspace_style": "DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D65 - MIRROR NEGS",
          "interface": "ViewTransform",
          "encoding": "sdr-video",
          "categories": "file-io",
          "aliases": "",
          "interop_id": "g26_p3d65_display",
          "ctl_transform": {
            "py/object": "opencolorio_config_aces.config.reference.discover.classify.CTLTransform",
            "_path": "/Users/kelsolaar/Documents/Development/ASWF/OpenColorIO-Config-ACES/opencolorio_config_aces/config/reference/aces/aces-output/d65/p3/Output.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.ctl",
            "_code": "// <ACEStransformID>urn:ampas:aces:transformId:v2.0:Output.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1</ACEStransformID>\n// <ACESuserName>P3-D65</ACESuserName>\n\nimport \"Lib.Academy.Utilities\";\nimport \"Lib.Academy.Tonescale\";\nimport \"Lib.Academy.OutputTransform\";\nimport \"Lib.Academy.DisplayEncoding\";\n\n// ---- ODT PARAMETERS BELOW ---- //\n\n// Rendering intent\n// Chromaticities of limiting primaries and white point\nconst Chromaticities limitingPri = // P3 Primaries / D65 White\n    {\n        {0.6800,  0.3200},\n        {0.2650,  0.6900},\n        {0.1500,  0.0600},\n        {0.3127,  0.3290}\n    };\n    \nconst float peakLuminance = 100;  // = 48 * (100/48); \n                                  // luminance the tone scale highlight rolloff will target in cd/m^2 (nits)\nconst bool scale_white = false;   // apply scaling to compress output so that largest channel hits 1.0; usually enabled when using a limiting white different from the encoding white\n\n// Encoding\n// Chromaticities of display primaries and white point\nconst Chromaticities encodingPri = // P3 Primaries / D65 White\n    {\n        {0.6800,  0.3200},\n        {0.2650,  0.6900},\n        {0.1500,  0.0600},\n        {0.3127,  0.3290}\n    };\n\n// EOTF of display (output is encoded with the inverse EOTF)\n//  0 - display linear\n//  1 - ST.2084\n//  2 - HLG\n//  3 - gamma 2.6\n//  4 - BT.1886 with gamma 2.4\n//  5 - gamma 2.2\n//  6 - sRGB IEC 61966-2-1:1999\nconst int eotf_enum = 3;\n\n// ---- ---- ---- ---- ---- ---- //\n\nconst float linear_scale_factor = 1.0;\n\n// Initialization functions\n// These only need to be calculated once and are done here at the global level to assure they are not done per pixel.\n\n// Calculate parameters derived from luminance and primaries\nconst ODTParams ODT_PARAMS = init_ODTParams(peakLuminance,\n                                            limitingPri);\n\nconst float MATRIX_limit_to_display[3][3] = mult_f33_f33(RGBtoXYZ_f33(limitingPri, 1.0),\n                                                         XYZtoRGB_f33(encodingPri, 1.0));\n\n// Transform\nvoid main(\n    input varying float rIn,\n    input varying float gIn,\n    input varying float bIn,\n    output varying float rOut,\n    output varying float gOut,\n    output varying float bOut,\n    output varying float aOut,\n    input varying float aIn = 1.)\n{\n    // ---- Assemble Input ---- //\n    float aces[3] = {rIn, gIn, bIn};\n\n    // ---- Output Transform ---- //\n    float rgb[3] = outputTransform_fwd(aces, ODT_PARAMS);\n\n    // ---- Clamp to peak luminance ---- //\n    rgb = clamp_f3(rgb, 0.0, peakLuminance / ref_luminance);\n\n    // ---- Scale white, needed if limiting white != encoding white ----\n    if (scale_white)\n    {\n        rgb = apply_white_scale(rgb, MATRIX_limit_to_display, false);\n    }\n\n    // ---- Display Encoding ---- //\n    float cv[3] = display_encoding(rgb, MATRIX_limit_to_display, eotf_enum, linear_scale_factor);\n\n    rOut = cv[0];\n    gOut = cv[1];\n    bOut = cv[2];\n    aOut = aIn;\n}",
            "_aces_transform_id": {
              "py/object": "opencolorio_config_aces.config.reference.discover.classify.ACESTransformID",
              "_aces_transform_id": "urn:ampas:aces:transformId:v2.0:Output.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1",
              "_urn": "urn:ampas:aces:transformId:v2.0",
              "_type": "Output",
              "_namespace": "Academy",
              "_name": "P3-D65_48nit_in_P3-D65_Gamma2pt6",
              "_major_version": "a2",
              "_minor_version": "v1",
              "_patch_version": "undefined",
              "_source": "ACES2065-1",
              "_target": "P3-D65_48nit_in_P3-D65_Gamma2pt6"
            },
            "_user_name": "P3-D65",
            "_description": "undefined",
            "_family": "output",
            "_genus": "d65/p3",
            "_siblings": [
              {
                "py/object": "opencolorio_config_aces.config.reference.discover.classify.CTLTransform",
                "_path": "/Users/kelsolaar/Documents/Development/ASWF/OpenColorIO-Config-ACES/opencolorio_config_aces/config/reference/aces/aces-output/d65/p3/InvOutput.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.ctl",
                "_code": "// <ACEStransformID>urn:ampas:aces:transformId:v2.0:InvOutput.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1</ACEStransformID>\n// <ACESuserName>Inverse P3-D65</ACESuserName>\n\nimport \"Lib.Academy.Utilities\";\nimport \"Lib.Academy.Tonescale\";\nimport \"Lib.Academy.OutputTransform\";\nimport \"Lib.Academy.DisplayEncoding\";\n\n// ---- ODT PARAMETERS BELOW ---- //\n\n// Rendering intent\n// Chromaticities of limiting primaries and white point\nconst Chromaticities limitingPri = // P3 Primaries / D65 White\n    {\n        {0.6800,  0.3200},\n        {0.2650,  0.6900},\n        {0.1500,  0.0600},\n        {0.3127,  0.3290}\n    };\n    \nconst float peakLuminance = 100;  // = 48 * (100/48); \n                                  // luminance the tone scale highlight rolloff will target in cd/m^2 (nits)\nconst bool scale_white = false;   // apply scaling to compress output so that largest channel hits 1.0; usually enabled when using a limiting white different from the encoding white\n\n// Encoding\n// Chromaticities of display primaries and white point\nconst Chromaticities encodingPri = // P3 Primaries / D65 White\n    {\n        {0.6800,  0.3200},\n        {0.2650,  0.6900},\n        {0.1500,  0.0600},\n        {0.3127,  0.3290}\n    };\n\n// EOTF of display (output is encoded with the inverse EOTF)\n//  0 - display linear\n//  1 - ST.2084\n//  2 - HLG\n//  3 - gamma 2.6\n//  4 - BT.1886 with gamma 2.4\n//  5 - gamma 2.2\n//  6 - sRGB IEC 61966-2-1:1999\nconst int eotf_enum = 3;\n\n// ---- ---- ---- ---- ---- ---- //\n\nconst float linear_scale_factor = 1.0;\n\n// Initialization functions\n// These only need to be calculated once and are done here at the global level to assure they are not done per pixel.\n\n// Calculate parameters derived from luminance and primaries of current transform\nconst ODTParams ODT_PARAMS = init_ODTParams(peakLuminance,\n                                            limitingPri);\n\nconst float MATRIX_limit_to_display[3][3] = mult_f33_f33(RGBtoXYZ_f33(limitingPri, 1.0),\n                                                         XYZtoRGB_f33(encodingPri, 1.0));\n\n// Transform\nvoid main(\n    input varying float rIn,\n    input varying float gIn,\n    input varying float bIn,\n    output varying float rOut,\n    output varying float gOut,\n    output varying float bOut,\n    output varying float aOut,\n    input varying float aIn = 1.)\n{\n    // ---- Assemble Input ---- //\n    float cv[3] = {rIn, gIn, bIn};\n\n    // ---- Display Decoding ---- //\n    float rgb[3] = display_decoding(cv, invert_f33(MATRIX_limit_to_display), eotf_enum, linear_scale_factor);\n\n    // ---- Undo white scaling, needed if limiting white != encoding white ----\n    if (scale_white)\n    {\n        rgb = apply_white_scale(rgb, MATRIX_limit_to_display, true);\n    }\n\n    // ---- Clamp to peak luminance ---- //\n    rgb = clamp_f3(rgb, 0.0, peakLuminance / ref_luminance);\n\n    // ---- Inverse Output Transform ---- //\n    float inv_aces[3] = outputTransform_inv(rgb, ODT_PARAMS);\n\n    rOut = inv_aces[0];\n    gOut = inv_aces[1];\n    bOut = inv_aces[2];\n    aOut = aIn;\n}",
                "_aces_transform_id": {
                  "py/object": "opencolorio_config_aces.config.reference.discover.classify.ACESTransformID",
                  "_aces_transform_id": "urn:ampas:aces:transformId:v2.0:InvOutput.Academy.P3-D65_48nit_in_P3-D65_Gamma2pt6.a2.v1",
                  "_urn": "urn:ampas:aces:transformId:v2.0",
                  "_type": "InvOutput",
                  "_namespace": "Academy",
                  "_name": "P3-D65_48nit_in_P3-D65_Gamma2pt6",
                  "_major_version": "a2",
                  "_minor_version": "v1",
                  "_patch_version": "undefined",
                  "_source": "P3-D65_48nit_in_P3-D65_Gamma2pt6",
                  "_target": "ACES2065-1"
                },
                "_user_name": "Inverse P3-D65",
                "_description": "undefined",
                "_family": "output",
                "_genus": "d65/p3",
                "_siblings": [
                  {
                    "py/id": 419
                  }
                ]
              }
            ]
          }
        },

@KelSolaar KelSolaar force-pushed the feature/2025-09 branch 4 times, most recently from 191fedb to 3832948 Compare September 18, 2025 11:36
@doug-walker
Copy link
Contributor

@KelSolaar , please add all the AMF Transform IDs into one string, separated by "\n" characters.

I just built the current main branch and tested the Python function as follows:

>> cs.setInterchangeAttribute("amf_transform_ids","foo bar\nbar foo")
>> cfg.addColorSpace(cs)
>> cfg.setVersion(2,5)
>> buf = cfg.serialize()

And the expected interchange string was in the buffer. So I don't understand why it's not working for you.

@KelSolaar
Copy link
Contributor Author

Unsure to be fair, the code is definitely called, like any other ColorSpace methods and the values are passed :(

@KelSolaar
Copy link
Contributor Author

@doug-walker : Late midnight mistake, I bumped the profile version which produced a config with different name, i.e., with 2.5 and I was still looking at the 2.4 one...

@KelSolaar KelSolaar force-pushed the feature/2025-09 branch 2 times, most recently from e29a219 to a218ba0 Compare September 19, 2025 00:08
@KelSolaar
Copy link
Contributor Author

Ok, artifacts updated, we are getting close!

@doug-walker
Copy link
Contributor

Great progress @KelSolaar !

One issue I'm noticing is that color spaces such as ACEScct has the new amf_transform_ids attribute, but still has the ACEStransformID in the description. While other spaces such as "ARRI LogC3 (EI800)" only have it in the description attribute still.

In addition, I'm wondering what we should do with the CLFtransformIDs, maybe we should omit those by default?

@doug-walker
Copy link
Contributor

doug-walker commented Sep 19, 2025

Thomas, here are the issues I've found. (I will check these off as they are addressed.)

  • Some color spaces are missing interchange/amf_transform_ids (mentioned above).
  • Some descriptions still contain either ACEStransformID or CLFtransformID (mentioned above).
  • Every interop ID needs to be added as an alias.
  • The name "G2.2 Rec.709 - Display" does not align with CIF Display rec. "Gamma 2.2 Rec.709 - Display", we need to change one or the other.
  • The interop ID for ACEScc is missing the namespace (which is odd since the spreadsheet looks correct).
  • The same was true for itu709_rec709_scene. The spreadsheet for that one was wrong, so I fixed it.
  • The encoding for "Display P3 HDR - Display" is still "hdr-video" rather than the "hdrx-video" I had put in the spreadsheet (which I've now changed to "edr-video", per Carol).
  • File rules are not implemented yet.
  • Viewing rules are not implemented yet.
  • Config version number should increase from 3.0.0.
  • The Un-tone-mapped view should have the "Any Scene-linear or Log" rule.
  • There should be a new view named "Video (colorimetric)" that has the "Any Video" rule.
  • Please add the interop id: "ocio:lin_ciexyzd65_display" to "CIE XYZ-D65 - Display-referred".
  • Please add the alias: "ocio:lin_ciexyzd65_display" to "CIE XYZ-D65 - Display-referred".
  • Some color spaces are missing AMF IDs, such as "ARRI LogC3 (EI800)".
  • Other color spaces only have the forward but not the inverse transform ID, such as "ACEScg".
  • The AMF IDs disappeared from the view transforms.
  • The Look transform is missing its AMF ID.
  • The D60 AMF IDs are present in the display color spaces.
  • The previousEquivalentTransformIds are present in some color spaces (e.g. ACEScc).
  • The inverse AMF ID is missing from the view transforms (and look, though that is perhaps not strictly necessary).
  • Missing the inverse AMF ID for ARRI LogC3.
  • Update the Display P3 HDR display with the new terminology (waiting on final wording)
  • Add "edr-video" encoding to the "Any Video" viewing rule.

@KelSolaar
Copy link
Contributor Author

KelSolaar commented Sep 19, 2025

Looking at the notes, thanks for the thorough check!

The interop ID for ACEScc is missing the namespace (which is odd since the spreadsheet looks correct).

The trap of the other spreadsheet! :)

https://docs.google.com/spreadsheets/d/1z3xsy3sF0I-8AN_tkMOEjHlAs13ba7VAVhrE8v4WIyo/edit?pli=1&gid=0#gid=0

but still has the ACEStransformID in the description. While other spaces such as "ARRI LogC3 (EI800)" only have it in the description attribute still.

In addition, I'm wondering what we should do with the CLFtransformIDs, maybe we should omit those by default?

Yes they are generated outside the AMF components and were always part of the description. They should be easy to hide, it is just a flag in the generator.

@KelSolaar
Copy link
Contributor Author

KelSolaar commented Sep 19, 2025

Config version number should increase from 3.0.0 to 3.1.0.

We technically have breaking changes for the Display spaces with the new builtins.


Are we going with those file rules?

file_rules:
  - !<Rule> {name: EXR, colorspace: ACES2065-1, pattern: "*", extension: exr}
  - !<Rule> {name: Movies, colorspace: Rec.1886 Rec.709 - Display, regex: ".*\\.([mM][pP]4|[mM][oO][vV]|[mM][xX][fF])$"}
  - !<Rule> {name: Default, colorspace: sRGB - Display}

PS: If a good soul was willing to punch the viewing rules in the new Reference spreadsheet column while I roll the code to support the feature, that would be mint!

image

@doug-walker
Copy link
Contributor

doug-walker commented Sep 19, 2025

@KelSolaar , the viewing rule column in the Reference spreadsheet looks correct.

Yes, let's use those file rules for now, to test the system.

@KelSolaar
Copy link
Contributor Author

Ok, new artifacts up! Still waiting for answer WRT to the version number and files rules.

@doug-walker
Copy link
Contributor

I'm not opposed to using 4.0.0 for the version, it sounds like that's your preference. I'll put it on the agenda for the next meeting.

And let's use the file rules you posted above. They probably need more discussion, but let's use those for now.

@doug-walker
Copy link
Contributor

Thanks for all the fixes! I checked off a lot of the items above. And I added some new items related to viewing rules. (I'm signing-off for tonight, good luck!)

@KelSolaar KelSolaar force-pushed the feature/2025-09 branch 2 times, most recently from ecdcd4b to 2e15401 Compare September 19, 2025 06:15
@KelSolaar
Copy link
Contributor Author

N8! Should be super close now.

@doug-walker
Copy link
Contributor

@KelSolaar , lots more items checked off, thank you!

I added a few more items to the checklist above, it seems the AMF IDs are not fully working yet.

Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
…3` branch.

Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
…nts.

Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
doug-walker
doug-walker previously approved these changes Sep 30, 2025
Copy link
Contributor

@doug-walker doug-walker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One remaining issue: It looks like the DCO sign-off check is failing.

And it's still marked draft, but approving!!

carolalynn
carolalynn previously approved these changes Sep 30, 2025
Copy link

@carolalynn carolalynn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing, let's goooooo!

@KelSolaar
Copy link
Contributor Author

One remaining issue: It looks like the DCO sign-off check is failing.

And it's still marked draft, but approving!!

This is intentional: I left a temporary commit on top of the branch to point the dependencies to Pypi Test. We have an Ouroboros situation where OCIO depends on the Configs but the Configs generation depends on an unreleased version of the library. When the library is released, I'll pop the commit and we should be able to merge!

@KelSolaar
Copy link
Contributor Author

@doug-walker, @carolalynn: I popped the blocking commit, we should be good now!

Copy link
Contributor

@doug-walker doug-walker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, Thomas!

Copy link

@carolalynn carolalynn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let’s go!!!

@KelSolaar KelSolaar merged commit 95f6bb0 into AcademySoftwareFoundation:main Oct 2, 2025
6 checks passed
@KelSolaar KelSolaar deleted the feature/2025-09 branch October 2, 2025 00:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants