summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.xyz>2019-01-04 16:46:38 +0100
committerJan Ekström <jeebjp@gmail.com>2019-02-18 01:54:06 +0200
commit3f1bc25d4de6150b0acff7e92d3e3084a7d989f0 (patch)
tree71d9e56cebef3fa8553795847a3c47bba54be1bb /video
parentb4b719e33748970a9bf98a82a017d8f149ecb557 (diff)
downloadmpv-3f1bc25d4de6150b0acff7e92d3e3084a7d989f0.tar.bz2
mpv-3f1bc25d4de6150b0acff7e92d3e3084a7d989f0.tar.xz
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.
Diffstat (limited to 'video')
-rw-r--r--video/out/gpu/video.c12
-rw-r--r--video/out/gpu/video.h4
-rw-r--r--video/out/gpu/video_shaders.c7
3 files changed, 12 insertions, 11 deletions
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