From 6b9862f6145b755b0febaa8ed0ad75ef251a246f Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Thu, 21 Nov 2019 16:52:48 +0100 Subject: [PATCH] avfilter/vf_lumakey: change options to doubles, so that values are automatically scaled --- libavfilter/vf_lumakey.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/libavfilter/vf_lumakey.c b/libavfilter/vf_lumakey.c index c833467388..2e07898f4e 100644 --- a/libavfilter/vf_lumakey.c +++ b/libavfilter/vf_lumakey.c @@ -28,12 +28,13 @@ typedef struct LumakeyContext { const AVClass *class; - int threshold; - int tolerance; - int softness; + double threshold; + double tolerance; + double softness; int white; int black; + int so; int max; int (*do_lumakey_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); @@ -47,7 +48,7 @@ static int do_lumakey_slice8(AVFilterContext *ctx, void *arg, int jobnr, int nb_ const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs; uint8_t *alpha = frame->data[3] + slice_start * frame->linesize[3]; const uint8_t *luma = frame->data[0] + slice_start * frame->linesize[0]; - const int so = s->softness; + const int so = s->so; const int w = s->white; const int b = s->black; int x, y; @@ -79,7 +80,7 @@ static int do_lumakey_slice16(AVFilterContext *ctx, void *arg, int jobnr, int nb const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs; uint16_t *alpha = (uint16_t *)(frame->data[3] + slice_start * frame->linesize[3]); const uint16_t *luma = (const uint16_t *)(frame->data[0] + slice_start * frame->linesize[0]); - const int so = s->softness; + const int so = s->so; const int w = s->white; const int b = s->black; const int m = s->max; @@ -113,14 +114,16 @@ static int config_input(AVFilterLink *inlink) depth = desc->comp[0].depth; if (depth == 8) { - s->white = av_clip_uint8(s->threshold + s->tolerance); - s->black = av_clip_uint8(s->threshold - s->tolerance); + s->white = av_clip_uint8((s->threshold + s->tolerance) * 255); + s->black = av_clip_uint8((s->threshold - s->tolerance) * 255); s->do_lumakey_slice = do_lumakey_slice8; + s->so = s->softness * 255; } else { s->max = (1 << depth) - 1; - s->white = av_clip(s->threshold + s->tolerance, 0, s->max); - s->black = av_clip(s->threshold - s->tolerance, 0, s->max); + s->white = av_clip((s->threshold + s->tolerance) * s->max, 0, s->max); + s->black = av_clip((s->threshold - s->tolerance) * s->max, 0, s->max); s->do_lumakey_slice = do_lumakey_slice16; + s->so = s->softness * s->max; } return 0; @@ -182,9 +185,9 @@ static const AVFilterPad lumakey_outputs[] = { #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM static const AVOption lumakey_options[] = { - { "threshold", "set the threshold value", OFFSET(threshold), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, - { "tolerance", "set the tolerance value", OFFSET(tolerance), AV_OPT_TYPE_INT, {.i64=1}, 0, UINT16_MAX, FLAGS }, - { "softness", "set the softness value", OFFSET(softness), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, + { "threshold", "set the threshold value", OFFSET(threshold), AV_OPT_TYPE_DOUBLE, {.dbl=0}, 0, 1, FLAGS }, + { "tolerance", "set the tolerance value", OFFSET(tolerance), AV_OPT_TYPE_DOUBLE, {.dbl=0.01}, 0, 1, FLAGS }, + { "softness", "set the softness value", OFFSET(softness), AV_OPT_TYPE_DOUBLE, {.dbl=0}, 0, 1, FLAGS }, { NULL } };