From patchwork Tue Mar 15 20:05:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34766 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:3486:0:0:0:0 with SMTP id ek6csp3313911nkb; Tue, 15 Mar 2022 13:06:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz/f0H99PwIF20MumY8EpBLW9RkWQbv1873RYBC9vOior30pID8V/Cotn2YIU4UCPToveX2 X-Received: by 2002:a05:6402:2915:b0:416:cad2:d619 with SMTP id ee21-20020a056402291500b00416cad2d619mr21864410edb.221.1647374803526; Tue, 15 Mar 2022 13:06:43 -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 n13-20020a05640205cd00b0041649c1b010si26306edx.229.2022.03.15.13.06.28; Tue, 15 Mar 2022 13:06:43 -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=lNUd9YRp; 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 5231E68AB7C; Tue, 15 Mar 2022 22:06:26 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2108.outbound.protection.outlook.com [40.92.90.108]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CC733680488 for ; Tue, 15 Mar 2022 22:06:19 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PqsDfUrmMQQDPXoTO51Z+o48VjoKDe6PzhMR4j7snw5AiVmrNiw7uoumLdTYY9xlgvxJGb1tyChNzX4ehQ+EjyhWvjjFcU2NKBO5wg6PyNu762ijwOkKx1BIFJKYfGWEYqmT01ehkBfsy5QkMkhki1I6868vjornC8sqiT3EmBVQXXMbQIfHaRwpNkwTOPZ5V0GYTkhyjLoojJgh1qExoi5ujIuWEAxqps1CDNqgl15Ag9vxPSsNnG+vneKA/9Z2bSsSy7KAQoyqLC5w0Za3GxvjabxJ6oGvrOI8TwBgP/ghdbYLy7UtC7qJxzDwvtxAy5IJhVh/KttYUEfUM1Zigw== 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=LmrpO6K4npA39Z88LSC05W7CNVKyY9HM643Ws2GnVug=; b=MsyHylGH93ljwv9c+uFNgeKkAjc/sHam9H+lDymgefbVwtGdTADgmI2KOYeL5P+ZPErHz/Bc4bOlL9dxTg4ifbej+Qje6JftZZdU75BOWQxnBU1JkzA5Qlogeet2ArrV9fDoA3D3Q/IR9Hcg1ZRKpr4B6WT+ee7XNAoxMiTPdfZ6/C0sD6iszsSI341JZazUTdFAGaI+3ba3tJb3ObXdaEBewnziZ5JW0fF8AlqjmqT8hU4kpYrsW3/GzJVgBB6jUBeIMCfznPb90PUghfnp58e1S6dEa9ZvBLwidAt4Q8T/u5MOyBmVDVsLzkzonOnjNysgNQM9IJ6nCoWEW6i2mA== 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=LmrpO6K4npA39Z88LSC05W7CNVKyY9HM643Ws2GnVug=; b=lNUd9YRpAPESeWSOIUA5cVc5370x+tdXfGRXj0ABfMe9C3IOw8D5ymTDrR4LYqgGxn8NZAX6Z6yMyqAitGmLH5pSuhECrhm337XBRQlhwGutjo2CzSO8TC0Kto4v41SjVmczM/gB6vfNufXdQ1bA1LLWa63SA1tmAxDtCgPbE4oRom40r/gIdrYF5mfGosx89CqMsS3awH0x/O+ovvZn8TY/44yWq2SQbu3wX7sVSa/CDQcd2JCS0YW+lH9MSCCQXoKUxhWh3GPEjQenvCO8bvpAHiSbiVHR8447smRoMWgGtNjuxVCpgZF440HtlN+jXYV8K/GLYesw4c8U7vjUPw== Received: from AS1PR01MB9564.eurprd01.prod.exchangelabs.com (2603:10a6:20b:4d1::16) by PA4PR01MB8947.eurprd01.prod.exchangelabs.com (2603:10a6:102:2a6::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5061.26; Tue, 15 Mar 2022 20:06:18 +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:18 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 15 Mar 2022 21:05:52 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [Scn2L8bfENXds7XlJLDHYf6ZA7Nfked3] 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-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 11f378a1-beb9-4e59-2426-08da06bf4489 X-MS-Exchange-SLBlob-MailProps: +LiGfBxqLEsJOQSw7m4Q3ZoiL16bWeWcXXNiiCTb5eJas7XcESzWbFCjCUkNMlTRygV8b7ctR3Ri8gPwL/bY6pvJQvk05eFHMobIPlbgpBXvlOBPFka+71WtKuM00pKKd8XiSrXGbI1ZjQWXCcDerWgcTHtbKLB3AAn99+XRKuImIbPUrGSxt+Tbhw0bQtideuWzDVWmsdbQd4QtJ9MOHfAaEGnPSifrdP0kdk9v8GtkGWti9wSZO5cQ4catsZq8PZxowxrbr7wxstIquU6FpM9K16dARSD8sNX9yJKg+q40YsIf9gpgJE+6FwyLGpRtjAhuHe6o4aTCaZguN6LCN+D7jhLjlRgxhqLfz/L1oB7n/GBzJV4tf1Y322TcevtBRTLBBa3EIBQKZVDFh7su92kK/c6ia1AGu0FVU+YPBFcB2LkvLYgfFP9mF/nSdTL4IOD7sa/xbe5uBUV6nTGJDTM/BSF2DXOT8jI1vPYIqzvrCJXYMqIHctxNrar809XVtlFAJH34EJ1nUiGh2xfx3i/mMPI0B4wK2o38ktw+N5bIoq+kSUNYxZX+Zg66uYxIyo/W5kuWNOONBb0i3MlwEUjDv82ZIqp0eyWNvOi8FQ6/DSFu8jIhteCbWQnt4xKC58c8G+63sgrWBQTe34jqoeyIG5bj0ZR2XFDe/EqQMM1kTeb/O2q8v6aAH/UzM1xyDQq+f5j1qX49Tn9iCb/FRZiUwJdzuv77HS7IpPb2rRgfU4VF7Lah6Wkzsx8QJoV+s2MGYnVyUYzIqvmbqZDQo2jxOPr2ti+m X-MS-TrafficTypeDiagnostic: PA4PR01MB8947:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: eJiDd3MMIDRgLdhH5IQieobzTIdgY8uGaFQh0tlMS6jMOFhrdyqzq4aNwd6RE2bcm7qYSH89kG7/6sm4YV7oL8Z/UO2MGuhjC8e9IcsVjlYe6Kb9Vh0/EXasOEu7uQvgh1APsGeK4HP8b4vLY+P5q+ladk1nBUjBsEggMrInViMkRqJgwYcHlwHBlWWN5eFALyWH/WhtaV3LUcIMKxHnl9eaeZ64DV94dyjte0UvCT6cQsRIuWfH7/u7b68FwckaAjmz70B3C4bKunMI5naL9HzG+9gqNio89xO5qJo/enjH2xO+Y0ez/iH5oVP6X/A0QaGJrjahCPxE8ttXxNe6yWTERlxH1AizBfT6+amivXHP4hNKbQn21NjaJZ5UeBbmEuDkfTbZ93x/f4/kXmqgOmIKh1e0SIH6lWqR5qX9uDgoIHmTp5liQB+dkKqTqSdpejW/X3e/cqqYgCbGhv/GdHCaCeUV33KlX5JrC67AhwaAI0LSsfdBNgpa4RjpBmvOes492QiPD0LOSfWosIc5VMqZllD4Dk647z7ofPDrYz6DMhD59aRiMrIL2F61SrBCrgEfmdVKRwnz+VDHg7rA0w== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: BA32275JFCImvTSRvqGxx7I4TSZTJVmfkFpFf6ak1uaWf1jFxRV5AQjCvQu8MGZ/LANwM5mT9iowiZ6w8L4t2nL+VJFoEb8LPk78xu9mvoySFQjDTyRbIrjn6F4HUFj5mnASSUULGNx8ZhZrfn4ik1dQXqZA5ae7Prw0aFrOlYYi79KIpirDZ3vCXwuVZ4GTrA7SXzAEv934muTRGrBcuSM9LEtHmp32tFA8S5CkTdxNAM6FZI6QB28W/t00VW8ccYcUS4hxX0Qv6N+QcS1xCY1OFmQl0UMIjFpUH9ui2qfthcujHcMdwNjiwIDcW4dx6Z6K3GVwQ6F3goN7NKWGDB3qw9RtB/q6OMhMlcXbvt/VWtlwd0kxdF7uKV/+mvFX4KvcB6rHN91/44mZE8Zk5Az+n2RN3qYYXmg86wYEHn8KvRHcDPzIDjjx9vVffLxQb6KagymS4EZ9MiPKCmmwCbyoZH3RjdWna7Wa+tgh9N5bLHdLJN+3hkX6dgWuPGKobhTHR77V5DLbxtRgwml3/KYP4YF3jzMeqBHP9ZiU1RdIDJnlYEZYlPFbpSDUsDW0sBB+ALVZW2s+VFeAVwhp6MUU5Dhv0fe2uZjVGrgs2KVcNAunba2au6Es1g+nsTgr6BzP7rTSbV3615umfnBoCCs87TzPcWHgBCAh7iYe/ZIXNOoVmLBEY8LOvAxlAHIF6RTtoZZ8+4s7ME7Ku5bRvi1ErbbLFYN0LudZOaUlamhfxbKVeMaGcCeWwvjBzi0sY/RQcW0YryhykI45prj4rKZF0hndO+Yc3eijCgPnbqhtmpwTieKDsahsBSHYBK9rsFAxGEONolXuS0j3rEKQInyCRsDUlWC2SrdGtD9/EbnYS88JFoE1/kmSiuxi8KmG4L0N3WcRdXEqrZWTjb8FpQtEbiuUdkXO8G5rG7ZOYjhXTldCgI33btL4WA7WOxRIW/zDc50kzvc1JrqWknngIS1uXGRLXKqA8QIofi48B8gdSoBE9xyblMDRV9eXp7IfYwxBuwODbvIVRSRhz6FhYA5HUt+htvh9zWnyHPMjpNgsG8sUPPMn2cQCUMaeDt12CtGWTnU6cqWG5mx7MlpG8y5bwuqdZxqSB77xSnheOHyi33H6+UbqA7olh+qlTCck1k+1DTO/M3R2r85Y1KPnHcu3LJHhM+nS4E6imSAc+JXsUZ90E5nlGJRTvI43BENO X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 11f378a1-beb9-4e59-2426-08da06bf4489 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:18.7048 (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: PA4PR01MB8947 Subject: [FFmpeg-devel] [PATCH 02/21] avcodec/zlib_wrapper: Add wrappers for zlib inflateInit, inflateEnd 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: /wXP5Xkt5nBP It is not documented to be safe to call inflateEnd() on a z_stream that has never been successfully been initialized by inflateInit(), but just zeroed. It just happens to work and several codecs rely on this (they have FF_CODEC_CAP_INIT_CLEANUP set and even call inflateEnd() when inflateInit() failed or has never been called). To avoid this, other codecs recorded whether their zstream has been initialized successfully or not. This commit adds wrappers for inflateInit() and inflateEnd() that do what these other codecs do; furthermore, they also take care of properly setting up the zstream before inflateInit() and emit an error message in case of error. Signed-off-by: Andreas Rheinhardt --- configure | 2 ++ libavcodec/Makefile | 1 + libavcodec/zlib_wrapper.c | 57 +++++++++++++++++++++++++++++++++++++++ libavcodec/zlib_wrapper.h | 51 +++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 libavcodec/zlib_wrapper.c create mode 100644 libavcodec/zlib_wrapper.h diff --git a/configure b/configure index 82642deabe..6254dc9dc1 100755 --- a/configure +++ b/configure @@ -2461,6 +2461,7 @@ CONFIG_EXTRA=" idctdsp iirfilter mdct15 + inflate_wrapper intrax8 iso_media ividsp @@ -2722,6 +2723,7 @@ faanidct_select="idctdsp" h264dsp_select="startcode" hevcparse_select="atsc_a53 golomb" frame_thread_encoder_deps="encoders threads" +inflate_wrapper_deps="zlib" intrax8_select="blockdsp idctdsp" iso_media_select="mpeg4audio" mdct_select="fft" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index f36b2e992d..62c8e34963 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -104,6 +104,7 @@ OBJS-$(CONFIG_HUFFYUVENCDSP) += huffyuvencdsp.o OBJS-$(CONFIG_IDCTDSP) += idctdsp.o simple_idct.o jrevdct.o OBJS-$(CONFIG_IIRFILTER) += iirfilter.o OBJS-$(CONFIG_MDCT15) += mdct15.o +OBJS-$(CONFIG_INFLATE_WRAPPER) += zlib_wrapper.o OBJS-$(CONFIG_INTRAX8) += intrax8.o intrax8dsp.o msmpeg4data.o OBJS-$(CONFIG_IVIDSP) += ivi_dsp.o OBJS-$(CONFIG_JNI) += ffjni.o jni.o diff --git a/libavcodec/zlib_wrapper.c b/libavcodec/zlib_wrapper.c new file mode 100644 index 0000000000..b15d5be2b8 --- /dev/null +++ b/libavcodec/zlib_wrapper.c @@ -0,0 +1,57 @@ +/* + * Wrappers for zlib + * Copyright (C) 2022 Andreas Rheinhardt + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "libavutil/error.h" +#include "libavutil/log.h" +#include "zlib_wrapper.h" + +int ff_inflate_init(FFZStream *z, void *logctx) +{ + z_stream *const zstream = &z->zstream; + int zret; + + z->inited = 0; + zstream->next_in = Z_NULL; + zstream->avail_in = 0; + zstream->zalloc = Z_NULL; + zstream->zfree = Z_NULL; + zstream->opaque = Z_NULL; + + zret = inflateInit(zstream); + if (zret == Z_OK) { + z->inited = 1; + } else { + av_log(logctx, AV_LOG_ERROR, "inflateInit error %d, message: %s\n", + zret, zstream->msg ? zstream->msg : ""); + return AVERROR_EXTERNAL; + } + return 0; +} + +void ff_inflate_end(FFZStream *z) +{ + if (z->inited) { + z->inited = 0; + inflateEnd(&z->zstream); + } +} diff --git a/libavcodec/zlib_wrapper.h b/libavcodec/zlib_wrapper.h new file mode 100644 index 0000000000..0e91713b25 --- /dev/null +++ b/libavcodec/zlib_wrapper.h @@ -0,0 +1,51 @@ +/* + * Wrappers for zlib + * Copyright (C) 2022 Andreas Rheinhardt + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_ZLIB_WRAPPER_H +#define AVCODEC_ZLIB_WRAPPER_H + +#include + +typedef struct FFZStream { + z_stream zstream; + int inited; +} FFZStream; + +/** + * Wrapper around inflateInit(). It initializes the fields that zlib + * requires to be initialized before inflateInit(). + * In case of error it also returns an error message to the provided logctx; + * in any case, it sets zstream->inited to indicate whether inflateInit() + * succeeded. + * @return Returns 0 on success or a negative error code on failure + */ +int ff_inflate_init(FFZStream *zstream, void *logctx); + +/** + * Wrapper around inflateEnd(). It calls inflateEnd() iff + * zstream->inited is set and resets zstream->inited. + * It is therefore safe to be called even if + * ff_inflate_init() has never been called on it (or errored out) + * provided that the FFZStream (or just FFZStream.inited) has been zeroed. + */ +void ff_inflate_end(FFZStream *zstream); + +#endif /* AVCODEC_ZLIB_WRAPPER_H */