An image in Digital Cinema is not like any other image, it follows a particular encoding workflow with several steps to result in a compliant digital cinema image.
This workflow involves applying several transformations from the original image to a JPEG2000 XYZ 12-bit image.
This workflow is mainly based on two mathematical equations :
![]() |
![]() |
Don't be scared ! please, come back ! :)
These two equations may seem to be complicated but taken step by step, they aren't so difficult. In the following chapters, we will look at each part.
XYZ Conversion | Transfert Function & Conversions |
---|---|
![]() |
![]() |
Ready to go ? Let's go ! :)
Image encoding for digital cinema must follow strict rules and guidelines 1 :
An example of the workflow, from an original image to the final result, a JPEG2000 X'Y'Z / 12-bit per color image.
We start with an RGB 16-bit per component image, we apply a transformation to linearize it, which involves removing RGB gamma (gamma 1.0). Then, we apply our XYZ transformation using matrix computation to provide an XYZ colorspace image. We add a small step for white point normalization and gamma encoding 3. Finally, we have a 12-bit conversion before the JPEG2000 compression.
From there, we can integrate our final image (JPEG2000, 12-bit per color, in XYZ colorspace, with a gamme 2.6) into an MXF.
The image of the workflow above is a visual and simplified representation of our two equations at the beginning of this chapter. That's easier now, right ? :)
See the following chapter Linear for further information.
See the following chapter XYZ for further information.
See the following chapter White Point for further information.
See the following chapter Gamma for further information.
See the following chapter Bitdepth for further information.
At the end of all of these steps, we can encode and compress our image into JPEG2000 format.
See the following chapter JPEG2000 for further (and intensive) information
By following this workflow, you will have a compliant DCI/SMPTE JPEG2000 image.
From there, you can integrate these images into our MXF, especially into the MXF Picture.
Find all the assets and softwares in the assets/Image/
directory.
SMPTE :
Ressources :
Few references on conversion workflow : ↩
Color conversion from R’G’B’ to X’Y’Z’ requires a three-step process which involves linearizing the color-corrected R’G’B’ signals (by applying a 2.6 gamma function), followed by their passage through a linear 3x3 transform matrix. The resultant linearized and coded XYZ signals are then given an inverse 2.6 gamma transfer characteristic whose output is quantized to 12 bits. -- SMPTE RP-431-2-2011 - DCinema Quality Reference Projector and Environement - Chapitre « Color Conversion to XYZ »
The digital files were linearized (applying a gamma of 2.6), then a 3x3 matrix was applied to convert RGB to XYZ, followed by application of the (1)/2.6 gamma function. The finished color-corrected files were stored as 12-bit X'Y'Z' data in 16-bit TIFF files. -- Color and Mastering for Digital Cinema (Glenn Kennel)
The DCI standard pixel representation specifies a quantization of the X’Y’Z’ color space using 12 bits and a 2.6 gamma power law TF with a peak luminance of 52.37 cd/m2 -- SMPTE Journal, March 2018, Evaluation of Color Pixel Representations for High Dynamic Range Digital Cinema (Boitard, Jacquemin, Damberg, Stojmenovik, Ballestad)
What did I mean by the term « component » ? Component may be confusing at the first sight, but it's just a different way of naming for "color" (but not exactly ;-) ↩
In a RGB colorspace, we have 3 colors - red, green, blue - so 3 components.
But then, why use the term "3 components" instead of "3 colors" ? because in other colorspaces - particularly in XYZ colorspace - they don't have color components. X, Y and Z are not color values, but only values which - with specific computations - allow for the retrieval of color and intensity information.
For example, the "Y" in "XYZ" is not a color but the lumimance value.
A component is just a slot for a value. This value can be a color value such as R, G or B, or another type of value such as Y in XYZ colorspace.
For simplicity and clarity, I may use the terms "color" or "component", it's just a misnomer for the purposes of this documentation.
In this schema, the gamma is included in the transfer function. In another documentation, they also integrate the white point normalization, and another documentation suggests that the transfert function includes the entire equation int( 4095 ( L*X / 52.37 ) 1 / 2.6 ) which are white point normalization, gamma and bitdepth. ↩