]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/vf_vibrance: add alternate option
authorPaul B Mahol <onemda@gmail.com>
Sun, 5 May 2019 11:26:24 +0000 (13:26 +0200)
committerPaul B Mahol <onemda@gmail.com>
Sun, 5 May 2019 11:29:34 +0000 (13:29 +0200)
doc/filters.texi
libavfilter/vf_vibrance.c

index 2f9333c3f3688d81d8954f6ff683e17f86bdf899..3c15bb95f483e7a2822d610704494905e6db6989 100644 (file)
@@ -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}
index bbcb7bef6fc3800253d4f3f7b9f377d29004dedf..aac61c0f10848789df0659f206a778745d27056c 100644 (file)
@@ -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 }
 };