[FFmpeg-devel] [PATCH] avfilter: add audio noise source

Kyle Swanson k at ylo.ph
Fri Oct 30 18:00:23 CET 2015


Signed-off-by: Kyle Swanson <k at ylo.ph>
---
 Changelog                |   1 +
 doc/filters.texi         |  30 ++++++++++
 libavfilter/Makefile     |   1 +
 libavfilter/allfilters.c |   1 +
 libavfilter/asrc_noise.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++
 libavfilter/version.h    |   2 +-
 6 files changed, 175 insertions(+), 1 deletion(-)
 create mode 100644 libavfilter/asrc_noise.c

diff --git a/Changelog b/Changelog
index c49e383..d2ea2e1 100644
--- a/Changelog
+++ b/Changelog
@@ -29,6 +29,7 @@ version <next>:
 - vibrato filter
 - innoHeim/Rsupport Screen Capture Codec decoder
 - ADPCM AICA decoder
+- noise audio source
 
 
 version 2.8:
diff --git a/doc/filters.texi b/doc/filters.texi
index 15ea77a..0d901cc 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -3193,6 +3193,36 @@ ffplay -f lavfi flite=text='No more be grieved for which that thou hast done.'
 For more information about libflite, check:
 @url{http://www.speech.cs.cmu.edu/flite/}
 
+ at section noise
+
+Generate a white noise audio signal.
+
+The filter accepts the following options:
+
+ at table @option
+
+ at item sample_rate, r
+Specify the sample rate. Default value is 48000 Hz.
+
+ at item duration, d
+Specify the duration of the generated audio stream. Default value is 10 seconds.
+
+ at item amplitude, a
+Specify the amplitude (0.0 - 1.0) of the generated audio stream. Default value is 1.0.
+
+ at end table
+
+ at subsection Examples
+
+ at itemize
+
+ at item
+Generate 60 seconds of white noise, with a 44.1 kHz sampling rate and an amplitude of 0.5:
+ at example
+noise=d=60:r=44100:a=0.5
+ at end example
+ at end itemize
+
 @section sine
 
 Generate an audio signal made of a sine wave with amplitude 1/8.
diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index c5819d4..a0b2232 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -93,6 +93,7 @@ OBJS-$(CONFIG_VOLUMEDETECT_FILTER)           += af_volumedetect.o
 OBJS-$(CONFIG_AEVALSRC_FILTER)               += aeval.o
 OBJS-$(CONFIG_ANULLSRC_FILTER)               += asrc_anullsrc.o
 OBJS-$(CONFIG_FLITE_FILTER)                  += asrc_flite.o
+OBJS-$(CONFIG_NOISE_FILTER)                  += asrc_noise.o
 OBJS-$(CONFIG_SINE_FILTER)                   += asrc_sine.o
 
 OBJS-$(CONFIG_ANULLSINK_FILTER)              += asink_anullsink.o
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index a538b81..f820441 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
@@ -115,6 +115,7 @@ void avfilter_register_all(void)
     REGISTER_FILTER(AEVALSRC,       aevalsrc,       asrc);
     REGISTER_FILTER(ANULLSRC,       anullsrc,       asrc);
     REGISTER_FILTER(FLITE,          flite,          asrc);
+    REGISTER_FILTER(NOISE,          noise,          asrc);
     REGISTER_FILTER(SINE,           sine,           asrc);
 
     REGISTER_FILTER(ANULLSINK,      anullsink,      asink);
diff --git a/libavfilter/asrc_noise.c b/libavfilter/asrc_noise.c
new file mode 100644
index 0000000..00370a6
--- /dev/null
+++ b/libavfilter/asrc_noise.c
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2015 Kyle Swanson <k at ylo.ph>.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <float.h>
+
+#include "libavutil/opt.h"
+#include "audio.h"
+#include "avfilter.h"
+#include "internal.h"
+#include "libavutil/lfg.h"
+
+typedef struct {
+    const AVClass *class;
+    int sample_rate;
+    double amplitude;
+    double dur_sec;
+    int64_t dur_samp;
+    AVLFG c;
+} NoiseContext;
+
+#define OFFSET(x) offsetof(NoiseContext, x)
+#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption noise_options[] = {
+    { "sample_rate", "set sample rate",    OFFSET(sample_rate),    AV_OPT_TYPE_INT,     {.i64 = 48000}, 15,   INT_MAX,  FLAGS },
+    { "r",           "set sample rate",    OFFSET(sample_rate),    AV_OPT_TYPE_INT,     {.i64 = 48000}, 15,   INT_MAX,  FLAGS },
+    { "amplitude",   "set amplitude",      OFFSET(amplitude),      AV_OPT_TYPE_DOUBLE,  {.dbl = 1.},    0.,   1.,       FLAGS },
+    { "a",           "set amplitude",      OFFSET(amplitude),      AV_OPT_TYPE_DOUBLE,  {.dbl = 1.},    0.,   1.,       FLAGS },
+    { "duration",    "set duration",       OFFSET(dur_sec),        AV_OPT_TYPE_DOUBLE,  {.dbl = 10.},   0.,   DBL_MAX,  FLAGS },
+    { "d",           "set duration",       OFFSET(dur_sec),        AV_OPT_TYPE_DOUBLE,  {.dbl = 10.},   0.,   DBL_MAX,  FLAGS },
+    {NULL}
+};
+
+AVFILTER_DEFINE_CLASS(noise);
+
+static av_cold int query_formats(AVFilterContext *ctx)
+{
+    NoiseContext *s = ctx->priv;
+    static const int64_t chlayouts[] = { AV_CH_LAYOUT_MONO, -1 };
+    int sample_rates[] = { s->sample_rate, -1 };
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_DBL,
+        AV_SAMPLE_FMT_NONE
+    };
+
+    AVFilterFormats *formats;
+    AVFilterChannelLayouts *layouts;
+    int ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats (ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    layouts = avfilter_make_format64_list(chlayouts);
+    if (!layouts)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_make_format_list(sample_rates);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static av_cold int config_props(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    NoiseContext *s = ctx->priv;
+    s->dur_samp = s->dur_sec * s->sample_rate;
+    return 0;
+}
+
+static int request_frame(AVFilterLink *outlink) {
+    AVFilterContext *ctx = outlink->src;
+    NoiseContext *s = ctx->priv;
+    AVFrame *frame;
+    int nb_samples, i;
+    double *dst;
+
+    nb_samples = 1024;
+    if (!(frame = ff_get_audio_buffer(outlink, nb_samples)))
+        return AVERROR(ENOMEM);
+    dst = (double *)frame->data[0];
+
+    for (i = 0; i < nb_samples; i++) {
+        dst[i]= s->amplitude * ((2 * ((double) av_lfg_get(&s->c) / 0xffffffff)) - 1);
+        s->dur_samp--;
+        if (s->dur_samp <= 0)
+            return AVERROR_EOF;
+    }
+    return ff_filter_frame(outlink, frame);
+}
+
+static av_cold int init(AVFilterContext *ctx) {
+    NoiseContext *s = ctx->priv;
+    av_lfg_init(&s->c, 0);
+    return 0;
+}
+
+static const AVFilterPad noise_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_AUDIO,
+        .request_frame = request_frame,
+        .config_props  = config_props,
+    },
+    { NULL }
+};
+
+AVFilter ff_asrc_noise = {
+    .name          = "noise",
+    .description   = NULL_IF_CONFIG_SMALL("Generate white noise audio signal."),
+    .init          = init,
+    .query_formats = query_formats,
+    .priv_size     = sizeof(NoiseContext),
+    .inputs        = NULL,
+    .outputs       = noise_outputs,
+    .priv_class    = &noise_class,
+};
diff --git a/libavfilter/version.h b/libavfilter/version.h
index c3ecf91..05b0735 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -30,7 +30,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVFILTER_VERSION_MAJOR   6
-#define LIBAVFILTER_VERSION_MINOR  14
+#define LIBAVFILTER_VERSION_MINOR  15
 #define LIBAVFILTER_VERSION_MICRO 101
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
-- 
2.6.2



More information about the ffmpeg-devel mailing list