From e72aa524d894e03ac13f549c3f9ee67bc6928dbc Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Sat, 17 Sep 2011 03:17:06 +0200 Subject: [PATCH] asrc_anullsrc: implement a request_frame callback for returning frames 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 | 26 ++++++++++++++++++++++---- libavfilter/avfilter.h | 2 +- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index d65d45ada8..173c6f6c79 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -309,8 +309,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 ":". @@ -331,6 +333,10 @@ is "stereo". Check the channel_layout_map definition in @file{libavcodec/audioconvert.c} for the mapping between strings and channel layout values. + +@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 525fde4190..a52f799a59 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,29 @@ 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->channel_layout = null->channel_layout; + 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 = { diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 9857c0fb45..0c675f8d16 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 2 #define LIBAVFILTER_VERSION_MINOR 43 -#define LIBAVFILTER_VERSION_MICRO 1 +#define LIBAVFILTER_VERSION_MICRO 2 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \