[vlc-devel] [PATCH 1/2] placebo: update for new tone mapping desaturation algo

Konstantin Pavlov thresh at videolan.org
Mon Mar 30 20:01:49 CEST 2020


This was introduced in API version 10, and refactors the tone mapping
desaturation curve into a new, more tunable algorithm that has some
different behavior. In particular, it allows us to simulate exactly the
"hollywood" style of tone mapping, so we document those special values
specifically.

This is a manual backport of b579384a239683232f5558216cc03c6ae5a5dc38
---
 .../video_output/opengl/fragment_shaders.c    |  7 ++++
 modules/video_output/opengl/vout_helper.h     | 34 +++++++++++++++++--
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
index 8c1f67ee7a..e0b98732ca 100644
--- a/modules/video_output/opengl/fragment_shaders.c
+++ b/modules/video_output/opengl/fragment_shaders.c
@@ -616,7 +616,14 @@ opengl_fragment_shader_init_impl(opengl_tex_converter_t *tc, GLenum tex_target,
         color_params.intent = var_InheritInteger(tc->gl, "rendering-intent");
         color_params.tone_mapping_algo = var_InheritInteger(tc->gl, "tone-mapping");
         color_params.tone_mapping_param = var_InheritFloat(tc->gl, "tone-mapping-param");
+#if PL_API_VER >= 10
+        color_params.desaturation_strength = var_InheritFloat(tc->gl, "desat-strength");
+        color_params.desaturation_exponent = var_InheritFloat(tc->gl, "desat-exponent");
+        color_params.desaturation_base = var_InheritFloat(tc->gl, "desat-base");
+        color_params.max_boost = var_InheritFloat(tc->gl, "max-boost");
+#else
         color_params.tone_mapping_desaturate = var_InheritFloat(tc->gl, "tone-mapping-desat");
+#endif
         color_params.gamut_warning = var_InheritBool(tc->gl, "tone-mapping-warn");
 
         struct pl_color_space dst_space = pl_color_space_unknown;
diff --git a/modules/video_output/opengl/vout_helper.h b/modules/video_output/opengl/vout_helper.h
index 978669f89c..db9ed52e39 100644
--- a/modules/video_output/opengl/vout_helper.h
+++ b/modules/video_output/opengl/vout_helper.h
@@ -148,6 +148,18 @@ static const char * const tone_text[] = {
 #define TONEMAP_DESAT_TEXT "Tone-mapping desaturation coefficient"
 #define TONEMAP_DESAT_LONGTEXT "How strongly to desaturate overbright colors towards white. 0.0 disables this behavior."
 
+#define DESAT_STRENGTH_TEXT "Desaturation strength"
+#define DESAT_STRENGTH_LONGTEXT "How strongly to desaturate bright spectral colors towards white. 0.0 disables this behavior, 1.0 enables full desaturation (hollywood-style)"
+
+#define DESAT_EXPONENT_TEXT "Desaturation exponent"
+#define DESAT_EXPONENT_LONGTEXT "Controls the steepness of the desaturation curve. If you set this to 0.0, the curve will be flat, i.e. desaturation always enabled (hollywood-style)."
+
+#define DESAT_BASE_TEXT "Desaturation base"
+#define DESAT_BASE_LONGTEXT "Controls the starting offset of the desaturation curve. Brightness values below this base will always be colorimetrically tone mapped (never desaturated)."
+
+#define MAX_BOOST_TEXT "Maximum brightness boost"
+#define MAX_BOOST_LONGTEXT "Maximum allowed brightness boost to compensate for dark scenes. A value of 1.0 means no brightness boost is allowed."
+
 #define TONEMAP_WARN_TEXT "Highlight clipped pixels"
 #define TONEMAP_WARN_LONGTEXT "Debugging tool to indicate which pixels were clipped as part of the tone mapping process."
 
@@ -171,6 +183,23 @@ static const char * const dither_text[] = {
 #define DEPTH_TEXT "Dither depth override (0 = framebuffer depth)"
 #define DEPTH_LONGTEXT "Overrides the detected framebuffer depth. Useful to dither to lower bit depths than otherwise required."
 
+#if PL_API_VER >= 10
+#define add_desat_params() \
+    add_float("desat-strength", pl_color_map_default_params.desaturation_strength, \
+            DESAT_STRENGTH_TEXT, DESAT_STRENGTH_LONGTEXT, false) \
+    add_float("desat-exponent", pl_color_map_default_params.desaturation_exponent, \
+            DESAT_EXPONENT_TEXT, DESAT_EXPONENT_LONGTEXT, false) \
+    add_float("desat-base", pl_color_map_default_params.desaturation_base, \
+            DESAT_BASE_TEXT, DESAT_BASE_LONGTEXT, false) \
+    add_float("max-boost", pl_color_map_default_params.max_boost, \
+            MAX_BOOST_TEXT, MAX_BOOST_LONGTEXT, false) \
+    add_obsolete_string("tone-mapping-desat")
+#else
+#define add_desat_params() \
+    add_float("tone-mapping-desat", pl_color_map_default_params.tone_mapping_desaturate, \
+            TONEMAP_DESAT_TEXT, TONEMAP_DESAT_LONGTEXT, false)
+#endif
+
 #define add_glopts_placebo() \
     set_section("Colorspace conversion", NULL) \
     add_integer("rendering-intent", pl_color_map_default_params.intent, \
@@ -186,13 +215,12 @@ static const char * const dither_text[] = {
             change_integer_list(tone_values, tone_text) \
     add_float("tone-mapping-param", pl_color_map_default_params.tone_mapping_param, \
               TONEMAP_PARAM_TEXT, TONEMAP_PARAM_LONGTEXT, true) \
-    add_float("tone-mapping-desat", pl_color_map_default_params.tone_mapping_desaturate, \
-              TONEMAP_DESAT_TEXT, TONEMAP_DESAT_LONGTEXT, false) \
     add_bool("tone-mapping-warn", false, TONEMAP_WARN_TEXT, TONEMAP_WARN_LONGTEXT, false) \
     set_section("Dithering", NULL) \
     add_integer("dither-algo", -1, DITHER_TEXT, DITHER_LONGTEXT, false) \
             change_integer_list(dither_values, dither_text) \
-    add_integer_with_range("dither-depth", 0, 0, 16, DEPTH_TEXT, DEPTH_LONGTEXT, false)
+    add_integer_with_range("dither-depth", 0, 0, 16, DEPTH_TEXT, DEPTH_LONGTEXT, false) \
+    add_desat_params()
 #else
 #define add_glopts_placebo()
 #endif
-- 
2.25.1



More information about the vlc-devel mailing list