summaryrefslogtreecommitdiffstats
path: root/video/csputils.c
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.xyz>2017-06-17 01:55:08 +0200
committerwm4 <wm4@nowhere>2017-06-18 20:54:44 +0200
commitc3f32f3a6e3486093eb17518146a6459a34c0c41 (patch)
treec6fbc9ea3695a5aef4a53151041fe2dbaae2bfd8 /video/csputils.c
parent6a4ce39648a7d93d9f06ec4f39254bd54ef7d408 (diff)
downloadmpv-c3f32f3a6e3486093eb17518146a6459a34c0c41.tar.bz2
mpv-c3f32f3a6e3486093eb17518146a6459a34c0c41.tar.xz
vo_opengl: tone map in linear XYZ instead of RGB
This preserves channel balance better and helps reduce discoloration due to nonlinear tone mapping. I wasn't sure whether to stuff this inside pass_color_manage or pass_tone_map but decided for the former because adding the extra mp_csp_prim would have made the signature of the latter longer than 80col, and also because the `mp_get_cms_matrix` below it basically does the same thing anyway, so it doesn't look that out of place. Also why is this justification longer than the actual description of the algorithm and what it's good for?
Diffstat (limited to 'video/csputils.c')
-rw-r--r--video/csputils.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/video/csputils.c b/video/csputils.c
index 9db7bb54a9..5b5c4e1def 100644
--- a/video/csputils.c
+++ b/video/csputils.c
@@ -479,7 +479,7 @@ bool mp_trc_is_hdr(enum mp_csp_trc trc)
// Compute the RGB/XYZ matrix as described here:
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
-static void mp_get_rgb2xyz_matrix(struct mp_csp_primaries space, float m[3][3])
+void mp_get_rgb2xyz_matrix(struct mp_csp_primaries space, float m[3][3])
{
float S[3], X[4], Z[4];
@@ -537,14 +537,14 @@ static void mp_apply_chromatic_adaptation(struct mp_csp_col_xy src,
for (int i = 0; i < 3; i++) {
// source cone
- C[i][0] = bradford[i][0] * src.x / src.y
+ C[i][0] = bradford[i][0] * mp_xy_X(src)
+ bradford[i][1] * 1
- + bradford[i][2] * (1 - src.x - src.y) / src.y;
+ + bradford[i][2] * mp_xy_Z(src);
// dest cone
- C[i][1] = bradford[i][0] * dest.x / dest.y
+ C[i][1] = bradford[i][0] * mp_xy_X(dest)
+ bradford[i][1] * 1
- + bradford[i][2] * (1 - dest.x - dest.y) / dest.y;
+ + bradford[i][2] * mp_xy_Z(dest);
}
// tmp := I * [Cd/Cs] * Ma