From patchwork Fri Jan 3 14:25:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 17171 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 530C0449244 for ; Fri, 3 Jan 2020 16:26:42 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2E88B68A4D4; Fri, 3 Jan 2020 16:26:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpbgeu1.qq.com (smtpbgeu1.qq.com [52.59.177.22]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D2E1568A2B9 for ; Fri, 3 Jan 2020 16:26:34 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1578061530; bh=RXNtu+Zpwc8L+8HBRPPx86+dV6T0aIJRAn/q6Lklhx0=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=bZqPakIa6kwmbyBBVoTnpbX9/aL8eaN7fATfYbHFBLkB3hr4JYlQAXxKbIB9XOtki GSgem5qp/nOlrT30IgzZ8zpqxcx/vcjGvz1Nus+WmCkaB4JzWtzwWYGE0HhV/PIxa2 RjKMg7f9xk8VTCB6pAu5fZZkR1JIN1n6vV03J6Og= X-QQ-mid: esmtp2t1578061529tp6w0o0xc Received: from ZHILIZHAO-MB1.tencent.com (unknown [14.17.22.54]) by esmtp4.qq.com (ESMTP) with id ; Fri, 03 Jan 2020 22:25:28 +0800 (CST) X-QQ-SSF: 01000000000000N0WH4000000000002 X-QQ-FEAT: ecaYsCPUlpvBMCi9wd74rN+sDsMu9Jp46dRuiGXONPIVzTT9JmlREe8NipKcR 0uTy0MH/1OXSlB+ug68Q4kqJRSCOswzSVSqEjqdGAt6njgwghVz/WXmhwo1wQW34wiAYTJF Uc7WTJ/huU4fJgNy+8hgOuHfJulbOniuxXSbCUyE7LrlkjG7jTsm3yqTVTQZ1yc8VeUFhKX LIpqBrRvLHgnOkYiOEoTS1/FtC2LtAwMdYTvKOJY4HeMPAtoPZ/z52CUishaARH2rrCWM4d 3pqaGZjo1d0wfPyJeD9HZNauHiq8tQv2R3OA== X-QQ-GoodBg: 0 From: quinkblack@foxmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 3 Jan 2020 22:25:21 +0800 Message-Id: <20200103142521.37264-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.22.0 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: esmtp:foxmail.com:bgforeign:bgforeign12 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [PATCH v2] avfilter/formats: optimize ff_all_formats X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Zhao Zhili This is a micro-optimization. Saving almost 200 reallocations makes it worth a try. --- libavfilter/formats.c | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/libavfilter/formats.c b/libavfilter/formats.c index 33c64668a0..c04253d898 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -348,21 +348,48 @@ int ff_add_channel_layout(AVFilterChannelLayouts **l, uint64_t channel_layout) AVFilterFormats *ff_all_formats(enum AVMediaType type) { - AVFilterFormats *ret = NULL; + int count, i; + AVFilterFormats *ret = av_mallocz(sizeof(*ret)); + + if (!ret) + return NULL; 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; + + count = 0; + while ((desc = av_pix_fmt_desc_next(desc))) + count++; + + ret->formats = av_malloc_array(count, sizeof(*ret->formats)); + if (!ret->formats) { + av_free(ret); + return NULL; + } + ret->nb_formats = count; + + for (i = 0, desc = NULL; i < count; i++) { + desc = av_pix_fmt_desc_next(desc); + ret->formats[i] = av_pix_fmt_desc_get_id(desc); } } 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++; + + count = 0; + while (av_get_sample_fmt_name(fmt)) + count++; + + ret->formats = av_malloc_array(count, sizeof(*ret->formats)); + if (!ret->formats) { + av_free(ret); + return NULL; } + ret->nb_formats = count; + + for (fmt = 0; fmt < count; fmt++) + ret->formats[fmt] = fmt; + } else { + av_freep(&ret); } return ret;