Getting the correct RGB color range out of your Elgato capture card in OBS Studio

To start off, a history lesson. I always find it fascinating to learn why the way things are today because of what happened in the past.

In the early days of TV, the signal was broadcast as black and white.

Then as technology evolved, TV stations could broadcast in color but didnt want people who still had black and white TVs to lose out so they come up with an ingenious way of breaking up the video. This is know as YcbCr encoding.

Photo: Wikipedia

Basically, they broke up the video into two sections – Chroma or chromanince (Color) and luma or lumanince (Brightness). Combined, the two images create a full color picture, but with a signal that only has luma, it is only the brightness information, or black and white.

The TV stations broadcast in YCbCr format and TVs that were black and white could only understand and correctly receive the Luma information, meaning they could receive the same broadcast as those with color TVs which also received the Chroma information.

That principle is still in effect today, and is the basis for modern video encoding. This post wont get into chroma subsampling and all that fancy jazz but just know that nearly all video you watched is still encoded with a luma and chroma layer, and very much based on old analog technology

Now, there are two formats we care about when it comes to capturing video – RGB and YUV.

YUV is YCbCR that format I talked about above

RGB is…RGB. Each color is represented by its own 8-bit digital value, so red is red, green is green and blue is blue.

Going back in history, TV broadcast signals are sent in what is known as the 16-235 color range, or more commonly known as partial/limited RGB. Modern day TVs and PC monitors support 0-255 signals which are called full RGB.

When a video signal is YUV, the difference between limited and full range does not exist. YUV video is simply always limited range (16 black point, 235 white point)

What does the color range setting in OBS Studio do?

This setting tells OBS Studio how to decode the video coming from the capture card. OBS Studio has to decode the video from capture card sources to convert it to RGB, and that requires the use of conversion matrices. Which matrix to use is what this setting affects. OBS Studio internally operates in the RGB format – all video no matter what format is converted to RGB, then all the scenes, sources, etc are composited(Combined and layered), scaled(Shrunken or enlarged) and then sent to the encoder. In the encoder it is converted back to NV12 color format to be encoded and sent out for streaming.

Now lets get into it. Ill break down the settings you should be using in different scenarios – Namely what your source is and what output format you are sending OBS Studio.

Scenerio 1 – Source: Partial range | YUY2/YV12 selected in OBS Studio

This is the simplest setup. You do not need to change anything. Leave the OBS Studio color range setting on default.
Color range setting: Default or Partial

Scenerio 2 – Source: Partial range |XRGB/RGB24 select in OBS Studio

The signal going to OBS Studio is RGB, and OBS will assume it is full range. In this case the signal is not full range, so leaving the Color range setting on default will result in the wrong colors.
Color range setting: Partial

Scenerio 3 – Source: Full range | YUY2/YV12 format select in OBS Studio

Since the YUV format always operates at limited range, the capture card has already done the conversion. Leave the color range setting on default.
Color range setting: Default or Partial

Scenerio 4 – Source: Full range | XRGB/RGB24 format select in OBS Studio

OBS now knows that the format is RGB, and will apply the default full range setting.
Color range setting: Default or Full