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