Video Transfer Functions - tonykwok/made-mistakes-again GitHub Wiki
Retrieved from https://learn.microsoft.com/en-us/windows/win32/api/dxva2api/ne-dxva2api-dxva2_videotransferfunction
T-REC-H.264-200606-S!Amd1!PDF-E.pdf
Constants
Constants | Value | Description |
---|---|---|
DXVA2_VideoTransFuncMask |
0x1f |
Bitmask to validate flag values. This value is not a valid flag. |
DXVA2_VideoTransFunc_Unknown |
0 |
Unknown. Treat as DXVA2_VideoTransFunc_709 . |
DXVA2_VideoTransFunc_10 |
1 |
Linear RGB (gamma = 1.0). |
DXVA2_VideoTransFunc_18 |
2 |
True 1.8 gamma, L' = L^1/1.8 . |
DXVA2_VideoTransFunc_20 |
3 |
True 2.0 gamma, L' = L^1/2.0 . |
DXVA2_VideoTransFunc_22 |
4 |
True 2.2 gamma, L' = L^1/2.2 . This transfer function is used in ITU-R BT.470-2 System M (NTSC). |
DXVA2_VideoTransFunc_709 |
5 |
ITU-R BT.709 transfer function. Gamma 2.2 curve with a linear segment in the lower range. This transfer function is used in BT.709, BT.601, SMPTE 296M, SMPTE 170M, BT.470, and SMPTE 274M. In addition BT-1361 uses this function within the range [0...1]. |
DXVA2_VideoTransFunc_240M |
6 |
SMPTE 240M transfer function. Gamma 2.2 curve with a linear segment in the lower range. |
DXVA2_VideoTransFunc_sRGB |
7 |
sRGB transfer function. Gamma 2.4 curve with a linear segment in the lower range. |
DXVA2_VideoTransFunc_28 |
8 |
True 2.8 gamma. L' = L^1/2.8 . This transfer function is used in ITU-R BT.470-2 System B, G (PAL). |
Remarks
The following table shows the formulas for the most common transfer functions.
In these formulas, L
is the linear value and L'
is the non-linear (gamma corrected) value.
These values are relative to a normalized range [0...1]
.
Color space | Transfer function |
---|---|
sRGB (8-bit) | L' = 12.92L , for L < 0.031308 |
L' = 1.055L^1/2.4− 0.055 , for L >= 0.031308 |
|
BT.470-2 System B, G | L' = L^0.36 |
BT.470-2 System M | L' = L^0.45 |
BT.709 | L' = 4.50L , for L < 0.018 |
L' = 1.099L^0.45− 0.099 , for L >= 0.018 |
|
scRGB | L' = L |
SMPTE 240M | L' = 4.0L , for L < 0.0228 |
L' = 1.1115L^0.45− 0.01115 , for L >= 0.0228 |
The following table shows the inverse formulas to obtain the original gamma-corrected values:
Color space | Transfer function |
---|---|
sRGB (8-bit) | L = 1/12.92L' , for L' < 0.03928 |
L = ((L' + 0.055)/1055)^2.4 , for L' >= 0.03928 |
|
BT.470-2 System B, G | L = L'^1/0.36 |
BT.470-2 System M | L = L'^1/0.45 |
BT.709 | L = L'/4.50 , for L' < 0.081 |
L = ((L' + 0.099) / 1.099)^1/0.45 , for L' >= 0.081 |
|
scRGB | L = L' |
SMPTE 240M | L = L'/4.0 , for L' < 0.0913 |
L= ((L' + 0.1115)/1.1115)^1/0.45 , for L' >= 0.0913 |
namespace MediaInfoLib
{
#include "ZenLib/Conf.h"
using namespace ZenLib;
//---------------------------------------------------------------------------
extern const char* Mpegv_colour_primaries(int8u colour_primaries)
{
switch (colour_primaries)
{
case 1 : return "BT.709";
case 4 : return "BT.470 System M";
case 5 : return "BT.601 PAL";
case 6 : return "BT.601 NTSC";
case 7 : return "SMPTE 240M"; //Same as BT.601 NTSC
case 8 : return "Generic film";
case 9 : return "BT.2020"; //Added in HEVC
case 10 : return "XYZ"; //Added in HEVC 2014
case 11 : return "DCI P3"; //Added in HEVC 2016
case 12 : return "Display P3"; //Added in HEVC 2016
case 22 : return "EBU Tech 3213"; //Added in HEVC 2016
default : return "";
}
}
//---------------------------------------------------------------------------
extern const char* Mpegv_transfer_characteristics(int8u transfer_characteristics)
{
switch (transfer_characteristics)
{
case 1 : return "BT.709"; //Same as BT.601
case 4 : return "BT.470 System M";
case 5 : return "BT.470 System B/G";
case 6 : return "BT.601";
case 7 : return "SMPTE 240M";
case 8 : return "Linear";
case 9 : return "Logarithmic (100:1)"; //Added in MPEG-4 Visual
case 10 : return "Logarithmic (316.22777:1)"; //Added in MPEG-4 Visual
case 11 : return "xvYCC"; //Added in AVC
case 12 : return "BT.1361"; //Added in AVC
case 13 : return "sRGB/sYCC"; //Added in HEVC
case 14 : return "BT.2020 (10-bit)"; //Same a BT.601 //Added in HEVC, 10/12-bit difference is in ISO 23001-8
case 15 : return "BT.2020 (12-bit)"; //Same a BT.601 //Added in HEVC, 10/12-bit difference is in ISO 23001-8
case 16 : return "PQ"; //Added in HEVC 2015
case 17 : return "SMPTE 428M"; //Added in HEVC 2015
case 18 : return "HLG"; //Added in HEVC 2016
default : return "";
}
}
//---------------------------------------------------------------------------
extern const char* Mpegv_matrix_coefficients(int8u matrix_coefficients)
{
switch (matrix_coefficients)
{
case 0 : return "Identity"; //Added in AVC
case 1 : return "BT.709";
case 4 : return "FCC 73.682";
case 5 : return "BT.470 System B/G";
case 6 : return "BT.601"; //Same as BT.470 System B/G
case 7 : return "SMPTE 240M";
case 8 : return "YCgCo"; //Added in AVC
case 9 : return "BT.2020 non-constant"; //Added in HEVC
case 10 : return "BT.2020 constant"; //Added in HEVC
case 11 : return "Y'D'zD'x"; //Added in HEVC 2016
case 12 : return "Chromaticity-derived non-constant"; //Added in HEVC 2016
case 13 : return "Chromaticity-derived constant"; //Added in HEVC 2016
case 14 : return "ICtCp"; //Added in HEVC 2016
default : return "";
}
}
//---------------------------------------------------------------------------
extern const char* Mpegv_matrix_coefficients_ColorSpace(int8u matrix_coefficients)
{
switch (matrix_coefficients)
{
case 0 :
return "RGB";
case 1 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 11 :
case 12 :
case 14 :
return "YUV";
default : return "";
}
}
} //NameSpace