AVFILTER_DEFINE_CLASS(aformat);
-#define PARSE_FORMATS(str, type, list, add_to_list, get_fmt, none, desc) \
+#define PARSE_FORMATS(str, type, list, add_to_list, unref_fn, get_fmt, none, desc) \
do { \
char *next, *cur = str, sep; \
+ int ret; \
\
if (str && strchr(str, ',')) { \
av_log(ctx, AV_LOG_WARNING, "This syntax is deprecated, use '|' to "\
av_log(ctx, AV_LOG_ERROR, "Error parsing " desc ": %s.\n", cur);\
return AVERROR(EINVAL); \
} \
- add_to_list(&list, fmt); \
+ if ((ret = add_to_list(&list, fmt)) < 0) { \
+ unref_fn(&list); \
+ return ret; \
+ } \
\
cur = next; \
} \
AFormatContext *s = ctx->priv;
PARSE_FORMATS(s->formats_str, enum AVSampleFormat, s->formats,
- ff_add_format, av_get_sample_fmt, AV_SAMPLE_FMT_NONE, "sample format");
- PARSE_FORMATS(s->sample_rates_str, int, s->sample_rates, ff_add_format,
+ ff_add_format, ff_formats_unref, av_get_sample_fmt, AV_SAMPLE_FMT_NONE, "sample format");
+ PARSE_FORMATS(s->sample_rates_str, int, s->sample_rates, ff_add_format, ff_formats_unref,
get_sample_rate, 0, "sample rate");
PARSE_FORMATS(s->channel_layouts_str, uint64_t, s->channel_layouts,
- ff_add_channel_layout, av_get_channel_layout, 0,
+ ff_add_channel_layout, ff_channel_layouts_unref, av_get_channel_layout, 0,
"channel layout");
return 0;