ACESproxy – An Integer Log Encoding of ACES Image Data¶
Introduction¶
This document specifies a logarithmictype integer encoding for the Academy Color Encoding System (ACES) for use in 10bit and 12bit hardware systems that need to transmit a representation of an ACES floatingpoint image.
The Academy Color Encoding Specification prescribes a digital encoding method using the IEEE halfprecision floatingpoint encoding defined in IEEE 7542008. Many production systems do not support the use of 16bitpercolor component transmission especially where hardware video systems are utilized. Some systems used for preview, look creation, and color grading are limited to common 10bit and 12bit video signals. In some cases, it is still necessary for a user to see a representation of the ACES image without it having been rendered for the output device using an Output Transform, and where no 16bit floatingpoint capability exists in the hardware and software.
This document specifies an encoding of ACES using 10bit or 12bit integer data types for compatibility with those systems. This encoding is defined and named herein as ACESproxy.
10bit and 12bit integer data types cannot store the full range of ACES data with the same level of precision provided by the ACES halfprecision floatingpoint format. To make appropriate use of the limited range of the 10bit and 12bit integer data types, the ACESproxy encoding uses a middle portion of the possible range of ACES values and is encoded using a logarithmic transfer function. To better facilitate onset look creation, ACESproxy also uses a smaller color gamut. ACES values outside of this encoded range cannot be transmitted using ACESproxy and are assumed to be clipped to the maximum and minimum ACESproxy values.
ACESproxy is appropriate as a workingspace encoding for onset preview and look creation systems since those systems are typically designed to work with other image data encoded in a similar fashion. The ACESproxy encoding is specifically designed to work well when graded using the American Society of Cinematographers Color Decision List (ASC CDL).
The ACESproxy encoding was designed for the transmission of images across transports such as High Definition Serial Digital Interface (HDSDI), for use within hardware systems limited to 10 or 12bit operation, and for the creation of look metadata such as ASC CDL values.
ACESproxy images are designed to be viewed through an ACES viewing pipeline as detailed in Appendix A. When viewed without an ACES output transform, ACESproxy images are dim and low in contrast and saturation, but allow all of the sensors image data to be viewed.
ACESproxyencoded images are intermediate encodings and are not replacements for ACES image data in postproduction color grading or finishing environments. There is no image file container format specified for use with ACESproxy. ACESproxy encoding is specifically not intended for interchange, mastering finals, or archiving, all of which are better completed using the original ACES files.
Scope¶
This document specifies 10bit and 12bit integer encodings of ACES for use with imaging systems that produce look metadata such as ASC CDL, and with transport systems such as HDSDI. The color encoding provided in this format represents ACES relative exposure values as RGB triplets in a logarithmic encoding, and does not define the interfaces or signals that may carry this encoding.
References¶
The following standards, specifications, articles, presentations, and texts are referenced in this text:
 ST 20651:2021  SMPTE Standard  Academy Color Encoding Specification (ACES)
 RP 177:1993  SMPTE Recommended Practice  Derivation of Basic Television Color Equations
Specification¶
Naming conventions¶
Both the 10bit and 12bit logarithmic integer encoding of ACES specified in this document shall be known as ACESproxy.
Systems that are limited to the display of 8 characters for control labels shall use the abbreviation ACESPRXY.
Systems that are limited to the display of 5 to 7 characters for control labels shall use the abbreviation ACSPX.
Color space chromaticities¶
ACESporxy uses a different set of primaries than the ACES RGB primaries defined in SMPTE ST 20651. The CIE 1931 colorimetry of the ACESproxy RGB primaries and white are specified below.
Color primaries¶
The chromaticity values of the RGB primaries (known as AP1) shall be those found below:
R  G  B  CIE x  CIE y  

Red  1.0  0.0  0.0  0.713  0.293  
Green  0.0  1.0  0.0  0.165  0.830  
Blue  0.0  0.0  1.0  0.128  0.044 
White point¶
The white point shall be:
R  G  B  CIE x  CIE y  

White  1.0  1.0  1.0  0.32168  0.33767 
ACESproxy 10bit definition¶
The following functions shall be used to convert between ACES values, encoded according to SMPTE ST 20651, and 10bit integer ACESproxy values.
Encoding Function¶
ACES \(R\), \(G\), and \(B\) values shall be converted to \(lin_{AP1}\) \(R\), \(G\), and \(B\) values using the transformation matrix (\(TRA_1\)) calculated and applied using the methods provided in Section 4 of SMPTE RP 177:1993.
\(lin_{AP1}\) \(R\), \(G\), and \(B\) values shall be converted to ACESproxy10 values according to Equation 1.
Where:
\(\mathrm{FLOAT2CV10}(\mathbf{a})\) returns MAX\((64,\) MIN\((940,\) ROUND\((\mathbf{a})))\)
ROUND(\(\mathbf{a}\)) returns the integer value closest to the floating point value \(\mathbf{a}\)
MAX\((\mathbf{a}, \mathbf{b})\) returns the greater of \(\mathbf{a}\) or \(\mathbf{b}\)
MIN\((\mathbf{a}, \mathbf{b})\) returns the lesser of \(\mathbf{a}\) or \(\mathbf{b}\)
Note
Equation 2 shows the relationship between ACES \(R\), \(G\), and \(B\) values and \(lin_{AP1}\) \(R\), \(G\), and \(B\) values. \(TRA_{1}\), rounded to 10 significant digits, is derived from the product of \(NPM_{AP1}\) inverse and \(NPM_{AP0}\) calculated using methods provided in Section 3.3 of SMPTE RP 177:1993.
AP0 are the primaries of ACES specified in SMPTE ST 20651.
AP1 are the primaries of ACESproxy specified in Color space chromaticities.
Note
ACESproxy values encoded using the equation above are not appropriate for storage or for archiving. They are intended for use only with digital transport interfaces unable to carry halfprecision floatingpoint values, and with integerbased grading systems designed to generate look metadata that will guide the color grading applied to ACES image data later in the postproduction process.
Note
ACESproxy encodes values into the SMPTE “legalrange” for video systems; grading systems should use this as their nominal range.
Decoding Function¶
ACESproxy \(R\), \(G\), and \(B\) values shall be converted to \(lin_{AP1}\) values using Equation 3.
\(lin_{AP1}\) \(R\), \(G\), and \(B\) values shall be converted to ACES \(R\), \(G\), and \(B\) values using the transformation matrix (\(TRA_{2}\)) calculated and applied using the methods provided in Section 4 of SMPTE RP 177:1993.
Note
Equation 4 shows the relationship between ACES \(R\), \(G\), and \(B\) values and ACESproxy \(R\), \(G\), and \(B\) values. \(TRA_{2}\), rounded to 10 significant digits, is derived from the product of \(NPM_{AP0}\) inverse and \(NPM_{AP1}\) calculated using methods provided in Section 3.3 of SMPTE RP 177:1993.
AP0 are the primaries of ACES specified in SMPTE ST 20651.
AP1 are the primaries of ACESproxy specified in Color space chromaticities.
ACESproxy 12bit definition¶
The following functions shall be used to convert between ACES values, encoded according to SMPTE ST 20651, and 10bit integer ACESproxy values.
Encoding Function¶
ACES \(R\), \(G\), and \(B\) values shall be converted to \(lin_{AP1}\) \(R\), \(G\), and \(B\) values using the transformation matrix (\(TRA_1\)) calculated and applied using the methods provided in Section 4 of SMPTE RP 177:1993.
\(lin_{AP1}\) \(R\), \(G\), and \(B\) values shall be converted to ACESproxy12 values according to Equation 5.
Where:
\(\mathrm{FLOAT2CV10}(\mathbf{a})\) returns MAX\((256,\) MIN\((3760,\) ROUND\((\mathbf{a})))\)
ROUND(\(\mathbf{a}\)) returns the integer value closest to the floating point value \(\mathbf{a}\)
MAX\((\mathbf{a}, \mathbf{b})\) returns the greater of \(\mathbf{a}\) or \(\mathbf{b}\)
MIN\((\mathbf{a}, \mathbf{b})\) returns the lesser of \(\mathbf{a}\) or \(\mathbf{b}\)
Note
Equation 6 shows the relationship between ACES \(R\), \(G\), and \(B\) values and \(lin_{AP1}\) \(R\), \(G\), and \(B\) values. \(TRA_{1}\), rounded to 10 significant digits, is derived from the product of \(NPM_{AP1}\) inverse and \(NPM_{AP0}\) calculated using methods provided in Section 3.3 of SMPTE RP 177:1993.
AP0 are the primaries of ACES specified in SMPTE ST 20651.
AP1 are the primaries of ACESproxy specified in Color space chromaticities.
Note
ACESproxy values encoded using the equation above are not appropriate for storage or for archiving. They are intended for use only with digital transport interfaces unable to carry halfprecision floatingpoint values, and with integerbased grading systems designed to generate look metadata that will guide the color grading applied to ACES image data later in the postproduction process.
Note
ACESproxy encodes values into the SMPTE “legalrange” for video systems; grading systems should use this as their nominal range.
Decoding Function¶
ACESproxy \(R\), \(G\), and \(B\) values shall be converted to \(lin_{AP1}\) values using Equation 7.
\(lin_{AP1}\) \(R\), \(G\), and \(B\) values shall be converted to ACES \(R\), \(G\), and \(B\) values using the transformation matrix (\(TRA_{2}\)) calculated and applied using the methods provided in Section 4 of SMPTE RP 177:1993.
Note
Equation 8 shows the relationship between ACES \(R\), \(G\), and \(B\) values and ACESproxy \(R\), \(G\), and \(B\) values. \(TRA_{2}\), rounded to 10 significant digits, is derived from the product of \(NPM_{AP0}\) inverse and \(NPM_{AP1}\) calculated using methods provided in Section 3.3 of SMPTE RP 177:1993.
AP0 are the primaries of ACES specified in SMPTE ST 20651.
AP1 are the primaries of ACESproxy specified in Color space chromaticities.
Appendices¶
Appendix A: Encoding of negative values¶
As a part of the ACES system, images encoded in ACESproxy form are intended to be decoded into ACES values and viewed using an ACES Output Transform appropriate for an intended viewing device.
Without such a transform in place, viewed ACESproxy images will appear dim, severely low in contrast and desaturated. However, directly viewing the unrendered logencoded images is sometimes useful, for example while looking at the wide range of captured image data in the highlights and shadows that are preserved in the ACES system.
ACESproxy has been designed to place scene details into the SMPTE “legalrange” of video systems. Scene detail from about 7 stops under midgray to 10 stops over midgray should be visible within normal legal range monitor setups. No rescaling of the device output signal should be needed for direct viewing, but is required before applying color grading transforms as described in Appendix C.
The ACESproxy encoding allows an amount of ‘headroom’ beyond the current dynamic range capabilities of digital motion picture cameras, and it is expected that the range of exposed highlight values seen on a waveform monitor will be lower on a monitors scale than the corresponding range that would be shown if other forms of log encoding were used.
Specific knowledge of the dynamic range of a camera system and its output encoding can be used to determine the maximum value that will appear on a waveform monitor indicating an exposure has reached full saturation of the sensor.
On a waveform monitor displaying ACESproxy values in IRE units, a gray card representing an 18% reflectance would appear at a level of 41% IRE under a normal exposure assumption. A perfect white reflector under the same conditions would appear at 55% IRE. A camera which reaches sensor saturation at 7 stops above 18% reflectance would not show any values above 81% IRE.
Appendix B: Range of ACES values¶
This appendix is intended for developers who wish to validate the accuracy of their implementation.
The table below contains the results of conversions using exact 16bit ACES codes. 16bit ACES has higher precision than either form of ACESproxy so rounding of ACES values will occur. These numbers are accurate for neutral values where R=G=B.
ACES 16bit halffloat Hex Code  ACES  ACESproxy 10bit CV  ACESproxy 12bit CV  ACES decoded from 10bit ACESproxy  ACES decoded from 12bit ACESproxy 

14DA  0.001184464  64  256  0.001185417  0.001185417 
31C3  0.180053711  426  1705  0.179199219  0.179809570 
5AF7  222.875  940  3760  222.875  222.875 
Appendix C: Convention for use of ACESproxy SMPTE range¶
This appendix defines the equivalent of a [0.0 ... 1.0] range in both 10bit and 12bit ACESproxy for use in applications.
For consistency in using ACESproxy values in video systems designed around the [0.0 . . . 1.0] video range (encoded in 10bit video as the range 64940), the following ACES values are considered the equivalents to 0.0 and 1.0 for both 10bit and 12bit video.
Video normalized scale  IRE  10bit CV  12bit CV  ACES 

0.0  0%  64  256  0.001185417 
1.0  100%  940  3760  222.875 
ASC CDL values are applied to values in the range [0.0 ... 1.0] which by this convention are set to ACES values 0.001185417 to 222.875. In integer based color grading systems this is typically accomplished by scaling from “legal” to full range before applying ASC CDL transforms. The ASC CDL application is further defined in a separate document.
Appendix D: ACESproxy function derivation¶
The ACESproxy 10bit and 12bit logarithmic encoding and decoding functions have been derived from the single mathematical function described below. A series of parameters are defined and the values for the parameters specified based on the bit depth of the encoding.
Math functions¶
The following generaluse math functions are defined for use within the equations.
 \(\mathrm{ROUND}(a)\)

Math function taking a floatingpoint value \(a\), and returning the integer value closest to \(a\)
 \(\mathrm{MAX}(a, b)\)

Math function returning the greater of \(a\) or \(b\)
 \(\mathrm{MIN}(a, b)\)
 Math function returning the lesser of \(a\) or \(b\)
 \(\mathrm{FLOAT2CV}(a)\)

Math function returning \(\mathrm{MAX}(\mathrm{CV_{min}}, \mathrm{MIN}[\mathrm{CV_{max}},\mathrm{ROUND}(a)])\)
Parameters¶
The following parameters are defined for each bitdepth.
 \(\mathrm{CV_{min}}\) is the minimum code value available for representation of ACES image data
 \(\mathrm{CV_{max}}\) is the maximum code value available for representation of ACES image data
 \(StepsPerStop\) is the number of code values representing a change of 1 stop in exposure
 \(\mathrm{MidCVOffset}\) is the integer code value representing the assigned midpoint of the exposure scale for a particular bitdepth encoding. (e.g. the point to which a midgrey exposure value would be mapped)
 \(\mathrm{MidLogOffset}\) is the base 2 logarithmic value representing the assigned midpoint of the exposure scale in log space, [e.g. \(\mathrm{MidLogOffset} = log_{2}(2^{−2.5}) = −2.5\) ]
ACESproxy 10bit CV  ACESproxy 12bit CV  

\(\mathrm{CV_{min}}\)  64  256 
\(\mathrm{CV_{max}}\)  940  3760 
\(\mathrm{StepsPerStop}\)  50  200 
\(\mathrm{MidCVOffset}\)  425  1700 
\(\mathrm{MidLogOffset}\)  2.5  2.5 
Note
\(\mathrm{MidCVOffset}\) is not equal to the ACESproxy value that most closely represents an ACES midgray value of 0.18.
ACES 0.18 is most closely represented by a 10bit ACESproxy code value of 426 or a 12bit ACESproxy code value of 1705.
Encoding function¶
The following floatingpoint equation is used to convert linear values to integer code values.
where \(\mathrm{ACESproxy}\) is the resulting integer code value in the range of code values from \(\mathrm{CV_{min}}\) to \(\mathrm{CV_{max}}\).
An implementation may use mathematically equivalent forms of this encoding equation.
Decoding function¶
The following floatingpoint equation is used to convert ACESproxy integer code values to linear values.
The conversion to linear creates the closest value in 16bit half precision floatingpoint to the floatingpoint result of the equation. Linear values resulting from this equation are limited to the range of values that can be encoded in ACESproxy as illustrated in Appendix B. This decoding function does not produce negative values.
An implementation may use mathematically equivalent forms of this decoding equation.