Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2011-09-17 05:17:06 +0400
committerStefano Sabatini <stefasab@gmail.com>2011-09-18 14:38:33 +0400
commite72aa524d894e03ac13f549c3f9ee67bc6928dbc (patch)
treecd5f932ea362f1b3e7ec4b689e1bc8b7c0905db7 /libavfilter/asrc_anullsrc.c
parent44ab77db9efaa41f968b9e90aa8b58e9d416a48a (diff)
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.
Diffstat (limited to 'libavfilter/asrc_anullsrc.c')
-rw-r--r--libavfilter/asrc_anullsrc.c26
1 files changed, 22 insertions, 4 deletions
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 = {