Commit c679119a authored by Paul B Mahol's avatar Paul B Mahol

avfilter/vf_amplify: add tolerance option

parent 6f93868e
...@@ -5652,6 +5652,11 @@ Set threshold for difference amplification. Any difference greater or equal to ...@@ -5652,6 +5652,11 @@ Set threshold for difference amplification. Any difference greater or equal to
this value will not alter source pixel. Default is 10. this value will not alter source pixel. Default is 10.
Allowed range is from 0 to 65535. Allowed range is from 0 to 65535.
@item tolerance
Set tolerance for difference amplification. Any difference lower to
this value will not alter source pixel. Default is 0.
Allowed range is from 0 to 65535.
@item low @item low
Set lower limit for changing source pixel. Default is 65535. Allowed range is from 0 to 65535. Set lower limit for changing source pixel. Default is 65535. Allowed range is from 0 to 65535.
This option controls maximum possible value that will decrease source pixel value. This option controls maximum possible value that will decrease source pixel value.
......
...@@ -34,6 +34,7 @@ typedef struct AmplifyContext { ...@@ -34,6 +34,7 @@ typedef struct AmplifyContext {
int radius; int radius;
float factor; float factor;
float threshold; float threshold;
float tolerance;
int planes; int planes;
int llimit; int llimit;
...@@ -104,6 +105,7 @@ static int amplify_frame(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs ...@@ -104,6 +105,7 @@ static int amplify_frame(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs
const int radius = s->radius; const int radius = s->radius;
const int nb_inputs = s->nb_inputs; const int nb_inputs = s->nb_inputs;
const float threshold = s->threshold; const float threshold = s->threshold;
const float tolerance = s->tolerance;
const float factor = s->factor; const float factor = s->factor;
const int llimit = s->llimit; const int llimit = s->llimit;
const int hlimit = s->hlimit; const int hlimit = s->hlimit;
...@@ -136,7 +138,7 @@ static int amplify_frame(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs ...@@ -136,7 +138,7 @@ static int amplify_frame(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs
avg = sum / (float)nb_inputs; avg = sum / (float)nb_inputs;
diff = src - avg; diff = src - avg;
if (fabsf(diff) < threshold) { if (fabsf(diff) < threshold && fabsf(diff) > tolerance) {
int amp; int amp;
if (diff < 0) { if (diff < 0) {
amp = -FFMIN(FFABS(diff * factor), llimit); amp = -FFMIN(FFABS(diff * factor), llimit);
...@@ -179,7 +181,7 @@ static int amplify_frame(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs ...@@ -179,7 +181,7 @@ static int amplify_frame(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs
avg = sum / (float)nb_inputs; avg = sum / (float)nb_inputs;
diff = src - avg; diff = src - avg;
if (fabsf(diff) < threshold) { if (fabsf(diff) < threshold && fabsf(diff) > tolerance) {
int amp; int amp;
if (diff < 0) { if (diff < 0) {
amp = -FFMIN(FFABS(diff * factor), llimit); amp = -FFMIN(FFABS(diff * factor), llimit);
...@@ -271,6 +273,7 @@ static const AVOption amplify_options[] = { ...@@ -271,6 +273,7 @@ static const AVOption amplify_options[] = {
{ "radius", "set radius", OFFSET(radius), AV_OPT_TYPE_INT, {.i64=2}, 1, 63, .flags = FLAGS }, { "radius", "set radius", OFFSET(radius), AV_OPT_TYPE_INT, {.i64=2}, 1, 63, .flags = FLAGS },
{ "factor", "set factor", OFFSET(factor), AV_OPT_TYPE_FLOAT, {.dbl=2}, 0, UINT16_MAX, .flags = FLAGS }, { "factor", "set factor", OFFSET(factor), AV_OPT_TYPE_FLOAT, {.dbl=2}, 0, UINT16_MAX, .flags = FLAGS },
{ "threshold", "set threshold", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl=10}, 0, UINT16_MAX, .flags = FLAGS }, { "threshold", "set threshold", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl=10}, 0, UINT16_MAX, .flags = FLAGS },
{ "tolerance", "set tolerance", OFFSET(tolerance), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, UINT16_MAX, .flags = FLAGS },
{ "low", "set low limit for amplification", OFFSET(llimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = FLAGS }, { "low", "set low limit for amplification", OFFSET(llimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = FLAGS },
{ "high", "set high limit for amplification", OFFSET(hlimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = FLAGS }, { "high", "set high limit for amplification", OFFSET(hlimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = FLAGS },
{ "planes", "set what planes to filter", OFFSET(planes), AV_OPT_TYPE_FLAGS, {.i64=7}, 0, 15, FLAGS }, { "planes", "set what planes to filter", OFFSET(planes), AV_OPT_TYPE_FLAGS, {.i64=7}, 0, 15, FLAGS },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment