Commit e72aa524 authored by Stefano Sabatini's avatar Stefano Sabatini

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.
parent 44ab77db
...@@ -309,8 +309,10 @@ value is "-1". ...@@ -309,8 +309,10 @@ value is "-1".
@section anullsrc @section anullsrc
Null audio source, never return audio frames. It is mainly useful as a Null audio source, return unprocessed audio frames. It is mainly useful
template and to be employed in analysis / debugging tools. 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, It accepts an optional sequence of @var{key}=@var{value} pairs,
separated by ":". separated by ":".
...@@ -331,6 +333,10 @@ is "stereo". ...@@ -331,6 +333,10 @@ is "stereo".
Check the channel_layout_map definition in Check the channel_layout_map definition in
@file{libavcodec/audioconvert.c} for the mapping between strings and @file{libavcodec/audioconvert.c} for the mapping between strings and
channel layout values. channel layout values.
@item nb_samples, n
Set the number of samples per requested frames.
@end table @end table
Follow some examples: Follow some examples:
......
...@@ -33,6 +33,8 @@ typedef struct { ...@@ -33,6 +33,8 @@ typedef struct {
int64_t channel_layout; int64_t channel_layout;
char *sample_rate_str; char *sample_rate_str;
int sample_rate; int sample_rate;
int nb_samples; ///< number of samples per requested frame
int64_t pts;
} ANullContext; } ANullContext;
#define OFFSET(x) offsetof(ANullContext, x) #define OFFSET(x) offsetof(ANullContext, x)
...@@ -42,6 +44,8 @@ static const AVOption anullsrc_options[]= { ...@@ -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 }, { "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 }, { "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 }, { "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 }, { NULL },
}; };
...@@ -92,15 +96,29 @@ static int config_props(AVFilterLink *outlink) ...@@ -92,15 +96,29 @@ static int config_props(AVFilterLink *outlink)
chans_nb = av_get_channel_layout_nb_channels(priv->channel_layout); 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_get_channel_layout_string(buf, sizeof(buf), chans_nb, priv->channel_layout);
av_log(outlink->src, AV_LOG_INFO, av_log(outlink->src, AV_LOG_INFO,
"sample_rate:%d channel_layout:%"PRId64 " channel_layout_description:'%s'\n", "sample_rate:%d channel_layout:%"PRId64 " channel_layout_description:'%s' nb_samples:%d\n",
priv->sample_rate, priv->channel_layout, buf); priv->sample_rate, priv->channel_layout, buf, priv->nb_samples);
return 0; 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 = { AVFilter avfilter_asrc_anullsrc = {
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 2 #define LIBAVFILTER_VERSION_MAJOR 2
#define LIBAVFILTER_VERSION_MINOR 43 #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, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment