diff options
author | Niklas Haas <git@haasn.xyz> | 2017-09-10 18:18:31 +0200 |
---|---|---|
committer | Niklas Haas <git@haasn.xyz> | 2017-09-10 18:19:46 +0200 |
commit | d0c87dd57918cab1afc4d5968355b6253377c0b1 (patch) | |
tree | be74d142ba356485b0f9e58bddff37495229dab4 /video/out/opengl/video_shaders.c | |
parent | b19b0869d68121f4e9a973b53d9abbd370d0a160 (diff) | |
download | mpv-d0c87dd57918cab1afc4d5968355b6253377c0b1.tar.bz2 mpv-d0c87dd57918cab1afc4d5968355b6253377c0b1.tar.xz |
vo_opengl: add a gamut warning feature
This clearly highlights all out-of-gamut/clipped pixels. (Either too
bright or too saturated)
Has some (documented) caveats. Also make TONE_MAPPING_CLIP stop actually
clamping the value range (it's unnecessary and breaks this feature).
Diffstat (limited to 'video/out/opengl/video_shaders.c')
-rw-r--r-- | video/out/opengl/video_shaders.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/video/out/opengl/video_shaders.c b/video/out/opengl/video_shaders.c index 10edc0563d..60c5ce82ac 100644 --- a/video/out/opengl/video_shaders.c +++ b/video/out/opengl/video_shaders.c @@ -616,7 +616,7 @@ static void pass_tone_map(struct gl_shader_cache *sc, float ref_peak, switch (algo) { case TONE_MAPPING_CLIP: - GLSLF("sig = clamp(%f * sig, 0.0, 1.0);\n", isnan(param) ? 1.0 : param); + GLSLF("sig = %f * sig;\n", isnan(param) ? 1.0 : param); break; case TONE_MAPPING_MOBIUS: @@ -683,7 +683,7 @@ void pass_color_map(struct gl_shader_cache *sc, struct mp_colorspace src, struct mp_colorspace dst, enum tone_mapping algo, float tone_mapping_param, float tone_mapping_desat, bool detect_peak, - bool is_linear) + bool gamut_warning, bool is_linear) { GLSLF("// color mapping\n"); @@ -748,6 +748,12 @@ void pass_color_map(struct gl_shader_cache *sc, if (src.light != dst.light) pass_inverse_ootf(sc, dst.light, mp_trc_nom_peak(dst.gamma)); + // Warn for remaining out-of-gamut colors is enabled + if (gamut_warning) { + GLSL(if (any(greaterThan(color.rgb, vec3(1.01))))) + GLSL(color.rgb = vec3(1.0) - color.rgb;) // invert + } + if (is_linear) pass_delinearize(sc, dst.gamma); } |