|
|
|
@ -231,24 +231,25 @@ static void filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) |
|
|
|
|
static av_cold int asink_init(AVFilterContext *ctx, const char *args, void *opaque) |
|
|
|
|
{ |
|
|
|
|
BufferSinkContext *buf = ctx->priv; |
|
|
|
|
AVABufferSinkParams *params; |
|
|
|
|
AVABufferSinkParams *params = opaque; |
|
|
|
|
|
|
|
|
|
if (!opaque) { |
|
|
|
|
av_log(ctx, AV_LOG_ERROR, |
|
|
|
|
"No opaque field provided, an AVABufferSinkParams struct is required\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} else |
|
|
|
|
params = (AVABufferSinkParams *)opaque; |
|
|
|
|
|
|
|
|
|
buf->sample_fmts = ff_copy_int_list (params->sample_fmts); |
|
|
|
|
buf->channel_layouts = ff_copy_int64_list(params->channel_layouts); |
|
|
|
|
if (!buf->sample_fmts || !buf->channel_layouts) { |
|
|
|
|
av_freep(&buf->sample_fmts); |
|
|
|
|
av_freep(&buf->channel_layouts); |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
if (params && params->sample_fmts) { |
|
|
|
|
buf->sample_fmts = ff_copy_int_list (params->sample_fmts); |
|
|
|
|
if (!buf->sample_fmts) |
|
|
|
|
goto fail_enomem; |
|
|
|
|
} |
|
|
|
|
if (params && params->channel_layouts) { |
|
|
|
|
buf->channel_layouts = ff_copy_int64_list(params->channel_layouts); |
|
|
|
|
if (!buf->channel_layouts) |
|
|
|
|
goto fail_enomem; |
|
|
|
|
} |
|
|
|
|
if (!common_init(ctx)) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
return common_init(ctx); |
|
|
|
|
fail_enomem: |
|
|
|
|
av_freep(&buf->sample_fmts); |
|
|
|
|
av_freep(&buf->channel_layouts); |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_cold void asink_uninit(AVFilterContext *ctx) |
|
|
|
@ -266,14 +267,17 @@ static int asink_query_formats(AVFilterContext *ctx) |
|
|
|
|
AVFilterFormats *formats = NULL; |
|
|
|
|
AVFilterChannelLayouts *layouts = NULL; |
|
|
|
|
|
|
|
|
|
if (buf->sample_fmts) { |
|
|
|
|
if (!(formats = ff_make_format_list(buf->sample_fmts))) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
ff_set_common_formats(ctx, formats); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (buf->channel_layouts) { |
|
|
|
|
if (!(layouts = avfilter_make_format64_list(buf->channel_layouts))) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
ff_set_common_channel_layouts(ctx, layouts); |
|
|
|
|
ff_set_common_samplerates (ctx, ff_all_samplerates()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|