[FFmpeg-devel] [PATCH] anullsrc: implement a request_frame callback for returning frames

Stefano Sabatini stefasab at gmail.com
Sat Sep 17 12:56:13 CEST 2011


This is mainly useful for filters (like the sox synth), which
overwrite the content of the passed data.
---
 doc/filters.texi            |   10 ++++++++--
 libavfilter/asrc_anullsrc.c |   25 +++++++++++++++++++++----
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index ec4dd87..ce0d53a 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -354,8 +354,10 @@ value is "-1".
 
 @section anullsrc
 
-Null audio source, never return audio frames. It is mainly useful as a
-template and to be employed in analysis / debugging tools.
+Null audio source, return unprocessed audio frames. It is mainly useful
+as a template and to be employed in analysis / debugging tools, or as
+the source for filters which ignore the input data (for example the sox
+synth filter).
 
 It accepts an optional sequence of @var{key}=@var{value} pairs,
 separated by ":".
@@ -376,6 +378,10 @@ is "stereo".
 Check the channel_layout_map definition in
 @file{libavcodec/audioconvert.c} for the mapping between strings and
 channel layout values.
+
+ at item nb_samples, n
+Set the number of samples per requested frames.
+
 @end table
 
 Follow some examples:
diff --git a/libavfilter/asrc_anullsrc.c b/libavfilter/asrc_anullsrc.c
index 525fde4..c39f3e7 100644
--- a/libavfilter/asrc_anullsrc.c
+++ b/libavfilter/asrc_anullsrc.c
@@ -33,6 +33,8 @@ typedef struct {
     int64_t channel_layout;
     char   *sample_rate_str;
     int     sample_rate;
+    int nb_samples;             ///< number of samples per requested frame
+    int64_t pts;
 } ANullContext;
 
 #define OFFSET(x) offsetof(ANullContext, x)
@@ -42,6 +44,8 @@ static const AVOption anullsrc_options[]= {
     { "cl",             "set channel_layout", OFFSET(channel_layout_str), FF_OPT_TYPE_STRING, {.str = "stereo"}, 0, 0 },
     { "sample_rate",    "set sample rate",    OFFSET(sample_rate_str)   , FF_OPT_TYPE_STRING, {.str = "44100"}, 0, 0 },
     { "r",              "set sample rate",    OFFSET(sample_rate_str)   , FF_OPT_TYPE_STRING, {.str = "44100"}, 0, 0 },
+    { "nb_samples",     "set the number of samples per requested frame", OFFSET(nb_samples), FF_OPT_TYPE_INT, {.dbl = 1024}, 0, INT_MAX },
+    { "n",              "set the number of samples per requested frame", OFFSET(nb_samples), FF_OPT_TYPE_INT, {.dbl = 1024}, 0, INT_MAX },
     { NULL },
 };
 
@@ -92,15 +96,28 @@ static int config_props(AVFilterLink *outlink)
     chans_nb = av_get_channel_layout_nb_channels(priv->channel_layout);
     av_get_channel_layout_string(buf, sizeof(buf), chans_nb, priv->channel_layout);
     av_log(outlink->src, AV_LOG_INFO,
-           "sample_rate:%d channel_layout:%"PRId64 " channel_layout_description:'%s'\n",
-           priv->sample_rate, priv->channel_layout, buf);
+           "sample_rate:%d channel_layout:%"PRId64 " channel_layout_description:'%s' nb_samples:%d\n",
+           priv->sample_rate, priv->channel_layout, buf, priv->nb_samples);
 
     return 0;
 }
 
-static int request_frame(AVFilterLink *link)
+static int request_frame(AVFilterLink *outlink)
 {
-    return -1;
+    ANullContext *null = outlink->src->priv;
+    AVFilterBufferRef *samplesref;
+
+    samplesref =
+        avfilter_get_audio_buffer(outlink, AV_PERM_WRITE, null->nb_samples);
+    samplesref->pts = null->pts;
+    samplesref->pos = -1;
+    samplesref->audio->sample_rate = outlink->sample_rate;
+
+    avfilter_filter_samples(outlink, avfilter_ref_buffer(samplesref, ~0));
+    avfilter_unref_buffer(samplesref);
+
+    null->pts += null->nb_samples;
+    return 0;
 }
 
 AVFilter avfilter_asrc_anullsrc = {
-- 
1.7.2.5



More information about the ffmpeg-devel mailing list