From patchwork Fri Nov 19 16:43:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 31504 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:d206:0:0:0:0:0 with SMTP id q6csp2657163iob; Fri, 19 Nov 2021 08:43:51 -0800 (PST) X-Google-Smtp-Source: ABdhPJxGQVhVJT12rmgP1ii7wjnIZ59TrNbIyst56bHyAVI9CVIWwutPwe0t1Wu4Ty4EoPJp0Q1L X-Received: by 2002:a05:6402:2079:: with SMTP id bd25mr26905419edb.116.1637340231667; Fri, 19 Nov 2021 08:43:51 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s22si434962ejy.151.2021.11.19.08.43.50; Fri, 19 Nov 2021 08:43:51 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=oPD0Ukje; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6BAA868AA67; Fri, 19 Nov 2021 18:43:47 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073045.outbound.protection.outlook.com [40.92.73.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 20CDF68A940 for ; Fri, 19 Nov 2021 18:43:40 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bug0O/mC7vvQUifnlt4+bMdwj9kbYdKBPPiX9rClg4hresi7jPlA5igwiDJAO3ha4sEYZJb88uQeSLLLY+bEMz7b+uMuq52MqS94mhhqyJO/9Vg9UfrVZ3I+EOZW9N5lUdY4FsHsMV2b1NuYG4OyVK2lqe7/jYt0hu14h8tx4TjHE+jSH/RdQTtuB2FyZWsre4L5bj/VQDKOPC9jd9m79n9GzAai/Fw71jTpnfuVic2ddVydT7loN5Vana1WVjqp24MT+ZhNxX2nxHqNY8ClzxZwtQB/zSOb/li4E5f/h8J1Tyb+1y26J0dQx0IaQA1Z1p+i1JqQNryAsmC+dlJvaA== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qI65RJVYCQzNzFEmeXPx5iDW7qkp7LisOKJNIHGgu64=; b=jxG4IeDSUy+vhyFXB4tB9G5oo9vwqLGiY7KQNjAiv2VkJBSMjKdAp2t5uiAgIB66Z1aT5fV8lmm9JcaAvq6fGuUAyraFh4p1hlqahqhrt/WeaAbJ29XMEf3uT1evlYk6uOtm+4p3QqsIjTrf3hft1fVD+3KqaFnAVXBCW8sXjm15y61kY8s5BxvJUyOqnp1y4C0sRCntvzPJzf8f4FnVImZHQIgrznsprmX618bJU22VZk2tOB/SJzr1vO+ZkFhL0xrdAL5KmEI7JWL6m+nR3SslqPzqj1mL5KTvrUTN8110J/cc21zKU5/2PeiVfG0m3Oa6ILlOQzFetJgHZpnz1w== 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=qI65RJVYCQzNzFEmeXPx5iDW7qkp7LisOKJNIHGgu64=; b=oPD0UkjeR+rG/guE9PYGiWJf+mUnSMV3dr/5zM02ty2k/L1C1YJEY+RJWLVBr7aQAVMgRjrs5kpWtowySGjTwkT1pmfS0INS8a/iAdu4DcY56ib0SLvcMxie67Hzuv0GtmEfZX/jP/1JtF6SkWIL63S0Ty6jp4PWdqICRZ3eu2PdUUiQi/AOuXYJtE4fbY9zhMlTxAIAbRy+9mMp7e38g25Hin3+60arP88jAkW6nzuKMhJDL6njdgkyFqTzCVD7hSe5XStfPtSPs2Xkod4NmBj6C7CxN5jcSb19ZrmOoD25pIf624SsOWyEQvLfVYIo19u49hfLjPgdBd3eAtCeXA== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB4774.eurprd03.prod.outlook.com (2603:10a6:20b:e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4713.19; Fri, 19 Nov 2021 16:43:38 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::700f:d70b:3bb8:4d51]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::700f:d70b:3bb8:4d51%9]) with mapi id 15.20.4713.022; Fri, 19 Nov 2021 16:43:38 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Nov 2021 17:43:29 +0100 Message-ID: X-Mailer: git-send-email 2.30.2 X-TMN: [bs9ipBjxO1pgWXAPN7h7raGGzXfBrsq2] X-ClientProxiedBy: AM3PR05CA0125.eurprd05.prod.outlook.com (2603:10a6:207:2::27) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20211119164329.639932-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.137.12) by AM3PR05CA0125.eurprd05.prod.outlook.com (2603:10a6:207:2::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4713.22 via Frontend Transport; Fri, 19 Nov 2021 16:43:37 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c8f7723c-2d58-4d28-0bbd-08d9ab7bbc61 X-MS-Exchange-SLBlob-MailProps: f36zkjAOy3V7gDvsffph3MQ3vtznjHN92XcMR5WfYJgCko3QXWpqHUatSZroFWsZknkIVM1fA/DUdrIYR591bllPT5Urf9R7k598QxBCLnPS9yG9PEAReKKensHCVsy5i2yhnD4NEvBrcaLkAcWg2d+bBbPceZSWVAfDcj9x6WEvuxxDDnlsZW1vKCI5b3y0W2tfRiKbE4c+mUIIE+4qZgcDYjHY2VCwHFwiNVaPAJ4ri/LlMibXe15Fhf4MhmFMYuZdhC+0f0fHvN+Ez1UGXBkk25Af7ERkGzoWTkBr60p/ymBY4pEHaeuQSFjrxMmAT0qJHuFVl8QNLVD4u9wc1jrmcGt4eBSU/dDT9eTX8cE6TXnHZ74WW1Zws+7YsuubINr/nAnVk/2vrUdRiEA4c6Zj9K0M8c3dK1TTHR98QH6/eaIPh6zjwEaCTI0ziEIYvQ1tJcsykxta7CkV1ReuhCyLsstupeNmHcT3mC9Kdyr8yPSLJnDStxteKlcW8hXQ9+s7yaXVplF9xyD7jRxBuemafzeSaa1jLVkvFCKD/hvOID7Fsu95aRuYtjfRMqftJx3fakYrhkFKX2vZ00s4EkyS6E1zGQlXf3iDBW+xD4pl//YVoRiG/HmG5xM7Jpg50iIqjdOEAg9/MXQF65lXPhhpi2I7P4K9IHZk47wi4fTqazNu7+6FtppYHbnkXdho3HDSdf5lO9q6loEfhfV5SGMRBMBZoRijuWIx7GQwWI0= X-MS-TrafficTypeDiagnostic: AM6PR03MB4774: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: xqdwfHbrLCrjEYODir2r74CMjrtd4L0WHKgGLmc2iOfdblroINMGg8c3shBHXtTh5yhJqUXqePI+8Km4bbu6oA/YnzqY5nI9rUGloh5L2ctJuo8EQiO2ZEMi0yQq8ImDB0FKpDXMTQm9BJrO9l++l01JUiEjCTvXZ7ONn1Q4qv40LXjrOBk5r0zXyF9ylVWih4fibvM4p8dJfvePdjN2uYElMmM/7d0mPBv2L3UQVFQF5jnb14S7SaACIPsM6mrvYF/wcQY+2cMFFAGSYhlw+Yic0AnFLPdg8e0cwGMZvZLjL4V3taJAQY0BHeU/PxY1OXuCbPaUtKdXjTSmmGcTV5/OCTR17NVAnryM724Idb7lHbDyxA2/kkgwkZrqHTzELxHEtYozRM1tyHxH+LtgMzY5I2MH4fdY3m140VbD0+fVPpP2+4oftS5Zlz5RVUymy8TioD1BIjZbwg6oI0n7NYNvGukbAQ3bizcLjx1b4D7/kA41oV8klx2AutxsT6hvHWn9+njYrSebyJVHf0EEvanxcpRmmaOVaHZcRsCOF7Xp4+hO9dIGtXfV4QB4lYd/3v0zrw0ZI56DWXOzv17Esg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hGAZ3nxu5PAysWmyOe+WsWzVJrLR+tqlDX7mjHL+bLxtWMRLBIhQpAcxmzK89hg3wQokSs4uWMI2xljwzuGnttMWWv3bN545xa0rDLDCcV00PPw1YWjWi7cGNknpL4T0jSV3MaRUQUWp1oLeWGO7vD7f+GjbPIG/psrWT774sq1kYesjEPZlxNhFcCaF3omIUuAZEMbowKNVp67HzyLTPnu4QV3EjxuL+K1BMvHSRk0ORJ5lLZ/EqkaQheMfI6MGpdwcO9o7YfRua8+djfc9+y06SRxyX55FheN/8/Rf6ADAaVa+qh8RZEb6aoS9pPo8NCtMs3IMWZa2WOuHuHOZaqQe+rx2l4KNTdqh77xDqsnzdbFgwnj/SUjH3mp+7LrNZ2WmdlMaBBNxVsBh1V6pt9gYnib+VOt1QWFHkw2qj/0lucyrSdjwHY7f1OUSJwCb7NVXWFkSSxLonHA5oFTh0jXAHLkZ+Uf4+Ho38Sum1C0oJOH9P3/pPkqeqf/fC0uiscH98L4gwwEdwppR9qp2vVafXv7EK28DBDSFpAfo0sLXY5t7knv4h4iJxcmSCOlrDuL4d1NFzyp05UWkgbOqsul42NbpPVySUvHcdd7IJQnmta94i469G0RCFiCoCunttiQE9cWjlMIFZuV0SUlGnuKWSVXs0oZ8Sm+bFiE2FMyiFcWSht6Bh/3y5g4oChvHLlbWg9qdupaDFuOkaPMHXQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c8f7723c-2d58-4d28-0bbd-08d9ab7bbc61 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Nov 2021 16:43:38.2655 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR03MB4774 Subject: [FFmpeg-devel] [PATCH] fftools/ffmpeg: Avoid temporary frame X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: cdHLOBI8zH7y send_frame_to_filters() sends a frame to all the filters that need said frame; for every filter except the last one this involves creating a reference to the frame, because av_buffersrc_add_frame_flags() by default takes ownership of the supplied references. Yet said function has a flag which changes its behaviour to create a reference itself. This commit uses this flag and stops creating the references itself; this allows to remove the spare AVFrame holding the temporary references; it also avoids unreferencing said frame. Signed-off-by: Andreas Rheinhardt --- fftools/ffmpeg.c | 22 +++++++--------------- fftools/ffmpeg.h | 1 - fftools/ffmpeg_opt.c | 4 ---- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index e88ca554ae..bdbbc23cfd 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -633,7 +633,6 @@ static void ffmpeg_cleanup(int ret) InputStream *ist = input_streams[i]; av_frame_free(&ist->decoded_frame); - av_frame_free(&ist->filter_frame); av_packet_free(&ist->pkt); av_dict_free(&ist->decoder_opts); avsubtitle_free(&ist->prev_sub.subtitle); @@ -2171,7 +2170,7 @@ static int ifilter_has_all_input_formats(FilterGraph *fg) return 1; } -static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) +static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int buffersrc_flags) { FilterGraph *fg = ifilter->graph; AVFrameSideData *sd; @@ -2217,7 +2216,6 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) AVFrame *tmp = av_frame_clone(frame); if (!tmp) return AVERROR(ENOMEM); - av_frame_unref(frame); if (!av_fifo_space(ifilter->frame_queue)) { ret = av_fifo_realloc2(ifilter->frame_queue, 2 * av_fifo_size(ifilter->frame_queue)); @@ -2243,7 +2241,8 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) } } - ret = av_buffersrc_add_frame_flags(ifilter->filter, frame, AV_BUFFERSRC_FLAG_PUSH); + ret = av_buffersrc_add_frame_flags(ifilter->filter, frame, + AV_BUFFERSRC_FLAG_PUSH | buffersrc_flags); if (ret < 0) { if (ret != AVERROR_EOF) av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", av_err2str(ret)); @@ -2306,18 +2305,13 @@ static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacke static int send_frame_to_filters(InputStream *ist, AVFrame *decoded_frame) { int i, ret; - AVFrame *f; av_assert1(ist->nb_filters > 0); /* ensure ret is initialized */ for (i = 0; i < ist->nb_filters; i++) { - if (i < ist->nb_filters - 1) { - f = ist->filter_frame; - ret = av_frame_ref(f, decoded_frame); - if (ret < 0) - break; - } else - f = decoded_frame; - ret = ifilter_send_frame(ist->filters[i], f); + int flags = 0; + if (i < ist->nb_filters - 1) + flags = AV_BUFFERSRC_FLAG_KEEP_REF; + ret = ifilter_send_frame(ist->filters[i], decoded_frame, flags); if (ret == AVERROR_EOF) ret = 0; /* ignore */ if (ret < 0) { @@ -2385,7 +2379,6 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output, ist->nb_samples = decoded_frame->nb_samples; err = send_frame_to_filters(ist, decoded_frame); - av_frame_unref(ist->filter_frame); av_frame_unref(decoded_frame); return err < 0 ? err : ret; } @@ -2511,7 +2504,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ err = send_frame_to_filters(ist, decoded_frame); fail: - av_frame_unref(ist->filter_frame); av_frame_unref(decoded_frame); return err < 0 ? err : ret; } diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 545ff1c8e7..ce790c4d6f 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -311,7 +311,6 @@ typedef struct InputStream { AVCodecContext *dec_ctx; const AVCodec *dec; AVFrame *decoded_frame; - AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */ AVPacket *pkt; int64_t prev_pkt_pts; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 98bd3b47b6..6732a29625 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -893,10 +893,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) if (!ist->decoded_frame) exit_program(1); - ist->filter_frame = av_frame_alloc(); - if (!ist->filter_frame) - exit_program(1); - ist->pkt = av_packet_alloc(); if (!ist->pkt) exit_program(1);