avfilter/vf_amplify: add tolerance option

This commit is contained in:
Paul B Mahol 2019-02-22 23:32:27 +01:00
parent 6f93868e46
commit c679119a73
2 changed files with 10 additions and 2 deletions

View File

@ -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.

View File

@ -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
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
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
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[] = {
{ "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 },