mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-06-09 14:07:31 +02:00
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.
This commit is contained in:
parent
44ab77db9e
commit
e72aa524d8
@ -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".
|
|||||||
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 {
|
|||||||
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[]= {
|
|||||||
{ "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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user