From patchwork Tue Nov 28 02:57:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 6413 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp2648679jah; Mon, 27 Nov 2017 18:57:43 -0800 (PST) X-Google-Smtp-Source: AGs4zMZNxpVE4BmvoUIDRrtWe2k+hEcdqsQkmodsyTDHALYmvYfffMVr61FaqVDk1Lg+TQ8oGfmP X-Received: by 10.223.161.14 with SMTP id o14mr3722178wro.111.1511837863811; Mon, 27 Nov 2017 18:57:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511837863; cv=none; d=google.com; s=arc-20160816; b=gcvsJQsmtTtm1P1mJ/EFi0wNJYNVlYBPl9m774NyLbFjXfbByZZUsakZeJlqoTYkHj AuuqTJX+NBHbu6XtlMkRzsQOWSyyquktJMiwEyA4SJ8UJ+1bEPLsrcxDbK/vOhxIv4Fv 9rOD24Q7s9A0k7kM+4VYFPPvFoo4hSYTLNU6jiHEvwFVH4xr7TWxMOb8sdS68cFnxSX/ BFY/V60/REhtQHS4ngOQrOQe+N/1vF87ogJ6ug1CP5PsZRJxX+zZZdHkURVgY0tywoJ3 0z2orRSLKEdriysaLyNFb9T0uB2uq1DBWq4NfgRiqvY3mM30yGimCy5c39FMKnpVEgeR I+Vw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=2vawulrfsABCIZGDzR8O2NsABrnEvtqbkKdZ75nwIVs=; b=xkD1XI/egf4doEK04H4UUq5aRWxdoGnj+3UVoD9AAOH63MrCB467l5+MX9d5myPLjU tIA8sioKg9ilIU0owAHGt3lxaUYNkdjN6jzYD9eWO9Qxp1KLn2ULC5hI5o8x4nKchROv VotT3CWPmOZkbiME3I/OwikNHd64KvVUTr5076za2ZTHGuR6uGSiKyApKqVKxObktxZc GF248NafnUByyUIG6egCsZHLToKDOAYKgfR2UtOIipMaytE6PWb1kyUkQPsFfrLqTtrx Dnu+zerv5l41AInf4zNMFqx4X2rAaDjxaAAn8p04SDeYv5JFytVgkayhm5IqnyWIqgzW NBsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=o6n1WJ16; 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=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b196si11911355wmb.214.2017.11.27.18.57.43; Mon, 27 Nov 2017 18:57:43 -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=@gmail.com header.s=20161025 header.b=o6n1WJ16; 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=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EF67F689E6D; Tue, 28 Nov 2017 04:57:39 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f194.google.com (mail-qk0-f194.google.com [209.85.220.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AE8A968831C for ; Tue, 28 Nov 2017 04:57:37 +0200 (EET) Received: by mail-qk0-f194.google.com with SMTP id a194so35283697qkc.9 for ; Mon, 27 Nov 2017 18:57:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=89YnzWNtAzJrT+8r+0JrgFfEDiFvyCSpdsDeXTKfo4s=; b=o6n1WJ16P4MHFo5QlnTtYaiuVcO3rKBw8xtISzV5VtFyuCsN6tHa3KD41lj+7J/GP2 EY8rc2v2BKWcqiY1Q6TWffGqCwpN+mXIeyTplDcy/IgQklW2PqRJ4nM4kOkMXqJY9Gtb hgSaq9gmp2EfSU8rKvsSS6zrvg9Gz57SXzabcX66km/wLWa2orGOaMOxJPaa7p8dLwYY MW52aSueGd/HzhZGSLCnTBUsW67RKIUP7wug1feXoP0VQqunKmLzRsGcqX84tk3DA7Rg tBSWnxmU66fq2G6gu5cupBvw+IY0KaugETC641btL51+/m3IOeolLAcOlViUlWH/KM5q 6RKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=89YnzWNtAzJrT+8r+0JrgFfEDiFvyCSpdsDeXTKfo4s=; b=CS3JG2UuiuL/hTQeKHDylhTDi2THrMDTzleKVmRd7fZ4bjCJp0MZPz3xVNGYQkq1MP PykwaE3dsAtr7jAWB2iJ1f7OuCmbl4p5I4/f3DPkLQEB5FiNX0DSZ49yJb3p+W7S/HPl cGvMgYaht4EC4T6gotGwLx8w/bclasfLOAJlWKjF8sHY71oo24kTk5Mscf5u9TylXDDP MIIFXNZFC5e7RlamdpMOcAsCch6QP3AuLalR/3xqF6MkdvwFqFg5edOG9zcbKwPaLDNx 3oHQZalG09XvBlIljVIKwvyavbilQtbeu9ODDoGzlzsEDwVRrMFDSM8FW2MF8EQmpcX4 OgGA== X-Gm-Message-State: AJaThX6ibmfnLgDzlp8g2aI4hJNtVln7Q/1qyyGDPCWGZKVL24WKdb6G a9WI1PG9U/I9LuoMKH8xJGlPxQ== X-Received: by 10.55.25.18 with SMTP id k18mr62638651qkh.336.1511837857940; Mon, 27 Nov 2017 18:57:37 -0800 (PST) Received: from localhost.localdomain ([181.231.59.220]) by smtp.gmail.com with ESMTPSA id a195sm8451884qkb.23.2017.11.27.18.57.36 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 27 Nov 2017 18:57:37 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 27 Nov 2017 23:57:22 -0300 Message-Id: <20171128025722.10876-1-jamrial@gmail.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171126205104.1064-2-jamrial@gmail.com> References: <20171126205104.1064-2-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/3 v2] avformat/mux: stop delaying writing the header X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Every bitstream filter behaves as intended now, so there's no need to wait for the first packet of every stream. Signed-off-by: James Almer --- Now without overloading ret in avformat_write_header. libavformat/avformat.h | 2 +- libavformat/internal.h | 6 ----- libavformat/mux.c | 52 ++++++++---------------------------------- libavformat/options_table.h | 2 +- libavformat/tests/fifo_muxer.c | 52 ------------------------------------------ tests/ref/fate/fifo-muxer-tst | 1 - 6 files changed, 12 insertions(+), 103 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 322210fae0..4f2798a871 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1449,7 +1449,7 @@ typedef struct AVFormatContext { #endif #define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats #define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. -#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Wait for packet data before writing a header, and add bitstream filters as requested by the muxer +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Add bitstream filters as requested by the muxer /** * Maximum size of the data read from input for determining diff --git a/libavformat/internal.h b/libavformat/internal.h index fcd47840a5..36a57214ce 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -120,12 +120,6 @@ struct AVFormatInternal { int avoid_negative_ts_use_pts; - /** - * Whether or not a header has already been written - */ - int header_written; - int write_header_ret; - /** * Timestamp of the end of the shortest stream. */ diff --git a/libavformat/mux.c b/libavformat/mux.c index b1244c67f3..effcc1152f 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -458,25 +458,6 @@ static void flush_if_needed(AVFormatContext *s) } } -static int write_header_internal(AVFormatContext *s) -{ - if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) - avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_HEADER); - if (s->oformat->write_header) { - int ret = s->oformat->write_header(s); - if (ret >= 0 && s->pb && s->pb->error < 0) - ret = s->pb->error; - s->internal->write_header_ret = ret; - if (ret < 0) - return ret; - flush_if_needed(s); - } - s->internal->header_written = 1; - if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) - avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_UNKNOWN); - return 0; -} - int avformat_init_output(AVFormatContext *s, AVDictionary **options) { int ret = 0; @@ -515,11 +496,18 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options) if ((ret = avformat_init_output(s, options)) < 0) return ret; - if (!(s->oformat->check_bitstream && s->flags & AVFMT_FLAG_AUTO_BSF)) { - ret = write_header_internal(s); + if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) + avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_HEADER); + if (s->oformat->write_header) { + ret = s->oformat->write_header(s); + if (ret >= 0 && s->pb && s->pb->error < 0) + ret = s->pb->error; if (ret < 0) goto fail; + flush_if_needed(s); } + if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) + avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_UNKNOWN); if (!s->internal->streams_initialized) { if ((ret = init_pts(s)) < 0) @@ -739,12 +727,6 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) } } - if (!s->internal->header_written) { - ret = s->internal->write_header_ret ? s->internal->write_header_ret : write_header_internal(s); - if (ret < 0) - goto fail; - } - if ((pkt->flags & AV_PKT_FLAG_UNCODED_FRAME)) { AVFrame *frame = (AVFrame *)pkt->data; av_assert0(pkt->size == UNCODED_FRAME_PACKET_SIZE); @@ -760,8 +742,6 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) ret = s->pb->error; } -fail: - if (ret < 0) { pkt->pts = pts_backup; pkt->dts = dts_backup; @@ -894,11 +874,6 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt) if (!pkt) { if (s->oformat->flags & AVFMT_ALLOW_FLUSH) { - if (!s->internal->header_written) { - ret = s->internal->write_header_ret ? s->internal->write_header_ret : write_header_internal(s); - if (ret < 0) - return ret; - } ret = s->oformat->write_packet(s, NULL); flush_if_needed(s); if (ret >= 0 && s->pb && s->pb->error < 0) @@ -1282,14 +1257,8 @@ int av_write_trailer(AVFormatContext *s) goto fail; } - if (!s->internal->header_written) { - ret = s->internal->write_header_ret ? s->internal->write_header_ret : write_header_internal(s); - if (ret < 0) - goto fail; - } - fail: - if (s->internal->header_written && s->oformat->write_trailer) { + if (s->oformat->write_trailer) { if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER); if (ret >= 0) { @@ -1302,7 +1271,6 @@ fail: if (s->oformat->deinit) s->oformat->deinit(s); - s->internal->header_written = s->internal->initialized = s->internal->streams_initialized = 0; diff --git a/libavformat/options_table.h b/libavformat/options_table.h index b60d031f67..b8fa47c6fd 100644 --- a/libavformat/options_table.h +++ b/libavformat/options_table.h @@ -57,7 +57,7 @@ static const AVOption avformat_options[] = { {"seek2any", "allow seeking to non-keyframes on demuxer level when supported", OFFSET(seek2any), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, D}, {"bitexact", "do not write random/volatile data", 0, AV_OPT_TYPE_CONST, { .i64 = AVFMT_FLAG_BITEXACT }, 0, 0, E, "fflags" }, {"shortest", "stop muxing with the shortest stream", 0, AV_OPT_TYPE_CONST, { .i64 = AVFMT_FLAG_SHORTEST }, 0, 0, E, "fflags" }, -{"autobsf", "add needed bsfs automatically (delays header until each stream's first packet is written)", 0, AV_OPT_TYPE_CONST, { .i64 = AVFMT_FLAG_AUTO_BSF }, 0, 0, E, "fflags" }, +{"autobsf", "add needed bsfs automatically", 0, AV_OPT_TYPE_CONST, { .i64 = AVFMT_FLAG_AUTO_BSF }, 0, 0, E, "fflags" }, {"analyzeduration", "specify how many microseconds are analyzed to probe the input", OFFSET(max_analyze_duration), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, D}, {"cryptokey", "decryption key", OFFSET(key), AV_OPT_TYPE_BINARY, {.dbl = 0}, 0, 0, D}, {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), AV_OPT_TYPE_INT, {.i64 = 1<<20 }, 0, INT_MAX, D}, diff --git a/libavformat/tests/fifo_muxer.c b/libavformat/tests/fifo_muxer.c index e20bd6e7b2..4b63df085e 100644 --- a/libavformat/tests/fifo_muxer.c +++ b/libavformat/tests/fifo_muxer.c @@ -238,54 +238,6 @@ fail: return ret; } -static int fifo_write_header_err_tst(AVFormatContext *oc, AVDictionary **opts, - const FailingMuxerPacketData *pkt_data) -{ - int ret = 0, i; - AVPacket pkt; - - av_init_packet(&pkt); - - ret = avformat_write_header(oc, opts); - if (ret) { - fprintf(stderr, "Unexpected write_header failure: %s\n", - av_err2str(ret)); - goto fail; - } - - for (i = 0; i < MAX_TST_PACKETS; i++ ) { - ret = prepare_packet(&pkt, pkt_data, i); - if (ret < 0) { - fprintf(stderr, "Failed to prepare test packet: %s\n", - av_err2str(ret)); - goto write_trailer_and_fail; - } - ret = av_write_frame(oc, &pkt); - av_packet_unref(&pkt); - if (ret < 0) { - break; - } - } - - if (!ret) { - fprintf(stderr, "write_packet not failed when supposed to.\n"); - goto fail; - } else if (ret != -1) { - fprintf(stderr, "Unexpected write_packet error: %s\n", av_err2str(ret)); - goto fail; - } - - ret = av_write_trailer(oc); - if (ret < 0) - fprintf(stderr, "Unexpected write_trailer error: %s\n", av_err2str(ret)); - - return ret; -write_trailer_and_fail: - av_write_trailer(oc); -fail: - return ret; -} - static int fifo_overflow_drop_test(AVFormatContext *oc, AVDictionary **opts, const FailingMuxerPacketData *data) { @@ -403,10 +355,6 @@ const TestCase tests[] = { * exactly what was on input */ {fifo_basic_test, "nonfail test", NULL,1, 0, 0, {0, 0, 0}}, - /* Test that we receive delayed write_header error from one of the write_packet - * calls. */ - {fifo_write_header_err_tst, "write header error test", NULL, 0, -1, 0, {0, 0, 0}}, - /* Each write_packet will fail 3 times before operation is successful. If recovery * Since recovery is on, fifo muxer should not return any errors. */ {fifo_basic_test, "recovery test", "attempt_recovery=1:recovery_wait_time=0", diff --git a/tests/ref/fate/fifo-muxer-tst b/tests/ref/fate/fifo-muxer-tst index ca7e294860..e1139ee0a8 100644 --- a/tests/ref/fate/fifo-muxer-tst +++ b/tests/ref/fate/fifo-muxer-tst @@ -2,7 +2,6 @@ flush count: 1 pts seen nr: 15 pts seen: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 nonfail test: ok -write header error test: ok recovery test: ok flush count: 1 pts seen nr: 15