diff --git a/libavfilter/af_silenceremove.c b/libavfilter/af_silenceremove.c
index 6f3250bbb1..2f376eb1ca 100644
--- a/libavfilter/af_silenceremove.c
+++ b/libavfilter/af_silenceremove.c
@@ -23,7 +23,6 @@
 
 #include <float.h> /* DBL_MAX */
 
-#include "libavutil/audio_fifo.h"
 #include "libavutil/avassert.h"
 #include "libavutil/opt.h"
 #include "libavutil/timestamp.h"
@@ -94,8 +93,6 @@ typedef struct SilenceRemoveContext {
     int64_t window_duration;
     double sum;
 
-    int threshold;
-    int one_period;
     int restart;
     int64_t next_pts;
 
@@ -104,22 +101,20 @@ typedef struct SilenceRemoveContext {
     double (*compute)(struct SilenceRemoveContext *s, AVFrame *frame, int ch, int offset);
     void (*copy)(struct SilenceRemoveContext *s, AVFrame *out, AVFrame *in,
                  int ch, int out_offset, int in_offset);
-
-    AVAudioFifo *fifo;
 } SilenceRemoveContext;
 
 #define OFFSET(x) offsetof(SilenceRemoveContext, x)
 #define AF AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_AUDIO_PARAM
 
 static const AVOption silenceremove_options[] = {
-    { "start_periods",   "set periods of silence parts to skip from start",    OFFSET(start_periods),       AV_OPT_TYPE_INT,      {.i64=0},     0,      9000, AF },
+    { "start_periods",   NULL,                                                 OFFSET(start_periods),       AV_OPT_TYPE_INT,      {.i64=0},     0,      9000, AF },
     { "start_duration",  "set start duration of non-silence part",             OFFSET(start_duration_opt),  AV_OPT_TYPE_DURATION, {.i64=0},     0, INT32_MAX, AF },
     { "start_threshold", "set threshold for start silence detection",          OFFSET(start_threshold),     AV_OPT_TYPE_DOUBLE,   {.dbl=0},     0,   DBL_MAX, AF },
     { "start_silence",   "set start duration of silence part to keep",         OFFSET(start_silence_opt),   AV_OPT_TYPE_DURATION, {.i64=0},     0, INT32_MAX, AF },
     { "start_mode",      "set which channel will trigger trimming from start", OFFSET(start_mode),          AV_OPT_TYPE_INT,      {.i64=T_ANY}, T_ANY, T_ALL, AF, "mode" },
     {   "any",           0,                                                    0,                           AV_OPT_TYPE_CONST,    {.i64=T_ANY}, 0,         0, AF, "mode" },
     {   "all",           0,                                                    0,                           AV_OPT_TYPE_CONST,    {.i64=T_ALL}, 0,         0, AF, "mode" },
-    { "stop_periods",    "set periods of silence parts to skip from end",      OFFSET(stop_periods),        AV_OPT_TYPE_INT,      {.i64=0}, -9000,      9000, AF },
+    { "stop_periods",    NULL,                                                 OFFSET(stop_periods),        AV_OPT_TYPE_INT,      {.i64=0}, -9000,      9000, AF },
     { "stop_duration",   "set stop duration of non-silence part",              OFFSET(stop_duration_opt),   AV_OPT_TYPE_DURATION, {.i64=0},     0, INT32_MAX, AF },
     { "stop_threshold",  "set threshold for stop silence detection",           OFFSET(stop_threshold),      AV_OPT_TYPE_DOUBLE,   {.dbl=0},     0,   DBL_MAX, AF },
     { "stop_silence",    "set stop duration of silence part to keep",          OFFSET(stop_silence_opt),    AV_OPT_TYPE_DURATION, {.i64=0},     0, INT32_MAX, AF },
@@ -435,7 +430,6 @@ static int config_input(AVFilterLink *inlink)
     AVFilterContext *ctx = inlink->dst;
     SilenceRemoveContext *s = ctx->priv;
 
-    s->threshold = -1;
     s->next_pts = AV_NOPTS_VALUE;
     s->window_duration = av_rescale(s->window_duration_opt, inlink->sample_rate,
                                    AV_TIME_BASE);
@@ -545,16 +539,12 @@ static int config_input(AVFilterLink *inlink)
         return AVERROR_BUG;
     }
 
-    s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, 1024);
-    if (!s->fifo)
-        return AVERROR(ENOMEM);
-
     return 0;
 }
 
 static void flush(SilenceRemoveContext *s,
                   AVFrame *out, AVFilterLink *outlink,
-                  int *nb_samples_written, int flush_silence)
+                  int *nb_samples_written, int *ret, int flush_silence)
 {
     AVFrame *silence;
 
@@ -566,18 +556,22 @@ static void flush(SilenceRemoveContext *s,
                                     (AVRational){1, outlink->sample_rate},
                                     outlink->time_base);
 
-        av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
+        *ret = ff_filter_frame(outlink, out);
+        if (*ret < 0)
+            return;
         *nb_samples_written = 0;
+    } else {
+        av_frame_free(&out);
     }
 
-    av_frame_free(&out);
-
     if (s->stop_silence_end <= 0 || !flush_silence)
         return;
 
     silence = ff_get_audio_buffer(outlink, s->stop_silence_end);
-    if (!silence)
+    if (!silence) {
+        *ret = AVERROR(ENOMEM);
         return;
+    }
 
     if (s->stop_silence_offset < s->stop_silence_end) {
         av_samples_copy(silence->extended_data, s->stop_silence_hold->extended_data, 0,
@@ -601,8 +595,7 @@ static void flush(SilenceRemoveContext *s,
                                 (AVRational){1, outlink->sample_rate},
                                 outlink->time_base);
 
-    av_audio_fifo_write(s->fifo, (void **)silence->extended_data, silence->nb_samples);
-    av_frame_free(&silence);
+    *ret = ff_filter_frame(outlink, silence);
 }
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
@@ -610,8 +603,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
     SilenceRemoveContext *s = ctx->priv;
-    int nbs, nb_samples_read, nb_samples_written;
     int i, j, threshold, ret = 0;
+    int nbs, nb_samples_read, nb_samples_written;
     AVFrame *out;
 
     nb_samples_read = nb_samples_written = 0;
@@ -639,10 +632,6 @@ silence_trim:
                 }
             }
 
-            if (s->threshold >= 0)
-                s->one_period = s->threshold != threshold;
-            s->threshold = threshold;
-
             if (threshold) {
                 for (j = 0; j < outlink->channels; j++) {
                     s->update(s, in, j, nb_samples_read);
@@ -656,8 +645,7 @@ silence_trim:
                 nb_samples_read++;
 
                 if (s->start_holdoff_end >= s->start_duration) {
-                    s->start_found_periods += s->one_period;
-                    if (s->start_found_periods >= s->start_periods) {
+                    if (++s->start_found_periods >= s->start_periods) {
                         s->mode = SILENCE_TRIM_FLUSH;
                         goto silence_trim_flush;
                     }
@@ -731,8 +719,7 @@ silence_trim_flush:
 
         s->start_holdoff_offset += nbs;
 
-        av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
-        av_frame_free(&out);
+        ret = ff_filter_frame(outlink, out);
 
         if (s->start_holdoff_offset == s->start_holdoff_end) {
             s->start_holdoff_offset = 0;
@@ -770,13 +757,9 @@ silence_copy:
                     }
                 }
 
-                if (s->threshold >= 0)
-                    s->one_period = s->threshold != threshold;
-                s->threshold = threshold;
-
                 if (threshold && s->stop_holdoff_end && !s->stop_silence) {
                     s->mode = SILENCE_COPY_FLUSH;
-                    flush(s, out, outlink, &nb_samples_written, 0);
+                    flush(s, out, outlink, &nb_samples_written, &ret, 0);
                     goto silence_copy_flush;
                 } else if (threshold) {
                     for (j = 0; j < outlink->channels; j++) {
@@ -813,14 +796,13 @@ silence_copy:
                     s->stop_holdoff_end++;
 
                     if (s->stop_holdoff_end >= s->stop_duration) {
-                        s->stop_found_periods += s->one_period;
-                        if (s->stop_found_periods >= s->stop_periods) {
+                        if (++s->stop_found_periods >= s->stop_periods) {
                             s->stop_holdoff_offset = 0;
                             s->stop_holdoff_end = 0;
 
                             if (!s->restart) {
                                 s->mode = SILENCE_STOP;
-                                flush(s, out, outlink, &nb_samples_written, 1);
+                                flush(s, out, outlink, &nb_samples_written, &ret, 1);
                                 goto silence_stop;
                             } else {
                                 s->stop_found_periods = 0;
@@ -831,17 +813,17 @@ silence_copy:
                                 s->start_silence_end = 0;
                                 clear_window(s);
                                 s->mode = SILENCE_TRIM;
-                                flush(s, out, outlink, &nb_samples_written, 1);
+                                flush(s, out, outlink, &nb_samples_written, &ret, 1);
                                 goto silence_trim;
                             }
                         }
                         s->mode = SILENCE_COPY_FLUSH;
-                        flush(s, out, outlink, &nb_samples_written, 0);
+                        flush(s, out, outlink, &nb_samples_written, &ret, 0);
                         goto silence_copy_flush;
                     }
                 }
             }
-            flush(s, out, outlink, &nb_samples_written, 0);
+            flush(s, out, outlink, &nb_samples_written, &ret, 0);
         } else {
             av_samples_copy(out->extended_data, in->extended_data,
                             nb_samples_written,
@@ -853,8 +835,7 @@ silence_copy:
                                         (AVRational){1, outlink->sample_rate},
                                         outlink->time_base);
 
-            av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
-            av_frame_free(&out);
+            ret = ff_filter_frame(outlink, out);
         }
         break;
 
@@ -881,8 +862,7 @@ silence_copy_flush:
                                     (AVRational){1, outlink->sample_rate},
                                     outlink->time_base);
 
-        av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
-        av_frame_free(&out);
+        ret = ff_filter_frame(outlink, out);
 
         if (s->stop_holdoff_offset == s->stop_holdoff_end) {
             s->stop_holdoff_offset = 0;
@@ -902,16 +882,6 @@ silence_stop:
 
     av_frame_free(&in);
 
-    if (av_audio_fifo_size(s->fifo) > 0) {
-        out = ff_get_audio_buffer(outlink, av_audio_fifo_size(s->fifo));
-        if (!out)
-            return AVERROR(ENOMEM);
-
-        av_audio_fifo_read(s->fifo, (void **)out->extended_data, out->nb_samples);
-        out->pts = s->next_pts;
-        ret = ff_filter_frame(outlink, out);
-    }
-
     return ret;
 }
 
@@ -975,9 +945,6 @@ static av_cold void uninit(AVFilterContext *ctx)
     av_frame_free(&s->stop_holdoff);
     av_frame_free(&s->stop_silence_hold);
     av_frame_free(&s->window);
-
-    av_audio_fifo_free(s->fifo);
-    s->fifo = NULL;
 }
 
 static const AVFilterPad silenceremove_inputs[] = {
