lavfi/buffersink: move channel layout parsing to init

That is a more appropriate place for this, and will also be useful in
future commits.
This commit is contained in:
Anton Khirnov 2024-09-25 11:09:58 +02:00
parent 2aad37ffb5
commit b8bf2f4e17
1 changed files with 42 additions and 33 deletions

View File

@ -154,6 +154,7 @@ int attribute_align_arg av_buffersink_get_samples(AVFilterContext *ctx,
static av_cold int common_init(AVFilterContext *ctx)
{
BufferSinkContext *buf = ctx->priv;
int ret = 0;
#if FF_API_BUFFERSINK_OPTS
@ -184,6 +185,44 @@ static av_cold int common_init(AVFilterContext *ctx)
CHECK_LIST_SIZE(sample_fmts)
CHECK_LIST_SIZE(sample_rates)
if (buf->channel_layouts_str) {
const char *cur = buf->channel_layouts_str;
if (buf->all_channel_counts)
av_log(ctx, AV_LOG_WARNING,
"Conflicting all_channel_counts and list in options\n");
while (cur) {
void *tmp;
char *next = strchr(cur, '|');
if (next)
*next++ = 0;
// +2 for the new element and terminator
tmp = av_realloc_array(buf->channel_layouts, buf->nb_channel_layouts + 2,
sizeof(*buf->channel_layouts));
if (!tmp)
return AVERROR(ENOMEM);
memset(&buf->channel_layouts[buf->nb_channel_layouts], 0,
sizeof(*buf->channel_layouts));
buf->nb_channel_layouts++;
ret = av_channel_layout_from_string(&buf->channel_layouts[buf->nb_channel_layouts - 1], cur);
if (ret < 0) {
av_log(ctx, AV_LOG_ERROR, "Error parsing channel layout: %s.\n", cur);
return ret;
}
if (ret < 0)
return ret;
cur = next;
}
if (buf->nb_channel_layouts)
buf->channel_layouts[buf->nb_channel_layouts] = (AVChannelLayout){ 0 };
}
}
#undef CHECK_LIST_SIZE
@ -412,8 +451,6 @@ static int asink_query_formats(AVFilterContext *ctx)
#if FF_API_BUFFERSINK_OPTS
} else {
AVFilterFormats *formats = NULL;
AVChannelLayout layout = { 0 };
AVFilterChannelLayouts *layouts = NULL;
unsigned i;
if (buf->sample_fmts_size) {
@ -424,37 +461,9 @@ static int asink_query_formats(AVFilterContext *ctx)
return ret;
}
if (buf->channel_layouts_str || buf->all_channel_counts) {
if (buf->channel_layouts_str) {
const char *cur = buf->channel_layouts_str;
while (cur) {
char *next = strchr(cur, '|');
if (next)
*next++ = 0;
ret = av_channel_layout_from_string(&layout, cur);
if (ret < 0) {
av_log(ctx, AV_LOG_ERROR, "Error parsing channel layout: %s.\n", cur);
return ret;
}
ret = ff_add_channel_layout(&layouts, &layout);
av_channel_layout_uninit(&layout);
if (ret < 0)
return ret;
cur = next;
}
}
if (buf->all_channel_counts) {
if (layouts)
av_log(ctx, AV_LOG_WARNING,
"Conflicting all_channel_counts and list in options\n");
else if (!(layouts = ff_all_channel_counts()))
return AVERROR(ENOMEM);
}
if ((ret = ff_set_common_channel_layouts(ctx, layouts)) < 0)
if (buf->nb_channel_layouts) {
ret = ff_set_common_channel_layouts_from_list(ctx, buf->channel_layouts);
if (ret < 0)
return ret;
}