This is a micro-optimization. Saving almost 200 reallocations makes it worth a try. --- fix commit message typo: relocations -> reallocations
libavfilter/formats.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/libavfilter/formats.c b/libavfilter/formats.c index 33c64668a0..1af7a1cedd 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -348,23 +348,30 @@ int ff_add_channel_layout(AVFilterChannelLayouts **l, uint64_t channel_layout) AVFilterFormats *ff_all_formats(enum AVMediaType type) { - AVFilterFormats *ret = NULL; + AVFilterFormats *ret; + int i, count; - if (type == AVMEDIA_TYPE_VIDEO) { - const AVPixFmtDescriptor *desc = NULL; - while ((desc = av_pix_fmt_desc_next(desc))) { - if (ff_add_format(&ret, av_pix_fmt_desc_get_id(desc)) < 0) - return NULL; - } - } else if (type == AVMEDIA_TYPE_AUDIO) { - enum AVSampleFormat fmt = 0; - while (av_get_sample_fmt_name(fmt)) { - if (ff_add_format(&ret, fmt) < 0) - return NULL; - fmt++; - } + if (type == AVMEDIA_TYPE_VIDEO) + count = AV_PIX_FMT_NB; + else if (type == AVMEDIA_TYPE_AUDIO) + count = AV_SAMPLE_FMT_NB; + else + return NULL; + + ret = av_mallocz(sizeof(*ret)); + if (!ret) + return NULL; + + ret->nb_formats = count; + ret->formats = av_malloc_array(count, sizeof(*ret->formats)); + if (!ret->formats) { + av_free(ret); + return NULL; } + for (i = 0; i < count; i++) + ret->formats[i] = i; + return ret; } -- 2.24.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".