From patchwork Tue Apr 6 05:40:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 26774 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 AE5DC44A9DD for ; Tue, 6 Apr 2021 08:41:02 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 857AF68A48F; Tue, 6 Apr 2021 08:41:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075061.outbound.protection.outlook.com [40.92.75.61]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0DA9B68A581 for ; Tue, 6 Apr 2021 08:41:00 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QBBD8zXAzQiPtOWsGEPBpysXunN/SaJyBmpKNPp3wwlcg3xTJ93AQ7j78zzoIsBvSHVeMVLUYGdZKQObQ7vV9OWhjQFLkc8umZSdlsSf7tOboMzm5rsRJFfw8m7k4JxFyfEEX/15byYWp/YbQ6jz1oxu14WJvnH598HIUPYYLwMSEdhn0cbLzQOiOg29408wQ0EcYVGsgrMooyd5boExjfDjpw0YJgKE7xUfyKY+jtFFMlGuYTGXpsOqLjOG6DAEIWE/wTn14idpA8sabllxsqiUm3k8frYu1cal8h+czVF8vTtsHByzC7VUAnBjfQXI8JHwMMKq2IXiiAXtOFmfNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kZdOHIc5sxcRzy9y9qMOAmjWzyaijjdb9ZgnRjrWty8=; b=bYZwWNmMkXG5o9wUN7M91tlhhl69PPOjlw8Xz8YlWmwYlc02ND+Y0yiiXPVIVXdUDrQZQ3y2KoSEYIOdOXdLXBX/WB0fyxvfEZCf9/08TfMs/ZXERLCnBW0QBVSlfHtai2NjiI/qxazKNlh/EaX78FAecoiGGeyfe1M+jxR/oEh8t6NpDZGdWwdwkFj1IZ+QGEQOO4vRbzSg5VEJs0qsPsGWLFqyaLXThJqqS6SI0kpLaLOa7p/EGRT9AU8zdBlTm+IbInQ0TnbNrAK3KaZWeRy82V4pAmwQKG06IO/IcnZxJxG89HGzX40RXdL0HbeeshaoUmQRzpk8nR1yonaTtA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kZdOHIc5sxcRzy9y9qMOAmjWzyaijjdb9ZgnRjrWty8=; b=AGpCY6+W6cH58/jzeErhp/TmT8AJFeLzPNZ0unU8EGL++XW333rgdV/9D4YKv57lKBd0NhJO9TaFVvnxZIlvEMAju5SPKK5c6CpTYkTuag3qcvzlRo0j6+fAaFYQ16yzjzg8R9y/2bwwds89nqTcwAlFm4wWMGdLcHf+hoI8anp/vSj0NRSGyrEpT02udw3VYGXz36u5bMzxeaWz9ciwjau9l07eAfeMqg9dd0FFD9O0bhcAAWhaCW9ABcNCNl4kBZqDGDzd4+vNcmmZ0RXCPgHYMPnpDju3qDaK8psys36/SfBcI/t5jt82JszwBbFsANn8Soe4Ahs6ZmXIHLjZoA== Received: from HE1EUR04FT014.eop-eur04.prod.protection.outlook.com (2a01:111:e400:7e0d::43) by HE1EUR04HT065.eop-eur04.prod.protection.outlook.com (2a01:111:e400:7e0d::333) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.28; Tue, 6 Apr 2021 05:40:56 +0000 Received: from HE1PR0301MB2154.eurprd03.prod.outlook.com (2a01:111:e400:7e0d::48) by HE1EUR04FT014.mail.protection.outlook.com (2a01:111:e400:7e0d::164) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.28 via Frontend Transport; Tue, 6 Apr 2021 05:40:56 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:35613D13F7779196AB917E0C63D78487CBF4A26EABFE07393EA1FC6C7A727C2F; UpperCasedChecksum:5CC757A69C14071A052E4A559A0F37F9AA8E7167E28E75F77AA49B894725CCDF; SizeAsReceived:7601; Count:48 Received: from HE1PR0301MB2154.eurprd03.prod.outlook.com ([fe80::8128:5de5:4e94:9a21]) by HE1PR0301MB2154.eurprd03.prod.outlook.com ([fe80::8128:5de5:4e94:9a21%3]) with mapi id 15.20.3999.032; Tue, 6 Apr 2021 05:40:56 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Apr 2021 07:40:14 +0200 Message-ID: X-Mailer: git-send-email 2.27.0 In-Reply-To: References: X-TMN: [miAI3WMgG/wrqM0FP4WJKla/oo+exDEa] X-ClientProxiedBy: AM0PR03CA0024.eurprd03.prod.outlook.com (2603:10a6:208:14::37) To HE1PR0301MB2154.eurprd03.prod.outlook.com (2603:10a6:3:2a::22) X-Microsoft-Original-Message-ID: <20210406054016.452174-6-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.137.96) by AM0PR03CA0024.eurprd03.prod.outlook.com (2603:10a6:208:14::37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3999.28 via Frontend Transport; Tue, 6 Apr 2021 05:40:55 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 48 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 752224b1-840e-404d-f9a4-08d8f8be8c9f X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNVIvygFamH8o7OZElNfARO0AjSDqvxkzvqRpYscltPJ5poDzAQVe5PwErlvpGjxopUYdpvLX3ykohLNcyN8ei9cxLZ5bbMlCcPc0BsKi1RU/MnUnwScubA5E2HW0n8Aa1M1RL/q2zBIjmiRI2PTRw60ggF3HvhG4tEFYpxpcYxFsfMFUgRXX88n3cfd3UbBanQ5boMqmArswNIBBumaQC9a9C0NiBHjNo8A25UOyjnC5Bnp/K9peQkUibEB67aNSX02SZBVMR/bxi2uap01e7d+cZX4kK2zwpsfgqxgecIa5pFDEPOBbrF80b7rWFUM4GquVYDq/oLMzucBp3rq/x5j2np+6n9W6pSK7jOFk1C1ZZ8xTuZ6EW47ArPIh20YC4mK6ZMgJ/mHiDrDFINXNYINSV9bRzNqjFFqg0fvWe2Xg6qezDmtuCemEWacYNBanxWLWig6nhfc8zm+L0aNB+LhFNP8essujGgQL14qwHvgiAO5Oc4TARP9y0cOX7rwM2m5iPt2ZOFMaiiJvuYtXoOx+fJpXtbjE6ECAUOmBEkyy9kJfHSKtCtjhKzfOTIA2ftGaHqAYR46h2gRBM2kbbG5vVuC05W9d3th4a21PDZTylDhMXn8ZuVANdNKIPXELtL3teUF45dhfzun4f/dUBxQkkScpAiomb1H0E/aWqtx0Qy4Z+Qlt6WLJzJbXWgARiKFj5jsvmBLE4C3z0IojVqv2Hh2p/V3b1Y= X-MS-TrafficTypeDiagnostic: HE1EUR04HT065: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: TDbIi/mEs8Lp+zJT7H2GbGtpXhhj8u4D2xg06yjFu8/AltuWxUpdFjuVjYn9AMU73/QhAGgNa5zQdpRT+dXisNLw9ZMz1fiGtlDf65V+FpdTrWc6lYlA7XqJWe3Qw8n6tWE6cwP7RT+4FkrEL6A2Vw1a1/JSGuWnNBWnEP4dznL9mii5NFkM5mB14hETISt3IrMfhqvfSLipuD7K98J70Ag6OR5YsirvspKitueQxnMDs+1/yIFqWSIhryUx+wve4Ig4yKfbBi5M8IXB7v6syVFp1dwK++Wo/ZYD7SnTXsiSFBtA9Yj34KdQVIeaYMob9wWDQl+zQmGPMe3nqrm20FjCVF1z0sUcqZWRb78zUdE7GJBJ0uPDMBNiW8MEzIdY8p9w0dKQZtidHr0VgO7xOA== X-MS-Exchange-AntiSpam-MessageData: tJ5/IwGXdffc957fENymvhASecmkuFz/pUJkBLSmScWNTswn9rgZtVuuRIWKX7tuP+FRPD4qWF3P2bS69HdtSuP8YjiqoobW1A1yJlJ22UsMc8eVME8grU6jJA0eZxm/dPJhoVaIZ5cvu9elHqgPuQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 752224b1-840e-404d-f9a4-08d8f8be8c9f X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2021 05:40:56.1773 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: HE1EUR04FT014.eop-eur04.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1EUR04HT065 Subject: [FFmpeg-devel] [PATCH 7/9] fftools/ffmpeg_filter: Avoid allocations when configuring output filters 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Use an AVBPrint to handle the (typically short) strings involved here. Signed-off-by: Andreas Rheinhardt --- fftools/ffmpeg_filter.c | 99 +++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 58 deletions(-) diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 5c44b75eff..61ca793058 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -127,45 +127,39 @@ static char *choose_pix_fmts(OutputFilter *ofilter) return NULL; } -/* Define a function for building a string containing a list of - * allowed formats. */ -#define DEF_CHOOSE_FORMAT(suffix, type, var, supported_list, none, get_name) \ -static char *choose_ ## suffix (OutputFilter *ofilter) \ +/* Define a function for appending a list of allowed formats + * to an AVBPrint. If nonempty, the list will have a header. */ +#define DEF_CHOOSE_FORMAT(name, type, var, supported_list, none, printf_format, get_name) \ +static void choose_ ## name (OutputFilter *ofilter, AVBPrint *bprint) \ { \ + if (ofilter->var == none && !ofilter->supported_list) \ + return; \ + av_bprintf(bprint, #name "="); \ if (ofilter->var != none) { \ - get_name(ofilter->var); \ - return av_strdup(name); \ - } else if (ofilter->supported_list) { \ + av_bprintf(bprint, printf_format, get_name(ofilter->var)); \ + } else { \ const type *p; \ - AVIOContext *s = NULL; \ - uint8_t *ret; \ - int len; \ - \ - if (avio_open_dyn_buf(&s) < 0) \ - exit_program(1); \ \ for (p = ofilter->supported_list; *p != none; p++) { \ - get_name(*p); \ - avio_printf(s, "%s|", name); \ + av_bprintf(bprint, printf_format "|", get_name(*p)); \ } \ - len = avio_close_dyn_buf(s, &ret); \ - ret[len - 1] = 0; \ - return ret; \ - } else \ - return NULL; \ + if (bprint->len > 0) \ + bprint->str[--bprint->len] = '\0'; \ + } \ + av_bprint_chars(bprint, ':', 1); \ } //DEF_CHOOSE_FORMAT(pix_fmts, enum AVPixelFormat, format, formats, AV_PIX_FMT_NONE, // GET_PIX_FMT_NAME) DEF_CHOOSE_FORMAT(sample_fmts, enum AVSampleFormat, format, formats, - AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME) + AV_SAMPLE_FMT_NONE, "%s", av_get_sample_fmt_name) DEF_CHOOSE_FORMAT(sample_rates, int, sample_rate, sample_rates, 0, - GET_SAMPLE_RATE_NAME) + "%d", ) DEF_CHOOSE_FORMAT(channel_layouts, uint64_t, channel_layout, channel_layouts, 0, - GET_CH_LAYOUT_NAME) + "0x%"PRIx64, ) int init_simple_filtergraph(InputStream *ist, OutputStream *ost) { @@ -525,7 +519,7 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVCodecContext *codec = ost->enc_ctx; AVFilterContext *last_filter = out->filter_ctx; int pad_idx = out->pad_idx; - char *sample_fmts, *sample_rates, *channel_layouts; + AVBPrint args; char name[255]; int ret; @@ -548,65 +542,52 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, avfilter_get_by_name(filter_name), \ filter_name, arg, NULL, fg->graph); \ if (ret < 0) \ - return ret; \ + goto fail; \ \ ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \ if (ret < 0) \ - return ret; \ + goto fail; \ \ last_filter = filt_ctx; \ pad_idx = 0; \ } while (0) + av_bprint_init(&args, 0, AV_BPRINT_SIZE_UNLIMITED); if (ost->audio_channels_mapped) { int i; - AVBPrint pan_buf; - av_bprint_init(&pan_buf, 256, 8192); - av_bprintf(&pan_buf, "0x%"PRIx64, + av_bprintf(&args, "0x%"PRIx64, av_get_default_channel_layout(ost->audio_channels_mapped)); for (i = 0; i < ost->audio_channels_mapped; i++) if (ost->audio_channels_map[i] != -1) - av_bprintf(&pan_buf, "|c%d=c%d", i, ost->audio_channels_map[i]); + av_bprintf(&args, "|c%d=c%d", i, ost->audio_channels_map[i]); - AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str); - av_bprint_finalize(&pan_buf, NULL); + AUTO_INSERT_FILTER("-map_channel", "pan", args.str); + av_bprint_clear(&args); } if (codec->channels && !codec->channel_layout) codec->channel_layout = av_get_default_channel_layout(codec->channels); - sample_fmts = choose_sample_fmts(ofilter); - sample_rates = choose_sample_rates(ofilter); - channel_layouts = choose_channel_layouts(ofilter); - if (sample_fmts || sample_rates || channel_layouts) { + choose_sample_fmts(ofilter, &args); + choose_sample_rates(ofilter, &args); + choose_channel_layouts(ofilter, &args); + if (!av_bprint_is_complete(&args)) { + ret = AVERROR(ENOMEM); + goto fail; + } + if (args.len) { AVFilterContext *format; - char args[256]; - args[0] = 0; - - if (sample_fmts) - av_strlcatf(args, sizeof(args), "sample_fmts=%s:", - sample_fmts); - if (sample_rates) - av_strlcatf(args, sizeof(args), "sample_rates=%s:", - sample_rates); - if (channel_layouts) - av_strlcatf(args, sizeof(args), "channel_layouts=%s:", - channel_layouts); - - av_freep(&sample_fmts); - av_freep(&sample_rates); - av_freep(&channel_layouts); snprintf(name, sizeof(name), "format_out_%d_%d", ost->file_index, ost->index); ret = avfilter_graph_create_filter(&format, avfilter_get_by_name("aformat"), - name, args, NULL, fg->graph); + name, args.str, NULL, fg->graph); if (ret < 0) - return ret; + goto fail; ret = avfilter_link(last_filter, pad_idx, format, 0); if (ret < 0) - return ret; + goto fail; last_filter = format; pad_idx = 0; @@ -631,12 +612,14 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, ret = insert_trim(of->start_time, of->recording_time, &last_filter, &pad_idx, name); if (ret < 0) - return ret; + goto fail; if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0) - return ret; + goto fail; +fail: + av_bprint_finalize(&args, NULL); - return 0; + return ret; } static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter,