From 3f1bc25d4de6150b0acff7e92d3e3084a7d989f0 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Fri, 4 Jan 2019 16:46:38 +0100 Subject: vo_gpu: use dB units for scene change detection Rather than the linear cd/m^2 units, these (relative) logarithmic units lend themselves much better to actually detecting scene changes, especially since the scene averaging was changed to also work logarithmically. --- video/out/gpu/video.c | 12 ++++++------ video/out/gpu/video.h | 4 ++-- video/out/gpu/video_shaders.c | 7 ++++--- 3 files changed, 12 insertions(+), 11 deletions(-) (limited to 'video') diff --git a/video/out/gpu/video.c b/video/out/gpu/video.c index df357b3552..24e6990139 100644 --- a/video/out/gpu/video.c +++ b/video/out/gpu/video.c @@ -318,8 +318,8 @@ static const struct gl_video_opts gl_video_opts_def = { .curve_param = NAN, .max_boost = 1.0, .decay_rate = 100.0, - .scene_threshold_low = 50, - .scene_threshold_high = 200, + .scene_threshold_low = 5.5, + .scene_threshold_high = 10.0, .desat = 0.75, .desat_exp = 1.5, }, @@ -372,10 +372,10 @@ const struct m_sub_options gl_video_conf = { {"yes", 1}, {"no", -1})), OPT_FLOATRANGE("hdr-peak-decay-rate", tone_map.decay_rate, 0, 1.0, 1000.0), - OPT_INTRANGE("hdr-scene-threshold-low", - tone_map.scene_threshold_low, 0, 0, 10000), - OPT_INTRANGE("hdr-scene-threshold-high", - tone_map.scene_threshold_high, 0, 0, 10000), + OPT_FLOATRANGE("hdr-scene-threshold-low", + tone_map.scene_threshold_low, 0, 0, 20.0), + OPT_FLOATRANGE("hdr-scene-threshold-high", + tone_map.scene_threshold_high, 0, 0, 20.0), OPT_FLOAT("tone-mapping-param", tone_map.curve_param, 0), OPT_FLOATRANGE("tone-mapping-max-boost", tone_map.max_boost, 0, 1.0, 10.0), OPT_FLOAT("tone-mapping-desaturate", tone_map.desat, 0), diff --git a/video/out/gpu/video.h b/video/out/gpu/video.h index 0bd5c57e8f..1b0994ac78 100644 --- a/video/out/gpu/video.h +++ b/video/out/gpu/video.h @@ -101,8 +101,8 @@ struct gl_tone_map_opts { float max_boost; int compute_peak; float decay_rate; - int scene_threshold_low; - int scene_threshold_high; + float scene_threshold_low; + float scene_threshold_high; float desat; float desat_exp; int gamut_warning; // bool diff --git a/video/out/gpu/video_shaders.c b/video/out/gpu/video_shaders.c index 07ac0b940f..5fea739385 100644 --- a/video/out/gpu/video_shaders.c +++ b/video/out/gpu/video_shaders.c @@ -613,9 +613,10 @@ static void hdr_update_peak(struct gl_shader_cache *sc, GLSLF(" average += %f * (cur - average);\n", decay); // Scene change hysteresis - GLSLF(" float weight = smoothstep(%f, %f, abs(cur.x - average.x));\n", - (float) opts->scene_threshold_low / MP_REF_WHITE, - (float) opts->scene_threshold_high / MP_REF_WHITE); + float log_db = 10.0 / log(10.0); + GLSLF(" float weight = smoothstep(%f, %f, abs(log(cur.x / average.x)));\n", + opts->scene_threshold_low / log_db, + opts->scene_threshold_high / log_db); GLSL( average = mix(average, cur, weight);) // Reset SSBO state for the next frame -- cgit v1.2.3