summaryrefslogtreecommitdiff
path: root/libavfilter/af_aresample.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavfilter/af_aresample.c')
-rw-r--r--libavfilter/af_aresample.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/libavfilter/af_aresample.c b/libavfilter/af_aresample.c
index a2980d90cd..521ccf7f8d 100644
--- a/libavfilter/af_aresample.c
+++ b/libavfilter/af_aresample.c
@@ -56,6 +56,42 @@ static av_cold void uninit(AVFilterContext *ctx)
swr_free(&aresample->swr);
}
+static int query_formats(AVFilterContext *ctx)
+{
+ AResampleContext *aresample = ctx->priv;
+
+ AVFilterLink *inlink = ctx->inputs[0];
+ AVFilterLink *outlink = ctx->outputs[0];
+
+ AVFilterFormats *in_formats = avfilter_all_formats(AVMEDIA_TYPE_AUDIO);
+ AVFilterFormats *out_formats = avfilter_all_formats(AVMEDIA_TYPE_AUDIO);
+ AVFilterFormats *in_samplerates = ff_all_samplerates();
+ AVFilterFormats *out_samplerates;
+
+
+ AVFilterChannelLayouts *in_layouts = ff_all_channel_layouts();
+ AVFilterChannelLayouts *out_layouts = ff_all_channel_layouts();
+
+ avfilter_formats_ref(in_formats, &inlink->out_formats);
+ avfilter_formats_ref(out_formats, &outlink->in_formats);
+
+ avfilter_formats_ref(in_samplerates, &inlink->out_samplerates);
+
+ ff_channel_layouts_ref(in_layouts, &inlink->out_channel_layouts);
+ ff_channel_layouts_ref(out_layouts, &outlink->in_channel_layouts);
+
+ if(aresample->out_rate > 0) {
+ int sample_rates[] = { aresample->out_rate, -1 };
+ ff_set_common_samplerates(ctx, avfilter_make_format_list(sample_rates));
+ } else {
+ out_samplerates = ff_all_samplerates();
+ avfilter_formats_ref(out_samplerates, &outlink->in_samplerates);
+ }
+
+ return 0;
+}
+
+
static int config_output(AVFilterLink *outlink)
{
int ret;
@@ -113,6 +149,7 @@ AVFilter avfilter_af_aresample = {
.description = NULL_IF_CONFIG_SMALL("Resample audio data."),
.init = init,
.uninit = uninit,
+ .query_formats = query_formats,
.priv_size = sizeof(AResampleContext),
.inputs = (const AVFilterPad[]) {{ .name = "default",