From 38baaa1617d8ba93fb2325f29350a09528904935 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sun, 5 May 2019 13:26:24 +0200 Subject: [PATCH] avfilter/vf_vibrance: add alternate option --- doc/filters.texi | 4 ++++ libavfilter/vf_vibrance.c | 16 ++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 2f9333c3f3..3c15bb95f4 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -17984,6 +17984,10 @@ Set the green luma coefficient. @item blum Set the blue luma coefficient. + +@item alternate +If @code{intensity} is negative and this is set to 1, colors will change, +otherwise colors will be less saturated, more towards gray. @end table @anchor{vignette} diff --git a/libavfilter/vf_vibrance.c b/libavfilter/vf_vibrance.c index bbcb7bef6f..aac61c0f10 100644 --- a/libavfilter/vf_vibrance.c +++ b/libavfilter/vf_vibrance.c @@ -31,6 +31,7 @@ typedef struct VibranceContext { float intensity; float balance[3]; float lcoeffs[3]; + int alternate; int depth; @@ -54,12 +55,13 @@ static int vibrance_slice8(AVFilterContext *avctx, void *arg, int jobnr, int nb_ const float bc = s->lcoeffs[1]; const float rc = s->lcoeffs[2]; const float intensity = s->intensity; + const float alternate = s->alternate ? 1.f : -1.f; const float gintensity = intensity * s->balance[0]; const float bintensity = intensity * s->balance[1]; const float rintensity = intensity * s->balance[2]; - const float sgintensity = FFSIGN(intensity); - const float sbintensity = FFSIGN(intensity); - const float srintensity = FFSIGN(intensity); + const float sgintensity = alternate * FFSIGN(gintensity); + const float sbintensity = alternate * FFSIGN(bintensity); + const float srintensity = alternate * FFSIGN(rintensity); const int slice_start = (height * jobnr) / nb_jobs; const int slice_end = (height * (jobnr + 1)) / nb_jobs; const int glinesize = frame->linesize[0]; @@ -112,12 +114,13 @@ static int vibrance_slice16(AVFilterContext *avctx, void *arg, int jobnr, int nb const int width = frame->width; const int height = frame->height; const float intensity = s->intensity; + const float alternate = s->alternate ? 1.f : -1.f; const float gintensity = intensity * s->balance[0]; const float bintensity = intensity * s->balance[1]; const float rintensity = intensity * s->balance[2]; - const float sgintensity = FFSIGN(intensity); - const float sbintensity = FFSIGN(intensity); - const float srintensity = FFSIGN(intensity); + const float sgintensity = alternate * FFSIGN(gintensity); + const float sbintensity = alternate * FFSIGN(bintensity); + const float srintensity = alternate * FFSIGN(rintensity); const int slice_start = (height * jobnr) / nb_jobs; const int slice_end = (height * (jobnr + 1)) / nb_jobs; const int glinesize = frame->linesize[0] / 2; @@ -231,6 +234,7 @@ static const AVOption vibrance_options[] = { { "rlum", "set the red luma coefficient", OFFSET(lcoeffs[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.072186}, 0, 1, VF }, { "glum", "set the green luma coefficient", OFFSET(lcoeffs[0]), AV_OPT_TYPE_FLOAT, {.dbl=0.715158}, 0, 1, VF }, { "blum", "set the blue luma coefficient", OFFSET(lcoeffs[1]), AV_OPT_TYPE_FLOAT, {.dbl=0.212656}, 0, 1, VF }, + { "alternate", "use alternate colors", OFFSET(alternate), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, VF }, { NULL } };