PODT: Partial Output Device Transform, general

Description Usage Arguments Details Value Source References See Also

Description

A partial Output Device Transform (PODT) maps from OCES to linear display RGB (both of these are optical in nature). The adjective "partial" is used because this is an ODT that omits the final OETF (which maps from linear display RGB to signal display RGB).
This PODT is parameterized.

Usage

1
general.PODT( display_pri, Ymax=1, observerWP=NULL, surround='dark', limiting_pri=NULL )

Arguments

display_pri

a 4x2 matrix containing the display primaries, or a numeric vector of length 8 that can be converted to such a matrix, by row. Some built-in matrices are REC709_PRI, etc.
display_pri can also be NULL, which means that the PODT maps to XYZ, instead of RGB. This is used in the case of DCDM (Digital Cinema Distribution Master). See the User Guide Appendix for examples of this.
display_pri is stored in the metadata of the returned object and later used in installRGB() (if the PODT is passed in an argument).

Ymax

the maximum luminance of the output device, in cd/m^2 (or nits). This has no effect on the PODT itself. It is stored in the metadata and later used in installRGB() (if the PODT is passed in an argument) when computing the 3x3 matrix that transforms from display RGB to display XYZ.

observerWP

the xy chromaticity of the assumed observer whitepoint. This is used to make a Chromatic Adaptation Transform (CAT) from the ACES whitepoint (approximately D60) to the assumed observer whitepoint. If observerWP is NULL, it is taken from display_pri. If display_pri is NULL, then it is taken from limiting_pri. If limiting_pri is NULL, or if two whitepoints are the same, then there is no CAT.

surround

The level of the surround luminance. Valid values are 'dark' and 'dim'. If the level is 'dark' there is no special color compensation. Partial matching is enabled and matching is case-insensitive.

limiting_pri

a 4x2 matrix containing the limiting primaries, or a numeric vector of length 8 that can be converted to such a matrix, by row. If limiting_pri is not NULL, and not equal to display_pri, then the output RGB is clamped to the RGB cube that corresponds to limiting_pri.

Details

The transfer is complicated; here is a summary of the steps:

  1. matrix conversion from AP0 RGB \rarrow AP1 RGB

  2. clamp to non-negative RGB

  3. segmented spline, assuming CINEMA_WHITE=48 nit

  4. absolute luminance to linear code-value, in cube [0,1]^3

  5. scale and roll-white to avoid clipping (optional, only when observerWP is ACES whitepoint and display whitepoint is D65 or DCI whitepoint)

  6. dim surround compensation with conversion to XYZ and back again (optional, see argument surround)

  7. matrix conversion from AP1 RGB to XYZ

  8. adapt XYZ from ACES whitepoint to observer whitepoint (optional, see argument observerWP)

  9. clamp XYZ to limiting primaries (optional, see argument limiting_pri)

  10. matrix conversion from XYZ to linear display RGB (but not for DCDM, see argument display_pri)

  11. clamp linear display RGB (or XYZ for DCDM) to the cube [0,1]^3

Value

general.PODT() returns a TransferFunction of dimension 3 that maps OCES RGB to linear display RGB. The domain is [0,10000]^3 and the range is [0,1]^3.
The metadata contains the display primaries and whitepoint, which is useful in installRGB().

Source

This function was based on source code at: https://github.com/ampas/aces-dev; especially the files under the folder aces-dev-master/transforms/ctl/odt/.

References

ST 2065-1:2012. SMPTE Standard - Academy Color Encoding Specification (ACES). 2013.

See Also

TransferFunction, installRGB(), metadata(), RRT.TF, Standard Primaries


spacesRGB documentation built on Dec. 11, 2021, 9:58 a.m.