-
Notifications
You must be signed in to change notification settings - Fork 43
PR: 2025-09 #160
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PR: 2025-09 #160
Conversation
…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>
|
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 |
There was a problem hiding this comment.
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!
|
I added (initial) support to inject the AMF components via the new Key Metrics
Status Legend
Enhanced Transforms DetailACES 1.3 Reference Gamut Compression 🟠Status: Enhanced (+2 components)
Detailed Component Changes
ACEScc 🟠Status: Enhanced (+8 components)
Detailed Component Changes
ACEScct 🟠Status: Enhanced (+4 components)
Detailed Component Changes
ACEScg 🟠Status: Enhanced (+8 components)
Detailed Component Changes
ARRI LogC4 🟠Status: Enhanced (+1 components)
Detailed Component Changes
Apple Log 🟠Status: Enhanced (+1 components)
Detailed Component Changes
BMDFilm WideGamut Gen5 🟠Status: Enhanced (+2 components)
Detailed Component Changes
CanonLog2 CinemaGamut D55 🟠Status: Enhanced (+4 components)
Detailed Component Changes
CanonLog3 CinemaGamut D55 🟠Status: Enhanced (+4 components)
Detailed Component Changes
Log3G10 REDWideGamutRGB 🟠Status: Enhanced (+3 components)
Detailed Component Changes
S-Log3 S-Gamut3 🟠Status: Enhanced (+3 components)
Detailed Component Changes
S-Log3 S-Gamut3.Cine 🟠Status: Enhanced (+3 components)
Detailed Component Changes
S-Log3 Venice S-Gamut3 🟠Status: Enhanced (+1 components)
Detailed Component Changes
S-Log3 Venice S-Gamut3.Cine 🟠Status: Enhanced (+1 components)
Detailed Component Changes
V-Log V-Gamut 🟠Status: Enhanced (+0 components)
Detailed Component Changes
Unchanged TransformsA total of 42 transforms remain identical between configurations, demonstrating the stability of the core ACES implementation. View complete list of unchanged transforms (42)
|
|
@doug-walker: Looking at Related, the 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
}
]
}
]
}
}, |
191fedb to
3832948
Compare
|
@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: And the expected interchange string was in the buffer. So I don't understand why it's not working for you. |
|
Unsure to be fair, the code is definitely called, like any other ColorSpace methods and the values are passed :( |
|
@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... |
e29a219 to
a218ba0
Compare
|
Ok, artifacts updated, we are getting close! |
|
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? |
|
Thomas, here are the issues I've found. (I will check these off as they are addressed.)
|
|
Looking at the notes, thanks for the thorough check!
The trap of the other spreadsheet! :)
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. |
a218ba0 to
6f218c5
Compare
|
@KelSolaar , the viewing rule column in the Reference spreadsheet looks correct. Yes, let's use those file rules for now, to test the system. |
|
Ok, new artifacts up! Still waiting for answer WRT to the version number and files rules. |
|
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. |
|
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!) |
ecdcd4b to
2e15401
Compare
|
N8! Should be super close now. |
|
@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>
eab2530 to
078b597
Compare
…nts. Signed-off-by: Thomas Mansencal <thomas.mansencal@gmail.com>
078b597 to
60df459
Compare
doug-walker
left a comment
There was a problem hiding this 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
left a comment
There was a problem hiding this 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!
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! |
60df459 to
2c36aeb
Compare
|
@doug-walker, @carolalynn: I popped the blocking commit, we should be good now! |
doug-walker
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you, Thomas!
carolalynn
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let’s go!!!

A draft PR to start parking the current work, so far:
ACEStransformIDof the ARRI transforms. References ARRI LogC4 ACES ID typo #157.transforms.jsonfile.amf_transform_idsatttribute support implemented. References Update color spaces to use new attributes #154interop_idatttribute support implemented. References Update color spaces to use new attributes #154Latest artifacts are here: https://github.com/AcademySoftwareFoundation/OpenColorIO-Config-ACES/actions/runs/18078454050