mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
2aad37ffb5
commit
b8bf2f4e17
|
@ -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,38 +461,10 @@ 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 (buf->nb_channel_layouts) {
|
||||
ret = ff_set_common_channel_layouts_from_list(ctx, buf->channel_layouts);
|
||||
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)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (buf->sample_rates_size) {
|
||||
|
|
Loading…
Reference in New Issue