From patchwork Fri May 26 20:08:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 3745 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp451497vsk; Fri, 26 May 2017 13:09:23 -0700 (PDT) X-Received: by 10.223.179.198 with SMTP id x6mr3300662wrd.167.1495829362959; Fri, 26 May 2017 13:09:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1495829362; cv=none; d=google.com; s=arc-20160816; b=fh8Hlu9bWxRGmTpypddTytI3e7ZzGoxDrhDo+3KmUrcTu1j41DFs3twu1kkoa/4bxU BJpgNMOKyJyYLtJl7QpJWxKlqrs3mnPnx3+Yr05weIhsKPjnSJsdzWjF/wM4x8eg7l/O 7U3dyTO8n50yPsZ5jx5Xb5TGEb+v53urIUfelFx/kdfiQuzRKlyrVYOXck7IsSzfQ0ug FshEoC+/RBJx3UPZO6qe06A3Q5Hd9hOjkGSrXoYrujYTiRGvjJsp2/Izg6edv6yi/MH4 sRDcmHwmX9TqNV8wb15UCTIVRmaJcZP3f3cOvAuPbhIqwR+H9N6fQkVoWNZAWWau9UFI EuLA== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=Lm6iGOI0Nva32o272QH74ICR/KTND9nGHYCZirR5BFo=; b=dSF14xWt3ZqnqC7uDSNSZYdE1U/tYj93BpV4AWou3tdSSKB+arwijTuTFoDEhY4pQZ VuYsezzMYcXRiq+e6Un2hChcnOYNCYmWcFjKgBaHG4Q34H4F4U7b45dEQ4mc7hWYuNnl jx2i2NDof9FbKaty6Pq+u6dM0UXty5NZt54j2d6N3tym02o7SexADg6jI4D4TL63IufI DaNEJF7hIfFemucv1uF9AiiIQ6hyhANvmX7A0rGLboxY7/i8GC5qopeNWxJURX6QCHTY A1Yh0sFREcZwMQXIOlCv58AneQQRKVX1mvkkOXIg9ZDVLhEy1Dqppn/gY7at8QmMlK0u Fipg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.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; 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 61si1985551wro.87.2017.05.26.13.09.22; Fri, 26 May 2017 13:09:22 -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=@gmail.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; 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 152A1689D0F; Fri, 26 May 2017 23:09:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f196.google.com (mail-qt0-f196.google.com [209.85.216.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3EF73689CD9 for ; Fri, 26 May 2017 23:09:10 +0300 (EEST) Received: by mail-qt0-f196.google.com with SMTP id r58so2647852qtb.2 for ; Fri, 26 May 2017 13:09:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=9DWL3U94Plct5LycE8oaLdSUT/UTr9IeCR1ADe8Ckrw=; b=Hya01e/G1rOXg9x+s0Z4O/IdQQ0Dcv2j3Jw4s/vT2AZ/h31mYGqNbYZV9C7FNKuTa9 VaBoeET3VsBDfW23Ai5m24EXn/00XVPhMxPNN2JX+ULKFN/3TEP+CZrc8aPsDW6HttqR 0o/a58DZS2J8+cRiqsAZxYKsPaaGuZuFpRk4OC3BMAxg8TO3JaUtPvtEi66FdmgNOP0P aoj7vUruu9y6axEfWDYp47naEIXlDMTUmNqdSZU05QcW0+BhatGlZEibp7fL/1bINwCF 3Y6vEzTHrK+nORSsHxz19wY6toDi6oxBp6nvnOd63nTxd9HorMPppiiStTfQl/90nuIB 6r5A== 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; bh=9DWL3U94Plct5LycE8oaLdSUT/UTr9IeCR1ADe8Ckrw=; b=gxKZHJUWM7nGombovdUreOTIAXngv7w2bJe7iMP15qIrLFZAM2j2Nv8uYVQMbrbDn1 kAff0ArdXQiNM/X0lIcXsdPZsYMpC8ksjvFYCLUAR9QDMV0zDFxS2W0pO43HMoGXjQUk ej0GaFCcd/irad/w3lRI/yvERlgVGsdYpuX+5mnpB7ONMrytS9cnbBueW+SRnM+vnK2E k9N5dsLbABWuLAN1sIW/rgrSYFDiVryDqkkrfxiqUTbXFR15sHcM5/gUo7GcmbmuTKbC 8Hg3jDh0bV+VNGW1VtSXAnweiOzqnyOcygg9yOaJu/BecwnqqTKyOqR1t/X9wcInYSes 6Xgg== X-Gm-Message-State: AODbwcC7cRhFKOHaAojFXfZOaMfA0e0oyPBs/c1u3mjkb6JnP7eOVSTk dUjOLHCq8o1c6WaJ X-Received: by 10.200.3.4 with SMTP id q4mr5007429qtg.147.1495829351841; Fri, 26 May 2017 13:09:11 -0700 (PDT) Received: from localhost.localdomain ([181.231.116.134]) by smtp.gmail.com with ESMTPSA id l36sm1181498qtl.32.2017.05.26.13.09.10 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 26 May 2017 13:09:11 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 26 May 2017 17:08:51 -0300 Message-Id: <20170526200851.7136-1-jamrial@gmail.com> X-Mailer: git-send-email 2.12.1 Subject: [FFmpeg-devel] [PATCH] 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" There's no need to wait for the first packet of every stream now that every bitstream filter behaves as intended. Signed-off-by: James Almer --- What should we do with the AVFMT_FLAG_AUTO_BSF flag? Do we deprecate it and force the automatic insertion of muxer-required bitstream filters now that the generic muxing code will always behave the same, or keep it to give the user a choice to apply said bitstream filters? I ask because some filters, like vp9_superframe, are necessary to avoid creating broken files, so it's not wise to allow the user to disable it. It would also go in line with AVCodec.bsfs, which is essentially a non-optional (for reasons made obvious in fa1749dd34) autobsf at the codec level instead of container level. The change to fate-rgb24-mkv is a regression that can be prevented by committing https://ffmpeg.org/pipermail/ffmpeg-devel/2017-May/211311.html or a similar solution, maybe using avformat_init_output(), to make sure ffmpeg.c sets AVCodecParameters->field_order for the output stream before calling avformat_write_header(). libavformat/internal.h | 6 ----- libavformat/mux.c | 53 +++++++++--------------------------------- libavformat/options_table.h | 2 +- libavformat/tests/fifo_muxer.c | 52 ----------------------------------------- tests/ref/fate/fifo-muxer-tst | 1 - tests/ref/fate/rgb24-mkv | 4 ++-- 6 files changed, 14 insertions(+), 104 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index c856945ce9..9c6cd77166 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -121,12 +121,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. */ int64_t shortest_end; diff --git a/libavformat/mux.c b/libavformat/mux.c index 01dcb362ae..f931d6a928 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -468,26 +468,6 @@ static int init_pts(AVFormatContext *s) return 0; } -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; - if (s->flush_packets && s->pb && s->pb->error >= 0 && s->flags & AVFMT_FLAG_FLUSH_PACKETS) - avio_flush(s->pb); - } - 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; @@ -526,11 +506,19 @@ 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) { + int ret = s->oformat->write_header(s); + if (ret >= 0 && s->pb && s->pb->error < 0) + ret = s->pb->error; if (ret < 0) goto fail; + if (s->flush_packets && s->pb && s->pb->error >= 0 && s->flags & AVFMT_FLAG_FLUSH_PACKETS) + avio_flush(s->pb); } + 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) @@ -756,12 +744,6 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif - 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); @@ -778,7 +760,6 @@ FF_ENABLE_DEPRECATION_WARNINGS ret = s->pb->error; } -fail: #if FF_API_LAVF_MERGE_SD FF_DISABLE_DEPRECATION_WARNINGS if (did_split) @@ -926,11 +907,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); if (s->flush_packets && s->pb && s->pb->error >= 0 && s->flags & AVFMT_FLAG_FLUSH_PACKETS) avio_flush(s->pb); @@ -1315,14 +1291,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) { @@ -1335,7 +1305,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 0c1915d6d4..250e16abe7 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 diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv index 4c357accaf..439b2bc5e9 100644 --- a/tests/ref/fate/rgb24-mkv +++ b/tests/ref/fate/rgb24-mkv @@ -1,5 +1,5 @@ -55270be3b5d393d770a1dfcb19b68271 *tests/data/fate/rgb24-mkv.matroska -58345 tests/data/fate/rgb24-mkv.matroska +09ee413b2d92a6be5e3b18e9e20a1f74 *tests/data/fate/rgb24-mkv.matroska +58342 tests/data/fate/rgb24-mkv.matroska #tb 0: 1/10 #media_type 0: video #codec_id 0: rawvideo