From patchwork Tue Mar 15 20:06:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34778 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:3486:0:0:0:0 with SMTP id ek6csp3315893nkb; Tue, 15 Mar 2022 13:09:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzz8pgQtovdoj9JshuX1n8glnUdLQrY3cweZNwElXcK+bhynqPTkbrLBANhDwPFQU3BuuDC X-Received: by 2002:aa7:d80f:0:b0:410:d5c3:f770 with SMTP id v15-20020aa7d80f000000b00410d5c3f770mr26710001edq.279.1647374990469; Tue, 15 Mar 2022 13:09:50 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j4-20020aa7c344000000b0041613a3fc5bsi21042edr.342.2022.03.15.13.09.49; Tue, 15 Mar 2022 13:09:50 -0700 (PDT) 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=Ezy+Wknu; 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 A32D668AF85; Tue, 15 Mar 2022 22:06:54 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-oln040092065021.outbound.protection.outlook.com [40.92.65.21]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2F4A168B195 for ; Tue, 15 Mar 2022 22:06:50 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GUshEB3QnzDG3KggVeIyLj6Iyz1BHIByGKi8yzw8sqVj5ABEmFl9DzXZdhC9B/5DIVFSlgMNA900DmRbFerPWrhVR8LBSjWssuMWa7BwXkNtRSeKzWn9cyldahMngnI3LUbIfOv5TmtnLWKme7s8LJN/rk5qUb5s1vfpHCfm6275RJiWYLyj75rjeepgXlYbgJsBQ2ESQbfpYME9Tk6Suoxn00CqP+LQJO5biclC7sN4APuPdw0LLkryflEtrZfm4zpc5UYegjSiDqpRQ8dHqc6OBve4tfFGwqyIKkdq4zH694spFfKoDD5Uu0N4Qcai8+DmkJRfw9LwBYM1MltCyg== 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=fIFg+8SxTU37S0g23h3VWH1iXoX7zPcNJPSgVAoU90c=; b=NLZHJ46GsmAGxv4O1YIZL0eT39VBEb6HluIQOQkv3N4KzMKcqBJge25vosKbvDxjgppb/1JpYi+6CIUz9onYVWcIjeg+aS3OlKrS0vxpBbIn7BfKyzwNxuwbb3RtcjfvUgQeOOel7xwWBgwvL+puQ2hNqlarlidChLpWH8jsgIdynimr0c1WRsY20TMIGE83bSiHFa3SxjPqD0hTacabPP9lesiF1CLH1HoyZzCl7NXa16+AdCaZM3jQuCKuSYc7nV5kEoqF4g62wPisLJLLZUEJj/XTIh4O4OXv7OozqPWKNPJ9QvyAS10ecfxrbDMDgyS2UojG0e2D8gwgUh43uQ== 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=fIFg+8SxTU37S0g23h3VWH1iXoX7zPcNJPSgVAoU90c=; b=Ezy+WknuQ/j3NdNiO9E7TbseTzAUA7vrl90TaT9xrO2orfNEKJpA5Ic4YmcVbTn8jGirobc1DbaQK/tUwIhdgLqWjt9owih3Sf25GVMZ1/AaY+VYiWbL9Io/Di/EE3tlHyyI6+NZPDL68GxEVNoUwsrE0WO/We+7QcPIzVXKASRFtTTpTkaOjophGECl1OKuLRMbt+82008sTx1wKd+JGQu+z7Vbbjwt2IrsiZXmgOS3T38TaCKIND1Uw4sHoT+FzjWnv27r6z4J9PPwLGVqNxDZ6w3YyijAGpZiuxmbBKFfZgOQ7Cql7S6/J/C+xI75WnwZWj4D1V3vXSwaLYqy9w== Received: from AS1PR01MB9564.eurprd01.prod.exchangelabs.com (2603:10a6:20b:4d1::16) by PR3PR01MB7035.eurprd01.prod.exchangelabs.com (2603:10a6:102:7b::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5081.14; Tue, 15 Mar 2022 20:06:49 +0000 Received: from AS1PR01MB9564.eurprd01.prod.exchangelabs.com ([fe80::9070:a5fd:e532:bdf8]) by AS1PR01MB9564.eurprd01.prod.exchangelabs.com ([fe80::9070:a5fd:e532:bdf8%4]) with mapi id 15.20.5061.028; Tue, 15 Mar 2022 20:06:49 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 15 Mar 2022 21:06:11 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [eDyPM5drsH68VQ6gulz4OydFJEm0Yvz9] X-ClientProxiedBy: AM5PR0202CA0004.eurprd02.prod.outlook.com (2603:10a6:203:69::14) To AS1PR01MB9564.eurprd01.prod.exchangelabs.com (2603:10a6:20b:4d1::16) X-Microsoft-Original-Message-ID: <20220315200611.553534-20-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c8ad1b78-c92b-4632-7ca8-08da06bf56b9 X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNVf+PcTdbcvjaDtfbcUOhIAwHRhtX+/fTg8CG3gRR5ysBzwUSXeq9KmrF0E0hDyHMMOVwhKs7pV4NPSfo61RVk6CQRRWDiOXY1DYtkTdEW4TGsQ9f2Eg5nRm5X0PkKiNw/JO0dHRYPA0EMfZ2LGG66QiR32/V3G/ye6t/8LEGo6JnLSweFYtZImiIL/L5m5YeDpUIeFEflsxBYoEwv7vH5EBl4TVy3Ml8M1I98ytnkc2yxIZA2We5xu03CwfsQzb3j2zpmzG+jqPukmfBEdLgHiTCzUYP21ppCQOfdaO2k3n7pRI3kfrduiMqjE0W6aBd7M8nLxtC+CXZ2n2/A2CO6CvS6IO5rjpLIOgxtMR7GQiBORVA3XZXdhGK1Mf21OKnZkBmOYCDUA13gAjQwNmLqaiz3ygk8RYfB4rpQ/uvvKu5XkR7UMDRQ++7J5uvQMPp7swD8md6cYpJ541p5v/4P8c4PPGC8SmWhqaxY8QcT8PMl/tiXGTQi3MmcZG1+ubK+GfwdcsTD3g9PL2pWJ7d/5rxKZd5ceDje7bputAQgl0uC4Pd7XBUMK1xHiFrZ6d5lDeaWwzDrRs99yMZl8ogS69KmprlS/E/QZwiWLanrWghwDNw2XlZeMaFXoGw/DfcpB6yhYPXE28v7yUo2AI9XyopTrTtt9nqUzG6F8XEW8ceJzv1qAfizVT9PqAa326g36xrQNnjtk2vR00xVmUg4zDntwXV3QFcM= X-MS-TrafficTypeDiagnostic: PR3PR01MB7035:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: StJwahmfEpSb6CA/aTChjuguPxoNHWQbg+MtQXzpS3yUbQHSXTmHyFUegX0jW6ECTlFdDDSpdFIDjrZBReSMxMv1gZT9hsqvMod+TwieuoMV+nabMeXIfe14AdqUSsHKSMqdysH5LLoIldxgbQoDCatSwfJ3+szJJUr+GNWEZwvI7Ex5mGo2TvznIGkiNzdtT8tLdc1kNYvNx1aO5w9XH/A1VHyVZIYcSraa2umAzAOR/D5hC5UE/KFtZaxU15KGVzUI8M5bfDWD44nNH5Nok3NMHdTU4kyp9POZSuQmbCHOIorenuZGYS0FfRYyTPwz/Mh2Og+cH0Ic5NTHqf6Gw4jyBpMlgRqSetkJ/wdQsyluaK2WJEvfg2uf6al7AnNKl9vj5pdMFgA1AYrzm5SheQIM7KzwKWxW3spIrzg9z2wocYaf4onPSScmQZCiY2e7bKkVxOMA7da/WEporfSocYj0RtuxfImBMouRvhM5KNPwnT+47PM29zCKXA70AzXi3yOmBHg4JPs9T7k9aA1KWn1nz2MZWpOXfsocOXcUpBW1YotpWxwW6I5XJCE2WPakzNWQ3rIzspWzT/L4cB7M6w== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: JkCK2nOEC5vg+TNCAsUzdNxJc79XGyr+RSrA0Z+0BzRzD9Wm9e5BQO3jdAka7TOx1aRLFLztxnT/yOW2kUjZWCVJJ3TVZunz45dR8FxSOtRkU0buTP6vFFDfCVmHH0+vKGDkEAqcSokE7nbTIxDzUsOv0rYGZLRnCuBbDOmv3MwHRVKrHmhoOg9YqhDktVdCX4dLF8YVkS+qj0IJFwkqSewXl9Nw3KXbbbphx//nUF8uXpOcS4m2xDlFZCHMQ/6DR2de4CyJvo8UGPpYBQneUQNnAO7mx1ImgYaM1WKooVLEQmk30Yew90+ObkfPW7XeGwQbeyUUfFVHhr4IuO7yxDubUefJv2RVDB2rHLyvH73ApVQCH0RCbQReD42NEfoNsQ3pihTiDdauZmQN2ehc/00DgvrdXXkSPlvl4JPSFKrTS0bRn6k78TwKcBch5sKJ+DVvEyxB7a9oTEIE4sPHlXesnv44pQdDtw99v1Bwjsa/T1ee0zDvU3dE+EXcwwAwzNo+YrJsYv5dqBWasVXpW4Gp2DscEH05ytxStqWdi6TODNcu5lCRwkYKwVpWB/xVbFX4cCQy1qseZKAsmjdnyIcx7YpWt7M6XzaTKT4oIepGOiHTJDp9wXQ2ulBLZ5Jn3q1LTIGwtna9MujQ8DdvZw5WFOko25At5VTXz7tjlyYqTytfFlLTe4fNZ2RkJ+vHT04un19EkFnrrlcAVn5zf8tiCoA+2Nx4Gw0W9vEaU0OnKWdCk9WGCS3SHQYOob+zQe7R+/lX6XL27YpfDw0Lb4u48l0CRe4NIEAdk5LGQMekpDUCU0ky1z3HHZIYz8Wt55Z64DeJ5OM+6gbO1C0tjaTDYDbDpDZu5vtDN+jlbmtIq1ydoPXoYFilCRVbAa35dZAlsq2tDntJ8lfhiwzUzpmCDPjSN7qXKPRcyo2MDEJ10C72lvAhocOpf1EYoHLp4chy+oUtprot4N/Npia7CU+qqcSNBaFIVM7Cf5ySbHas6DS3VrFAGnZbJ9uV40Fe7JkwnfSHvxICmIV6wZBs5WmwwgNTQDbNn6QcEyriADghvJq5iFu7G0Pg7a4KoZPAFaSh+l/nNKU0nkOeNgZqoQ2hEsIQqFpY4IRiDFYNuMxJFiXysAjv3CB15ULwWBiRzEfH/hw8s2ZzBrQiGIncZ5J1veAElWhto/RIWSi2axc= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c8ad1b78-c92b-4632-7ca8-08da06bf56b9 X-MS-Exchange-CrossTenant-AuthSource: AS1PR01MB9564.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Mar 2022 20:06:49.1738 (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: PR3PR01MB7035 Subject: [FFmpeg-devel] [PATCH 21/21] avcodec/flashsv2enc: Avoid opening and closing z_stream 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: 21hBPSporEo3 Instead initialize a z_stream during init and reset it when needed. Signed-off-by: Andreas Rheinhardt --- configure | 2 +- libavcodec/flashsv2enc.c | 70 +++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/configure b/configure index ee3c6783f3..b175019a61 100755 --- a/configure +++ b/configure @@ -2812,7 +2812,7 @@ fic_decoder_select="golomb" flac_decoder_select="flacdsp" flac_encoder_select="bswapdsp flacdsp lpc" flashsv2_decoder_select="inflate_wrapper" -flashsv2_encoder_deps="zlib" +flashsv2_encoder_select="deflate_wrapper" flashsv_decoder_select="inflate_wrapper" flashsv_encoder_deps="zlib" flv_decoder_select="h263_decoder" diff --git a/libavcodec/flashsv2enc.c b/libavcodec/flashsv2enc.c index 56ea0ed0a4..9b8a891ae4 100644 --- a/libavcodec/flashsv2enc.c +++ b/libavcodec/flashsv2enc.c @@ -52,6 +52,7 @@ #include "internal.h" #include "put_bits.h" #include "bytestream.h" +#include "zlib_wrapper.h" #define HAS_IFRAME_IMAGE 0x02 #define HAS_PALLET_INFO 0x01 @@ -112,6 +113,7 @@ typedef struct FlashSV2Context { uint8_t use_custom_palette; uint8_t palette_type; ///< 0=>default, 1=>custom - changed when palette regenerated. Palette palette; + FFZStream zstream; #ifndef FLASHSV2_DUMB double tot_blocks; ///< blocks encoded since last keyframe double diff_blocks; ///< blocks that were different since last keyframe @@ -136,6 +138,7 @@ static av_cold void cleanup(FlashSV2Context * s) av_freep(&s->frame_blocks); av_freep(&s->key_blocks); + ff_deflate_end(&s->zstream); } static void init_blocks(FlashSV2Context * s, Block * blocks, @@ -234,7 +237,9 @@ static av_cold int flashsv2_encode_init(AVCodecContext * avctx) if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0) return ret; - + ret = ff_deflate_init(&s->zstream, s->comp, avctx); + if (ret < 0) + return ret; s->last_key_frame = 0; s->image_width = avctx->width; @@ -357,41 +362,47 @@ static int write_block(Block * b, uint8_t * buf, int buf_size) return buf_pos; } -static int encode_zlib(Block * b, uint8_t * buf, unsigned long *buf_size, int comp) +static int encode_zlib(Block *b, uint8_t *buf, unsigned long *buf_size, + z_stream *zstream) { - int res = compress2(buf, buf_size, b->sl_begin, b->sl_end - b->sl_begin, comp); - return res == Z_OK ? 0 : -1; + int res; + + if (deflateReset(zstream) != Z_OK) + return AVERROR_EXTERNAL; + zstream->next_out = buf; + zstream->avail_out = *buf_size; + zstream->next_in = b->sl_begin; + zstream->avail_in = b->sl_end - b->sl_begin; + res = deflate(zstream, Z_FINISH); + if (res != Z_STREAM_END) + return AVERROR_EXTERNAL; + *buf_size -= zstream->avail_out; + return 0; } static int encode_zlibprime(Block * b, Block * prime, uint8_t * buf, - int *buf_size, int comp) + int *buf_size, z_stream *zstream) { - z_stream s; int res; - s.zalloc = NULL; - s.zfree = NULL; - s.opaque = NULL; - res = deflateInit(&s, comp); - if (res < 0) - return -1; - s.next_in = prime->enc; - s.avail_in = prime->enc_size; - while (s.avail_in > 0) { - s.next_out = buf; - s.avail_out = *buf_size; - res = deflate(&s, Z_SYNC_FLUSH); + if (deflateReset(zstream) != Z_OK) + return AVERROR_EXTERNAL; + zstream->next_in = prime->enc; + zstream->avail_in = prime->enc_size; + while (zstream->avail_in > 0) { + zstream->next_out = buf; + zstream->avail_out = *buf_size; + res = deflate(zstream, Z_SYNC_FLUSH); if (res < 0) return -1; } - s.next_in = b->sl_begin; - s.avail_in = b->sl_end - b->sl_begin; - s.next_out = buf; - s.avail_out = *buf_size; - res = deflate(&s, Z_FINISH); - deflateEnd(&s); - *buf_size -= s.avail_out; + zstream->next_in = b->sl_begin; + zstream->avail_in = b->sl_end - b->sl_begin; + zstream->next_out = buf; + zstream->avail_out = *buf_size; + res = deflate(zstream, Z_FINISH); + *buf_size -= zstream->avail_out; if (res != Z_STREAM_END) return -1; return 0; @@ -559,7 +570,7 @@ static int encode_15_7(Palette * palette, Block * b, const uint8_t * src, } static int encode_block(FlashSV2Context *s, Palette * palette, Block * b, - Block * prev, const uint8_t * src, int stride, int comp, + Block *prev, const uint8_t *src, int stride, int dist, int keyframe) { unsigned buf_size = b->width * b->height * 6; @@ -574,12 +585,12 @@ static int encode_block(FlashSV2Context *s, Palette * palette, Block * b, if (b->len > 0) { b->data_size = buf_size; - res = encode_zlib(b, b->data, &b->data_size, comp); + res = encode_zlib(b, b->data, &b->data_size, &s->zstream.zstream); if (res) return res; if (!keyframe) { - res = encode_zlibprime(b, prev, buf, &buf_size, comp); + res = encode_zlibprime(b, prev, buf, &buf_size, &s->zstream.zstream); if (res) return res; @@ -656,7 +667,8 @@ static int encode_all_blocks(FlashSV2Context * s, int keyframe) b->flags |= HAS_DIFF_BLOCKS; } data = s->current_frame + s->image_width * 3 * s->block_height * row + s->block_width * col * 3; - res = encode_block(s, &s->palette, b, prev, data, s->image_width * 3, s->comp, s->dist, keyframe); + res = encode_block(s, &s->palette, b, prev, data, + s->image_width * 3, s->dist, keyframe); #ifndef FLASHSV2_DUMB if (b->dirty) s->diff_blocks++;