| @@ -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 } | |||
| }; | |||