ProRes levels

Why would someone want to encode ProRes with full range levels? This question comes up often. To make a long story short, don’t do it! Since its inception in 2007, ProRes has always been a legal range codec, designed to accept YUV input. In the early days Apple didn’t provide much detail, but the codec has matured and in 2015 it was formalized in SMPTE RDD-36:

A ProRes compressed slice contains an entropy-coded array of scanned quantized DCT coefficients for each color component (Y′, Cb, and Cr). Quantized DC coefficients are encoded differentially, while quantized AC coefficients are run-length encoded.

RDD 36:2015 “Apple ProRes Bitstream Syntax and Decoding Process”

Note: I’m aware that YUV technically refers to analog encoding, and we are really talking about Y’CbCr. But the term is so ubiquitous that I still use it, and YCC just sounds weird.

Based on the above quote, all ProRes, including 422 and 444, is encoded as YUV, and therefore must be legal range. DaVinci Resolve offers a checkbox to encode full range ProRes, and some people believe this equates to better quality. I will demonstrate why this is wrong. Here is an image created in Photoshop, with gradients from black to fully saturated primaries.

This is what it looks like on an RGB parade:

And this is what it looks like when rendered to full-range ProRes 444 using Resolve. The darkest and brightest parts are clipped, meaning detail is lost. If this were a real picture instead of gradients it would look terrible:

Now that’s not really fair, because Resolve automatically decodes ProRes as legal range by default (that ought be be a sign.) We can force it to decode as full-range using Clip Attributes, and then it looks like this:

This is better, but look closely at the highlights. The luma (green) channel is correct, while red and blue are both clipped around 98%. This means you are losing detail in highly saturated colors. The reason for this dates back over 30 years to the days of analog video, and a more detailed explanation can be found in ITU-R BT.601. In 10-bit code values, luminance was recorded using a range of 64-940, while chroma difference was recorded using 64-960. Since all video software works with full-range internally, the full-range ProRes file scales 940 up to 1023 and the last 20 code values are discarded.

There is one advantage to using full range. It means you gain a few extra code values which may theoretically reduce quantization error, increasing the perceived detail in gradients. However, this is not necessary because ProRes 444 already has 12 bits of precision using legal range, as shown here. In my opinion the extra precision is not worth the risk of chroma clipping shown above. And every major software interprets ProRes as legal by default, so if you choose full, you will have to explain to all your delivery partners why the image needs special treatment to avoid clipping.

Leave a comment