avfilter/vf_framerate: fix scene change detection score

- normalize score to [0..100] instead of [0..85]
- change the default score to 8.2 to roughly keep existing behaviour
- take into account bit depth
- do not truncate to integer

Signed-off-by: Marton Balint <cus@passwd.hu>
pull/274/head
Marton Balint 7 years ago
parent be15304ee6
commit e1113a83cc
  1. 2
      doc/filters.texi
  2. 4
      libavfilter/vf_framerate.c
  3. 2
      tests/ref/fate/filter-framerate-12bit-down
  4. 2
      tests/ref/fate/filter-framerate-12bit-up

@ -9121,7 +9121,7 @@ Specify the level at which a scene change is detected as a value between
0 and 100 to indicate a new scene; a low value reflects a low
probability for the current frame to introduce a new scene, while a higher
value means the current frame is more likely to be one.
The default is @code{7}.
The default is @code{8.2}.
@item flags
Specify flags influencing the filter process.

@ -88,7 +88,7 @@ static const AVOption framerate_options[] = {
{"interp_start", "point to start linear interpolation", OFFSET(interp_start), AV_OPT_TYPE_INT, {.i64=15}, 0, 255, V|F },
{"interp_end", "point to end linear interpolation", OFFSET(interp_end), AV_OPT_TYPE_INT, {.i64=240}, 0, 255, V|F },
{"scene", "scene change level", OFFSET(scene_score), AV_OPT_TYPE_DOUBLE, {.dbl=7.0}, 0, INT_MAX, V|F },
{"scene", "scene change level", OFFSET(scene_score), AV_OPT_TYPE_DOUBLE, {.dbl=8.2}, 0, INT_MAX, V|F },
{"flags", "set flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64=1}, 0, INT_MAX, V|F, "flags" },
{"scene_change_detect", "enable scene change detection", 0, AV_OPT_TYPE_CONST, {.i64=FRAMERATE_FLAG_SCD}, INT_MIN, INT_MAX, V|F, "flags" },
@ -183,7 +183,7 @@ static double get_scene_score(AVFilterContext *ctx, AVFrame *crnt, AVFrame *next
else
sad = scene_sad16(s, (const uint16_t*)crnt->data[0], crnt->linesize[0] >> 1, (const uint16_t*)next->data[0], next->linesize[0] >> 1, crnt->height);
mafd = sad / (crnt->height * crnt->width * 3);
mafd = (double)sad * 100.0 / (crnt->height * crnt->width) / (1 << s->bitdepth);
diff = fabs(mafd - s->prev_mafd);
ret = av_clipf(FFMIN(mafd, diff), 0, 100.0);
s->prev_mafd = mafd;

@ -4,7 +4,7 @@
#dimensions 0: 320x240
#sar 0: 1/1
0, 0, 0, 1, 307200, 0xb49cf016
0, 1, 1, 1, 307200, 0xfe025c7f
0, 1, 1, 1, 307200, 0xc3be6971
0, 2, 2, 1, 307200, 0x4d458da1
0, 3, 3, 1, 307200, 0x35d4d8ea
0, 4, 4, 1, 307200, 0x88f88697

@ -4,7 +4,7 @@
#dimensions 0: 320x240
#sar 0: 1/1
0, 0, 0, 1, 307200, 0xb49cf016
0, 1, 1, 1, 307200, 0xc74259b4
0, 1, 1, 1, 307200, 0x59cb92c7
0, 2, 2, 1, 307200, 0xe4ca172c
0, 3, 3, 1, 307200, 0x5378b13c
0, 4, 4, 1, 307200, 0x2a7d4840

Loading…
Cancel
Save