0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 03:52:22 +02:00

csputils: add some missing colorspaces

With target-prim and target-trc it makes sense to include some common
colorspaces that aren't strictly speaking used for video.
This commit is contained in:
Niklas Haas 2015-03-30 14:54:52 +02:00
parent b51ff8702b
commit bfbe1342f7
No known key found for this signature in database
GPG Key ID: 3BA77D4BFDB10BCE
5 changed files with 110 additions and 12 deletions

View File

@ -300,6 +300,10 @@ Available filters are:
:bt.601-625: ITU-R BT.601 (SD) 625-line systems (PAL, SECAM)
:bt.709: ITU-R BT.709 (HD) (same primaries as sRGB)
:bt.2020: ITU-R BT.2020 (UHD)
:apple: Apple RGB
:adobe: Adobe RGB (1998)
:prophoto: ProPhoto RGB (ROMM)
:cie1931: CIE 1931 RGB
``<stereo-in>``
Set the stereo mode the video is assumed to be encoded in. Takes the

View File

@ -616,6 +616,14 @@ Available video output drivers are:
ITU-R BT.709 (HD), IEC 61966-2-4 (sRGB), SMPTE RP177 Annex B
bt2020
ITU-R BT.2020 (UHD)
apple
Apple RGB
adobe
Adobe RGB (1998)
prophoto
ProPhoto RGB (ROMM)
cie1931
CIE 1931 RGB (not to be confused with CIE XYZ)
``target-trc=<value>``
Specifies the transfer characteristics (gamma) of the display. Video
@ -629,8 +637,14 @@ Available video output drivers are:
IEC 61966-2-4 (sRGB)
linear
Linear light output
gamma18
Pure power curve (gamma 1.8), also used for Apple RGB
gamma22
Pure power curve (gamma 2.2)
gamma28
Pure power curve (gamma 2.8), also used for BT.470-BG
prophoto
ProPhoto RGB (ROMM)
``icc-profile=<file>``
Load an ICC profile and use it to transform linear RGB to screen output.

View File

@ -66,15 +66,23 @@ const struct m_opt_choice_alternatives mp_csp_prim_names[] = {
{"bt.709", MP_CSP_PRIM_BT_709},
{"bt.2020", MP_CSP_PRIM_BT_2020},
{"bt.470m", MP_CSP_PRIM_BT_470M},
{"apple", MP_CSP_PRIM_APPLE},
{"adobe", MP_CSP_PRIM_ADOBE},
{"prophoto", MP_CSP_PRIM_PRO_PHOTO},
{"cie1931", MP_CSP_PRIM_CIE_1931},
{0}
};
const char *const mp_csp_trc_names[MP_CSP_TRC_COUNT] = {
"auto",
"bt.1886",
"srgb",
"linear",
"gamma2.2",
const struct m_opt_choice_alternatives mp_csp_trc_names[] = {
{"auto", MP_CSP_TRC_AUTO},
{"bt.1886", MP_CSP_TRC_BT_1886},
{"srgb", MP_CSP_TRC_SRGB},
{"linear", MP_CSP_TRC_LINEAR},
{"gamma1.8", MP_CSP_TRC_GAMMA18},
{"gamma2.2", MP_CSP_TRC_GAMMA22},
{"gamma2.8", MP_CSP_TRC_GAMMA28},
{"prophoto", MP_CSP_TRC_PRO_PHOTO},
{0}
};
const char *const mp_csp_equalizer_names[MP_CSP_EQ_COUNT] = {
@ -162,6 +170,7 @@ enum mp_csp_trc avcol_trc_to_mp_csp_trc(int avtrc)
case AVCOL_TRC_IEC61966_2_1: return MP_CSP_TRC_SRGB;
case AVCOL_TRC_LINEAR: return MP_CSP_TRC_LINEAR;
case AVCOL_TRC_GAMMA22: return MP_CSP_TRC_GAMMA22;
case AVCOL_TRC_GAMMA28: return MP_CSP_TRC_GAMMA28;
default: return MP_CSP_TRC_AUTO;
}
}
@ -209,6 +218,7 @@ int mp_csp_trc_to_avcol_trc(enum mp_csp_trc trc)
case MP_CSP_TRC_SRGB: return AVCOL_TRC_IEC61966_2_1;
case MP_CSP_TRC_LINEAR: return AVCOL_TRC_LINEAR;
case MP_CSP_TRC_GAMMA22: return AVCOL_TRC_GAMMA22;
case MP_CSP_TRC_GAMMA28: return AVCOL_TRC_GAMMA28;
default: return AVCOL_TRC_UNSPECIFIED;
}
}
@ -317,9 +327,16 @@ struct mp_csp_primaries mp_get_csp_primaries(enum mp_csp_prim spc)
https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.601-7-201103-I!!PDF-E.pdf
https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.709-5-200204-I!!PDF-E.pdf
https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.2020-0-201208-I!!PDF-E.pdf
Other colorspaces from https://en.wikipedia.org/wiki/RGB_color_space#Specifications
*/
static const struct mp_csp_col_xy d65 = {0.3127, 0.3290};
// CIE standard illuminant series
static const struct mp_csp_col_xy
d50 = {0.34577, 0.35850},
d65 = {0.31271, 0.32902},
c = {0.31006, 0.31616},
e = {1.0/3.0, 1.0/3.0};
switch (spc) {
case MP_CSP_PRIM_BT_470M:
@ -327,7 +344,7 @@ struct mp_csp_primaries mp_get_csp_primaries(enum mp_csp_prim spc)
.red = {0.670, 0.330},
.green = {0.210, 0.710},
.blue = {0.140, 0.080},
.white = {0.310, 0.316} // Illuminant C
.white = c
};
case MP_CSP_PRIM_BT_601_525:
return (struct mp_csp_primaries) {
@ -360,6 +377,34 @@ struct mp_csp_primaries mp_get_csp_primaries(enum mp_csp_prim spc)
.blue = {0.131, 0.046},
.white = d65
};
case MP_CSP_PRIM_APPLE:
return (struct mp_csp_primaries) {
.red = {0.625, 0.340},
.green = {0.280, 0.595},
.blue = {0.115, 0.070},
.white = d65
};
case MP_CSP_PRIM_ADOBE:
return (struct mp_csp_primaries) {
.red = {0.640, 0.330},
.green = {0.210, 0.710},
.blue = {0.150, 0.060},
.white = d65
};
case MP_CSP_PRIM_PRO_PHOTO:
return (struct mp_csp_primaries) {
.red = {0.7347, 0.2653},
.green = {0.1596, 0.8404},
.blue = {0.0366, 0.0001},
.white = d50
};
case MP_CSP_PRIM_CIE_1931:
return (struct mp_csp_primaries) {
.red = {0.7347, 0.2653},
.green = {0.2738, 0.7174},
.blue = {0.1666, 0.0089},
.white = e
};
default:
return (struct mp_csp_primaries) {{0}};
}

View File

@ -65,6 +65,10 @@ enum mp_csp_prim {
MP_CSP_PRIM_BT_709,
MP_CSP_PRIM_BT_2020,
MP_CSP_PRIM_BT_470M,
MP_CSP_PRIM_APPLE,
MP_CSP_PRIM_ADOBE,
MP_CSP_PRIM_PRO_PHOTO,
MP_CSP_PRIM_CIE_1931,
MP_CSP_PRIM_COUNT
};
@ -75,12 +79,14 @@ enum mp_csp_trc {
MP_CSP_TRC_BT_1886,
MP_CSP_TRC_SRGB,
MP_CSP_TRC_LINEAR,
MP_CSP_TRC_GAMMA18,
MP_CSP_TRC_GAMMA22,
MP_CSP_TRC_GAMMA28,
MP_CSP_TRC_PRO_PHOTO,
MP_CSP_TRC_COUNT
};
// Any enum mp_csp_trc value is a valid index (except MP_CSP_TRC_COUNT)
extern const char *const mp_csp_trc_names[MP_CSP_TRC_COUNT];
extern const struct m_opt_choice_alternatives mp_csp_trc_names[];
// These constants are based on the ICC specification (Table 23) and match
// up with the API of LittleCMS, which treats them as integers.

View File

@ -372,13 +372,20 @@ const struct m_sub_options gl_video_conf = {
{"bt601-625", MP_CSP_PRIM_BT_601_625},
{"bt709", MP_CSP_PRIM_BT_709},
{"bt2020", MP_CSP_PRIM_BT_2020},
{"bt470m", MP_CSP_PRIM_BT_470M})),
{"bt470m", MP_CSP_PRIM_BT_470M},
{"apple", MP_CSP_PRIM_APPLE},
{"adobe", MP_CSP_PRIM_ADOBE},
{"prophoto", MP_CSP_PRIM_PRO_PHOTO},
{"cie1931", MP_CSP_PRIM_CIE_1931})),
OPT_CHOICE("target-trc", target_trc, 0,
({"auto", MP_CSP_TRC_AUTO},
{"bt1886", MP_CSP_TRC_BT_1886},
{"srgb", MP_CSP_TRC_SRGB},
{"linear", MP_CSP_TRC_LINEAR},
{"gamma22", MP_CSP_TRC_GAMMA22})),
{"gamma18", MP_CSP_TRC_GAMMA18},
{"gamma22", MP_CSP_TRC_GAMMA22},
{"gamma28", MP_CSP_TRC_GAMMA28},
{"prophoto", MP_CSP_TRC_PRO_PHOTO})),
OPT_FLAG("npot", npot, 0),
OPT_FLAG("pbo", pbo, 0),
OPT_STRING_VALIDATE("scale", scaler[0].kernel.name, 0, validate_scaler_opt),
@ -1492,9 +1499,20 @@ static void pass_linearize(struct gl_video *p, enum mp_csp_trc trc)
case MP_CSP_TRC_BT_1886:
GLSL(color.rgb = pow(color.rgb, vec3(1.961));)
break;
case MP_CSP_TRC_GAMMA18:
GLSL(color.rgb = pow(color.rgb, vec3(1.8));)
break;
case MP_CSP_TRC_GAMMA22:
GLSL(color.rgb = pow(color.rgb, vec3(2.2));)
break;
case MP_CSP_TRC_GAMMA28:
GLSL(color.rgb = pow(color.rgb, vec3(2.8));)
break;
case MP_CSP_TRC_PRO_PHOTO:
GLSL(color.rgb = mix(color.rgb / vec3(16.0),
pow(color.rgb, vec3(1.8)),
lessThan(vec3(0.03125), color.rgb));)
break;
}
}
@ -1515,9 +1533,20 @@ static void pass_delinearize(struct gl_video *p, enum mp_csp_trc trc)
case MP_CSP_TRC_BT_1886:
GLSL(color.rgb = pow(color.rgb, vec3(1.0/1.961));)
break;
case MP_CSP_TRC_GAMMA18:
GLSL(color.rgb = pow(color.rgb, vec3(1.0/1.8));)
break;
case MP_CSP_TRC_GAMMA22:
GLSL(color.rgb = pow(color.rgb, vec3(1.0/2.2));)
break;
case MP_CSP_TRC_GAMMA28:
GLSL(color.rgb = pow(color.rgb, vec3(1.0/2.8));)
break;
case MP_CSP_TRC_PRO_PHOTO:
GLSL(color.rgb = mix(color.rgb * vec3(16.0),
pow(color.rgb, vec3(1.0/1.8)),
lessThanEqual(vec3(0.001953), color.rgb));)
break;
}
}