diff options
author | Paul B Mahol <onemda@gmail.com> | 2020-12-11 13:35:41 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2020-12-11 13:39:50 +0100 |
commit | 7adb747fd760dc756f23d642ee902f6a1389fc97 (patch) | |
tree | 8f3af145bcfbe60339306bbc794c561b0cbc1a3b /libavfilter | |
parent | b607f193743be473d6d401fd89e1177192565e62 (diff) | |
download | ffmpeg-7adb747fd760dc756f23d642ee902f6a1389fc97.tar.gz |
avfilter/vf_chromanr: add options for finer controls of filtering
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/vf_chromanr.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/libavfilter/vf_chromanr.c b/libavfilter/vf_chromanr.c index 78dbe37e68..3c027b8f42 100644 --- a/libavfilter/vf_chromanr.c +++ b/libavfilter/vf_chromanr.c @@ -32,7 +32,13 @@ typedef struct ChromaNRContext { const AVClass *class; float threshold; + float threshold_y; + float threshold_u; + float threshold_v; int thres; + int thres_y; + int thres_u; + int thres_v; int sizew; int sizeh; int stepw; @@ -91,6 +97,9 @@ static int filter_slice##name(AVFilterContext *ctx, void *arg, int jobnr, int nb const int sizew = s->sizew; \ const int sizeh = s->sizeh; \ const int thres = s->thres; \ + const int thres_y = s->thres_y; \ + const int thres_u = s->thres_u; \ + const int thres_v = s->thres_v; \ const int h = s->planeheight[1]; \ const int w = s->planewidth[1]; \ const int slice_start = (h * jobnr) / nb_jobs; \ @@ -142,6 +151,8 @@ static int filter_slice##name(AVFilterContext *ctx, void *arg, int jobnr, int nb const int V = in_vptr[xx]; \ \ if (FFABS(cu - U) + FFABS(cv - V) + FFABS(cy - Y) < thres && \ + FFABS(cu - U) < thres_u && FFABS(cv - V) < thres_v && \ + FFABS(cy - Y) < thres_y && \ xx != x && yy != y) { \ su += U; \ sv += V; \ @@ -172,6 +183,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) AVFrame *out; s->thres = s->threshold * (1 << (s->depth - 8)); + s->thres_y = s->threshold_y * (1 << (s->depth - 8)); + s->thres_u = s->threshold_u * (1 << (s->depth - 8)); + s->thres_v = s->threshold_v * (1 << (s->depth - 8)); out = ff_get_video_buffer(outlink, outlink->w, outlink->h); if (!out) { @@ -217,11 +231,14 @@ static int config_input(AVFilterLink *inlink) #define VF AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM static const AVOption chromanr_options[] = { - { "thres", "set u/v threshold", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl=30}, 1, 200, VF }, + { "thres", "set y+u+v threshold", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl=30}, 1, 200, VF }, { "sizew", "set horizontal size", OFFSET(sizew), AV_OPT_TYPE_INT, {.i64=5}, 1, 100, VF }, { "sizeh", "set vertical size", OFFSET(sizeh), AV_OPT_TYPE_INT, {.i64=5}, 1, 100, VF }, { "stepw", "set horizontal step", OFFSET(stepw), AV_OPT_TYPE_INT, {.i64=1}, 1, 50, VF }, { "steph", "set vertical step", OFFSET(steph), AV_OPT_TYPE_INT, {.i64=1}, 1, 50, VF }, + { "threy", "set y threshold", OFFSET(threshold_y), AV_OPT_TYPE_FLOAT, {.dbl=200},1, 200, VF }, + { "threu", "set u threshold", OFFSET(threshold_u), AV_OPT_TYPE_FLOAT, {.dbl=200},1, 200, VF }, + { "threv", "set v threshold", OFFSET(threshold_v), AV_OPT_TYPE_FLOAT, {.dbl=200},1, 200, VF }, { NULL } }; |