History

avfilter/af_silenceremove: avoid returning 1 sample duration frames

Paul B Mahol committed 5 years ago

Commit 8a42ee61 parent 3b331461 file · +38 −18Browse files

Showing the changes to libavfilter (1 of 1 file). Show all

Unified · Split

libavfilter/af_silenceremove.c+38−18
@@ -23,6 +23,7 @@ · 22 unmodified lines
2323
2424 #include <float.h> /* DBL_MAX */
2525
26+#include "libavutil/audio_fifo.h"
2627 #include "libavutil/avassert.h"
2728 #include "libavutil/opt.h"
2829 #include "libavutil/timestamp.h"
@@ -103,6 +104,8 @@ typedef struct SilenceRemoveContext { · 74 unmodified lines
103104 double (*compute)(struct SilenceRemoveContext *s, AVFrame *frame, int ch, int offset);
104105 void (*copy)(struct SilenceRemoveContext *s, AVFrame *out, AVFrame *in,
105106 int ch, int out_offset, int in_offset);
107+
108+ AVAudioFifo *fifo;
106109 } SilenceRemoveContext;
107110
108111 #define OFFSET(x) offsetof(SilenceRemoveContext, x)
@@ -542,12 +545,16 @@ static int config_input(AVFilterLink *inlink) · 433 unmodified lines
542545 return AVERROR_BUG;
543546 }
544547
548+ s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, 1024);
549+ if (!s->fifo)
550+ return AVERROR(ENOMEM);
551+
545552 return 0;
546553 }
547554
548555 static void flush(SilenceRemoveContext *s,
549556 AVFrame *out, AVFilterLink *outlink,
550− int *nb_samples_written, int *ret, int flush_silence)
557+ int *nb_samples_written, int flush_silence)
551558 {
552559 AVFrame *silence;
553560
@@ -559,22 +566,18 @@ static void flush(SilenceRemoveContext *s, · 5 unmodified lines
559566 (AVRational){1, outlink->sample_rate},
560567 outlink->time_base);
561568
562− *ret = ff_filter_frame(outlink, out);
563− if (*ret < 0)
564− return;
569+ av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
565570 *nb_samples_written = 0;
566− } else {
567− av_frame_free(&out);
568571 }
569572
573+ av_frame_free(&out);
574+
570575 if (s->stop_silence_end <= 0 || !flush_silence)
571576 return;
572577
573578 silence = ff_get_audio_buffer(outlink, s->stop_silence_end);
574− if (!silence) {
575− *ret = AVERROR(ENOMEM);
579+ if (!silence)
576580 return;
577− }
578581
579582 if (s->stop_silence_offset < s->stop_silence_end) {
580583 av_samples_copy(silence->extended_data, s->stop_silence_hold->extended_data, 0,
@@ -598,7 +601,8 @@ static void flush(SilenceRemoveContext *s, · 17 unmodified lines
598601 (AVRational){1, outlink->sample_rate},
599602 outlink->time_base);
600603
601− *ret = ff_filter_frame(outlink, silence);
604+ av_audio_fifo_write(s->fifo, (void **)silence->extended_data, silence->nb_samples);
605+ av_frame_free(&silence);
602606 }
603607
604608 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
@@ -727,7 +731,8 @@ silence_trim_flush: · 122 unmodified lines
727731
728732 s->start_holdoff_offset += nbs;
729733
730− ret = ff_filter_frame(outlink, out);
734+ av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
735+ av_frame_free(&out);
731736
732737 if (s->start_holdoff_offset == s->start_holdoff_end) {
733738 s->start_holdoff_offset = 0;
@@ -771,7 +776,7 @@ silence_copy: · 37 unmodified lines
771776
772777 if (threshold && s->stop_holdoff_end && !s->stop_silence) {
773778 s->mode = SILENCE_COPY_FLUSH;
774− flush(s, out, outlink, &nb_samples_written, &ret, 0);
779+ flush(s, out, outlink, &nb_samples_written, 0);
775780 goto silence_copy_flush;
776781 } else if (threshold) {
777782 for (j = 0; j < outlink->channels; j++) {
@@ -812,7 +817,7 @@ silence_copy: · 34 unmodified lines
812817
813818 if (!s->restart) {
814819 s->mode = SILENCE_STOP;
815− flush(s, out, outlink, &nb_samples_written, &ret, 1);
820+ flush(s, out, outlink, &nb_samples_written, 1);
816821 goto silence_stop;
817822 } else {
818823 s->stop_found_periods = 0;
@@ -823,17 +828,17 @@ silence_copy: · 4 unmodified lines
823828 s->start_silence_end = 0;
824829 clear_window(s);
825830 s->mode = SILENCE_TRIM;
826− flush(s, out, outlink, &nb_samples_written, &ret, 1);
831+ flush(s, out, outlink, &nb_samples_written, 1);
827832 goto silence_trim;
828833 }
829834 }
830835 s->mode = SILENCE_COPY_FLUSH;
831− flush(s, out, outlink, &nb_samples_written, &ret, 0);
836+ flush(s, out, outlink, &nb_samples_written, 0);
832837 goto silence_copy_flush;
833838 }
834839 }
835840 }
836− flush(s, out, outlink, &nb_samples_written, &ret, 0);
841+ flush(s, out, outlink, &nb_samples_written, 0);
837842 } else {
838843 av_samples_copy(out->extended_data, in->extended_data,
839844 nb_samples_written,
@@ -845,7 +850,8 @@ silence_copy: · 5 unmodified lines
845850 (AVRational){1, outlink->sample_rate},
846851 outlink->time_base);
847852
848− ret = ff_filter_frame(outlink, out);
853+ av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
854+ av_frame_free(&out);
849855 }
850856 break;
851857
@@ -872,7 +878,8 @@ silence_copy_flush: · 20 unmodified lines
872878 (AVRational){1, outlink->sample_rate},
873879 outlink->time_base);
874880
875− ret = ff_filter_frame(outlink, out);
881+ av_audio_fifo_write(s->fifo, (void **)out->extended_data, out->nb_samples);
882+ av_frame_free(&out);
876883
877884 if (s->stop_holdoff_offset == s->stop_holdoff_end) {
878885 s->stop_holdoff_offset = 0;
@@ -892,6 +899,16 @@ silence_stop: · 13 unmodified lines
892899
893900 av_frame_free(&in);
894901
902+ if (av_audio_fifo_size(s->fifo) > 0) {
903+ out = ff_get_audio_buffer(outlink, av_audio_fifo_size(s->fifo));
904+ if (!out)
905+ return AVERROR(ENOMEM);
906+
907+ av_audio_fifo_read(s->fifo, (void **)out->extended_data, out->nb_samples);
908+ out->pts = s->next_pts;
909+ ret = ff_filter_frame(outlink, out);
910+ }
911+
895912 return ret;
896913 }
897914
@@ -955,6 +972,9 @@ static av_cold void uninit(AVFilterContext *ctx) · 57 unmodified lines
955972 av_frame_free(&s->stop_holdoff);
956973 av_frame_free(&s->stop_silence_hold);
957974 av_frame_free(&s->window);
975+
976+ av_audio_fifo_free(s->fifo);
977+ s->fifo = NULL;
958978 }
959979
960980 static const AVFilterPad silenceremove_inputs[] = {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t