summaryrefslogtreecommitdiff
path: root/libavfilter/af_silencedetect.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2021-09-02 21:28:13 +0200
committerPaul B Mahol <onemda@gmail.com>2021-09-02 21:34:17 +0200
commita4101dca6c91cbcbd1bfa0d6fa68ee14737db9b1 (patch)
treecf21ede8a0fe7b55856ef399c896b97c9e80dc55 /libavfilter/af_silencedetect.c
parentba3c09b84aeed514c8fa91a2a457e261e4be4f39 (diff)
avfilter/af_silencedetect: add planar sample formats support
Diffstat (limited to 'libavfilter/af_silencedetect.c')
-rw-r--r--libavfilter/af_silencedetect.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/libavfilter/af_silencedetect.c b/libavfilter/af_silencedetect.c
index 6f747b64b2..93ec5f7171 100644
--- a/libavfilter/af_silencedetect.c
+++ b/libavfilter/af_silencedetect.c
@@ -131,11 +131,35 @@ static void silencedetect_##name(SilenceDetectContext *s, AVFrame *insamples,
nb_samples_notify, time_base); \
}
+#define SILENCE_DETECT_PLANAR(name, type) \
+static void silencedetect_##name(SilenceDetectContext *s, AVFrame *insamples, \
+ int nb_samples, int64_t nb_samples_notify, \
+ AVRational time_base) \
+{ \
+ const int channels = insamples->channels; \
+ const type noise = s->noise; \
+ \
+ nb_samples /= channels; \
+ for (int i = 0; i < nb_samples; i++) { \
+ for (int ch = 0; ch < insamples->channels; ch++) { \
+ const type *p = (const type *)insamples->extended_data[ch]; \
+ update(s, insamples, p[i] < noise && p[i] > -noise, \
+ channels * i + ch, \
+ nb_samples_notify, time_base); \
+ } \
+ } \
+}
+
SILENCE_DETECT(dbl, double)
SILENCE_DETECT(flt, float)
SILENCE_DETECT(s32, int32_t)
SILENCE_DETECT(s16, int16_t)
+SILENCE_DETECT_PLANAR(dblp, double)
+SILENCE_DETECT_PLANAR(fltp, float)
+SILENCE_DETECT_PLANAR(s32p, int32_t)
+SILENCE_DETECT_PLANAR(s16p, int16_t)
+
static int config_input(AVFilterLink *inlink)
{
AVFilterContext *ctx = inlink->dst;
@@ -165,6 +189,18 @@ static int config_input(AVFilterLink *inlink)
s->noise *= INT16_MAX;
s->silencedetect = silencedetect_s16;
break;
+ case AV_SAMPLE_FMT_DBLP: s->silencedetect = silencedetect_dblp; break;
+ case AV_SAMPLE_FMT_FLTP: s->silencedetect = silencedetect_fltp; break;
+ case AV_SAMPLE_FMT_S32P:
+ s->noise *= INT32_MAX;
+ s->silencedetect = silencedetect_s32p;
+ break;
+ case AV_SAMPLE_FMT_S16P:
+ s->noise *= INT16_MAX;
+ s->silencedetect = silencedetect_s16p;
+ break;
+ default:
+ return AVERROR_BUG;
}
return 0;
@@ -198,10 +234,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
static int query_formats(AVFilterContext *ctx)
{
static const enum AVSampleFormat sample_fmts[] = {
- AV_SAMPLE_FMT_DBL,
- AV_SAMPLE_FMT_FLT,
- AV_SAMPLE_FMT_S32,
- AV_SAMPLE_FMT_S16,
+ AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBLP,
+ AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
+ AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32P,
+ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
AV_SAMPLE_FMT_NONE
};
int ret = ff_set_common_all_channel_counts(ctx);