From patchwork Fri Mar 25 22:54:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Gaullier X-Patchwork-Id: 34994 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1469670uaj; Fri, 25 Mar 2022 15:55:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxIrtIstifXeGSaNVrdbGowJVh6KVuK300PUnUna7ZRl5Q4bXrkObmcEq5qI28jW/2pDaSc X-Received: by 2002:a05:6402:2688:b0:419:5dde:4700 with SMTP id w8-20020a056402268800b004195dde4700mr1262658edd.124.1648248917582; Fri, 25 Mar 2022 15:55:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648248917; cv=none; d=google.com; s=arc-20160816; b=A6VdyLW5AFrYHkO5iIR6zYlHhwhEg+YfRRQM3q2gERc2XUXpqs1Q+AzQLktXsbNdYI EBAUPampv7u71ymOz+b+OjdorCtQB9BW5UdjWr5o76Y09qIhE+ZmZYVQPN0/w1/waI0U DfubrvtncCRVRVEwucR4C3g2ZSKn//OMXwYcxwAeslj6POUfOKl+SiqCnvG6n5l4v6Cy CTjXUc4eRVQm9DZRsIXnZFthuX78A13x9wbP7q4FHXOTV9FVIt21XHvstWhqO5txeA2x 5DgSplqLlw+YpK8fMeA5/0chH8iOyvZOJ3RIvjvfy+RMx5Mw+/4sSLiM5/BIc432Bb2/ 6KKA== 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=akBq/V2M3QZEoEuv1uKkWMuhJV/X2JubGAOKCcAJMBw=; b=S5ub/6wxA8vKp5n6vvpqHZYVaPb7E2xO5iHGbVNvQkH5Ang9GSNxGnzSOnwAPEgeHf qbF7DTD5gY1zDhPJSGbcHaG3lnFTpNS3j4kteiCCsGwqF7Azf3Ex8RBdSfD1fQLfDA4q TKzEVa9gWb+v/z6NLSpXXgPobXKSixwDqW//bYv42XQFf8yFkEA0eQJaWQ09tI/rkOmm oCGBv5ZA7KGXpq1redPgx+pKiGICh1s7rxDpVyg79zlkstFr7ThuBoN0+0s6OK/oBQxt LY+nPeseLibNuUWPpzLhcPTC1mrHBAI32XnDbjw34/DjfofRrbKqRKp/fIDKlS3M6l8Z Sg9A== 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 gt15-20020a1709072d8f00b006df76385c5asi4894199ejc.250.2022.03.25.15.55.16; Fri, 25 Mar 2022 15:55:17 -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; 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 DC05268B204; Sat, 26 Mar 2022 00:55:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from srv-infra-1.infra.inf.glb.tvvideoms.com (www.inf.tvvideoms.com [213.205.126.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A3B2768B19F for ; Sat, 26 Mar 2022 00:55:00 +0200 (EET) Received: from cji.paris (unknown [172.16.3.159]) by srv-infra-1.infra.inf.glb.tvvideoms.com (Postfix) with ESMTP id 1F69221889; Fri, 25 Mar 2022 22:54:58 +0000 (UTC) From: Nicolas Gaullier To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 23:54:51 +0100 Message-Id: <20220325225452.47-2-nicolas.gaullier@cji.paris> X-Mailer: git-send-email 2.34.0.windows.1 In-Reply-To: <20220325225452.47-1-nicolas.gaullier@cji.paris> References: <20220325225452.47-1-nicolas.gaullier@cji.paris> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 1/2] lavf/mpegenc: fix ever-growing fifo size since the new API 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: Nicolas Gaullier Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: UScUDqodph9B The older av_fifo_realloc2 implemented an auto grow that should be ported as such in the new API. This patch introduces a limitation in the fifo buffer size. The default is set to 128MB and may be overriden by a new user option. The amount of memory allocated depends on multiple factors, including the number of audio streams. A worst case scenario is where an out-of-spec high video bitrate is combined with numerous low bitrate audios. A fatal error mentions the availability of fifo_size_limit option. Fix regressing since ea511196a6c85eb433e10cdbecb0b2c722faf20d Signed-off-by: Nicolas Gaullier --- libavformat/mpegenc.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index cc47a43288..e0955a7d33 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -84,6 +84,7 @@ typedef struct MpegMuxContext { int64_t vcd_padding_bytes_written; int preload; + int fifo_size_limit; } MpegMuxContext; extern const AVOutputFormat ff_mpeg1vcd_muxer; @@ -461,9 +462,10 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) av_get_media_type_string(st->codecpar->codec_type), i); return AVERROR(EINVAL); } - stream->fifo = av_fifo_alloc2(16, 1, 0); + stream->fifo = av_fifo_alloc2(16, 1, AV_FIFO_FLAG_AUTO_GROW); if (!stream->fifo) return AVERROR(ENOMEM); + av_fifo_auto_grow_limit(stream->fifo, s->fifo_size_limit); } bitrate = 0; audio_bitrate = 0; @@ -1207,10 +1209,6 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt) pkt_desc->unwritten_size = pkt_desc->size = size; - ret = av_fifo_grow2(stream->fifo, size); - if (ret < 0) - return ret; - if (s->is_dvd) { // min VOBU length 0.4 seconds (mpucoder) if (is_iframe && @@ -1222,10 +1220,15 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt) } } - av_fifo_write(stream->fifo, buf, size); + ret = av_fifo_write(stream->fifo, buf, size); + if (ret == AVERROR(ENOSPC)) + av_log(s, AV_LOG_FATAL, "Input stream buffer overrun. " + "To avoid, increase fifo_size_limit option.\n"); + if (ret < 0) + return ret; for (;;) { - int ret = output_packet(ctx, 0); + ret = output_packet(ctx, 0); if (ret <= 0) return ret; } @@ -1277,6 +1280,7 @@ static void mpeg_mux_deinit(AVFormatContext *ctx) static const AVOption options[] = { { "muxrate", NULL, OFFSET(user_mux_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, ((1<<22) - 1) * (8 * 50), E }, { "preload", "Initial demux-decode delay in microseconds.", OFFSET(preload), AV_OPT_TYPE_INT, { .i64 = 500000 }, 0, INT_MAX, E }, + { "fifo_size_limit", "Maximum allowed memory for buffering an input stream in bytes", OFFSET(fifo_size_limit), AV_OPT_TYPE_INT, {.i64 = 128 * 1024 * 1024 }, 16, FFMIN(INT_MAX, SIZE_MAX), E}, { NULL }, }; From patchwork Fri Mar 25 22:54:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Gaullier X-Patchwork-Id: 34995 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1469691uaj; Fri, 25 Mar 2022 15:55:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJywYLABsVO3lQVq2IYl/yxCFS4K8tTA1V3maAuF49azP7zTDphEx5GmRzHVe7aIpn7fkF5J X-Received: by 2002:aa7:d619:0:b0:419:af7:841f with SMTP id c25-20020aa7d619000000b004190af7841fmr1234171edr.20.1648248925026; Fri, 25 Mar 2022 15:55:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648248925; cv=none; d=google.com; s=arc-20160816; b=aIVYbpfzmyn1CzPm3A/pbt5laxjsS/uicjOlKFvkCbRfl8puSqRLpjC5ddDjovifrr h50vEGXdq/QmBytjfsReCp9rZZ2XHoT8S6GmbOqCp+kpxjWQVm61LiY9VKZTIQoBn0ix vnMYkjjDC8mS83LBkfGu10Wcm7yCnbsXh6Gc0K1lfqqKHqaVq7LaXYOz/OcRKGBEIh5A ALwlw2Qq+qVra/HPc5AxJEGT6Ss2oN0FCZ35Z1ZvgGax7/HqUpRalRNoQvxV3Noig0ie eM6Gp9sS8Zgp7p/c/5kPjGRdX/z9iUp9V8yqeJbxlNaeF+tMDVEoPeoO0q/bubE1jno4 G6wg== 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=PZoychhtoCTEpQ641jghQvP4SUOf0aCpu36jBUIHswM=; b=glGmPPDhdk8ExSG0HkfKPeCsOWQq0USgWYpl12o/34P7QhsqyR2f2OvHBtXE+rgrkD AxcmO6lO59XMLS6aoq9C2BthG8jd09as6a1eiliyNQSWOi+FJp3PGC/q067eiMTT8RJ5 CfEIm0kduJtTFQwvycaarXbHhvhjrr1wXI/DxEo2eqeq8c+hc2kJDqgG0C70jovEOus8 EQSrXelPc1ZdFZoEN8LxWojG/BZkCqBmPpJNFM5nz/ChmD8iPMiYAZpt07YOIJtyXz2v OwwyvlNb+kwM40+6cf8WarSjVnUknhT1ef1cW9mLVNHYsq1o++GV0gnJvrdOGN30dJiL 8TzQ== 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 qf16-20020a1709077f1000b006df76385dc4si5085266ejc.612.2022.03.25.15.55.24; Fri, 25 Mar 2022 15:55:25 -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; 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 BAD2C68B21E; Sat, 26 Mar 2022 00:55:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from srv-infra-1.infra.inf.glb.tvvideoms.com (www.inf.tvvideoms.com [213.205.126.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7808268008C for ; Sat, 26 Mar 2022 00:55:02 +0200 (EET) Received: from cji.paris (unknown [172.16.3.159]) by srv-infra-1.infra.inf.glb.tvvideoms.com (Postfix) with ESMTP id 209AF21568; Fri, 25 Mar 2022 22:55:00 +0000 (UTC) From: Nicolas Gaullier To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 23:54:52 +0100 Message-Id: <20220325225452.47-3-nicolas.gaullier@cji.paris> X-Mailer: git-send-email 2.34.0.windows.1 In-Reply-To: <20220325225452.47-1-nicolas.gaullier@cji.paris> References: <20220325225452.47-1-nicolas.gaullier@cji.paris> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 2/2] lavf/mpegenc: fix termination on error conditions 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: Nicolas Gaullier Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CL51cTVCZonH Avoid an infinite 'retry' loop in output_packet when flushing. Signed-off-by: Nicolas Gaullier --- libavformat/mpegenc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index e0955a7d33..e113a42867 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -1002,7 +1002,7 @@ static int output_packet(AVFormatContext *ctx, int flush) MpegMuxContext *s = ctx->priv_data; AVStream *st; StreamInfo *stream; - int i, avail_space = 0, es_size, trailer_size; + int i, has_avail_data = 0, avail_space = 0, es_size, trailer_size; int best_i = -1; int best_score = INT_MIN; int ignore_constraints = 0; @@ -1028,6 +1028,7 @@ retry: if (avail_data == 0) continue; av_assert0(avail_data > 0); + has_avail_data = 1; if (space < s->packet_size && !ignore_constraints) continue; @@ -1048,6 +1049,8 @@ retry: int64_t best_dts = INT64_MAX; int has_premux = 0; + if (!has_avail_data) + return 0; for (i = 0; i < ctx->nb_streams; i++) { AVStream *st = ctx->streams[i]; StreamInfo *stream = st->priv_data;