summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2020-12-11 13:35:41 +0100
committerPaul B Mahol <onemda@gmail.com>2020-12-11 13:39:50 +0100
commit7adb747fd760dc756f23d642ee902f6a1389fc97 (patch)
tree8f3af145bcfbe60339306bbc794c561b0cbc1a3b /libavfilter
parentb607f193743be473d6d401fd89e1177192565e62 (diff)
avfilter/vf_chromanr: add options for finer controls of filtering
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/vf_chromanr.c19
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 }
};