From patchwork Sat Dec 4 21:15:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 31968 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp2464809iog; Sat, 4 Dec 2021 13:16:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJywUt86TC1+UKVxQqOUs/EqJxUyvVVriWXeS583hYRyF6uDyLqI1g3m3YNQwZ6TVqAeF9Se X-Received: by 2002:a17:907:c15:: with SMTP id ga21mr33185216ejc.349.1638652563135; Sat, 04 Dec 2021 13:16:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638652563; cv=none; d=google.com; s=arc-20160816; b=a56NSUxLl/fjJACvFH/sJUvApFc8S+1d2iKhEu9ivkwhjSrz6+b/D+ZiK4bWvTEsUj ZUX3mC5i33loBJYdsP7cXOwWYZIX7KGjiHXjFq8rm8k2j9E1WVvdsVlGT93Uk+X4/+zP lGMccG/6139+Cf2+dW/wUNI9xKP7bwlRV8oh3e4TKlndwbI02wY8WfZvRnVIlrrKoePk lgBTh5AI0b+EnGNLDae5+X818xGwJFiABkoUL2JDC7bwDF5BX0hSPP5g89X+GUSkD0pT xTm/nZmwYBwoueX61tFnmYKnQKqTkHqQQwaRtRF5mUfLnk/zV4zbMqtIS7hnNianBNIA HDGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=ZZpsbkSBL9lHB0eMZZAGl+68sU/muOpPu296A7kcadU=; b=oq/PB8fXRkg44tcy3gCpQ+XeG9+1MUmadsVpI42k3xqnZ0pTbaKr1eQ3sGcAtw0FQC x95v9AaLEVlJ7rrSDMqZ7AFVyAYgxED2eDMvXWJOhy1Ka3X6W2c+pMfr47jdwwil+wl4 7MIaYURvbu7XVHh49Qb4pXhrONo4IcoH6dlXRfJ24YuFKf1CE0/wpVyUmd0WXSz46TUd ezQavk8/uRQLVotbGbS0yA8Fjp3BzlVeeX65LJRfhByrJFK/dckcpoCJS3BSEEYDlnHa 2CExE7moNym1cFWYpf+Zg/LwCP29Qf7IanHCKw5HhZyLBebxserc5pxa5iLs4/fi2i7P j3fA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x3si13968123edd.66.2021.12.04.13.16.02; Sat, 04 Dec 2021 13:16:03 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A47CB68AAD7; Sat, 4 Dec 2021 23:15:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 980A068A3B0 for ; Sat, 4 Dec 2021 23:15:52 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 91E39E6491; Sat, 4 Dec 2021 22:15:51 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SO6uQ4H3CVkC; Sat, 4 Dec 2021 22:15:49 +0100 (CET) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 9C872E0855; Sat, 4 Dec 2021 22:15:49 +0100 (CET) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Sat, 4 Dec 2021 22:15:44 +0100 Message-Id: <20211204211544.26406-1-cus@passwd.hu> X-Mailer: git-send-email 2.31.1 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 4/5] avformat: introduce AVFormatContext io_close2 which returns an int 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: s8kmPoKygNws Otherwise there is no way to detect an error returned by avio_close() because ff_format_io_close cannot get the return value. Checking the return value of the close function is important in order to check if all data was successfully written and the underlying close() operation was successful. It can also be useful even for read mode because it can return any pending AVIOContext error, so the user don't have to manually check AVIOContext->error. In order to still support if the user overrides io_close, the generic code only uses io_close2 if io_close is either NULL or the default io_close callback. Signed-off-by: Marton Balint --- doc/APIchanges | 3 +++ libavformat/avformat.h | 13 +++++++++++++ libavformat/dashenc.c | 1 + libavformat/fifo.c | 1 + libavformat/hlsenc.c | 1 + libavformat/internal.h | 10 +++++++++- libavformat/options.c | 7 ++++--- libavformat/segment.c | 1 + libavformat/tee.c | 1 + libavformat/utils.c | 17 ++++++++++++++--- libavformat/version.h | 4 ++-- 11 files changed, 50 insertions(+), 9 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 2914ad6734..a9092d27ef 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,9 @@ libavutil: 2021-04-27 API changes, most recent first: +2021-12-xx - xxxxxxxxxx - lavf 59.10.100 - avformat.h + Add AVFormatContext io_close2 which returns an int + 2021-11-xx - xxxxxxxxxx - lavfi 8.19.100 - avfilter.h Add AVFILTER_FLAG_METADATA_ONLY. diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 75699f3a32..70b36d7682 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1786,6 +1786,19 @@ typedef struct AVFormatContext { * - decoding: set by user */ int max_probe_packets; + + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + * + * Using this is preferred over io_close, because this can return an error. + * Therefore this callback is used instead of io_close by the generic + * libavformat code if io_close is NULL or the default. + * + * @param s the format context + * @param pb IO context to be closed and freed + * @return 0 on success, a negative AVERROR code on failure + */ + int (*io_close2)(struct AVFormatContext *s, AVIOContext *pb); } AVFormatContext; /** diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 3f28f5ad71..4709bc6615 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -1546,6 +1546,7 @@ static int dash_init(AVFormatContext *s) ctx->interrupt_callback = s->interrupt_callback; ctx->opaque = s->opaque; ctx->io_close = s->io_close; + ctx->io_close2 = s->io_close2; ctx->io_open = s->io_open; ctx->strict_std_compliance = s->strict_std_compliance; diff --git a/libavformat/fifo.c b/libavformat/fifo.c index 2ee6dde830..86e5d369b5 100644 --- a/libavformat/fifo.c +++ b/libavformat/fifo.c @@ -499,6 +499,7 @@ static int fifo_mux_init(AVFormatContext *avf, const AVOutputFormat *oformat, return ret; avf2->opaque = avf->opaque; avf2->io_close = avf->io_close; + avf2->io_close2 = avf->io_close2; avf2->io_open = avf->io_open; avf2->flags = avf->flags; diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index cfd0c036d1..ae288e408d 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -867,6 +867,7 @@ static int hls_mux_init(AVFormatContext *s, VariantStream *vs) oc->opaque = s->opaque; oc->io_open = s->io_open; oc->io_close = s->io_close; + oc->io_close2 = s->io_close2; oc->strict_std_compliance = s->strict_std_compliance; av_dict_copy(&oc->metadata, s->metadata, 0); diff --git a/libavformat/internal.h b/libavformat/internal.h index 20e93d9267..b0f70c614b 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -905,8 +905,16 @@ int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **op /* * A wrapper around AVFormatContext.io_close that should be used * instead of calling the pointer directly. + * + * @param s AVFormatContext + * @param *pb the AVIOContext to be closed and freed. Can be NULL. + * @return >=0 on success, negative AVERROR in case of failure */ -void ff_format_io_close(AVFormatContext *s, AVIOContext **pb); +int ff_format_io_close(AVFormatContext *s, AVIOContext **pb); + +/* Default io_close callback, not to be used directly, use ff_format_io_close + * instead. */ +void ff_format_io_close_default(AVFormatContext *s, AVIOContext *pb); /** * Utility function to check if the file uses http or https protocol diff --git a/libavformat/options.c b/libavformat/options.c index 72c9bdcefe..1634388acb 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -146,9 +146,9 @@ static int io_open_default(AVFormatContext *s, AVIOContext **pb, return ffio_open_whitelist(pb, url, flags, &s->interrupt_callback, options, s->protocol_whitelist, s->protocol_blacklist); } -static void io_close_default(AVFormatContext *s, AVIOContext *pb) +static int io_close2_default(AVFormatContext *s, AVIOContext *pb) { - avio_close(pb); + return avio_close(pb); } AVFormatContext *avformat_alloc_context(void) @@ -162,7 +162,8 @@ AVFormatContext *avformat_alloc_context(void) s = &si->pub; s->av_class = &av_format_context_class; s->io_open = io_open_default; - s->io_close = io_close_default; + s->io_close = ff_format_io_close_default; + s->io_close2= io_close2_default; av_opt_set_defaults(s); diff --git a/libavformat/segment.c b/libavformat/segment.c index d531286c31..e9b0aa4fa8 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -158,6 +158,7 @@ static int segment_mux_init(AVFormatContext *s) av_dict_copy(&oc->metadata, s->metadata, 0); oc->opaque = s->opaque; oc->io_close = s->io_close; + oc->io_close2 = s->io_close2; oc->io_open = s->io_open; oc->flags = s->flags; diff --git a/libavformat/tee.c b/libavformat/tee.c index dfdf70cb08..b3bcd70b9f 100644 --- a/libavformat/tee.c +++ b/libavformat/tee.c @@ -237,6 +237,7 @@ static int open_slave(AVFormatContext *avf, char *slave, TeeSlave *tee_slave) avf2->opaque = avf->opaque; avf2->io_open = avf->io_open; avf2->io_close = avf->io_close; + avf2->io_close2 = avf->io_close2; avf2->interrupt_callback = avf->interrupt_callback; avf2->flags = avf->flags; avf2->strict_std_compliance = avf->strict_std_compliance; diff --git a/libavformat/utils.c b/libavformat/utils.c index 7840e8717c..e449c45fec 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1829,11 +1829,22 @@ int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **op return 0; } -void ff_format_io_close(AVFormatContext *s, AVIOContext **pb) +void ff_format_io_close_default(AVFormatContext *s, AVIOContext *pb) { - if (*pb) - s->io_close(s, *pb); + avio_close(pb); +} + +int ff_format_io_close(AVFormatContext *s, AVIOContext **pb) +{ + int ret = 0; + if (*pb) { + if (s->io_close == ff_format_io_close_default || s->io_close == NULL) + ret = s->io_close2(s, *pb); + else + s->io_close(s, *pb); + } *pb = NULL; + return ret; } int ff_is_http_proto(const char *filename) { diff --git a/libavformat/version.h b/libavformat/version.h index 0705ee4112..1623835a78 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 59 -#define LIBAVFORMAT_VERSION_MINOR 9 -#define LIBAVFORMAT_VERSION_MICRO 102 +#define LIBAVFORMAT_VERSION_MINOR 10 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \