[FFmpeg-user] Requesting colormatrix advice

markfilipak.imdb at gmail.com markfilipak.imdb at gmail.com
Mon Nov 6 22:20:31 EET 2023

On 11/6/23 11:16, Phil Rhodes via ffmpeg-user wrote:
>   A number of potentially complex interactions govern what's going on here. FFmpeg has never been particularly smart about how it interprets colour and brightness encoding, and it is not very well documented in that regard, but to be fair, files are not always (or even often) marked correctly with flags indicating what they contain, the flags may be nonstandard, etc. It's tricky.

Hello, Phil, Nice to 'speak' with you again. I agree with you. Color is a wilderness.

Below is what x265 expects, so it's what ffmpeg must give it:

--video-signal-type-preset <string>
     Specify combinations of 'colorprim' 'transfer' 'colormatrix' 'range'
     & 'chromaloc'.

     String format: <system>
     This has higher precedence than individual VUI parameters.
     If any individual VUI option is specified together with this, which
     changes the values set corresponding to the system or color-volume,
     it will be discarded.

     <system>        colorprim transfer     colormatrix range   chromaloc
     =============== ========= ============ =========== ======= =========
     BT601_525       smpte170m smpte170m    smpte170m   limited 0
     BT601_626       bt470bg   smpte170m    bt470bg     limited 0
     BT709_YCC       bt709     bt709        bt709       limited 0
     BT709_RGB       bt709     bt709        gbr         limited
     BT2020_YCC_NCL  bt2020    bt2020-10    bt709       limited 2
     BT2020_RGB      bt2020    smpte2084    bt2020nc    limited
     BT2100_HLG_YCC  bt2020    arib-std-b67 bt2020nc    limited 2
     BT2100_HLG_RGB  bt2020    arib-std-b67 gbr         limited
     FR709_RGB       bt709     bt709        gbr         full
     FR2020_RGB      bt2020    bt2020-10    gbr         full
     FRP3D65_YCC     smpte432  bt709        smpte170m   full    1

     String format: <system>:<color-volume>
     The color-volume options can be used only with the system options
     BT2100_PQ_YCC, BT2100_PQ_ICTCP, and BT2100_PQ_RGB. It is
     incompatible with other options.

     <system>        colorprim transfer     colormatrix range   chromaloc
     =============== ========= ============ =========== ======= =========
     BT2100_PQ_YCC   bt2020    smpte2084    bt2020nc    limited 2
     BT2100_PQ_ICTCP bt2020    smpte2084    ictcp       limited 2
     BT2100_PQ_RGB   bt2020    smpte2084    gbr         limited

     <color-volume>  master-display
     =============== =====================================================================
     P3D65x1000n0005 G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,5)
     P3D65x4000n005  G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(40000000,50)
     BT2100x108n0005 G(8500,39850)B(6550,2300)R(34000,146000)WP(15635,16450)L(10000000,1)

--colorprim <integer|string>
     Specify color primaries to use when converting to RGB. Default
     undefined (not signaled)

      0 bt709       3 bt470m       6 smpte240m    9 smpte428
      1 unknown     4 bt470bg      7 film        10 smpte431
      2 reserved    5 smpte170m    8 bt2020      11 smpte432

--transfer <integer|string>
     Specify transfer characteristics. Default undefined (not signaled)

      0 bt709       5 smpte170m   10 iec61966-2-4   15 smpte2084
      1 unknown     6 smpte240m   11 bt1361e        16 smpte428
      2 reserved    7 linear      12 iec61966-2-1   17 arib-std-b67
      3 bt470m      8 log100      13 bt2020-10
      4 bt470bg     9 log316      14 bt2020-12

--colormatrix <integer|string>
     Specify color matrix setting i.e set the matrix coefficients used in
     deriving the luma and chroma. Default undefined (not signaled)

      0 gbr         4 fcc          8 ycgco       12 chroma-derived-nc
      1 bt709       5 bt470bg      9 bt2020nc    13 chroma-derived-c
      2 unknown     6 smpte170m   10 bt2020c     14 ictcp
      3 reserved    7 smpte240m   11 smpte2085

> If it's a blu-ray it'll generally be in 709, unless it's one of the Sony 4K Blu-Rays which uses xvYCC. It's hard to prove a negative but those are the only situations I'm aware of.  Assume what's on the disc will be studio swing 709 unless it is a 4K blu-ray.

It's 1920x1080. I 'heard' of "studio swing". What is it relative to what x265 expects (above)? Do 
you know?

> If it's a blu-ray of a TV show which was shot on film, it will have been scanned and electronically colour corrected for the blu-ray.

Film scanned. Yes. So that's a 1st-level coloration. But red could not have saturated during 
scanning. Otherwise, I couldn't pull more detail from the 'saturated' regions.

> Oversaturation particularly of reds is one of the issues that will arise from mixing up 601 and 709 and scaling issues are another, but there are so many ways this can be wrong, and places to change settings, that I hesitate to speculate further without further info. You are likely to be facing several confounding issues at once.

I feel a headache coming on. Let's assume ffprobe is correct and colormatrix is undefined on the 
discs. That limits things, eh? That limits things a lot.

> If you intend to watch the resulting file on a computer, you should not need to change the colourspace as sRGB and 709 have identical primaries (they do not have identical brightness mapping but it should not look wildly wrong).

Right now I'm watching it on computer.

Well, I'll tell you. Watching 1: my transcode, and 2: the original (with no colormatrix?), and 3: 
the Criterion "Fanny and Alexander", the skin tones in my transcode look a lot more like "Fanny and 
Alexander" than it looks like the original (with no colormatrix?). The original looks bluish in 
addition to red saturating from bright light emitters.

I'd love to tag the original as 'film' and let the bt709 encoding happen and see what results, but I 
don't know how to do that in ffmpeg. Do you?

FFmpeg doesn't have any 'film' color setting, and ffmpeg colormatrix makes no sense if the source's 
colormatrix is 'unknown'.

I'm kinda happy with what I've done: cutting contrast, reducing red and blue, but that's not very 
satisfying or scientific.

Key may be what you mean by 'studio swing'.

 From ffprobe:

What do you think of this: Paramount did not limit chroma (i.e., 'range=full'). Is there any way I 
could confirm such a statement?

More information about the ffmpeg-user mailing list