diff --git a/libavfilter/af_silenceremove.c b/libavfilter/af_silenceremove.c index bc390ab536bba0a95b1daabf405b6a5eb796dffa..82251ce9f843a1431d17e39cfcda4ef73bb8957f 100644 --- a/libavfilter/af_silenceremove.c +++ b/libavfilter/af_silenceremove.c @@ -49,6 +49,7 @@ typedef struct SilenceRemoveContext { double start_threshold; int64_t start_silence; int64_t start_silence_opt; + int start_mode; int stop_periods; int64_t stop_duration; @@ -56,6 +57,7 @@ typedef struct SilenceRemoveContext { double stop_threshold; int64_t stop_silence; int64_t stop_silence_opt; + int stop_mode; double *start_holdoff; double *start_silence_hold; @@ -96,10 +98,14 @@ static const AVOption silenceremove_options[] = { { "start_duration", NULL, OFFSET(start_duration_opt), AV_OPT_TYPE_DURATION, {.i64=0}, 0, INT32_MAX, AF }, { "start_threshold", NULL, OFFSET(start_threshold), AV_OPT_TYPE_DOUBLE, {.dbl=0}, 0, DBL_MAX, AF }, { "start_silence", NULL, OFFSET(start_silence_opt), AV_OPT_TYPE_DURATION, {.i64=0}, 0, INT32_MAX, AF }, + { "start_mode", NULL, OFFSET(start_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, AF, "mode" }, + { "any", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, AF, "mode" }, + { "all", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AF, "mode" }, { "stop_periods", NULL, OFFSET(stop_periods), AV_OPT_TYPE_INT, {.i64=0}, -9000, 9000, AF }, { "stop_duration", NULL, OFFSET(stop_duration_opt), AV_OPT_TYPE_DURATION, {.i64=0}, 0, INT32_MAX, AF }, { "stop_threshold", NULL, OFFSET(stop_threshold), AV_OPT_TYPE_DOUBLE, {.dbl=0}, 0, DBL_MAX, AF }, { "stop_silence", NULL, OFFSET(stop_silence_opt), AV_OPT_TYPE_DURATION, {.i64=0}, 0, INT32_MAX, AF }, + { "stop_mode", NULL, OFFSET(stop_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, AF, "mode" }, { "detection", NULL, OFFSET(detection), AV_OPT_TYPE_INT, {.i64=1}, 0, 1, AF, "detection" }, { "peak", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, AF, "detection" }, { "rms", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AF, "detection" }, @@ -320,9 +326,16 @@ silence_trim: break; for (i = 0; i < nbs; i++) { - threshold = 0; - for (j = 0; j < inlink->channels; j++) { - threshold |= s->compute(s, ibuf[j]) > s->start_threshold; + if (s->start_mode) { + threshold = 0; + for (j = 0; j < inlink->channels; j++) { + threshold |= s->compute(s, ibuf[j]) > s->start_threshold; + } + } else { + threshold = 1; + for (j = 0; j < inlink->channels; j++) { + threshold &= s->compute(s, ibuf[j]) > s->start_threshold; + } } if (threshold) { @@ -428,9 +441,17 @@ silence_copy: if (s->stop_periods) { for (i = 0; i < nbs; i++) { - threshold = 1; - for (j = 0; j < inlink->channels; j++) - threshold &= s->compute(s, ibuf[j]) > s->stop_threshold; + if (s->stop_mode) { + threshold = 0; + for (j = 0; j < inlink->channels; j++) { + threshold |= s->compute(s, ibuf[j]) > s->stop_threshold; + } + } else { + threshold = 1; + for (j = 0; j < inlink->channels; j++) { + threshold &= s->compute(s, ibuf[j]) > s->stop_threshold; + } + } if (threshold && s->stop_holdoff_end && !s->stop_silence) { s->mode = SILENCE_COPY_FLUSH;