diff options
-rw-r--r-- | DOCS/man/options.rst | 6 | ||||
-rw-r--r-- | video/out/gpu/video.c | 12 | ||||
-rw-r--r-- | video/out/gpu/video.h | 4 | ||||
-rw-r--r-- | video/out/gpu/video_shaders.c | 7 |
4 files changed, 15 insertions, 14 deletions
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index e5a897ba4f..2e15106bf0 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -5264,9 +5264,9 @@ The following video options are currently all specific to ``--vo=gpu`` and to excessive flicker. (In signal theory terms, this controls the time constant "tau" of an IIR low pass filter) -``--hdr-scene-threshold-low=<0..10000>``, ``--hdr-scene-threshold-high=<0..10000>`` - The lower and upper thresholds (in cd/m^2) for a brightness difference to - be considered a scene change (default: 50 low, 200 high). This is only +``--hdr-scene-threshold-low=<0.0..100.0>``, ``--hdr-scene-threshold-high=<0.0..100.0>`` + The lower and upper thresholds (in dB) for a brightness difference + to be considered a scene change (default: 5.5 low, 10.0 high). This is only relevant when ``--hdr-compute-peak`` is enabled. Normally, small fluctuations in the frame brightness are compensated for by the peak averaging mechanism, but for large jumps in the brightness this can result 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 |