[FFmpeg-devel] [PATCH] avfilter/formats: optimize ff_all_formats

Zhao Zhili quinkblack at foxmail.com
Fri Dec 6 19:00:56 EET 2019


This is a micro-optimization. Saving almost 200 relocations makes it
worth a try.
---
Can lavf depends on the sequential properties of AVPixelFormat and
AVSampleFormat? Or should limited to pixdesc.h/samplefmt.h API?

 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





More information about the ffmpeg-devel mailing list