avfilter/vf_mix: add scale option
authorPaul B Mahol <onemda@gmail.com>
Tue, 24 Apr 2018 12:45:19 +0000 (14:45 +0200)
committerPaul B Mahol <onemda@gmail.com>
Thu, 26 Apr 2018 14:44:15 +0000 (16:44 +0200)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
doc/filters.texi
libavfilter/vf_mix.c

index 23d6063..99ebfdb 100644 (file)
@@ -11154,6 +11154,11 @@ The number of inputs. If unspecified, it defaults to 2.
 Specify weight of each input video stream as sequence.
 Each weight is separated by space.
 
 Specify weight of each input video stream as sequence.
 Each weight is separated by space.
 
+@item scale
+Specify scale, if it is set it will be multiplied with sum
+of each weight multiplied with pixel values to give final destination
+pixel value. By default @var{scale} is auto scaled to sum of weights.
+
 @item duration
 Specify how end of stream is determined.
 @table @samp
 @item duration
 Specify how end of stream is determined.
 @table @samp
@@ -15574,6 +15579,11 @@ The number of successive frames to mix. If unspecified, it defaults to 3.
 @item weights
 Specify weight of each input video frame.
 Each weight is separated by space.
 @item weights
 Specify weight of each input video frame.
 Each weight is separated by space.
+
+@item scale
+Specify scale, if it is set it will be multiplied with sum
+of each weight multiplied with pixel values to give final destination
+pixel value. By default @var{scale} is auto scaled to sum of weights.
 @end table
 
 @section tonemap
 @end table
 
 @section tonemap
index 55307a4..23385db 100644 (file)
@@ -37,6 +37,7 @@ typedef struct MixContext {
     int nb_inputs;
     int duration;
     float *weights;
     int nb_inputs;
     int duration;
     float *weights;
+    float scale;
     float wfactor;
 
     int tmix;
     float wfactor;
 
     int tmix;
@@ -109,7 +110,11 @@ static av_cold int init(AVFilterContext *ctx)
         sscanf(arg, "%f", &s->weights[i]);
         s->wfactor += s->weights[i];
     }
         sscanf(arg, "%f", &s->weights[i]);
         s->wfactor += s->weights[i];
     }
-    s->wfactor = 1 / s->wfactor;
+    if (s->scale == 0) {
+        s->wfactor = 1 / s->wfactor;
+    } else {
+        s->wfactor = s->scale;
+    }
 
     return 0;
 }
 
     return 0;
 }
@@ -275,6 +280,7 @@ static int activate(AVFilterContext *ctx)
 static const AVOption mix_options[] = {
     { "inputs", "set number of inputs", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=2}, 2, INT_MAX, .flags = FLAGS },
     { "weights", "set weight for each input", OFFSET(weights_str), AV_OPT_TYPE_STRING, {.str="1 1"}, 0, 0, .flags = FLAGS },
 static const AVOption mix_options[] = {
     { "inputs", "set number of inputs", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=2}, 2, INT_MAX, .flags = FLAGS },
     { "weights", "set weight for each input", OFFSET(weights_str), AV_OPT_TYPE_STRING, {.str="1 1"}, 0, 0, .flags = FLAGS },
+    { "scale", "set scale", OFFSET(scale), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, INT16_MAX, .flags = FLAGS },
     { "duration", "how to determine end of stream", OFFSET(duration), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, .flags = FLAGS, "duration" },
         { "longest",  "Duration of longest input",  0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "duration" },
         { "shortest", "Duration of shortest input", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "duration" },
     { "duration", "how to determine end of stream", OFFSET(duration), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, .flags = FLAGS, "duration" },
         { "longest",  "Duration of longest input",  0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "duration" },
         { "shortest", "Duration of shortest input", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "duration" },
@@ -340,6 +346,7 @@ static int tmix_filter_frame(AVFilterLink *inlink, AVFrame *in)
 static const AVOption tmix_options[] = {
     { "frames", "set number of successive frames to mix", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=3}, 2, 128, .flags = FLAGS },
     { "weights", "set weight for each frame", OFFSET(weights_str), AV_OPT_TYPE_STRING, {.str="1 1 1"}, 0, 0, .flags = FLAGS },
 static const AVOption tmix_options[] = {
     { "frames", "set number of successive frames to mix", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=3}, 2, 128, .flags = FLAGS },
     { "weights", "set weight for each frame", OFFSET(weights_str), AV_OPT_TYPE_STRING, {.str="1 1 1"}, 0, 0, .flags = FLAGS },
+    { "scale", "set scale", OFFSET(scale), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, INT16_MAX, .flags = FLAGS },
     { NULL },
 };
 
     { NULL },
 };