From patchwork Sun Apr 5 15:59:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18664 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 49AE944BE3F for ; Sun, 5 Apr 2020 19:00:06 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 31F3F680C83; Sun, 5 Apr 2020 19:00:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4655F680C46 for ; Sun, 5 Apr 2020 18:59:59 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id a25so14463359wrd.0 for ; Sun, 05 Apr 2020 08:59:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JcRfnoeY2PHmw1hlSVhQGnKK0gFV8LuAtbKDAsKRj60=; b=c5tznrnoX/7YlfCQcSyGo/FEOTu3W+40ztLZRHooObOVhWnr7YlCxSBH7aEhF+DTQv LZrCwUuu3u+jIfYQYMEBSJQFFm3H+gD5PR9aG/RkVXXh9d6CC0Jz7V8VFzzxJr8tRfN5 GB+4rp8wpxXp4+7hiYsAhUOUfoSCBDHi4hn3dqgP4ioi9HnGzywRsF284V3NdJMefvVy 9AR5eEVifTQvBAaJXTdNGHphf4Xij1kgPurPvz7a7wvT3PrHQwtmrJJgoALari6YQqDm wozbPXMCDG7SVqkDiszzDlLlOLplUn4w2yXUJAGfzVDdMvlZvuwMaRGQdgWEkoK1Hg+H 02yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JcRfnoeY2PHmw1hlSVhQGnKK0gFV8LuAtbKDAsKRj60=; b=kkIj6G9ye9/0tWLzmh6xI3ZOX719IZMcJ++KfqvWor0VHatlXXedYjip4dEq9X3zBg INwauf6or/iZBJTu2zllZ2QC8dsjbGRKlsfrfrpkvl8KmF0qTf3yJKhUK5UXYqD8RE1t muki+cwefn99OEqgJ4LWpv98qQ26IWhfo52uEWGKY8+76RyIfqPO9hF+v+ob/nCgLhLW ZpfacjoBHAA7V3HWPw6M59QwAhrgoKa1jo+k/Tc3zTQJBZ4nrjA7MpIK0uV0ykt97uix sP6jyqR3sMx9fQxwJ9Uii2iBNSiVpiUngiKpDMIfQA/SAiJlHznB1PsRqTfN33JeIJzV TJPA== X-Gm-Message-State: AGi0PuZwfvUBE5F87h1wse3p41fUVkfWFvIPA0mRMjZTSIiopXjOO6Gg cQRr5+gciPp/WU9mTz97g91KpIaI X-Google-Smtp-Source: APiQypK2DVsNGhUddA7qq4PMPB++sKZ4C8vcPWvpcOmUsOMAA35SKMNLNG5B4QIbQ9ArIx/z5GXH3g== X-Received: by 2002:a5d:6885:: with SMTP id h5mr12321573wru.166.1586102398230; Sun, 05 Apr 2020 08:59:58 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.08.59.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 08:59:57 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:09 +0200 Message-Id: <20200405155928.9323-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/20] avformat/matroskaenc: Ensure that ChapterUID are != 0 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" AVChapters have an int as id field and therefore this value can appear <= 0. When remuxing from Matroska, this value actually contains the lower 32 bits of the original ChapterUID (which can be 64 bits). In order to ensure that the ChapterUID is always > 0, they were offset as follows (since 07704c61): First max(0, 1LL - chapter[i].id) was computed and stored in an uint32_t. And then the IDs were offset using this value. This has two downsides: 1. It does not ensure that the UID is actually != 0: Namely if there is a chapter with id == INT_MIN, then the offset will be 2^31 + 1 and a chapter with id == INT_MAX will become 2^31 - 1 + 2^31 + 1 = 2^32 = 0, because the actual calculation was performed in 32 bits. 2. As soon as a chapter id appears to be negative, a nontrivial offset is used, so that not even a ChapterUID that only uses 32 bits is preserved. So change this by treating the id as an unsigned value internally and only offset (by 1) if an id vanishes. The actual offsetting then has to be performed in 64 bits in order to make sure that no UINT32_MAX wraps around. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 060e8b7816..a377d092df 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1422,7 +1422,8 @@ static int mkv_write_chapters(AVFormatContext *s) } chapteratom = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERATOM, 0); - put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, c->id + mkv->chapter_id_offset); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, + (uint32_t)c->id + (uint64_t)mkv->chapter_id_offset); put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart); put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend); if (mkv->mode != MODE_WEBM) { @@ -1479,7 +1480,7 @@ static int mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t) } static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid, - unsigned int uid, ebml_master *tag) + uint64_t uid, ebml_master *tag) { AVIOContext *pb; MatroskaMuxContext *mkv = s->priv_data; @@ -1518,7 +1519,7 @@ static int mkv_check_tag_name(const char *name, uint32_t elementid) } static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, uint32_t elementid, - unsigned int uid) + uint64_t uid) { MatroskaMuxContext *mkv = s->priv_data; ebml_master tag; @@ -1612,7 +1613,8 @@ static int mkv_write_tags(AVFormatContext *s) if (!mkv_check_tag(ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID)) continue; - ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, ch->id + mkv->chapter_id_offset); + ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, + (uint32_t)ch->id + (uint64_t)mkv->chapter_id_offset); if (ret < 0) return ret; } @@ -1882,7 +1884,10 @@ static int mkv_write_header(AVFormatContext *s) return ret; for (i = 0; i < s->nb_chapters; i++) - mkv->chapter_id_offset = FFMAX(mkv->chapter_id_offset, 1LL - s->chapters[i]->id); + if (!s->chapters[i]->id) { + mkv->chapter_id_offset = 1; + break; + } ret = mkv_write_chapters(s); if (ret < 0) From patchwork Sun Apr 5 15:59:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18665 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 6A6DB44BE3F for ; Sun, 5 Apr 2020 19:00:07 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 519CD68B1EA; Sun, 5 Apr 2020 19:00:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BF7126881B6 for ; Sun, 5 Apr 2020 19:00:00 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id j19so13160245wmi.2 for ; Sun, 05 Apr 2020 09:00:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=h+ySA1xv0p4nVmeSi/y/PbIYY/2p3E0cf2R2S7fZ1U4=; b=ai+wpWFibqFaXgjsFtkBDC/6h/xLJ0xB3JbgyBt+BcGZWhVp8ZozipqcTU5yUToOiW 36+kVnagyZKddZEkxxzOjFOLmG3OIjM8/tvHm/vYHJi8YODHlRfrUbk0PJEP9QSVX/Xl eHusvDi4Z0ak+ufZ2TbBFUDK/NJpD294vpxqSUCD8uB7wT4Oj2ii+Fscv2D4Lvhmi5js e4bd9g31OgURryaR3fXM3/qYinZp/A7lgkoqZwA5f5kGcmT8qoZet18XHj01gjDxOVFL lH06cj9ZeDgI6iTUSiTt6aEkRWiQM68tXX5f0Sa2jMYJQFuJ8C97yix1VyleriIIgb8z NKHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=h+ySA1xv0p4nVmeSi/y/PbIYY/2p3E0cf2R2S7fZ1U4=; b=rgDIGvIHddmHRXGwXX3rqrzmQPcUMYBng+Gjs1xcqjPQ1by4QKWNHJanij/2gyJfns wmCygIbB4QEspD6o2DdIW+YQmAdju+fud8QggNPac+II+ExMzf4VrKEZez06ApDzDfSe HJ3PNvfQpv7gggBjyABogK3rnR4rkv2w0zfaC/zRMVk+KmvMhM2Um50GlGvtGzMuKHdr RDn8ks3yqx3joW2kMn1I4ImomeJAY2df7qujlJzceorw2b4HYIKroXHmyBMB8wmtPJpY 4Ar4nQb54VeiC3fmidaTHOA/P4UbjIGr33JEdkdSzl+MM56dghWn1o4wByGpOJfIiO5w aS6A== X-Gm-Message-State: AGi0Pub7+1Skt4UZo6cG/iEtfJejY8cMnU84YY8kgS3JJpEOQKfzKdHB +oquVltRGHW8/MT5yfI2TmauqiHj X-Google-Smtp-Source: APiQypJ8y3Px0IeygBJBiDUC9gCBiXU6bKc1PEa7cBiOGfryPnWujfCYffXaiklgyPVEunxScfbTpQ== X-Received: by 2002:a1c:1942:: with SMTP id 63mr19288392wmz.133.1586102399197; Sun, 05 Apr 2020 08:59:59 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.08.59.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 08:59:58 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:10 +0200 Message-Id: <20200405155928.9323-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/20] avformat/matroskaenc: Don't waste bytes writing durations 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Tags in the Matroska file format can be summarized as follows: There is a level 1-element called Tags containing one or many Tag elements each of which in turn contain a Targets element and one or many SimpleTags. Each SimpleTag roughly corresponds to a single key-value pair similar to an AVDictionaryEntry. The Targets meanwhile contains information to what the metadata contained in the SimpleTags contained in the containing Tag applies (i.e. to the file as a whole or to an individual track). The Matroska muxer writes such metadata. It puts the metadata of every stream into a Tag whose Targets makes it point to the corresponding track. And if the output is seekable, then it also adds another Tag for each track whose Targets corresponds to the track and where it reserves space in a SimpleTag to write the duration at the end of the muxing process into. Yet there is no reason to write two Tag elements for a track and a few bytes (typically 24 bytes per track) can be saved by adding the duration SimpleTag to the other Tag of the same track (if it exists). FATE has been updated because the output files changed. (Tests that write to unseekable output (pipes) needn't be updated (no duration tag has ever been written for them) and the same applies to tests without further metadata.) Signed-off-by: Andreas Rheinhardt --- This one is new. libavformat/matroskaenc.c | 48 ++++++++----------- tests/ref/fate/matroska-flac-extradata-update | 4 +- tests/ref/fate/rgb24-mkv | 4 +- tests/ref/lavf/mka | 4 +- tests/ref/lavf/mkv | 4 +- tests/ref/lavf/mkv_attachment | 4 +- tests/ref/seek/lavf-mkv | 44 ++++++++--------- 7 files changed, 53 insertions(+), 59 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index a377d092df..96d8c012ad 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1519,14 +1519,14 @@ static int mkv_check_tag_name(const char *name, uint32_t elementid) } static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, uint32_t elementid, - uint64_t uid) + uint64_t uid, ebml_master *tag) { MatroskaMuxContext *mkv = s->priv_data; - ebml_master tag; + ebml_master tag2; int ret; AVDictionaryEntry *t = NULL; - ret = mkv_write_tag_targets(s, elementid, uid, &tag); + ret = mkv_write_tag_targets(s, elementid, uid, tag ? tag : &tag2); if (ret < 0) return ret; @@ -1538,7 +1538,9 @@ static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, uint32_t elementid } } - end_ebml_master(mkv->tags_bc, tag); + if (!tag) + end_ebml_master(mkv->tags_bc, tag2); + return 0; } @@ -1556,53 +1558,43 @@ static int mkv_check_tag(AVDictionary *m, uint32_t elementid) static int mkv_write_tags(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; + ebml_master tag, *tagp; int i, ret; ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL); if (mkv_check_tag(s->metadata, 0)) { - ret = mkv_write_tag(s, s->metadata, 0, 0); + ret = mkv_write_tag(s, s->metadata, 0, 0, NULL); if (ret < 0) return ret; } + tagp = (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live ? &tag : NULL; for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) continue; - if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID)) + if (!tagp && !mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID)) continue; - ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1); + ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, + i + 1, tagp); if (ret < 0) return ret; - } - - if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { - for (i = 0; i < s->nb_streams; i++) { - AVIOContext *pb; - AVStream *st = s->streams[i]; - ebml_master tag_target; - ebml_master tag; - if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) - continue; - - ret = mkv_write_tag_targets(s, MATROSKA_ID_TAGTARGETS_TRACKUID, - i + 1, &tag_target); - if (ret < 0) - return ret; - pb = mkv->tags_bc; + if (tagp) { + AVIOContext *pb = mkv->tags_bc; + ebml_master simpletag; - tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0); + simpletag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0); put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION"); mkv->tracks[i].duration_offset = avio_tell(pb); // Reserve space to write duration as a 20-byte string. // 2 (ebml id) + 1 (data size) + 20 (data) put_ebml_void(pb, 23); + end_ebml_master(pb, simpletag); end_ebml_master(pb, tag); - end_ebml_master(pb, tag_target); } } @@ -1614,7 +1606,8 @@ static int mkv_write_tags(AVFormatContext *s) continue; ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, - (uint32_t)ch->id + (uint64_t)mkv->chapter_id_offset); + (uint32_t)ch->id + (uint64_t)mkv->chapter_id_offset, + NULL); if (ret < 0) return ret; } @@ -1628,7 +1621,8 @@ static int mkv_write_tags(AVFormatContext *s) if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID)) continue; - ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, attachment->fileuid); + ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, + attachment->fileuid, NULL); if (ret < 0) return ret; } diff --git a/tests/ref/fate/matroska-flac-extradata-update b/tests/ref/fate/matroska-flac-extradata-update index 743486c974..f274e1a75d 100644 --- a/tests/ref/fate/matroska-flac-extradata-update +++ b/tests/ref/fate/matroska-flac-extradata-update @@ -1,5 +1,5 @@ -2b363aecd6422c3ce9964983f5d0f3ef *tests/data/fate/matroska-flac-extradata-update.matroska -2049 tests/data/fate/matroska-flac-extradata-update.matroska +5070c157123b54e218c7e0a45d5606c8 *tests/data/fate/matroska-flac-extradata-update.matroska +1977 tests/data/fate/matroska-flac-extradata-update.matroska #extradata 0: 34, 0x7acb09e7 #extradata 1: 34, 0x7acb09e7 #extradata 2: 34, 0x443402dd diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv index 43b4ee2e19..686c45ebfb 100644 --- a/tests/ref/fate/rgb24-mkv +++ b/tests/ref/fate/rgb24-mkv @@ -1,5 +1,5 @@ -92861b36a8220a3dae10d91cba614892 *tests/data/fate/rgb24-mkv.matroska -58216 tests/data/fate/rgb24-mkv.matroska +f9feab2a7ed8f1049df1b70982291505 *tests/data/fate/rgb24-mkv.matroska +58192 tests/data/fate/rgb24-mkv.matroska #tb 0: 1/10 #media_type 0: video #codec_id 0: rawvideo diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka index e8239442e9..f212097bac 100644 --- a/tests/ref/lavf/mka +++ b/tests/ref/lavf/mka @@ -1,3 +1,3 @@ -58936d3ad4eb1372bd2e5845963fe17c *tests/data/lavf/lavf.mka -43563 tests/data/lavf/lavf.mka +9bd06ae5291de75c19a60c3f39db4c09 *tests/data/lavf/lavf.mka +43538 tests/data/lavf/lavf.mka tests/data/lavf/lavf.mka CRC=0x3a1da17e diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv index 4d73fbf39d..04b554bb56 100644 --- a/tests/ref/lavf/mkv +++ b/tests/ref/lavf/mkv @@ -1,3 +1,3 @@ -6ec6d6a058a85bf616e0b981bb8e383f *tests/data/lavf/lavf.mkv -320466 tests/data/lavf/lavf.mkv +85ef0666b3ad642221793b1c4f985011 *tests/data/lavf/lavf.mkv +320418 tests/data/lavf/lavf.mkv tests/data/lavf/lavf.mkv CRC=0xec6c3c68 diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment index 2e9711483f..56b1078d4a 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -41b4f132ada6e0faedf92e909526a899 *tests/data/lavf/lavf.mkv_attachment -472617 tests/data/lavf/lavf.mkv_attachment +c339e42793d2a3cb1b8e99fc7a60de31 *tests/data/lavf/lavf.mkv_attachment +472569 tests/data/lavf/lavf.mkv_attachment tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68 diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv index 223e098829..a3dce35d86 100644 --- a/tests/ref/seek/lavf-mkv +++ b/tests/ref/seek/lavf-mkv @@ -1,48 +1,48 @@ -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 714 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 666 size: 208 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 ret:-1 st: 1 flags:0 ts: 2.577000 ret: 0 st: 1 flags:1 ts: 1.471000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320187 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320139 size: 209 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146898 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146850 size: 27925 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 ret:-1 st: 0 flags:0 ts: 2.153000 ret: 0 st: 0 flags:1 ts: 1.048000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 ret: 0 st: 1 flags:0 ts:-0.058000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 714 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 666 size: 208 ret: 0 st: 1 flags:1 ts: 2.836000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320187 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320139 size: 209 ret:-1 st:-1 flags:0 ts: 1.730004 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146898 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146850 size: 27925 ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 ret:-1 st: 1 flags:0 ts: 1.307000 ret: 0 st: 1 flags:1 ts: 0.201000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 714 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 666 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 ret: 0 st: 0 flags:0 ts: 0.883000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 ret: 0 st: 0 flags:1 ts:-0.222000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 ret:-1 st: 1 flags:0 ts: 2.672000 ret: 0 st: 1 flags:1 ts: 1.566000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320187 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320139 size: 209 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146898 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146850 size: 27925 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 From patchwork Sun Apr 5 15:59:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18666 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 69C3B44BE3F for ; Sun, 5 Apr 2020 19:00:09 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5569668B303; Sun, 5 Apr 2020 19:00:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4F00F68B1B3 for ; Sun, 5 Apr 2020 19:00:01 +0300 (EEST) Received: by mail-wm1-f68.google.com with SMTP id z7so12128350wmk.1 for ; Sun, 05 Apr 2020 09:00:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UWcaxdu9K4akJ+sWaH4xeegobRis5gP3mIQvcJe7RHs=; b=vPow1t+G8fK2KFjV2RRFL8JUrvZheXz2sHzdzPtiX7qQy9qELc6lIktxujYeW3zuWR FD6/Ecn5AOKAY5GZuJUErfLaUp9NcafbXssGEbuYaNsV655X+b3Y1mE8Nso3R3B9rZuw dUuyqIVRVDEhYyRGUb0HY6RDeY1EaeVx+3RZ1dNm/4q8UXoboOS2BHoDNdVYHgw5Yprf WbkjZMTe0JV8hVChZoQYp7uNllb6Vr3TMctivilJUhyne1B7qD1anVHLH94eeLjqgMBz cUWHuTvRphFNJWxfZpo2JXsNUAyCuGOcXjvzoBQ/bx9MILSSP/WUcG/4I8Km7IyM4FIt 0gDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UWcaxdu9K4akJ+sWaH4xeegobRis5gP3mIQvcJe7RHs=; b=lPhDXB2yo6knoLH+T9kHXJiBNZ18OFz512/YBNQgPnBcrCyCOldU09DoTTssJpdsg5 sTOpb5haV5SKe1rFeD6UvbVPqn5R6dlPybqahOuEDTmZ5SFEUW/KEeqDzLodVB18f43S RGa6oHDVR0fh+o/pMo/0cd5ktawXJiTX0Mb9yRXjY6UzTIp5hi/3l/PyMCY8R7Xwo9Uf vI8mFSwZCnq5tv1CqKN01W73bz5egLej6spTezHR5OQxEJ4g3kL9sRFQZC7wmdUW6kEb /bWfoWyukP9/WBemlfpeoFCCEzdatL9NX8QRZWed6wLWxFrRxbl5Rf+9F3QCKeeZiG5k hoYA== X-Gm-Message-State: AGi0PuZI1ybU0ogiSdP8RMsngjE6wJLvATQleJV+rM350vyA0Ms4fV5X u015vv1jQOxibiZYLatRl4GJ2PJU X-Google-Smtp-Source: APiQypKSj9c/GzeOEnkzu8upaE0cob/5fTGc9ycXtxkTGsWF2mUVsAF0zML15NmiTikK8teYKANcYQ== X-Received: by 2002:a05:600c:204b:: with SMTP id p11mr8854577wmg.92.1586102400253; Sun, 05 Apr 2020 09:00:00 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.08.59.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 08:59:59 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:11 +0200 Message-Id: <20200405155928.9323-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/20] avformat/matroskaenc: Use random TrackUID 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Up until now, the TrackUID of a Matroska track which is supposed to be random was not random at all: It always coincided with the TrackNumber which is usually the 1-based index of the corresponding stream in the array of AVStreams. This has been changed: It is now set via an AVLFG if AVFMT_FLAG_BITEXACT is not set. Otherwise it is set like it is set now (the only change happens if an explicit track number has been chosen via dash_track_number, because the system used in the normal situation is now used, too). In particular, no FATE tests need to be updated. This also fixes a bug in case the dash_track_number option was used: In this case the TrackUID was set to the provided number, but the tags were written with a TagTrackUID simply based upon the index, so that the tags didn't apply to the track they ought to apply to. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 47 +++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 96d8c012ad..d2046193ee 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -95,6 +95,7 @@ typedef struct mkv_cues { typedef struct mkv_track { int write_dts; int has_cue; + uint64_t uid; int sample_rate; int64_t sample_rate_offset; int64_t last_timestamp; @@ -1117,8 +1118,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER, mkv->is_dash ? mkv->dash_track_number : i + 1); - put_ebml_uint (pb, MATROSKA_ID_TRACKUID, - mkv->is_dash ? mkv->dash_track_number : i + 1); + put_ebml_uint (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid); put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) if ((tag = av_dict_get(st->metadata, "title", NULL, 0))) @@ -1571,6 +1571,7 @@ static int mkv_write_tags(AVFormatContext *s) tagp = (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live ? &tag : NULL; for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; + mkv_track *track = &mkv->tracks[i]; if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) continue; @@ -1579,7 +1580,7 @@ static int mkv_write_tags(AVFormatContext *s) continue; ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, - i + 1, tagp); + track->uid, tagp); if (ret < 0) return ret; if (tagp) { @@ -1785,10 +1786,6 @@ static int mkv_write_header(AVFormatContext *s) version = 4; } - mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks)); - if (!mkv->tracks) { - return AVERROR(ENOMEM); - } ebml_header = start_ebml_master(pb, EBML_ID_HEADER, MAX_EBML_HEADER_SIZE); put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1); put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1); @@ -2609,8 +2606,28 @@ static int webm_query_codec(enum AVCodecID codec_id, int std_compliance) return 0; } +static uint64_t mkv_get_uid(const mkv_track *tracks, int i, AVLFG *c) +{ + while (1) { + uint64_t uid; + int k; + uid = (uint64_t)av_lfg_get(c) << 32; + uid |= av_lfg_get(c); + if (!uid) + continue; + for (k = 0; k < i; k++) { + if (tracks[k].uid == uid) + break; + } + if (k == i) + return uid; + } +} + static int mkv_init(struct AVFormatContext *s) { + MatroskaMuxContext *mkv = s->priv_data; + AVLFG c; int i; if (s->nb_streams > MAX_TRACKS) { @@ -2639,7 +2656,23 @@ static int mkv_init(struct AVFormatContext *s) s->internal->avoid_negative_ts_use_pts = 1; } + mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks)); + if (!mkv->tracks) { + return AVERROR(ENOMEM); + } + + if (!(s->flags & AVFMT_FLAG_BITEXACT)) + av_lfg_init(&c, av_get_random_seed()); + for (i = 0; i < s->nb_streams; i++) { + mkv_track *track = &mkv->tracks[i]; + + if (s->flags & AVFMT_FLAG_BITEXACT) { + track->uid = i + 1; + } else { + track->uid = mkv_get_uid(mkv->tracks, i, &c); + } + // ms precision is the de-facto standard timescale for mkv files avpriv_set_pts_info(s->streams[i], 64, 1, 1000); } From patchwork Sun Apr 5 15:59:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18667 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 767AD44BE3F for ; Sun, 5 Apr 2020 19:00:10 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5B4F268B366; Sun, 5 Apr 2020 19:00:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7178768B213 for ; Sun, 5 Apr 2020 19:00:02 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id s8so12282508wrt.7 for ; Sun, 05 Apr 2020 09:00:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7C97MRB9M/nR+brk//umK2OrDV45oainxlR1I53Otcw=; b=nzsfxksn5JrTzycWBJdpyfv5sROcK+Tx4tTzkTJ76pEcnPsDMidaa/cbC063NgN59+ SOj9/Gv8xGnzAp7pGgUEcfiQLb5K0OBCHxPzqDKrSlFaz/2ujfu3YPcAf/nQvuMXymOh Nwy0bWdYC6jcbRt4kzSPy9+ShWx6YtNIO+2YCGN7fvX5ASe3FwNOdA+SfewugUqwF/BG VoGVOzPV7cI7jhz5kJRb9O4YPNiXtemlBtPo+Blk/PlJsafmpo3OlPEWhfFN2JaoBDmr HgsuWuZJgFji14T1hVop0b5ASsoYI5fJQ+Cu4YcuPrOU/3/QjUDSkM6nZOkG4AB+2AiW rWUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7C97MRB9M/nR+brk//umK2OrDV45oainxlR1I53Otcw=; b=Ts1gPAcOTpnNyr7u1vq1MWTT2x9WEmV3tkKcQ2s71KZ+SF8gfxvg9Hz2Gdr8YCML6B voR5ozD/4DBrKsOIpz7HslAh7T8Vi5144kx8JrLGBkKQj3q9rBvnZM2O6giOj0IJbott 1/+cFXcIczII/+RoTaKUFgl8Uz9CEFnRcekSwlzqEr80p44yj+zmchIaq+HPiviCLeiK FcDhK+koggd+9+33yHIg8hy86wG7vO8ioEP2SGIPAW04SME5PHO+Izw/AE+W3D8ogjSy afB/MeGGjzOqvAGj4hJeYeCHEnBhZWw6/7q1sEZhXYYXkHRUMfsNpKYPuWp7GQMegcke 7MNQ== X-Gm-Message-State: AGi0PuaCP0t5EMjk4G9RP5yRqwXPF/EYbEEzZElu3IlB7K6Pj8nAlbTO xswqfbC3CrsrHn3qoCKaPgm52SC2 X-Google-Smtp-Source: APiQypLTrJeBp4J+9iJxJrng7qx3vYSamUWaGSJqu3EY2bEYtnIImC2fqiOY05K/pCL8H6WD59Ua9A== X-Received: by 2002:a5d:414f:: with SMTP id c15mr21200515wrq.60.1586102401477; Sun, 05 Apr 2020 09:00:01 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:00 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:12 +0200 Message-Id: <20200405155928.9323-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/20] avformat/matroskaenc: Reuse random seed 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This commit reuses the random seed generated in mkv_init() (to determine the TrackUIDs) for the SegmentUID in order to avoid a potentially expensive call to av_get_random_seed(). Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index d2046193ee..b93c50cb01 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -161,6 +161,8 @@ typedef struct MatroskaMuxContext { int wrote_chapters; int allow_raw_vfw; + + uint32_t segment_uid[4]; } MatroskaMuxContext; /** 2 bytes * 7 for EBML IDs, 7 1-byte EBML lengths, 6 1-byte uint, @@ -1821,15 +1823,7 @@ static int mkv_write_header(AVFormatContext *s) put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT); if (mkv->mode != MODE_WEBM) { - uint32_t segment_uid[4]; - AVLFG lfg; - - av_lfg_init(&lfg, av_get_random_seed()); - - for (i = 0; i < 4; i++) - segment_uid[i] = av_lfg_get(&lfg); - - put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16); + put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 16); } } else { const char *ident = "Lavf"; @@ -2661,9 +2655,14 @@ static int mkv_init(struct AVFormatContext *s) return AVERROR(ENOMEM); } - if (!(s->flags & AVFMT_FLAG_BITEXACT)) + if (!(s->flags & AVFMT_FLAG_BITEXACT)) { av_lfg_init(&c, av_get_random_seed()); + // Calculate the SegmentUID now in order not to waste our random seed. + for (i = 0; i < 4; i++) + mkv->segment_uid[i] = av_lfg_get(&c); + } + for (i = 0; i < s->nb_streams; i++) { mkv_track *track = &mkv->tracks[i]; From patchwork Sun Apr 5 15:59:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18668 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B6D8F44BE3F for ; Sun, 5 Apr 2020 19:00:11 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A25F368B21B; Sun, 5 Apr 2020 19:00:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7FB746882A2 for ; Sun, 5 Apr 2020 19:00:03 +0300 (EEST) Received: by mail-wm1-f66.google.com with SMTP id x25so1104518wmc.0 for ; Sun, 05 Apr 2020 09:00:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Io/g4prOlvUeSkPSsvwE9hxuxKko0T/NOE4678gKJkk=; b=i+LcnVEaHGNZHELrVavSvn8Xbksf8Augf0yMWOc7htK/WGp55H+XC5q7MDYnFmJpaP vHMNQHHv+zcp6BQ1i6lu4BGCut12igovv7gPuK/OE84Lg8626XLT8ByKMOei+XAr1xtY KCj1RFqLece5WA4uEqsI3rfhS5CancQ+wsbnFA3H+Ak9cIhSZSJJZ7pClIxD3KOUpytD YO9jZ8MwVOLw219UoA6/ytklj8eBOSW4UrTfEyV3+MtppqdEXNIdYkOmKSntcg05fNbl 8yHEfOEjpUGV4l4UqPTfQnxHp+XGjz9TWvYpoG/E/ozetbF9aK7bURcrtdtEOl8SZ1q4 JudA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Io/g4prOlvUeSkPSsvwE9hxuxKko0T/NOE4678gKJkk=; b=bD9xOELjeWXmdiduMryJybsWomB8a+P4GgJrjr48340vouuSIPh5AqQwE362mKLGKz 78nhUlMV2FKJd+Jd/3r0lGm85V/sk16TIITTHcNxDoAp+JObJ2s4yxHpzZpbG36VMsyn zQvm1yID+7cYUOiWiRgKVz9kLzocaRzE9E80wAgCMl+WlIYiHLyODn3kGkgNzfTMAe6h 4vE5b2pq7HzYPyiRx8441MgRFaKzIK0nl0YYY3XF1z0O2jCJqQvf7zpwgSA6GDpWyH0c GoiS2HChThBRRWnZKKqn9aZ2vrHDnuLvQVVtq1mVLnWpgPze3v+LjyRZFr/OKG14yLOA 0ZeQ== X-Gm-Message-State: AGi0PubfA0Os0Q7tphyqHCe0A2BYlXTBiyDlIyY+p9Y4paZcfY4Tboo0 f2kQ9dbndGtLkP2CScUYQcsheCui X-Google-Smtp-Source: APiQypI9tJyrX0OTunMeZk5iLxGyf89wpk0JovlCLIPptnND1GN1+B0FqW3FSbVPIkKpGavPBFVP7Q== X-Received: by 2002:a1c:6285:: with SMTP id w127mr19492736wmb.133.1586102402460; Sun, 05 Apr 2020 09:00:02 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:01 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:13 +0200 Message-Id: <20200405155928.9323-6-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/20] avformat/matroskaenc: Remove allocations for Attachments 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If there are Attachments to write, the Matroska muxer currently allocates two objects: An array that contains an entry for each AttachedFile containing just the stream index of the corresponding stream and the FileUID used for this AttachedFile; and a structure with a pointer to said array and a counter for said array. These uids are generated via code special to Attachments: It uses an AVLFG in the normal and a sha of the attachment data in the bitexact case. (Said sha requires an allocation, too.) But now that an uid is generated for each stream in mkv_init(), there is no need any more to use special code for generating the FileUIDs of AttachedFiles: One can simply use the uid already generated for the corresponding stream. And this makes the whole allocations of the structures for AttachedFiles as well as the structures itself superfluous. They have been removed. In case AVFMT_FLAG_BITEXACT is set, the uids will be different from the old ones which is the reason why the FATE-test lavf-mkv_attachment needed to be updated. The old method had the drawback that two AttachedFiles with the same data would have the same FileUID. The new one doesn't. Also notice that the dynamic buffer used to write the Attachments leaks if an error happens when writing the buffer. By removing the allocations potential sources of errors have been removed. Signed-off-by: Andreas Rheinhardt --- This will be the last patch of my "remove allocations for"-series; after this there won't be any allocations to remove any more. libavformat/matroskaenc.c | 63 +++++------------------------------ tests/ref/lavf/mkv_attachment | 4 +-- 2 files changed, 11 insertions(+), 56 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b93c50cb01..135d5e3abd 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -50,7 +50,6 @@ #include "libavutil/random_seed.h" #include "libavutil/rational.h" #include "libavutil/samplefmt.h" -#include "libavutil/sha.h" #include "libavutil/stereo3d.h" #include "libavcodec/xiph.h" @@ -105,16 +104,6 @@ typedef struct mkv_track { int64_t ts_offset; } mkv_track; -typedef struct mkv_attachment { - int stream_idx; - uint32_t fileuid; -} mkv_attachment; - -typedef struct mkv_attachments { - mkv_attachment *entries; - int num_entries; -} mkv_attachments; - #define MODE_MATROSKAv2 0x01 #define MODE_WEBM 0x02 @@ -141,7 +130,6 @@ typedef struct MatroskaMuxContext { mkv_seekhead seekhead; mkv_cues cues; mkv_track *tracks; - mkv_attachments *attachments; AVPacket cur_audio_pkt; @@ -403,10 +391,6 @@ static void mkv_deinit(AVFormatContext *s) ffio_free_dyn_buf(&mkv->tags_bc); av_freep(&mkv->cues.entries); - if (mkv->attachments) { - av_freep(&mkv->attachments->entries); - av_freep(&mkv->attachments); - } av_freep(&mkv->tracks); } @@ -1617,15 +1601,18 @@ static int mkv_write_tags(AVFormatContext *s) } if (mkv->have_attachments && mkv->mode != MODE_WEBM) { - for (i = 0; i < mkv->attachments->num_entries; i++) { - mkv_attachment *attachment = &mkv->attachments->entries[i]; - AVStream *st = s->streams[attachment->stream_idx]; + for (i = 0; i < s->nb_streams; i++) { + mkv_track *track = &mkv->tracks[i]; + AVStream *st = s->streams[i]; + + if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT) + continue; if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID)) continue; ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, - attachment->fileuid, NULL); + track->uid, NULL); if (ret < 0) return ret; } @@ -1645,18 +1632,11 @@ static int mkv_write_attachments(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *dyn_cp = NULL, *pb = s->pb; - AVLFG c; int i, ret; if (!mkv->have_attachments) return 0; - mkv->attachments = av_mallocz(sizeof(*mkv->attachments)); - if (!mkv->attachments) - return AVERROR(ENOMEM); - - av_lfg_init(&c, av_get_random_seed()); - mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb)); ret = start_ebml_master_crc32(&dyn_cp, mkv); @@ -1664,20 +1644,14 @@ static int mkv_write_attachments(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; + mkv_track *track = &mkv->tracks[i]; ebml_master attached_file; - mkv_attachment *attachment = mkv->attachments->entries; AVDictionaryEntry *t; const char *mimetype = NULL; - uint32_t fileuid; if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT) continue; - attachment = av_realloc_array(attachment, mkv->attachments->num_entries + 1, sizeof(mkv_attachment)); - if (!attachment) - return AVERROR(ENOMEM); - mkv->attachments->entries = attachment; - attached_file = start_ebml_master(dyn_cp, MATROSKA_ID_ATTACHEDFILE, 0); if (t = av_dict_get(st->metadata, "title", NULL, 0)) @@ -1708,29 +1682,10 @@ static int mkv_write_attachments(AVFormatContext *s) return AVERROR(EINVAL); } - if (s->flags & AVFMT_FLAG_BITEXACT) { - struct AVSHA *sha = av_sha_alloc(); - uint8_t digest[20]; - if (!sha) - return AVERROR(ENOMEM); - av_sha_init(sha, 160); - av_sha_update(sha, st->codecpar->extradata, st->codecpar->extradata_size); - av_sha_final(sha, digest); - av_free(sha); - fileuid = AV_RL32(digest); - } else { - fileuid = av_lfg_get(&c); - } - av_log(s, AV_LOG_VERBOSE, "Using %.8"PRIx32" for attachment %d\n", - fileuid, mkv->attachments->num_entries); - put_ebml_string(dyn_cp, MATROSKA_ID_FILEMIMETYPE, mimetype); put_ebml_binary(dyn_cp, MATROSKA_ID_FILEDATA, st->codecpar->extradata, st->codecpar->extradata_size); - put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, fileuid); + put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, track->uid); end_ebml_master(dyn_cp, attached_file); - - mkv->attachments->entries[mkv->attachments->num_entries].stream_idx = i; - mkv->attachments->entries[mkv->attachments->num_entries++].fileuid = fileuid; } end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0, 0); diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment index 56b1078d4a..08c9c1ebdb 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -c339e42793d2a3cb1b8e99fc7a60de31 *tests/data/lavf/lavf.mkv_attachment -472569 tests/data/lavf/lavf.mkv_attachment +6f68dccaaaf875a0671f47e5b21c8cca *tests/data/lavf/lavf.mkv_attachment +472566 tests/data/lavf/lavf.mkv_attachment tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68 From patchwork Sun Apr 5 15:59:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18672 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 2DFD644BE3F for ; Sun, 5 Apr 2020 19:00:16 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 172DA68B227; Sun, 5 Apr 2020 19:00:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EF62368B1DC for ; Sun, 5 Apr 2020 19:00:04 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id t203so3641700wmt.2 for ; Sun, 05 Apr 2020 09:00:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=uIWuEsSyqgQiK5lJnjcsn0moB+8AYXXjlvB6MD6scb4=; b=ipobjyxRm+pi3LaxGeHPMwlycPtHBbfQS67NteohPveJcuIySbCi772+XoUJ9rJGGj X6Od4f+A7FH8YaEuU/HKIyCwLSgKbmSSzSXd4TBApiwNzFa7XsOgDNu1PWbX69NZaMBm ddoHClIwNF6Szxh464m52QOeHuuHxNywPJhQMYSpibwC/fnyOD6NUZWFLD8SkA9A4xSz B/5OgEaIHtCl7KpDr91LJPoe3xzzdIRfQUaXn3jf9zOAPwzEvDEKY1PvRoAv5251pHaU RA/DwDPmI6CImN/TvC0PdXY4qQMFrrT6AduPossBmz+n0u/UwsiRoIjrL9nxGqb9mKHZ E4+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uIWuEsSyqgQiK5lJnjcsn0moB+8AYXXjlvB6MD6scb4=; b=ZL2Qxq6PtyOogfdNT9rdYKV5FqHkxAfMYXFZrEWAxbQleIBU198RVzfFMnnFKigwio XJq6b2scSzH9tBvkpMMpfXLqOQjvjCrCDMtDCuzPzgGrQYCc0cTQkGM7fE7CcglKku/1 sjqtKR/8E/uFyQni7k9mqfXoQkl4gdInt8XzhYGW0SLxw0hxAha8u3RMGx4KeNpK3tCu GaGZSuIP1x4LaqLysRSApXfTExQ7bpYZx0gGpMJm9/++kHRpvnpJrFO5NX9Bz2+BPNTC 3b1pAtauzcbDwMGNkflIMkOa2hE9ShBDXxP3aY7WV4n3B3w7gFedOj2vRuakFlh5eDRl ELPA== X-Gm-Message-State: AGi0PuY2E/152fnl58xCFNQpzLAhW/sHmBTQQqWb0QWfpjR2bW1oEp7I plnHO0rORTobvPpVWh2byOhMonyr X-Google-Smtp-Source: APiQypLfx7/R0+gt6jVoEsftEmhLJFNSu5y7sbOQ0BK5+gIdx1XMrbVukrPKE7PatTzN5AC3VtnFOQ== X-Received: by 2002:a1c:51:: with SMTP id 78mr17943517wma.157.1586102403527; Sun, 05 Apr 2020 09:00:03 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:02 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:14 +0200 Message-Id: <20200405155928.9323-7-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/20] avformat/matroskaenc: Make output more deterministic 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Using random values for TrackUID and FileUID (as happens when the AVFMT_FLAG_BITEXACT flag is not set) has the obvious downside of making the output indeterministic. This commit mitigates this by writing the potentially random values with a fixed size of eight byte, even if their actual values would fit into less than eight bytes. This ensures that even in non-bitexact mode, the differences between two files generated with the same settings are restricted to a few bytes in the header. (Namely the SegmentUID, the TrackUIDs (in Tracks as well as when referencing them via TagTrackUID), the FileUIDs (in Attachments as well as in TagAttachmentUID) as well as the CRC-32 checksums of the Info, Tracks, Attachments and Tags level-1-elements.) Without this patch, there might be an offset/a size difference between two such files. The FATE-tests had to be updated because the fixed-sized UIDs are also used in bitexact mode. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 16 +++++-- tests/fate/matroska.mak | 2 +- tests/fate/wavpack.mak | 4 +- tests/ref/fate/aac-autobsf-adtstoasc | 4 +- tests/ref/fate/binsub-mksenc | 2 +- tests/ref/fate/matroska-flac-extradata-update | 4 +- tests/ref/fate/rgb24-mkv | 4 +- tests/ref/lavf-fate/av1.mkv | 4 +- tests/ref/lavf/mka | 4 +- tests/ref/lavf/mkv | 4 +- tests/ref/lavf/mkv_attachment | 4 +- tests/ref/seek/lavf-mkv | 44 +++++++++---------- 12 files changed, 53 insertions(+), 43 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 135d5e3abd..cf2bb7b933 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -226,6 +226,16 @@ static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes) avio_w8(pb, (uint8_t)(num >> i * 8)); } +/** + * Write a (random) UID with fixed size to make the output more deterministic + */ +static void put_ebml_uid(AVIOContext *pb, uint32_t elementid, uint64_t uid) +{ + put_ebml_id(pb, elementid); + put_ebml_num(pb, 8, 0); + avio_wb64(pb, uid); +} + static void put_ebml_uint(AVIOContext *pb, uint32_t elementid, uint64_t val) { int i, bytes = 1; @@ -1104,7 +1114,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER, mkv->is_dash ? mkv->dash_track_number : i + 1); - put_ebml_uint (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid); + put_ebml_uid (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid); put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) if ((tag = av_dict_get(st->metadata, "title", NULL, 0))) @@ -1485,7 +1495,7 @@ static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid, *tag = start_ebml_master(pb, MATROSKA_ID_TAG, 0); targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 0); if (elementid) - put_ebml_uint(pb, elementid, uid); + put_ebml_uid(pb, elementid, uid); end_ebml_master(pb, targets); return 0; } @@ -1684,7 +1694,7 @@ static int mkv_write_attachments(AVFormatContext *s) put_ebml_string(dyn_cp, MATROSKA_ID_FILEMIMETYPE, mimetype); put_ebml_binary(dyn_cp, MATROSKA_ID_FILEDATA, st->codecpar->extradata, st->codecpar->extradata_size); - put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, track->uid); + put_ebml_uid(dyn_cp, MATROSKA_ID_FILEUID, track->uid); end_ebml_master(dyn_cp, attached_file); } end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0, 0); diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak index 4b9ee7a872..8cc35d52da 100644 --- a/tests/fate/matroska.mak +++ b/tests/fate/matroska.mak @@ -12,7 +12,7 @@ fate-matroska-prores-header-insertion-bz2: CMD = framecrc -i $(TARGET_SAMPLES)/m FATE_MATROSKA-$(call DEMMUX, MATROSKA, MATROSKA) += fate-matroska-remux fate-matroska-remux: CMD = md5pipe -i $(TARGET_SAMPLES)/vp9-test-vectors/vp90-2-2pass-akiyo.webm -color_trc 4 -c:v copy -fflags +bitexact -strict -2 -f matroska fate-matroska-remux: CMP = oneline -fate-matroska-remux: REF = 49a60ef91cf7302ab7276f9373f8a429 +fate-matroska-remux: REF = 8369f24de64aaa52cf57a699dcdc7d58 FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER VORBIS_PARSER) += fate-matroska-xiph-lacing fate-matroska-xiph-lacing: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/xiph_lacing.mka -c:a copy diff --git a/tests/fate/wavpack.mak b/tests/fate/wavpack.mak index bc7a5cc92f..e3cf4ec632 100644 --- a/tests/fate/wavpack.mak +++ b/tests/fate/wavpack.mak @@ -91,12 +91,12 @@ fate-wavpack-matroskamode: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/special/matros FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-mono fate-wavpack-matroska_mux-mono: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -fflags +bitexact -f matroska fate-wavpack-matroska_mux-mono: CMP = oneline -fate-wavpack-matroska_mux-mono: REF = a9da0444604848080b08e32de19f42d9 +fate-wavpack-matroska_mux-mono: REF = 7ebd447336f0ba76b41a3f32d1551f05 FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-61 fate-wavpack-matroska_mux-61: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -fflags +bitexact -f matroska fate-wavpack-matroska_mux-61: CMP = oneline -fate-wavpack-matroska_mux-61: REF = 60812e377937456863a3c899ee068060 +fate-wavpack-matroska_mux-61: REF = c95bca3c3023230a324c633942c453d5 FATE_SAMPLES_AVCONV += $(FATE_WAVPACK-yes) fate-wavpack: $(FATE_WAVPACK-yes) diff --git a/tests/ref/fate/aac-autobsf-adtstoasc b/tests/ref/fate/aac-autobsf-adtstoasc index 45b68b62bd..f1c6f889d4 100644 --- a/tests/ref/fate/aac-autobsf-adtstoasc +++ b/tests/ref/fate/aac-autobsf-adtstoasc @@ -1,5 +1,5 @@ -d10b73732b32f6b2f08885b40c41c77f *tests/data/fate/aac-autobsf-adtstoasc.matroska -6606 tests/data/fate/aac-autobsf-adtstoasc.matroska +9d0c81ce285a84c0137316004d091d95 *tests/data/fate/aac-autobsf-adtstoasc.matroska +6620 tests/data/fate/aac-autobsf-adtstoasc.matroska #extradata 0: 2, 0x0030001c #tb 0: 1/1000 #media_type 0: audio diff --git a/tests/ref/fate/binsub-mksenc b/tests/ref/fate/binsub-mksenc index 3266501de6..b4c08e57dd 100644 --- a/tests/ref/fate/binsub-mksenc +++ b/tests/ref/fate/binsub-mksenc @@ -1 +1 @@ -03d376cc2e8622e7af540d4d9809dbf7 +3dd15fa67a1df541aa89565ceb7047cf diff --git a/tests/ref/fate/matroska-flac-extradata-update b/tests/ref/fate/matroska-flac-extradata-update index f274e1a75d..dfb2851b0f 100644 --- a/tests/ref/fate/matroska-flac-extradata-update +++ b/tests/ref/fate/matroska-flac-extradata-update @@ -1,5 +1,5 @@ -5070c157123b54e218c7e0a45d5606c8 *tests/data/fate/matroska-flac-extradata-update.matroska -1977 tests/data/fate/matroska-flac-extradata-update.matroska +83aca2772c52f6f802cac288f889382b *tests/data/fate/matroska-flac-extradata-update.matroska +2019 tests/data/fate/matroska-flac-extradata-update.matroska #extradata 0: 34, 0x7acb09e7 #extradata 1: 34, 0x7acb09e7 #extradata 2: 34, 0x443402dd diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv index 686c45ebfb..fc73604ebc 100644 --- a/tests/ref/fate/rgb24-mkv +++ b/tests/ref/fate/rgb24-mkv @@ -1,5 +1,5 @@ -f9feab2a7ed8f1049df1b70982291505 *tests/data/fate/rgb24-mkv.matroska -58192 tests/data/fate/rgb24-mkv.matroska +661b2d8ad9b7c5bf7389d3408c3695c4 *tests/data/fate/rgb24-mkv.matroska +58206 tests/data/fate/rgb24-mkv.matroska #tb 0: 1/10 #media_type 0: video #codec_id 0: rawvideo diff --git a/tests/ref/lavf-fate/av1.mkv b/tests/ref/lavf-fate/av1.mkv index bd8ae6eefa..28a8c890c7 100644 --- a/tests/ref/lavf-fate/av1.mkv +++ b/tests/ref/lavf-fate/av1.mkv @@ -1,3 +1,3 @@ -be4903a6a6710043383c8f38a535a8d3 *tests/data/lavf-fate/lavf.av1.mkv -55636 tests/data/lavf-fate/lavf.av1.mkv +339f457b665fb5e8652fd50f2d3c4823 *tests/data/lavf-fate/lavf.av1.mkv +55650 tests/data/lavf-fate/lavf.av1.mkv tests/data/lavf-fate/lavf.av1.mkv CRC=0x7c27cc15 diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka index f212097bac..b3c4117d92 100644 --- a/tests/ref/lavf/mka +++ b/tests/ref/lavf/mka @@ -1,3 +1,3 @@ -9bd06ae5291de75c19a60c3f39db4c09 *tests/data/lavf/lavf.mka -43538 tests/data/lavf/lavf.mka +0d48d93057f14704f6b839bb15e7328a *tests/data/lavf/lavf.mka +43552 tests/data/lavf/lavf.mka tests/data/lavf/lavf.mka CRC=0x3a1da17e diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv index 04b554bb56..014ea06003 100644 --- a/tests/ref/lavf/mkv +++ b/tests/ref/lavf/mkv @@ -1,3 +1,3 @@ -85ef0666b3ad642221793b1c4f985011 *tests/data/lavf/lavf.mkv -320418 tests/data/lavf/lavf.mkv +06c38b55305367672a7fc4efb71947bc *tests/data/lavf/lavf.mkv +320446 tests/data/lavf/lavf.mkv tests/data/lavf/lavf.mkv CRC=0xec6c3c68 diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment index 08c9c1ebdb..f297d407c8 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -6f68dccaaaf875a0671f47e5b21c8cca *tests/data/lavf/lavf.mkv_attachment -472566 tests/data/lavf/lavf.mkv_attachment +cf27537eabb1f4f222e7391aa4f5250d *tests/data/lavf/lavf.mkv_attachment +472601 tests/data/lavf/lavf.mkv_attachment tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68 diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv index a3dce35d86..e9f1e521f2 100644 --- a/tests/ref/seek/lavf-mkv +++ b/tests/ref/seek/lavf-mkv @@ -1,48 +1,48 @@ -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 666 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 694 size: 208 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 ret:-1 st: 1 flags:0 ts: 2.577000 ret: 0 st: 1 flags:1 ts: 1.471000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320139 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320167 size: 209 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146850 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146878 size: 27925 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 ret:-1 st: 0 flags:0 ts: 2.153000 ret: 0 st: 0 flags:1 ts: 1.048000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 ret: 0 st: 1 flags:0 ts:-0.058000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 666 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 694 size: 208 ret: 0 st: 1 flags:1 ts: 2.836000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320139 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320167 size: 209 ret:-1 st:-1 flags:0 ts: 1.730004 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146850 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146878 size: 27925 ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 ret:-1 st: 1 flags:0 ts: 1.307000 ret: 0 st: 1 flags:1 ts: 0.201000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 666 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 694 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 ret: 0 st: 0 flags:0 ts: 0.883000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292298 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 ret: 0 st: 0 flags:1 ts:-0.222000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 ret:-1 st: 1 flags:0 ts: 2.672000 ret: 0 st: 1 flags:1 ts: 1.566000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320139 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320167 size: 209 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146850 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146878 size: 27925 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 882 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 From patchwork Sun Apr 5 15:59:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18673 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 5605944BE3F for ; Sun, 5 Apr 2020 19:00:17 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3D7D168B481; Sun, 5 Apr 2020 19:00:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A164E68B1DC for ; Sun, 5 Apr 2020 19:00:05 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id p10so14409924wrt.6 for ; Sun, 05 Apr 2020 09:00:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ni8QELsvjygjV0XmGZmuEEmtu6WGqS4wGaXxHHzuylI=; b=HFgSidEimdWmVhAuFtSYMelEr09cLP2N6nhDRGULAChb27wAz2HI0u4/jJ+QldkmuH MqeNVDjIhvNjhTHCYk7Sm/SZbVJqeMxmnbmpH4Ny4oo4eUaXSLmHSpMuwvoU8fSu8+B8 JAaDHSI9AlA8lVzWTKfv7qwWwIY914xK5e8oytSUiX6e7QcVA029JzMM12xp3F3kU7v/ LCJED2lOXNLYqf2ahc3nT3llZvx7nxzO8STroMpwW0lLS5DzwvXa9zg86YpmYUq56TqX X4AJcjoY0xnijKh6G5Z+o8pj5zKk/O+6lS2arYk9vHdsjUzc2/QDScEBBH7mbeKvwbSQ 7jkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ni8QELsvjygjV0XmGZmuEEmtu6WGqS4wGaXxHHzuylI=; b=O73hL4l+z3IPqy0rgf1P3OKJxJgKe8Mmb5HEBJ9qKBUmAnbUijYsoBK08QJgPfc80Y yJDnUdHc+BSR+X4SnVfgbByrBYwKsjU34VPIhhRBt3Ll9+28aXxkVn/jwqEbPNeXaJ3C h5RbAyaLNZJYfCKhz+WWqYpm+BOmsmmKhjKyxEFtkSheAnv8FcFLqdbDUb1QbMn/dnBZ 892eGBeTQCG3dPls1roDsFu5eHO7tSguhhOZ6wjicRfmcFXVtvO+Izdfz/6kwUHdTKUF f5LbLEqa83y7B4I6bIG4Xra5iLi7PttQEJvrtgGixSsrGbI3KQfxKpKcPEHtAO6Lmhn4 sG8w== X-Gm-Message-State: AGi0PuZgG/Opz+slQn67+j7teW22MzllxPaSXbM0b+K80ZWipV9HG715 xRQ/zLLpPt2pvedAhyoaK/FwbPfX X-Google-Smtp-Source: APiQypLTNArSzCyK4VE2IjkHQ2Vr0Bd0qmQtnTqa7Ywx0MWA8dqY8zBKbyY86UvSnlyEIy7bRE2vxw== X-Received: by 2002:a5d:4acd:: with SMTP id y13mr19547016wrs.61.1586102404580; Sun, 05 Apr 2020 09:00:04 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:04 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:15 +0200 Message-Id: <20200405155928.9323-8-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/20] avformat/matroskaenc: Ignore AttachedFiles for track limit 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Attachments are streams in FFmpeg, but they are not tracks in Matroska. Yet they were counted when checking a limit for the number of tracks that the Matroska muxer imposes. This is unnecessary and has been changed. Also use unsigned variables for the variables denoting TrackNumbers as negative TrackNumbers are impossible. (The Matroska file format actually has practically no limit on the number of tracks and this is purely what our muxer supports. But even if this limit were removed/relaxed in the future, it still makes sense to use small TrackNumbers as this patch does, because greater numbers need more bytes to encode.) Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index cf2bb7b933..4607ddd6ad 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -95,6 +95,7 @@ typedef struct mkv_track { int write_dts; int has_cue; uint64_t uid; + unsigned track_num; int sample_rate; int64_t sample_rate_offset; int64_t last_timestamp; @@ -1112,8 +1113,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); - put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER, - mkv->is_dash ? mkv->dash_track_number : i + 1); + put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER, mkv->tracks[i].track_num); put_ebml_uid (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid); put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) @@ -1966,7 +1966,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, int64_t ts = track->write_dts ? pkt->dts : pkt->pts; uint64_t additional_id; int64_t discard_padding = 0; - uint8_t track_number = (mkv->is_dash ? mkv->dash_track_number : (pkt->stream_index + 1)); + unsigned track_number = track->track_num; ebml_master block_group, block_additions, block_more; ts += track->ts_offset; @@ -1976,7 +1976,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, av_log(s, AV_LOG_DEBUG, "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", " "duration %" PRId64 " at relative offset %" PRId64 " in cluster " - "at offset %" PRId64 ". TrackNumber %d, keyframe %d\n", + "at offset %" PRId64 ". TrackNumber %u, keyframe %d\n", pkt->size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb), mkv->cluster_pos, track_number, keyframe != 0); @@ -2074,6 +2074,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; + mkv_track *track = &mkv->tracks[pkt->stream_index]; ebml_master blockgroup; int id_size, settings_size, size; uint8_t *id, *settings; @@ -2095,15 +2096,15 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *p av_log(s, AV_LOG_DEBUG, "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", " "duration %" PRId64 " at relative offset %" PRId64 " in cluster " - "at offset %" PRId64 ". TrackNumber %d, keyframe %d\n", + "at offset %" PRId64 ". TrackNumber %u, keyframe %d\n", size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb), - mkv->cluster_pos, pkt->stream_index + 1, 1); + mkv->cluster_pos, track->track_num, 1); blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size)); put_ebml_id(pb, MATROSKA_ID_BLOCK); put_ebml_num(pb, size + 4, 0); - avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 + avio_w8(pb, 0x80 | track->track_num); // this assumes track_num is less than 126 avio_wb16(pb, ts - mkv->cluster_pts); avio_w8(pb, flags); avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size, id, settings_size, settings, pkt->size, pkt->data); @@ -2232,7 +2233,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ int ret; int64_t ts = track->write_dts ? pkt->dts : pkt->pts; int64_t relative_packet_pos; - int tracknum = mkv->is_dash ? mkv->dash_track_number : pkt->stream_index + 1; + unsigned tracknum = track->track_num; if (ts == AV_NOPTS_VALUE) { av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n"); @@ -2587,15 +2588,9 @@ static int mkv_init(struct AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVLFG c; + unsigned nb_tracks = 0; int i; - if (s->nb_streams > MAX_TRACKS) { - av_log(s, AV_LOG_ERROR, - "At most %d streams are supported for muxing in Matroska\n", - MAX_TRACKS); - return AVERROR(EINVAL); - } - for (i = 0; i < s->nb_streams; i++) { if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_ATRAC3 || s->streams[i]->codecpar->codec_id == AV_CODEC_ID_COOK || @@ -2629,6 +2624,7 @@ static int mkv_init(struct AVFormatContext *s) } for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; mkv_track *track = &mkv->tracks[i]; if (s->flags & AVFMT_FLAG_BITEXACT) { @@ -2639,6 +2635,19 @@ static int mkv_init(struct AVFormatContext *s) // ms precision is the de-facto standard timescale for mkv files avpriv_set_pts_info(s->streams[i], 64, 1, 1000); + + if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) + continue; + + nb_tracks++; + track->track_num = mkv->is_dash ? mkv->dash_track_number : nb_tracks; + } + + if (nb_tracks > MAX_TRACKS) { + av_log(s, AV_LOG_ERROR, + "%u > "AV_STRINGIFY(MAX_TRACKS)" tracks (excluding attachments)" + " not supported for muxing in Matroska\n", nb_tracks); + return AVERROR(EINVAL); } return 0; From patchwork Sun Apr 5 15:59:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18675 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4079044BE3F for ; Sun, 5 Apr 2020 19:00:19 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 287B268B4C0; Sun, 5 Apr 2020 19:00:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 83A7368B27C for ; Sun, 5 Apr 2020 19:00:06 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id s8so12282693wrt.7 for ; Sun, 05 Apr 2020 09:00:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=MIImAE0D9faHPoJsp4bz0q9LhDqGmbn4bS1S5YnauRU=; b=agK689IPLmGloDcssz0b/2G/w83HQSqC5DYC8dfW3hDYHYJtbHAHxxl8iOrdPqDtl2 m1Lyh2oPSRAQPOuiWoyrQBfm5Abi6d3fyyrt5ej1+RYBMflI2SDu3bR1wvdVuP7aaQOb w4Baxbu9TSfxPK5uKSwspQyQs7VVft0Vsfqkkndj/FZ2u/mA+5nwfxhQ9y8BPYLYkB3S 6+Cknsuwn0mNLfCW+L9cNdurHyyBJ/+enCNCqtrrC/9moxCJ91U/qmt2mUynKTRq4lP5 Hr5q9/KswLvfWsaePzetu5bCxL011MGaLhqL7Mx7yZ+iOsoUhRDsyi2W6dLaabLVx4gA hJDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MIImAE0D9faHPoJsp4bz0q9LhDqGmbn4bS1S5YnauRU=; b=O01ke87KHra4KDlm4x9OwcogNP81goHeif72NH2YVwyNYBcqZ07p0J5wbMuykiCGlS LkAaEYN9bYeadSuvM4QkSab61j5FEh3Py8NdE5x5WTS4LepNXGB92MdYc8ywNiTEYDa7 bFhh60gHswd2uzRRmtGV07ZMCtaqdpEQx4vchgQvYn0EFHxRN2q3OmA6Iif+nZbyiuAN By5oGpqdvHnYw7KMvxMba+4hjCVku0PPviPjNX4X+ZoW6Q/VEUYths3pvkpn+m9w1YuV 4RFuQKul/Jzs+aqXoCeDkK6bTkkwo3K5QFC6/e7kYtqSn9Y1aLikphrFTq0Bj3kyMBvF rZDA== X-Gm-Message-State: AGi0PuYJt7Rl8ZUbC3xc3uvNTg5jF4f2rTLMBksns5Og/TAhn4Cgp+vw xklKEqqVq42Ne8s2SdN3Sugsx2mR X-Google-Smtp-Source: APiQypILaghvis0S2V3nYpM9g1EA3pTHXSpCVEtEqQ9Ig4vQsMXbRn3yK+SdAipzfilbdrnkKQG82A== X-Received: by 2002:adf:f78a:: with SMTP id q10mr1936941wrp.132.1586102405636; Sun, 05 Apr 2020 09:00:05 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:04 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:16 +0200 Message-Id: <20200405155928.9323-9-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/20] avformat/matroskaenc: Automatically use right TrackNumber in Cues 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" mkv_cuepoint (the structure used to store the index entries in the Matroska muxer) currently contains fields for both the index of the packet's stream in the AVFormatContext.streams array and for the Matroska TrackNumber; correspondingly, mkv_add_cuepoint() has arguments for both. But these two numbers can't be chosen independently, so get rid of the TrackNumber. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 4607ddd6ad..ab1c28ae02 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -80,7 +80,6 @@ typedef struct mkv_seekhead { typedef struct mkv_cuepoint { uint64_t pts; int stream_idx; - int tracknum; int64_t cluster_pos; ///< offset of the cluster containing the block relative to the segment int64_t relative_pos; ///< relative offset from the position of the cluster containing the block int64_t duration; ///< duration of the block according to time base @@ -479,7 +478,7 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, return 0; } -static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int tracknum, int64_t ts, +static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts, int64_t cluster_pos, int64_t relative_pos, int64_t duration) { mkv_cues *cues = &mkv->cues; @@ -495,7 +494,6 @@ static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int tracknum, i cues->entries[cues->num_entries].pts = ts; cues->entries[cues->num_entries].stream_idx = stream; - cues->entries[cues->num_entries].tracknum = tracknum; cues->entries[cues->num_entries].cluster_pos = cluster_pos - mkv->segment_offset; cues->entries[cues->num_entries].relative_pos = relative_pos; cues->entries[cues->num_entries++].duration = duration; @@ -534,7 +532,7 @@ static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp, continue; tracks[idx].has_cue = 1; track_positions = start_ebml_master(cuepoint, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE); - put_ebml_uint(cuepoint, MATROSKA_ID_CUETRACK , entry->tracknum ); + put_ebml_uint(cuepoint, MATROSKA_ID_CUETRACK , tracks[idx].track_num); put_ebml_uint(cuepoint, MATROSKA_ID_CUECLUSTERPOSITION , entry->cluster_pos); put_ebml_uint(cuepoint, MATROSKA_ID_CUERELATIVEPOSITION, entry->relative_pos); if (entry->duration != -1) @@ -2233,7 +2231,6 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ int ret; int64_t ts = track->write_dts ? pkt->dts : pkt->pts; int64_t relative_packet_pos; - unsigned tracknum = track->track_num; if (ts == AV_NOPTS_VALUE) { av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n"); @@ -2270,7 +2267,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ if (ret < 0) return ret; if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (par->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) { - ret = mkv_add_cuepoint(mkv, pkt->stream_index, tracknum, ts, + ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, mkv->cluster_pos, relative_packet_pos, -1); if (ret < 0) return ret; } @@ -2296,7 +2293,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { - ret = mkv_add_cuepoint(mkv, pkt->stream_index, tracknum, ts, + ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, mkv->cluster_pos, relative_packet_pos, duration); if (ret < 0) return ret; From patchwork Sun Apr 5 15:59:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18669 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id BEE1244BE3F for ; Sun, 5 Apr 2020 19:00:12 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9E27368B3F8; Sun, 5 Apr 2020 19:00:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8F7D568B227 for ; Sun, 5 Apr 2020 19:00:07 +0300 (EEST) Received: by mail-wr1-f48.google.com with SMTP id v5so3460711wrp.12 for ; Sun, 05 Apr 2020 09:00:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sFAAitrFy2iqtFoD921Yd3NfHGz7eupy4O/VhWRT18Y=; b=JqFP0GxFe4jCqpk/SpNo0oTIl5x6mGYC58q8RJkDr2p+v135q1h3Tk71uJu4UpeKom WM7/4vVA3BEMrT8oWc6oCq4+B+9j8O2oJ4Dk5DYapYxYu0f0lXX8tJG9RgVN/3F1mmBR vQq4e0tDz/pX9qbyv3Zzbpy9xmx7oR6fslv1u8G/8ZSqtgCrsUqyuej5C7P9nn/9X9vX e8tIvPwC6r3MnRe5tNGlOGF3hLQV77O7TVcfXjHqdMUg6BwUGAN8emsQZUIFdTnniA40 K6eBKUIxgUkXVcDLhBjkWYjFMK70vIsOwdHrfkrgWKhousLyDGAshjjfcXTr3zHK+zHA PYbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sFAAitrFy2iqtFoD921Yd3NfHGz7eupy4O/VhWRT18Y=; b=Am52QPyNSdddbtHXcaZLJKwbNEBTtS5mLntFsxFf/Zew4QJA2OHezjMFhdvdooeiBU DZ4x0RceSyODkQtA+fPAED5SDLREOq9KTKrxE8cxRNu6DPBSvIvyP+/n0R4/PXA4M+zc ur0Nz4C3x86oVB1n76Ix9gxKlnZA/kxgXOJJRlA/mAQ6nDasowUYwDomy7vfr03UlmPm PEPxPsJmqEch+w25mCp6AM4Gk372YErCLObWV3M5A9FVf/ySPqR2EPDJewlk83MI+LU7 20+3zfoohW1mQNloEYKO9L3fV42hPXvkEf9ZUqBQiN8TGJ9Xn0Q6TTJMRo97v7cFZ8Bf wIcw== X-Gm-Message-State: AGi0PuYrCgn3nNT+S+frbjinYtg0SjOJH0yBnIWbYpD1xKvwzXyzPikh u8ZWLJtEa17h7QEnpbr5AAROanoJ X-Google-Smtp-Source: APiQypJpZyziXgcCOcDp1hOyYCYb51S/9BE0MwcHqr6bIoxx1EC72pcf/GUBQJbRQdBAwr19YTafmg== X-Received: by 2002:a5d:6a46:: with SMTP id t6mr18822534wrw.93.1586102406789; Sun, 05 Apr 2020 09:00:06 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:05 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:17 +0200 Message-Id: <20200405155928.9323-10-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/20] avformat/matroskaenc: Increase max supported tracks 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Our code can actually write tracks with a TrackNumber in the range of 1..127 without problems. Variable length integers that only have '1' bits after the marker bit are not reserved when being used to encode the TrackNumber in a Block (there is no equivalent of unknown length elements here). Signed-off-by: Andreas Rheinhardt --- Don't know yet if this or a version that completely removes said limit will get in. libavformat/matroskaenc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index ab1c28ae02..f313b93e2a 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -107,9 +107,9 @@ typedef struct mkv_track { #define MODE_MATROSKAv2 0x01 #define MODE_WEBM 0x02 -/** Maximum number of tracks allowed in a Matroska file (with track numbers in - * range 1 to 126 (inclusive) */ -#define MAX_TRACKS 126 +/** Maximum number of tracks supported by this muxer (with track numbers + * in the range 1 to 127 (inclusive)) */ +#define MAX_TRACKS 127 typedef struct MatroskaMuxContext { const AVClass *class; @@ -2034,7 +2034,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, put_ebml_id(pb, blockid); put_ebml_num(pb, size + 4, 0); - // this assumes stream_index is less than 126 + // this assumes track_number is <= 127 avio_w8(pb, 0x80 | track_number); avio_wb16(pb, ts - mkv->cluster_pts); avio_w8(pb, (blockid == MATROSKA_ID_SIMPLEBLOCK && keyframe) ? (1 << 7) : 0); @@ -2102,7 +2102,7 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *p put_ebml_id(pb, MATROSKA_ID_BLOCK); put_ebml_num(pb, size + 4, 0); - avio_w8(pb, 0x80 | track->track_num); // this assumes track_num is less than 126 + avio_w8(pb, 0x80 | track->track_num); // this assumes track_num <= 127 avio_wb16(pb, ts - mkv->cluster_pts); avio_w8(pb, flags); avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size, id, settings_size, settings, pkt->size, pkt->data); From patchwork Sun Apr 5 15:59:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18670 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id DB04944BE3F for ; Sun, 5 Apr 2020 19:00:13 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BCF1D68B307; Sun, 5 Apr 2020 19:00:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9B6DE68B255 for ; Sun, 5 Apr 2020 19:00:08 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id g3so12115036wrx.2 for ; Sun, 05 Apr 2020 09:00:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CB1shAZO5glOkTP52K2+AZ9gmb1lJAQ1Nj4v3gpjCuw=; b=Txk22b7Rljet+Ig8jrc0RhkxdVDnhplxIfO5ecisAP4WHRjjPgNh9I15AG6GwaddxX 95ObxzZwHWmxPL+yymRFSJIsArCUeUgohDnClGSY9PxcoER4eovb65I4QG5LEnaLGlEb ZJpwPRdvwWoCUIo4kwV6sSNlr5nk9MNcdWWXeqyUoCMjKGztoGoIMWnlrTXqn7FxVxQJ AFC2WMpKd1sI4qY4wEvzWzpWfd26klWnKXqnHp36U1KyW2++Wru3HT8kCu8o7i2eU1mC plOS8iNl8Uo9gQ0jEpXvQZtXw5Lr4sJ5grRlOQfbVIc7ONz23XlLpIMwSriopVggmH9C Cd0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CB1shAZO5glOkTP52K2+AZ9gmb1lJAQ1Nj4v3gpjCuw=; b=b8+Kw4j0qHmoCUTvUBTxlJ+ObnCzrLCYOia9/DW3BdkSsxMP16mSO2pHMCl3kkVIKc HxmqjAC7iaiIiFH+846/t1AdTx3NQW8ejo2qQqBJ9uDJqBWbyzmZ5aP1O0Ki+RhosB72 HyP+8T9uvC27eVzY9BUFt/DJbQuY3aD+xGaqf2sPuk7NClH3SDuLaCvYjhi3dgyY8TaS tMUIq85t3mYYt7jzN7W25bmbf+7OaPVRM6yp9TA4l+Fm+oyqtQ29Y/Hkhdd/crYJVMRe fBaDpi1We/B+qXqjV/cASByNX9FxKp5NZjM0L/crsNruKXA2Ps2kL6t3sp8WrQVkTy5b pvrQ== X-Gm-Message-State: AGi0Pua4SQaLQHfsNtPBGsaN85qpV2KX9nQ1hraXof7iXaZgtIhQ4LzV kq5N3CNK5E9a0Fo8xRW3c6TXZnW1 X-Google-Smtp-Source: APiQypLnQI/HJuZwacXkj4uUR6sCPX7PIhjOYw4VpOltP++uI7sC4ztS1b6QVx2l/A0PTLq89qlOGA== X-Received: by 2002:a05:6000:e:: with SMTP id h14mr7511711wrx.128.1586102407722; Sun, 05 Apr 2020 09:00:07 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:07 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:18 +0200 Message-Id: <20200405155928.9323-11-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/20] avformat/matroskaenc: Change signature of mkv_write_track() 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Up until now, mkv_write_track() received the index of the stream whose header data it is about to write as parameter; this index has until recently been explicitly used to generate both TrackNumber and TrackUID. But this is no longer so and as there is no reason why the function for writing a single TrackEntry should even know the index of the TrackEntry it is about to write, said index is replaced in the list of function parameters by the corresponding AVStream and mkv_track. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index f313b93e2a..27c419954b 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1083,11 +1083,11 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, } static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, - int i, AVIOContext *pb, int default_stream_exists) + AVStream *st, mkv_track *track, AVIOContext *pb, + int default_stream_exists) { - AVStream *st = s->streams[i]; AVCodecParameters *par = st->codecpar; - ebml_master subinfo, track; + ebml_master subinfo, track_master; int native_id = 0; int qt_id = 0; int bit_depth; @@ -1110,9 +1110,9 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, return ret; } - track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); - put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER, mkv->tracks[i].track_num); - put_ebml_uid (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid); + track_master = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); + put_ebml_uint(pb, MATROSKA_ID_TRACKNUMBER, track->track_num); + put_ebml_uid (pb, MATROSKA_ID_TRACKUID, track->uid); put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) if ((tag = av_dict_get(st->metadata, "title", NULL, 0))) @@ -1209,7 +1209,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, else if (!native_id) { // if there is no mkv-specific codec ID, use VFW mode put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC"); - mkv->tracks[i].write_dts = 1; + track->write_dts = 1; s->internal->avoid_negative_ts_use_pts = 0; } @@ -1285,9 +1285,9 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, av_log(s, AV_LOG_ERROR, "Initial padding is invalid\n"); return AVERROR(EINVAL); } -// mkv->tracks[i].ts_offset = av_rescale_q(par->initial_padding, -// (AVRational){ 1, par->sample_rate }, -// st->time_base); +// track->ts_offset = av_rescale_q(par->initial_padding, +// (AVRational){ 1, par->sample_rate }, +// st->time_base); put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay); } @@ -1303,7 +1303,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0); put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , par->channels); - mkv->tracks[i].sample_rate_offset = avio_tell(pb); + track->sample_rate_offset = avio_tell(pb); put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate); if (output_sample_rate) put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate); @@ -1339,13 +1339,13 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) { - mkv->tracks[i].codecpriv_offset = avio_tell(pb); + track->codecpriv_offset = avio_tell(pb); ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id); if (ret < 0) return ret; } - end_ebml_master(pb, track); + end_ebml_master(pb, track_master); return 0; } @@ -1367,7 +1367,9 @@ static int mkv_write_tracks(AVFormatContext *s) default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT; } for (i = 0; i < s->nb_streams; i++) { - ret = mkv_write_track(s, mkv, i, mkv->tracks_bc, default_stream_exists); + AVStream *st = s->streams[i]; + ret = mkv_write_track(s, mkv, st, &mkv->tracks[i], + mkv->tracks_bc, default_stream_exists); if (ret < 0) return ret; } From patchwork Sun Apr 5 15:59:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18671 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0956F44BE3F for ; Sun, 5 Apr 2020 19:00:15 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E31A868B47A; Sun, 5 Apr 2020 19:00:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A9E2E68B319 for ; Sun, 5 Apr 2020 19:00:09 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id 65so14443667wrl.1 for ; Sun, 05 Apr 2020 09:00:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=G/49ayKSkP9C1UTKvO7MZGGJ77fJFZaj7Djy1DlrVmY=; b=o3IenFOSD/bJBC1JqqSdgm+0gILQvPHjSEvGE1N3g7Kw0NgtLyudHLq67s3Vx5O34r lWOTOlPtwc29YdvF/7+Z8z8gR0V4nDKYq8aKkA6kz9JcvXLtr/3O6E+oFqXNq3OWf0zv i1QyuliH1t0dW4NCIZWDQ8lHdUqQbqCyyaQ0TV7rmnOwVDvLm2Pa40PSfgRe6a7bP2wk jCPvw938rreCVwHiF/xDJEtqRFyYuSogMWXksQGQTF12QaYwWnRDO2X2CWChnKBZFm/X OYgEyLBFJiz7HwaSFLfnVYbX+lFkXM/FwyuVA8S0psmuCneMX6PFr+WHAtGtE6q7td8Y 4Ahw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=G/49ayKSkP9C1UTKvO7MZGGJ77fJFZaj7Djy1DlrVmY=; b=PVVeJTyUiRy21GvK8et5j5CfLdbkV9bAPNnnXZ9RPSWbL+GZW30lhv3NsDXEPkkViS eHqSo4vgmGhlyBAb99QQfzHvF0GQp7cJdNdliRgc1wTJUqFb/uGilCEqFQtGPjE6eiML BujplD6wqFA2zPetcZ1INY8tC6hXRyO0MwpfgqF7mWnSOAPwPYVudhwuqZ40jzIRpbpJ npiN2EKQ2B73f8pR3TCnacsnyN6p4EIU4AaTzfp4/w5w0BDrCp2Cm/CNjPRXV0B/m0ZA gWIBRm5N8dYvzENRnbCt1jz+EXunS4B4Ii82WWrRED1tQ4JHjYaYsFrkCEIU9UyBdsZ9 GmhQ== X-Gm-Message-State: AGi0PuY5proCxOEMHdr9PlVTeIPldlM6aC+sC3bucgzhtiMHjJme/prv jqNTSVERoYb1uVeEtlOep7+i7R18 X-Google-Smtp-Source: APiQypJ4DEcNpYid6ekDUzTWvkKBjXJjBctVzDDNm7naTelO++LJVi60lGZqrbOJ7QCzV28zxddtGg== X-Received: by 2002:adf:e744:: with SMTP id c4mr18585625wrn.133.1586102408763; Sun, 05 Apr 2020 09:00:08 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:08 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:19 +0200 Message-Id: <20200405155928.9323-12-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/20] avformat/matroskaenc: Add check for using explicit TrackNumber 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" When creating DASH streams, the TrackNumber is externally prescribed and not derived from the number of streams in the AVFormatContext. Up until now, a TrackNumber of zero was allowed, although this is invalid. Furthermore, it was not checked whether the number of tracks for a file using an explicit TrackNumber was more than one, as such a file would be invalid (it would be impossible to tell to which track a Block belongs if different tracks share the same TrackNumber). Besides that, use the MAX_TRACKS macro for the maximum of dash_track_number. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 27c419954b..b9bfd34756 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2642,6 +2642,9 @@ static int mkv_init(struct AVFormatContext *s) track->track_num = mkv->is_dash ? mkv->dash_track_number : nb_tracks; } + if (mkv->is_dash && nb_tracks != 1) + return AVERROR(EINVAL); + if (nb_tracks > MAX_TRACKS) { av_log(s, AV_LOG_ERROR, "%u > "AV_STRINGIFY(MAX_TRACKS)" tracks (excluding attachments)" @@ -2704,7 +2707,7 @@ static const AVOption options[] = { { "cluster_size_limit", "Store at most the provided amount of bytes in a cluster. ", OFFSET(cluster_size_limit), AV_OPT_TYPE_INT , { .i64 = -1 }, -1, INT_MAX, FLAGS }, { "cluster_time_limit", "Store at most the provided number of milliseconds in a cluster.", OFFSET(cluster_time_limit), AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, FLAGS }, { "dash", "Create a WebM file conforming to WebM DASH specification", OFFSET(is_dash), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS }, - { "dash_track_number", "Track number for the DASH stream", OFFSET(dash_track_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 127, FLAGS }, + { "dash_track_number", "Track number for the DASH stream", OFFSET(dash_track_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, MAX_TRACKS, FLAGS }, { "live", "Write files assuming it is a live stream.", OFFSET(is_live), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS }, { "allow_raw_vfw", "allow RAW VFW mode", OFFSET(allow_raw_vfw), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS }, { "write_crc32", "write a CRC32 element inside every Level 1 element", OFFSET(write_crc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS }, From patchwork Sun Apr 5 15:59:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18674 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3566044BE3F for ; Sun, 5 Apr 2020 19:00:18 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 20CFB68B4B0; Sun, 5 Apr 2020 19:00:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0677068B1C0 for ; Sun, 5 Apr 2020 19:00:10 +0300 (EEST) Received: by mail-wm1-f50.google.com with SMTP id j19so13160584wmi.2 for ; Sun, 05 Apr 2020 09:00:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ccIovoUHBXRea6/VJz2tbUaySwr1iLCIOY5JEcCKysc=; b=FuECRTmTXMlSuJVAxm4Kbu9XoQnxPAVxpASbZ0YychsgC6fvPJCEkD7dYh5akfXsFA MQ93g1p7wKgOpp+kcDgUudHDAbMhJ8t8T14X4whmuEeKF76Eucf/5e8JTf9KEd7XSxBZ ek/pqWIT+eWoMT8tiZwHgMMSiCW9wm0YqdFqqWj//r3vrhOTfu26GsYT/wwQtVXAKnpT Ei7fQtXDo8iSS62KGhQ9agUk8q8Kdm9lLIBFwO1DrSlilVMnxVZvXaOCXG88EbDjgbCz u6INC1cpBdSOX2wurTHcuk3D2ra2BoOwD1HUg07vbVefCYpVr7V+6/hbKs6i+FemQbrV jfxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ccIovoUHBXRea6/VJz2tbUaySwr1iLCIOY5JEcCKysc=; b=jhLeXiCuNL8IHoECXYmA0QzqS1p1S+CIli3nJEvEiziNmmPy3f2Rjkzjh1f9LJgK3c eV3GX65J/yFBH+PkMVdQp2bvh2LMDBd9QVQlO/M54tgWIn/cSn6hEToSTbqsMlHqwYgm 2zI77bRUaAqdHslza9ey9OvWEvRgwEZ5EzTf7lx+RKAqj37ZLSl3pFdmoJbJUPRRfpad btLTImncwZnRBSbJyOClMCtwnM8RSec42dJujENyMew4auDAivdRBy2OgAzIVGq6LGaN Cqha9+ZzYTw5YNLMO7RHzcBlzVpIpX0b57378iRPO2DGL0ROLIQkRet0fBwjn++GUfFv wlYQ== X-Gm-Message-State: AGi0Puau5eU08dIcVE+flCyZIErnKpvoIszsPfPDkYSBGdOVz2CJyJpt ODu0bByqZ3oxqv2gRyrj3wgNK/tf X-Google-Smtp-Source: APiQypJQ9iRUJjDxhknRTZHXn3OQOxmurGUBF147R9BObolq5kPvcboVpMUkgY+T/8Ow3Dam4NhgKQ== X-Received: by 2002:a7b:cde8:: with SMTP id p8mr18307788wmj.87.1586102409735; Sun, 05 Apr 2020 09:00:09 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:09 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:20 +0200 Message-Id: <20200405155928.9323-13-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/20] avformat/matroskaenc: Improve Cues in case of no video 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The Matroska muxer currently only adds CuePoints in three cases: a) For video keyframes. b) For the first audio frame in a new Cluster if in DASH-mode. c) For subtitles. This means that ordinary Matroska audio files won't have any Cues which impedes seeking. This commit changes this. For every track in a file without video track it is checked and tracked whether a Cue entry has already been added for said track for the current Cluster. This is used to add a Cue entry for each first packet of each track in each Cluster. Implements #3149. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 21 +++++++++++-------- tests/ref/fate/aac-autobsf-adtstoasc | 4 ++-- tests/ref/fate/matroska-flac-extradata-update | 4 ++-- tests/ref/lavf/mka | 4 ++-- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b9bfd34756..a469d48cc0 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2120,6 +2120,10 @@ static void mkv_end_cluster(AVFormatContext *s) MatroskaMuxContext *mkv = s->priv_data; end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 0, 1); + if (!mkv->have_video) { + for (unsigned i = 0; i < s->nb_streams; i++) + mkv->tracks[i].has_cue = 0; + } mkv->cluster_pos = -1; avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT); } @@ -2222,7 +2226,7 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) return 0; } -static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_cue) +static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb; @@ -2268,10 +2272,12 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ ret = mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe); if (ret < 0) return ret; - if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (par->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) { + if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && keyframe && + (par->codec_type == AVMEDIA_TYPE_VIDEO || !mkv->have_video && !track->has_cue)) { ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, mkv->cluster_pos, relative_packet_pos, -1); if (ret < 0) return ret; + track->has_cue = 1; } } else { if (par->codec_id == AV_CODEC_ID_WEBVTT) { @@ -2336,8 +2342,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) // on seeing key frames. start_new_cluster = keyframe; } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO && - (mkv->cluster_pos == -1 || - cluster_time > mkv->cluster_time_limit)) { + cluster_time > mkv->cluster_time_limit) { // For DASH audio, we create a Cluster based on cluster_time_limit start_new_cluster = 1; } else if (!mkv->is_dash && @@ -2361,9 +2366,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) // check if we have an audio packet cached if (mkv->cur_audio_pkt.size > 0) { - // for DASH audio, a CuePoint has to be added when there is a new cluster. - ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt, - mkv->is_dash ? start_new_cluster : 0); + ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt); av_packet_unref(&mkv->cur_audio_pkt); if (ret < 0) { av_log(s, AV_LOG_ERROR, @@ -2378,7 +2381,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) if (pkt->size > 0) ret = av_packet_ref(&mkv->cur_audio_pkt, pkt); } else - ret = mkv_write_packet_internal(s, pkt, 0); + ret = mkv_write_packet_internal(s, pkt); return ret; } @@ -2406,7 +2409,7 @@ static int mkv_write_trailer(AVFormatContext *s) // check if we have an audio packet cached if (mkv->cur_audio_pkt.size > 0) { - ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt, 0); + ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt); if (ret < 0) { av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret); diff --git a/tests/ref/fate/aac-autobsf-adtstoasc b/tests/ref/fate/aac-autobsf-adtstoasc index f1c6f889d4..d9191fb37f 100644 --- a/tests/ref/fate/aac-autobsf-adtstoasc +++ b/tests/ref/fate/aac-autobsf-adtstoasc @@ -1,5 +1,5 @@ -9d0c81ce285a84c0137316004d091d95 *tests/data/fate/aac-autobsf-adtstoasc.matroska -6620 tests/data/fate/aac-autobsf-adtstoasc.matroska +76a14cc1b3292c7f724006d56b7e2eac *tests/data/fate/aac-autobsf-adtstoasc.matroska +6648 tests/data/fate/aac-autobsf-adtstoasc.matroska #extradata 0: 2, 0x0030001c #tb 0: 1/1000 #media_type 0: audio diff --git a/tests/ref/fate/matroska-flac-extradata-update b/tests/ref/fate/matroska-flac-extradata-update index dfb2851b0f..16b268c4a8 100644 --- a/tests/ref/fate/matroska-flac-extradata-update +++ b/tests/ref/fate/matroska-flac-extradata-update @@ -1,5 +1,5 @@ -83aca2772c52f6f802cac288f889382b *tests/data/fate/matroska-flac-extradata-update.matroska -2019 tests/data/fate/matroska-flac-extradata-update.matroska +5f6a67a45906f1bc7dd11d840470b0e4 *tests/data/fate/matroska-flac-extradata-update.matroska +2071 tests/data/fate/matroska-flac-extradata-update.matroska #extradata 0: 34, 0x7acb09e7 #extradata 1: 34, 0x7acb09e7 #extradata 2: 34, 0x443402dd diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka index b3c4117d92..24ccef51fd 100644 --- a/tests/ref/lavf/mka +++ b/tests/ref/lavf/mka @@ -1,3 +1,3 @@ -0d48d93057f14704f6b839bb15e7328a *tests/data/lavf/lavf.mka -43552 tests/data/lavf/lavf.mka +df7155d4333e9993c9ea2a9d53868881 *tests/data/lavf/lavf.mka +43580 tests/data/lavf/lavf.mka tests/data/lavf/lavf.mka CRC=0x3a1da17e From patchwork Sun Apr 5 15:59:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18676 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 35E2344BE3F for ; Sun, 5 Apr 2020 19:00:20 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 25F5468B4F2; Sun, 5 Apr 2020 19:00:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BC22768B3A2 for ; Sun, 5 Apr 2020 19:00:11 +0300 (EEST) Received: by mail-wm1-f68.google.com with SMTP id c195so6028885wme.1 for ; Sun, 05 Apr 2020 09:00:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=QSwU6qoPTdqrBKBh1UMK2mnhKHjUW2X/wQkAKwOcCxg=; b=pbygFW8qWta/uYefDJd3NMKPo4fdHAo/o67NzgwVYqcVdqrkCq73CSYt+RtVqmxpt4 HqxpZ9oDrwFR8WEtr/pXx9mlbZPx3mZE++zvoa3Hge23k7eD360oCyFOHdsZnpHyLr7G lJGq4r2/CW58BD255sX9GaIl607m/FmsX8HB/dFgTmDeOkFpoj66OpxnsHBtyUhCeCNy lHsklCup6GmM2IZJ3O/Ix6QQJFb0m6hJsQFmuFA5f/0nHqPAYxxlDvMKfrW4TERIzldG kItu0SmVHlt42M+FYG9UQYvOR6QYj/AcykAZAu3gg9TyEZwnfuz4VA5tDt0ZkwStCmaP Yl7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QSwU6qoPTdqrBKBh1UMK2mnhKHjUW2X/wQkAKwOcCxg=; b=YH0YKfCu501FsWCCoh+CGQyvf2ljqjskK1hr7ld2NxblA+HI/KhU4fYxttxm8C+6MU dfLnbYTo00yJXQyC6tOvcMnU1XJGL++jqaIfpwQi+rTo2oCVlJESd4ylU4UQZWL+tfyQ icQAvkCkpu1jDRZ7g+ArCoTrQdy2KDl0GGj5Kp4KU9Q7LaAABe1Sfcyv2xUZ4h4w6bpz uFA/WMTPv3IblKfncZq+R6HGO2bAEN6cKXRhpWkMCxO9ds4ie0E7aOjQMvqIgxh+eHd4 CKWRBk18eThbu7drFPcFsHGVf/WyyR8ERlnsauuUZZ+i9FqOXpG8m30tPt9zOaaLBx4I dfBQ== X-Gm-Message-State: AGi0PubdVpeteuN/6/c1+egaiTHJ9rGfy56KrkSVtH0xtMI35M8OdRQG Hw8MHA8bKfeMooyoSOdJeQ4qC7Fz X-Google-Smtp-Source: APiQypIexN0o8BaOpW1sGfQ8il6c45SkKq4RokkJM5toGFwiE9XVTx7s2EAKLqL+Zzc+fPt5DXXI/w== X-Received: by 2002:a1c:7707:: with SMTP id t7mr17834128wmi.173.1586102410935; Sun, 05 Apr 2020 09:00:10 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:10 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:21 +0200 Message-Id: <20200405155928.9323-14-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/20] avformat/matroskaenc: Don't use size of inexistent Cluster 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" In order to determine whether the current Cluster needs to be closed because of the limits on clustersize and clustertime, mkv_write_packet() would first get the size of the current Cluster by applying avio_tell() on the dynamic buffer holding the current Cluster. It did this without checking whether there is a dynamic buffer for writing Clusters open right now. In this case (which happens when writing the first packet) avio_tell() returned AVERROR(EINVAL); yet it is not good to rely on avio_tell() (or actually, avio_seek()) to handle the situation gracefully. Fixing this is easy: Only check whether a Cluster needs to be closed if a Cluster is in fact open. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index a469d48cc0..acac3828f2 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2328,6 +2328,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; + if (mkv->cluster_pos != -1) { if (mkv->tracks[pkt->stream_index].write_dts) cluster_time = pkt->dts - mkv->cluster_pts; else @@ -2355,9 +2356,10 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) start_new_cluster = 0; } - if (mkv->cluster_pos != -1 && start_new_cluster) { + if (start_new_cluster) { mkv_end_cluster(s); } + } if (!mkv->cluster_pos) avio_write_marker(s->pb, From patchwork Sun Apr 5 15:59:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18677 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1740444BE3F for ; Sun, 5 Apr 2020 19:00:21 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E9BE368B502; Sun, 5 Apr 2020 19:00:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7540468B1E0 for ; Sun, 5 Apr 2020 19:00:13 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id a25so14463961wrd.0 for ; Sun, 05 Apr 2020 09:00:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=AmaNpIdIc2PnVIStNP0zqeIXzTFfz6h6BHUF/649FaQ=; b=BfZ0R32sHUSrul4wQZu2eQGwwYQuIxowCwo53LLajTsTTbOLl0AiAB7xbnIE9ZKUB7 rs0XQtCzwVvpTgoCTgUgdHVtjYO7fpam6E8MLhosi84iDqQ1Yjrh9g66hm2lV/5x5Sm3 DxhTcmfGdq+x4zlxdfqE7EbYte3JWHB2sJpfWcTbpDG+tApqsok7YKHKqdWMeWKE0FMx /yPUPK89MXRqZ5w9J2oBG1QYvpo9njZkR/WpW00vjS5edHLZN+NHbKoHB3CUNyv8lNCW 7lTMsBmY5DkeOKFi7RsP79PQBF0vXPEnEQyipJjMU3K3JLCYgQ7w5BTYpfbbLkkdE9PH TW4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AmaNpIdIc2PnVIStNP0zqeIXzTFfz6h6BHUF/649FaQ=; b=Fdpg/kOm+3rSmYzFyFcAKjFk61wrag9CySBf/2Huf4swItEW3gfw+RCffxtNKLZ9iV xfzlbFYZ+fymFb+QM4d9oZ3i09LhAR8i+Y2kG0ZLtkblE4kvxA2tw8iOz6DJPQXxlYt+ pZmtA7Ju0Wiz9xrr2K66Qfi1++NsvxjFIt9YBZGETeZel1BUkEFmWHudQHn0HpjNcMFF 2ebzMMkZqMbRx7EPZse9qGU3554DHiLsmV254TLJFrdUk+8AUMf9oDMtbS/cvePpy4hs 44mUjKZVE7HqNgd0XcQ56lo+s2KHmhAWgHMP+DYa7IQmxW0reivPQbEdFTripwqUdYBY qcVQ== X-Gm-Message-State: AGi0PubYaYWq3FSvPLeb7j77/0UBC8vr6M3AguzVr5ee100AxY8aFpXt w9WRbk8eV6/Yp36yTwvzVVrBGcla X-Google-Smtp-Source: APiQypLOpWKVFfa5Ui4FWSzt9V4aV+SzK0ACNM0UAztb9Cn3wQGNH/vzjMR83nbg4IWrybkpTpcaCg== X-Received: by 2002:adf:8b8e:: with SMTP id o14mr14309756wra.392.1586102412533; Sun, 05 Apr 2020 09:00:12 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:12 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:22 +0200 Message-Id: <20200405155928.9323-15-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/20] avformat/matroskaenc: Warn that WebM doesn't support Attachments 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" As WebM doesn't support Attachments, the Matroska muxer drops them when in WebM mode. This happened silently until this commit which adds a warning for this. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index acac3828f2..1b9ea45bc0 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1735,12 +1735,6 @@ static int mkv_write_header(AVFormatContext *s) int ret, i, version = 2; int64_t creation_time; - if (!strcmp(s->oformat->name, "webm")) { - mkv->mode = MODE_WEBM; - mkv->write_crc = 0; - } else - mkv->mode = MODE_MATROSKAv2; - if (mkv->mode != MODE_WEBM || av_dict_get(s->metadata, "stereo_mode", NULL, 0) || av_dict_get(s->metadata, "alpha_mode", NULL, 0)) @@ -2614,6 +2608,12 @@ static int mkv_init(struct AVFormatContext *s) s->internal->avoid_negative_ts_use_pts = 1; } + if (!strcmp(s->oformat->name, "webm")) { + mkv->mode = MODE_WEBM; + mkv->write_crc = 0; + } else + mkv->mode = MODE_MATROSKAv2; + mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks)); if (!mkv->tracks) { return AVERROR(ENOMEM); @@ -2640,8 +2640,13 @@ static int mkv_init(struct AVFormatContext *s) // ms precision is the de-facto standard timescale for mkv files avpriv_set_pts_info(s->streams[i], 64, 1, 1000); - if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) + if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) { + if (mkv->mode == MODE_WEBM) { + av_log(s, AV_LOG_WARNING, "Stream %d will be ignored " + "as WebM doesn't support attachments.\n", i); + } continue; + } nb_tracks++; track->track_num = mkv->is_dash ? mkv->dash_track_number : nb_tracks; From patchwork Sun Apr 5 15:59:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18679 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3113544BBAC for ; Sun, 5 Apr 2020 19:02:24 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BB82068B3C7; Sun, 5 Apr 2020 19:00:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 58A7E68B421 for ; Sun, 5 Apr 2020 19:00:14 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id z7so12128836wmk.1 for ; Sun, 05 Apr 2020 09:00:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eChqWe3CflXCJK25cmLOi3puhGffCLSf/UPWc6HLhNY=; b=Pu5S6XK64mp0jtNzxIjoL7xBKtaKEnzP7z7+sUUDi4a1yg/zKGO6W+M4i9iMOOr4KD crMcPjVYMxjjM+ZXUBcx/4bMyTkUHb+ueHcG3WkXaKoVMWDeSxXnWA+n1neTnS3rVxaQ 36Fzdj2Zp/bHLC61yWTIt/2hm9oOwvShkliRFtGXMQLzdXjKnfjPGXLAP1vkqjhkGum9 Eo7AccV+Ps9X8rqHtcdYAZ75ste0eNOSPyFR/PiaZlwWZXkOEJ6F6d15LPzo17yWlNaQ SdQaWf0LEYh3L58Etr56ksQKMZsvks+conPqwWiCnY4Ae/Df6oaxD00OTMv7GNmHGW5Q a7xw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eChqWe3CflXCJK25cmLOi3puhGffCLSf/UPWc6HLhNY=; b=eE5KzKnRTCzDJ2KHTZk7paDA3CnEmx//vSNcqz46r8vGv0yetMIFsxU+LgC8BkNYH3 ODJPsyw/7HimlUhDvoSUiOpXFIPDju7N33I4Z3ZnfueOn2Hngw5mixZK/hGm+D/uqLlo Y5SW8J9mEXM4O4dLSL9SceKozR9BAtJT3WN4OphnU4RaxDpz+H7G8lWRgG2VaLYNGhCT SERdcxKBVNBCbXKlnDleGitoz87FTaDL2rR70pGdJXzpzmmFXAeh8VxMSMfnhrTfasZS 5nfKqHfA7VhrQ3p91z9KTph/yaeR8lKHMtVEMeM4phg9YTjFh7qd4GUqa6wLoOa3O3N8 P0TQ== X-Gm-Message-State: AGi0PuYnD30eqLe806tLV0BdfdHgAVV56RpAWIkPjpfuaKeam6rKZldS b9JGQdBIQGLeGZLJdRLDrcLGIL8Z X-Google-Smtp-Source: APiQypJ+FOHLW/HQmk7HsYHXsZXn4DBLTY7NfsoKX1aaOcxV61v5NfIQBB/rg0vnwGyMno/3OtTugQ== X-Received: by 2002:a1c:1942:: with SMTP id 63mr19289214wmz.133.1586102413425; Sun, 05 Apr 2020 09:00:13 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:12 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:23 +0200 Message-Id: <20200405155928.9323-16-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 15/20] avformat/matroskaenc: Only write Tracks if there is a track 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The Matroska muxer does not write every stream as a Matroska track; some streams are written as AttachedFile. But should no stream be written as a Matroska track, the Matroska muxer would nevertheless write a Tracks element without a TrackEntry. This is against the spec. This commit changes this and only writes a Tracks if there is a Matroska track. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 1b9ea45bc0..45a2341c22 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -133,7 +133,7 @@ typedef struct MatroskaMuxContext { AVPacket cur_audio_pkt; - int have_attachments; + unsigned nb_attachments; int have_video; int reserve_cues_space; @@ -1099,7 +1099,6 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, AVDictionaryEntry *tag; if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT) { - mkv->have_attachments = 1; return 0; } @@ -1356,6 +1355,9 @@ static int mkv_write_tracks(AVFormatContext *s) AVIOContext *pb = s->pb; int i, ret, default_stream_exists = 0; + if (mkv->nb_attachments == s->nb_streams) + return 0; + mkv_add_seekhead_entry(mkv, MATROSKA_ID_TRACKS, avio_tell(pb)); ret = start_ebml_master_crc32(&mkv->tracks_bc, mkv); @@ -1610,7 +1612,7 @@ static int mkv_write_tags(AVFormatContext *s) } } - if (mkv->have_attachments && mkv->mode != MODE_WEBM) { + if (mkv->nb_attachments && mkv->mode != MODE_WEBM) { for (i = 0; i < s->nb_streams; i++) { mkv_track *track = &mkv->tracks[i]; AVStream *st = s->streams[i]; @@ -1644,7 +1646,7 @@ static int mkv_write_attachments(AVFormatContext *s) AVIOContext *dyn_cp = NULL, *pb = s->pb; int i, ret; - if (!mkv->have_attachments) + if (!mkv->nb_attachments) return 0; mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb)); @@ -2495,9 +2497,12 @@ static int mkv_write_trailer(AVFormatContext *s) put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration); end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0, 0); - // write tracks master - avio_seek(pb, mkv->tracks_pos, SEEK_SET); - end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0, 0); + if (mkv->tracks_bc) { + // write Tracks master + avio_seek(pb, mkv->tracks_pos, SEEK_SET); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, + MATROSKA_ID_TRACKS, 0, 0); + } // update stream durations if (mkv->tags_bc) { @@ -2645,6 +2650,7 @@ static int mkv_init(struct AVFormatContext *s) av_log(s, AV_LOG_WARNING, "Stream %d will be ignored " "as WebM doesn't support attachments.\n", i); } + mkv->nb_attachments++; continue; } From patchwork Sun Apr 5 15:59:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18678 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C307F44BE3F for ; Sun, 5 Apr 2020 19:00:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AFFAB68B4EF; Sun, 5 Apr 2020 19:00:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 07D4E680C46 for ; Sun, 5 Apr 2020 19:00:15 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id d202so13185232wmd.1 for ; Sun, 05 Apr 2020 09:00:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eXCP/V4B3y7aqehWLZZKy/YjHn+TG5wElCroTa7mmWc=; b=H/FcvjZvAFEiZ2q/p3IOjKo5rJHJapflcZdZ1b5wi1+qvL1vBfeTAaCyJDRtalmI1/ 8rd+34cAROKD596rpSCB2ck5hB3vtXL7LWBFhk0V76fr6qgyCl8wc+eh0qWniChJdWxk bGbsTrTKlrPvYPDJYbMfvPPWCkf+dZUgQHt5o5fBhtmkLW4x077zvvlLYLsfsC0NANte OBWSPEFTYZw6siM8bhXBTl5SNv6sXXb+KDxvb6LFjKg9yAVe+ulOqzKPNSAnG8vCR/6Y fUpK51hO7WlewXljbPyJ11rEQekhkwxM1Gbj0SZnCLu8dgYl6W/5Sd1QRGM7X7jAeQyK 0Tzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eXCP/V4B3y7aqehWLZZKy/YjHn+TG5wElCroTa7mmWc=; b=TPXYs6Be5pQ3dHNxnpH1EBbo2qfDT8UYf7WsZ9dPFIdGTEZYLfTpqjQaNcgYwZCtyC eubfWCbhD6ok544N9eHd74Uphhz8rVd9nqiUlZSyO0aO/NmEuyP6kAmtiFI/+P7nZCy7 mwefV2sQdva1zi9VzoHPShx5KDXhcVv0S/+Z430a0QU7jlJBfsKfnkfz7Ct7fNe7lt2R yR9Ro6PNtwc9kKAafhNwPBvhc3X8QdcuJJCzPrC7zRP9H8XfEW79DPFnRGNDngFDYUPw KzVsEz5O8vX5LWo8AB93p8wNKieOHgtJ35t21iEswSjXYh82XF+wDKk0DgjFIY6/P/0O 1nTg== X-Gm-Message-State: AGi0PuYB1Omv4cMYl1CpbP2QVMdiAp3Vma8HezDhPeKpXQm9fFfMghUF E526gTopc2c7+0Hss3CdjKn3IJNi X-Google-Smtp-Source: APiQypLk3crAqMd3W1XcFyAQgNAn1U7VkFsL0OkulSX7ES5OJ6/6lOHW1/tGoanUMWke61yEHmf0fg== X-Received: by 2002:a05:600c:204b:: with SMTP id p11mr8855391wmg.92.1586102414417; Sun, 05 Apr 2020 09:00:14 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:13 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:24 +0200 Message-Id: <20200405155928.9323-17-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 16/20] avformat/matroskaenc: Don't waste bytes on length fields 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Several EBML Master elements for which a good upper bound of the final length was available were nevertheless written without giving an upper bound of the final length to start_ebml_master(), so that their length fields were eight bytes long. This has been changed. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 9 ++-- tests/fate/wavpack.mak | 4 +- tests/ref/fate/aac-autobsf-adtstoasc | 4 +- tests/ref/fate/matroska-flac-extradata-update | 4 +- tests/ref/fate/rgb24-mkv | 4 +- tests/ref/lavf-fate/av1.mkv | 4 +- tests/ref/lavf/mka | 4 +- tests/ref/lavf/mkv | 4 +- tests/ref/lavf/mkv_attachment | 4 +- tests/ref/seek/lavf-mkv | 44 +++++++++---------- 10 files changed, 43 insertions(+), 42 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 45a2341c22..17e1f8dec9 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -835,7 +835,7 @@ static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStre &side_data_size); if (side_data_size == sizeof(AVMasteringDisplayMetadata)) { ebml_master meta_element = start_ebml_master( - dyn_cp, MATROSKA_ID_VIDEOCOLORMASTERINGMETA, 0); + dyn_cp, MATROSKA_ID_VIDEOCOLORMASTERINGMETA, 10 * (2 + 1 + 8)); const AVMasteringDisplayMetadata *metadata = (const AVMasteringDisplayMetadata*)side_data; if (metadata->has_primaries) { @@ -1299,7 +1299,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, // no mkv-specific ID, use ACM mode put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM"); - subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0); + subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 6 + 4 * 9); put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , par->channels); track->sample_rate_offset = avio_tell(pb); @@ -1495,7 +1495,7 @@ static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid, pb = mkv->tags_bc; *tag = start_ebml_master(pb, MATROSKA_ID_TAG, 0); - targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 0); + targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 4 + 1 + 8); if (elementid) put_ebml_uid(pb, elementid, uid); end_ebml_master(pb, targets); @@ -1585,7 +1585,8 @@ static int mkv_write_tags(AVFormatContext *s) AVIOContext *pb = mkv->tags_bc; ebml_master simpletag; - simpletag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0); + simpletag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, + 2 + 1 + 8 + 23); put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION"); mkv->tracks[i].duration_offset = avio_tell(pb); diff --git a/tests/fate/wavpack.mak b/tests/fate/wavpack.mak index e3cf4ec632..c62b3ceefd 100644 --- a/tests/fate/wavpack.mak +++ b/tests/fate/wavpack.mak @@ -91,12 +91,12 @@ fate-wavpack-matroskamode: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/special/matros FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-mono fate-wavpack-matroska_mux-mono: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -fflags +bitexact -f matroska fate-wavpack-matroska_mux-mono: CMP = oneline -fate-wavpack-matroska_mux-mono: REF = 7ebd447336f0ba76b41a3f32d1551f05 +fate-wavpack-matroska_mux-mono: REF = a378996c1bb5a54998fc804fb1ad97b1 FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-61 fate-wavpack-matroska_mux-61: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -fflags +bitexact -f matroska fate-wavpack-matroska_mux-61: CMP = oneline -fate-wavpack-matroska_mux-61: REF = c95bca3c3023230a324c633942c453d5 +fate-wavpack-matroska_mux-61: REF = 3d708dfce5ac85df114ea91b30143708 FATE_SAMPLES_AVCONV += $(FATE_WAVPACK-yes) fate-wavpack: $(FATE_WAVPACK-yes) diff --git a/tests/ref/fate/aac-autobsf-adtstoasc b/tests/ref/fate/aac-autobsf-adtstoasc index d9191fb37f..c7eae5d6c1 100644 --- a/tests/ref/fate/aac-autobsf-adtstoasc +++ b/tests/ref/fate/aac-autobsf-adtstoasc @@ -1,5 +1,5 @@ -76a14cc1b3292c7f724006d56b7e2eac *tests/data/fate/aac-autobsf-adtstoasc.matroska -6648 tests/data/fate/aac-autobsf-adtstoasc.matroska +6ffdfc7f11f06f94c22cda3a29bf576b *tests/data/fate/aac-autobsf-adtstoasc.matroska +6627 tests/data/fate/aac-autobsf-adtstoasc.matroska #extradata 0: 2, 0x0030001c #tb 0: 1/1000 #media_type 0: audio diff --git a/tests/ref/fate/matroska-flac-extradata-update b/tests/ref/fate/matroska-flac-extradata-update index 16b268c4a8..890bf1ac52 100644 --- a/tests/ref/fate/matroska-flac-extradata-update +++ b/tests/ref/fate/matroska-flac-extradata-update @@ -1,5 +1,5 @@ -5f6a67a45906f1bc7dd11d840470b0e4 *tests/data/fate/matroska-flac-extradata-update.matroska -2071 tests/data/fate/matroska-flac-extradata-update.matroska +2b82ee67ace359edb464e289486b3ebd *tests/data/fate/matroska-flac-extradata-update.matroska +2008 tests/data/fate/matroska-flac-extradata-update.matroska #extradata 0: 34, 0x7acb09e7 #extradata 1: 34, 0x7acb09e7 #extradata 2: 34, 0x443402dd diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv index fc73604ebc..c9438dffe4 100644 --- a/tests/ref/fate/rgb24-mkv +++ b/tests/ref/fate/rgb24-mkv @@ -1,5 +1,5 @@ -661b2d8ad9b7c5bf7389d3408c3695c4 *tests/data/fate/rgb24-mkv.matroska -58206 tests/data/fate/rgb24-mkv.matroska +84474651e0744e7049e27dd19b8c18a8 *tests/data/fate/rgb24-mkv.matroska +58192 tests/data/fate/rgb24-mkv.matroska #tb 0: 1/10 #media_type 0: video #codec_id 0: rawvideo diff --git a/tests/ref/lavf-fate/av1.mkv b/tests/ref/lavf-fate/av1.mkv index 28a8c890c7..3288a4481d 100644 --- a/tests/ref/lavf-fate/av1.mkv +++ b/tests/ref/lavf-fate/av1.mkv @@ -1,3 +1,3 @@ -339f457b665fb5e8652fd50f2d3c4823 *tests/data/lavf-fate/lavf.av1.mkv -55650 tests/data/lavf-fate/lavf.av1.mkv +696074a7600fb5a02a434839d09201f0 *tests/data/lavf-fate/lavf.av1.mkv +55636 tests/data/lavf-fate/lavf.av1.mkv tests/data/lavf-fate/lavf.av1.mkv CRC=0x7c27cc15 diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka index 24ccef51fd..303867228c 100644 --- a/tests/ref/lavf/mka +++ b/tests/ref/lavf/mka @@ -1,3 +1,3 @@ -df7155d4333e9993c9ea2a9d53868881 *tests/data/lavf/lavf.mka -43580 tests/data/lavf/lavf.mka +a67d0e6113de91ee53ee00b47fa6ff42 *tests/data/lavf/lavf.mka +43559 tests/data/lavf/lavf.mka tests/data/lavf/lavf.mka CRC=0x3a1da17e diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv index 014ea06003..9eaf5a4a11 100644 --- a/tests/ref/lavf/mkv +++ b/tests/ref/lavf/mkv @@ -1,3 +1,3 @@ -06c38b55305367672a7fc4efb71947bc *tests/data/lavf/lavf.mkv -320446 tests/data/lavf/lavf.mkv +e08b2effe716fb6b72f4a2cd2598b6d4 *tests/data/lavf/lavf.mkv +320411 tests/data/lavf/lavf.mkv tests/data/lavf/lavf.mkv CRC=0xec6c3c68 diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment index f297d407c8..d6cd1cdf64 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -cf27537eabb1f4f222e7391aa4f5250d *tests/data/lavf/lavf.mkv_attachment -472601 tests/data/lavf/lavf.mkv_attachment +aa2419820c590d0512ce199b7b59b9c9 *tests/data/lavf/lavf.mkv_attachment +472566 tests/data/lavf/lavf.mkv_attachment tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68 diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv index e9f1e521f2..3299861d9c 100644 --- a/tests/ref/seek/lavf-mkv +++ b/tests/ref/seek/lavf-mkv @@ -1,48 +1,48 @@ -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 694 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 659 size: 208 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 ret:-1 st: 1 flags:0 ts: 2.577000 ret: 0 st: 1 flags:1 ts: 1.471000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320167 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size: 209 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146878 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 ret:-1 st: 0 flags:0 ts: 2.153000 ret: 0 st: 0 flags:1 ts: 1.048000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 ret: 0 st: 1 flags:0 ts:-0.058000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 694 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 659 size: 208 ret: 0 st: 1 flags:1 ts: 2.836000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320167 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size: 209 ret:-1 st:-1 flags:0 ts: 1.730004 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146878 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925 ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 ret:-1 st: 1 flags:0 ts: 1.307000 ret: 0 st: 1 flags:1 ts: 0.201000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 694 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 659 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 ret: 0 st: 0 flags:0 ts: 0.883000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292326 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 ret: 0 st: 0 flags:1 ts:-0.222000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 ret:-1 st: 1 flags:0 ts: 2.672000 ret: 0 st: 1 flags:1 ts: 1.566000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320167 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size: 209 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146878 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 910 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 From patchwork Sun Apr 5 15:59:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18680 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 9F51144BBAC for ; Sun, 5 Apr 2020 19:02:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 727F168B505; Sun, 5 Apr 2020 19:00:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A83CA68B1DC for ; Sun, 5 Apr 2020 19:00:16 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id a25so14464068wrd.0 for ; Sun, 05 Apr 2020 09:00:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lXp64nYkMexwNwG3Y8258jIr6OJ0q9HcQ3QLINprOOo=; b=qFixdZ8E5dICEBSovpreHiHfSE7tfmvLBEGw3M6OKVA0Wxf6TnYo34HOnaoO0p33Cq heBIZDUh2DfvsySZvJ3MT0SYmLqQcO2AhcgDk9ZCvbX7OFljXLsrxU1vbiCCxg487pTP GnrNBO9WCY2+oX16+8UbxzRushtG0Ia6wVwTcLwWcH0SWlWReZ443iGZATirqdV2CIMC KE5FDU42tj/q050KkQ7LNVVxbdXJnGfopj5nUJ9rEGhdzamsBl3madhYcSAZ3imDr71H CKyUkxNIibqCL1j/ZAT2xwrFtNt/riWzSA9HzloY4RFHHTHi0jKUJIJXZbvcR1+RiH/x xe6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lXp64nYkMexwNwG3Y8258jIr6OJ0q9HcQ3QLINprOOo=; b=OesR9X3H/0DcOSaTaBrelm8QulzoMy3C2PJVXV+ep9ul68smpyJlaFR2ZMtMkKdmd2 pceRuTDyH0cg0nCStHVKfvFTHvvWUyKp9bD22o5ZWDLWfkFeCyo700Xjl5BUJmoB5zxU ETPoGYUkDw9uYeTcd+wEh+lmYvYT54C4X9PVzFvSr9hwZH3IWco1JQQOEIwDwbtScOdg JBIcaaj8dUEYRKBIy1fdcQNEambOdgxvQXpnn7APMIBF0d/NEhABFmi1t7Xlrpo5Z+Z6 AEf4rYpbzWPowGnAAr6Toq0EzzZ8dZX4yaLDQMKV9RcSynysa07hr25sD/S3VU3bu2Sk W0xA== X-Gm-Message-State: AGi0PuajAzznu/axcEIme1Y6SBAow+LfLZphKg78Uv+COFJ+owO1U/iF VKz++rHqOcU3zJcpgg/+3aWiqnzu X-Google-Smtp-Source: APiQypJ9LdgteJoxEBNxjzMSE6OYEpsRCob4MavdtIG71+Lx2VVMyn7sHdelrsLsX++jHnD0/QaRcA== X-Received: by 2002:a5d:4345:: with SMTP id u5mr19207041wrr.417.1586102415409; Sun, 05 Apr 2020 09:00:15 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:14 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:25 +0200 Message-Id: <20200405155928.9323-18-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 17/20] avformat/matroskaenc: Add const where appropriate 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 68 +++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 17e1f8dec9..3981986e86 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -548,7 +548,8 @@ static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp, return 0; } -static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par) +static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, + const AVCodecParameters *par) { const uint8_t *header_start[3]; int header_len[3]; @@ -576,7 +577,7 @@ static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecParame return 0; } -static int put_wv_codecpriv(AVIOContext *pb, AVCodecParameters *par) +static int put_wv_codecpriv(AVIOContext *pb, const AVCodecParameters *par) { if (par->extradata && par->extradata_size == 2) avio_write(pb, par->extradata, 2); @@ -586,7 +587,7 @@ static int put_wv_codecpriv(AVIOContext *pb, AVCodecParameters *par) } static int put_flac_codecpriv(AVFormatContext *s, - AVIOContext *pb, AVCodecParameters *par) + AVIOContext *pb, const AVCodecParameters *par) { int write_comment = (par->channel_layout && !(par->channel_layout & ~0x3ffffULL) && @@ -634,8 +635,9 @@ static int put_flac_codecpriv(AVFormatContext *s, return 0; } -static int get_aac_sample_rates(AVFormatContext *s, uint8_t *extradata, int extradata_size, - int *sample_rate, int *output_sample_rate) +static int get_aac_sample_rates(AVFormatContext *s, const uint8_t *extradata, + int extradata_size, int *sample_rate, + int *output_sample_rate) { MPEG4AudioConfig mp4ac; int ret; @@ -667,7 +669,7 @@ static int get_aac_sample_rates(AVFormatContext *s, uint8_t *extradata, int extr } static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, - AVCodecParameters *par, + const AVCodecParameters *par, AVIOContext *dyn_cp) { switch (par->codec_id) { @@ -785,7 +787,9 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, return ret; } -static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStream *st) { +static int mkv_write_video_color(AVIOContext *pb, const AVCodecParameters *par, + const AVStream *st) +{ AVIOContext *dyn_cp; uint8_t *colorinfo_ptr; int side_data_size = 0; @@ -876,7 +880,7 @@ static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStre } static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, - AVStream *st) + const AVStream *st) { ebml_master projection; int side_data_size = 0; @@ -989,7 +993,7 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, { int i; int ret = 0; - AVDictionaryEntry *tag; + const AVDictionaryEntry *tag; MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB; *h_width = 1; @@ -1096,7 +1100,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, int display_width_div = 1; int display_height_div = 1; int j, ret; - AVDictionaryEntry *tag; + const AVDictionaryEntry *tag; if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT) { return 0; @@ -1408,10 +1412,10 @@ static int mkv_write_chapters(AVFormatContext *s) } for (i = 0; i < s->nb_chapters; i++) { ebml_master chapteratom, chapterdisplay; - AVChapter *c = s->chapters[i]; + const AVChapter *c = s->chapters[i]; int64_t chapterstart = av_rescale_q(c->start, c->time_base, scale); int64_t chapterend = av_rescale_q(c->end, c->time_base, scale); - AVDictionaryEntry *t = NULL; + const AVDictionaryEntry *t; if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) { av_log(s, AV_LOG_ERROR, "Invalid chapter start (%"PRId64") or end (%"PRId64").\n", @@ -1443,7 +1447,7 @@ static int mkv_write_chapters(AVFormatContext *s) return 0; } -static int mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t) +static int mkv_write_simpletag(AVIOContext *pb, const AVDictionaryEntry *t) { uint8_t *key = av_strdup(t->key); uint8_t *p = key; @@ -1516,13 +1520,13 @@ static int mkv_check_tag_name(const char *name, uint32_t elementid) av_strcasecmp(name, "mimetype"))); } -static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, uint32_t elementid, +static int mkv_write_tag(AVFormatContext *s, const AVDictionary *m, uint32_t elementid, uint64_t uid, ebml_master *tag) { MatroskaMuxContext *mkv = s->priv_data; + const AVDictionaryEntry *t = NULL; ebml_master tag2; int ret; - AVDictionaryEntry *t = NULL; ret = mkv_write_tag_targets(s, elementid, uid, tag ? tag : &tag2); if (ret < 0) @@ -1542,9 +1546,9 @@ static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, uint32_t elementid return 0; } -static int mkv_check_tag(AVDictionary *m, uint32_t elementid) +static int mkv_check_tag(const AVDictionary *m, uint32_t elementid) { - AVDictionaryEntry *t = NULL; + const AVDictionaryEntry *t = NULL; while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) if (mkv_check_tag_name(t->key, elementid)) @@ -1568,7 +1572,7 @@ static int mkv_write_tags(AVFormatContext *s) tagp = (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live ? &tag : NULL; for (i = 0; i < s->nb_streams; i++) { - AVStream *st = s->streams[i]; + const AVStream *st = s->streams[i]; mkv_track *track = &mkv->tracks[i]; if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) @@ -1615,8 +1619,8 @@ static int mkv_write_tags(AVFormatContext *s) if (mkv->nb_attachments && mkv->mode != MODE_WEBM) { for (i = 0; i < s->nb_streams; i++) { - mkv_track *track = &mkv->tracks[i]; - AVStream *st = s->streams[i]; + const mkv_track *track = &mkv->tracks[i]; + const AVStream *st = s->streams[i]; if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT) continue; @@ -1656,10 +1660,10 @@ static int mkv_write_attachments(AVFormatContext *s) if (ret < 0) return ret; for (i = 0; i < s->nb_streams; i++) { - AVStream *st = s->streams[i]; + const AVStream *st = s->streams[i]; mkv_track *track = &mkv->tracks[i]; ebml_master attached_file; - AVDictionaryEntry *t; + const AVDictionaryEntry *t; const char *mimetype = NULL; if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT) @@ -1711,7 +1715,7 @@ static int64_t get_metadata_duration(AVFormatContext *s) int64_t max = 0; int64_t us; - AVDictionaryEntry *explicitDuration = av_dict_get(s->metadata, "DURATION", NULL, 0); + const AVDictionaryEntry *explicitDuration = av_dict_get(s->metadata, "DURATION", NULL, 0); if (explicitDuration && (av_parse_time(&us, explicitDuration->value, 1) == 0) && us > 0) { av_log(s, AV_LOG_DEBUG, "get_metadata_duration found duration in context metadata: %" PRId64 "\n", us); return us; @@ -1719,7 +1723,7 @@ static int64_t get_metadata_duration(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { int64_t us; - AVDictionaryEntry *duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0); + const AVDictionaryEntry *duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0); if (duration && (av_parse_time(&us, duration->value, 1) == 0)) max = FFMAX(max, us); @@ -1734,7 +1738,7 @@ static int mkv_write_header(AVFormatContext *s) MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb = s->pb; ebml_master ebml_header; - AVDictionaryEntry *tag; + const AVDictionaryEntry *tag; int ret, i, version = 2; int64_t creation_time; @@ -1953,7 +1957,7 @@ fail: } static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, - uint32_t blockid, AVPacket *pkt, int keyframe) + uint32_t blockid, const AVPacket *pkt, int keyframe) { MatroskaMuxContext *mkv = s->priv_data; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; @@ -2068,7 +2072,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, return 0; } -static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt) +static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, const AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; mkv_track *track = &mkv->tracks[pkt->stream_index]; @@ -2125,7 +2129,7 @@ static void mkv_end_cluster(AVFormatContext *s) avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT); } -static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) +static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; mkv_track *track = &mkv->tracks[pkt->stream_index]; @@ -2223,7 +2227,7 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) return 0; } -static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt) +static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb; @@ -2311,7 +2315,7 @@ FF_ENABLE_DEPRECATION_WARNINGS return 0; } -static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) +static int mkv_write_packet(AVFormatContext *s, const AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; int codec_type = s->streams[pkt->stream_index]->codecpar->codec_type; @@ -2509,8 +2513,8 @@ static int mkv_write_trailer(AVFormatContext *s) if (mkv->tags_bc) { int i; for (i = 0; i < s->nb_streams; ++i) { - AVStream *st = s->streams[i]; - mkv_track *track = &mkv->tracks[i]; + const AVStream *st = s->streams[i]; + const mkv_track *track = &mkv->tracks[i]; if (track->duration_offset > 0) { double duration_sec = track->duration * av_q2d(st->time_base); From patchwork Sun Apr 5 15:59:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18681 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 783E644BBAC for ; Sun, 5 Apr 2020 19:02:52 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3F41168B511; Sun, 5 Apr 2020 19:00:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B210268B498 for ; Sun, 5 Apr 2020 19:00:17 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id s8so12283138wrt.7 for ; Sun, 05 Apr 2020 09:00:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2FU230niD3autI9zfhsD0x9ikhrIdm7emlM06KqX2GM=; b=LXAH//ntSLhSLLdaSHA3jqUUlV4dJapKwFu0ekEhV66GXvAyZXnj22yLFd73g6zgKE EUPiZ20CNqqSWn6yO8xuCikiHkjn0X0EJJ0PjCkDFLJVZ0hQJkpUgMew28oHw/gTBQON po7oAtJ86WK2ZuhMgzxzrTJesa6tstnXrs/PrlExb372wN/rrR4DJgBZSe9eAIHLiPDh bW7pTo2aGG4Je4GRKUVHO+ZUQ420eS++GXodmpHaxWkE27QtV2tPpbY9VjskRZtn3ev7 Fcn1sWf6trY6+ufWVfoimyORF6oYFPbJtRRcb3ZFG07w2SItVBsdL5D4/UttL3DYTxJx QDbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2FU230niD3autI9zfhsD0x9ikhrIdm7emlM06KqX2GM=; b=PG3zQfp+Qnk/+XZLnOlhNHrgfbNQwzXXcNdeLugI+X7aLWDsEEBXq0fEiy3CM1ZeY1 sYJekqOquXOTYGjkV+KBfbwtNHXFhwS0zGFCfhZ7VoG658zVIwz/+bfKB8fp3MFHzTms +1CU3isES34+Droc29vj1cmA6r6UNwawO3mqrZwcJrXlO6hsJtOnu08WJAbn7hSTlUBR FmBH6C5Son3tO5vgJAePqpMFPnfzd6/WLkYv9KHMSWRuKIuxs8FRl3Kt+3NBecMol9xN k8N2Gg7ekGGPkBwdGP8hFPmzUrb5EL4o7vJY7h7EJA5fPWDPYGc6PIpUUqWMj2jNplOi BKAw== X-Gm-Message-State: AGi0PuYFhgOVoLIH3dtDHsRg+QqbQNyEBnMcZXuA5RW+fKEuxl3pnL0N fSM37odyU1cBLszWhHajBF4b2jmc X-Google-Smtp-Source: APiQypIut1JiKfO0XNQ42RZVMMRi003+rfQbi3dRSUKRnm+2FLt8n78nd493Nh/2eWGP4D36TVXNEQ== X-Received: by 2002:adf:f78a:: with SMTP id q10mr1937606wrp.132.1586102416531; Sun, 05 Apr 2020 09:00:16 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:15 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:26 +0200 Message-Id: <20200405155928.9323-19-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 18/20] avformat/matroskaenc: Don't needlessly copy AVCodecParameters 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" At the end of encoding, the FLAC encoder sends a packet whose side data contains updated extradata (e.g. a correct md5 checksum). The Matroska muxer uses this to update the CodecPrivate. In doing so, the stream's codecpar was copied. But given that writing a FLAC CodecPrivate does not modify the used AVCodecParameters at all, there is no need to do so and this commit changes this. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 3981986e86..3cbaaf9574 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2170,24 +2170,16 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) break; case AV_CODEC_ID_FLAC: if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { - AVCodecParameters *codecpriv_par; + uint8_t *old_extradata = par->extradata; if (side_data_size != par->extradata_size) { av_log(s, AV_LOG_ERROR, "Invalid FLAC STREAMINFO metadata for output stream %d\n", pkt->stream_index); return AVERROR(EINVAL); } - codecpriv_par = avcodec_parameters_alloc(); - if (!codecpriv_par) - return AVERROR(ENOMEM); - ret = avcodec_parameters_copy(codecpriv_par, par); - if (ret < 0) { - avcodec_parameters_free(&codecpriv_par); - return ret; - } - memcpy(codecpriv_par->extradata, side_data, side_data_size); + par->extradata = side_data; avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET); - mkv_write_codecprivate(s, mkv->tracks_bc, codecpriv_par, 1, 0); - avcodec_parameters_free(&codecpriv_par); + mkv_write_codecprivate(s, mkv->tracks_bc, par, 1, 0); + par->extradata = old_extradata; } break; // FIXME: Remove the following once libaom starts propagating extradata during init() From patchwork Sun Apr 5 15:59:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18683 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a0c:c987:0:0:0:0:0 with SMTP id b7csp662107qvk; Sun, 5 Apr 2020 09:03:07 -0700 (PDT) X-Google-Smtp-Source: APiQypIp8CgIYindADNsLjSHYigWuV3+4hs9ZOBXsdgeq13I8zl+3K6ikaPf6erWUgvHji/dfiV9 X-Received: by 2002:a05:6402:b17:: with SMTP id bm23mr15847218edb.165.1586102587822; Sun, 05 Apr 2020 09:03:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1586102587; cv=none; d=google.com; s=arc-20160816; b=DeGsybfpJ4MDULh7LYtJ0I4dWSd/60Bn7m/iL3UqCNfIiJAfSbR+5rRWNbV0BMRa14 r7Bne4aMiiCscBSUG1ZJBsnUYlg77KtUu48+bULoRgphK719OFfgnYW2BTjxZGA+WXYf jVjfgPevTJ35arq8GYWI6ZEdDJdvnjjGNFrgDkIA1WX8FERTALSkMPZ4pGdntE1GVkcQ IMkgwfTRK8LSMVkbDhMsuZ+pZuaJsmq0ojDmbr5vQ/IhgZ6mkrc/vaAEi12NUt67kBzk nPmzHlfKM5QY7Lb3CHaryAc+cYzwZhs4SR+kfd4XY2KHpT6ZaHP+MTRMS1m3qw5d+qv8 SQvQ== 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:dkim-signature:delivered-to; bh=7IJSQpAW+KIA2LvQxQNv4mNgVWAiXE5QuoC4AbeOQM8=; b=E3eNMomQ8krbR3qMNWjfRBfUND4DvdYi9q4NmpEOI//532mQezGdBuX2spTqWVehy0 DKjWHojv3+UD4OTvk2BLThfZN0sziWrWJ9XiZJhf4HEPaxXqmkkUyyTWXkObq8AByJeb dtZ1N0pF/k4Z5tt7CKf8PrtPJe+cqgAXjpxrYeTGqhUhVYc7DVlFfqSDMGJ5gy2Ug5w0 94XLEBWT8Q83qiSvQMVlUlCkgcq1gPSpevJXEhwQtWr2UR7SIwvzLGQKR6+ScwOD68LH mxSAcQPI7lHcGs26N5QpAxe1ET8KVsyJTpA7+++twofhGC8MlpjYhqjvcZmTOy5NcAkr 91Vw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=GFicUn7J; 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=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 v15si10462773eda.214.2020.04.05.09.03.07; Sun, 05 Apr 2020 09:03:07 -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 header.s=20161025 header.b=GFicUn7J; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C50DB68B520; Sun, 5 Apr 2020 19:00:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3317C68B4C7 for ; Sun, 5 Apr 2020 19:00:19 +0300 (EEST) Received: by mail-wr1-f45.google.com with SMTP id w10so14471765wrm.4 for ; Sun, 05 Apr 2020 09:00:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6ezyr8/l+bddLWaB8K3mHhZm8HSKMlqxwUOBD7E7Hic=; b=GFicUn7JL8h++gIe9CzkC17wYENZ0CpmlJJFDyQrWnyhoc+wGC86bgkYCmj7Fk/NOQ CoBGEDfvNd7xuDKONqw5MisuqaEQYw7ffkV5XmKsU6ZjtWDdifz59vfMpSFecB3+UAQ3 umwi4ZDKlL5+Wj1L76ctY96Cl00qz0z6RyagMWhTy5ceJ3MCvnYIguVdSnf/2xNzYSbb 8ysYTJ2kjvYDBEoeo14CC2sxh1r8pHoxaXTzOtEVJaq1mXTySru0ox6UvZj3N3HXKEwp 0BuszBB4PoOtRxgX/OTZ34FvXipy4xvzX1mpx1UqF4KlZYq1u7lXznQi7fSXl8eNZ1tA Jwyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6ezyr8/l+bddLWaB8K3mHhZm8HSKMlqxwUOBD7E7Hic=; b=Vovv2IXCHDwdfnk0/++BB0O6Ic85gNpBN7WjFqWoY9RW8pbuRameb7sguUAeYtLlQp iZN2fF7qE5cLsf+Wkd7g0g4P08Jxy2lfE6PO/e4p8iFi7B8FiflK7Aerz4yB3EgtEXfr RO5RRJPQbeWaENvTjZ2xgyitQ1dTcg7KgOGchzfcGTtubumWXxViGSLhca6S9TA018AD HMx+o6ueAgF6tAMMmVR1UMbhywVVqbvOk+e8KbBrx1fpFM+SZahQKtk1dyKRw/k91zKv AKeNA38QTIsR5a0e7ysWCqRqZhDV+jqRSrKXaKKiMw4EfWOPov8/Ai3JNIcrUNz+ddqf XsTw== X-Gm-Message-State: AGi0PuYRlZNNQEbDhWKyHJm329WPrSRr/X4liPJXNwPEA2wSYaQ64Ur6 UVyKXqQMvh2uLpC9AUNCWLPKI6Ek X-Received: by 2002:adf:9b96:: with SMTP id d22mr20778463wrc.249.1586102417658; Sun, 05 Apr 2020 09:00:17 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:16 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:27 +0200 Message-Id: <20200405155928.9323-20-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 19/20] avformat/matroskaenc: Redo handling of FlagDefault 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: S5n6+Eyzt6ft Content-Length: 13374 Up until now, the Matroska muxer would mark a track as default if it had the disposition AV_DISPOSITION_DEFAULT or if there was no track with AV_DISPOSITION_DEFAULT set; in the latter case even more than one track of a kind (audio, video, subtitles) was marked as default which is not sensible. This commit changes the logic used to mark tracks as default. There are now three modes for this: a) In the "infer" mode the first track of every type (audio, video, subtitles) with default disposition set will be marked as default; if there is no such track (for a given type), then the first track of this type (if existing) will be marked as default. This behaviour is inspired by mkvmerge. It ensures that the default flags will be set in a sensible way even if the input comes from containers that lack the concept of default flags. This mode is the default mode. b) The "infer_no_subs" mode is similar to the "infer" mode; the difference is that if no subtitle track with default disposition exists, no subtitle track will be marked as default at all. c) The "passthrough" mode: Here the track will be marked as default if and only the corresponding input stream had disposition default. This fixes ticket #8173 (the passthrough mode is ideal for this) as well as ticket #8416 (the "infer_no_subs" mode leads to the desired output). Signed-off-by: Andreas Rheinhardt --- I did not apply this with the last round of patches as I am still hoping that someone would come up with better names. Furthermore, AVFormatContext.nb_streams is actually an unsigned, yet I am using an int to run through it (this is no problem now and probably won't be one ever, because the nb_streams is always in the range of int); I could rewrite this to only use unsigned. Should I do it? doc/muxers.texi | 19 +++++++ libavformat/matroskaenc.c | 56 ++++++++++++++++--- tests/ref/fate/matroska-flac-extradata-update | 4 +- 3 files changed, 69 insertions(+), 10 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index 3be1c89416..4083e24205 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -1358,6 +1358,25 @@ A safe size for most use cases should be about 50kB per hour of video. Note that cues are only written if the output is seekable and this option will have no effect if it is not. +@item default_mode +This option controls how the FlagDefault of the output tracks will be set. +It influences which tracks players should play by default. The default mode +is @samp{infer}. +@table @samp +@item infer +In this mode, for each type of track (audio, video or subtitle), if there is +a track with disposition default of this type, then the first such track +(i.e. the one with the lowest index) will be marked as default; if no such +track exists, the first track of this type will be marked as default instead +(if existing). This ensures that the default flag is set in a sensible way even +if the input originated from containers that lack the concept of default tracks. +@item infer_no_subs +This mode is the same as infer except that if no subtitle track with +disposition default exists, no subtitle track will be marked as default. +@item passthrough +In this mode the FlagDefault is set if and only if the AV_DISPOSITION_DEFAULT +flag is set in the disposition of the corresponding stream. +@end table @end table @anchor{md5} diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 3cbaaf9574..084e7ca416 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -60,6 +60,12 @@ * Info, Tracks, Chapters, Attachments, Tags and Cues */ #define MAX_SEEKHEAD_ENTRIES 6 +enum { + DEFAULT_MODE_INFER, + DEFAULT_MODE_INFER_NO_SUBS, + DEFAULT_MODE_PASSTHROUGH, +}; + typedef struct ebml_master { int64_t pos; ///< absolute offset in the containing AVIOContext where the master's elements start int sizebytes; ///< how many bytes were reserved for the size @@ -149,6 +155,7 @@ typedef struct MatroskaMuxContext { int wrote_chapters; int allow_raw_vfw; + int default_mode; uint32_t segment_uid[4]; } MatroskaMuxContext; @@ -1088,7 +1095,7 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, AVStream *st, mkv_track *track, AVIOContext *pb, - int default_stream_exists) + int is_default) { AVCodecParameters *par = st->codecpar; ebml_master subinfo, track_master; @@ -1126,8 +1133,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, // The default value for TRACKFLAGDEFAULT is 1, so add element // if we need to clear it. - if (default_stream_exists && !(st->disposition & AV_DISPOSITION_DEFAULT)) - put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT)); + if (!is_default) + put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, 0); if (st->disposition & AV_DISPOSITION_FORCED) put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1); @@ -1357,7 +1364,7 @@ static int mkv_write_tracks(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb = s->pb; - int i, ret, default_stream_exists = 0; + int i, ret, video_default_idx, audio_default_idx, subtitle_default_idx; if (mkv->nb_attachments == s->nb_streams) return 0; @@ -1368,14 +1375,43 @@ static int mkv_write_tracks(AVFormatContext *s) if (ret < 0) return ret; - for (i = 0; i < s->nb_streams; i++) { - AVStream *st = s->streams[i]; - default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT; + if (mkv->default_mode != DEFAULT_MODE_PASSTHROUGH) { + int video_idx, audio_idx, subtitle_idx; + + video_idx = video_default_idx = + audio_idx = audio_default_idx = + subtitle_idx = subtitle_default_idx = -1; + + for (i = s->nb_streams - 1; i >= 0; i--) { + AVStream *st = s->streams[i]; + + switch (st->codecpar->codec_type) { +#define CASE(type, variable) \ + case AVMEDIA_TYPE_ ## type: \ + variable ## _idx = i; \ + if (st->disposition & AV_DISPOSITION_DEFAULT) \ + variable ## _default_idx = i; \ + break; + CASE(VIDEO, video) + CASE(AUDIO, audio) + CASE(SUBTITLE, subtitle) +#undef CASE + } + } + + video_default_idx = FFMAX(video_default_idx, video_idx); + audio_default_idx = FFMAX(audio_default_idx, audio_idx); + if (mkv->default_mode != DEFAULT_MODE_INFER_NO_SUBS) + subtitle_default_idx = FFMAX(subtitle_default_idx, subtitle_idx); } for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; + int is_default = mkv->default_mode == DEFAULT_MODE_PASSTHROUGH ? + st->disposition & AV_DISPOSITION_DEFAULT : + i == video_default_idx || i == audio_default_idx || + i == subtitle_default_idx; ret = mkv_write_track(s, mkv, st, &mkv->tracks[i], - mkv->tracks_bc, default_stream_exists); + mkv->tracks_bc, is_default); if (ret < 0) return ret; } @@ -2724,6 +2760,10 @@ static const AVOption options[] = { { "live", "Write files assuming it is a live stream.", OFFSET(is_live), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS }, { "allow_raw_vfw", "allow RAW VFW mode", OFFSET(allow_raw_vfw), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS }, { "write_crc32", "write a CRC32 element inside every Level 1 element", OFFSET(write_crc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS }, + { "default_mode", "Controls how a track's FlagDefault is inferred", OFFSET(default_mode), AV_OPT_TYPE_INT, { .i64 = DEFAULT_MODE_INFER }, DEFAULT_MODE_INFER, DEFAULT_MODE_PASSTHROUGH, FLAGS, "default_mode" }, + { "infer", "For each track type, mark the first track of disposition default as default; if none exists, mark the first track as default.", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_INFER }, 0, 0, FLAGS, "default_mode" }, + { "infer_no_subs", "For each track type, mark the first track of disposition default as default; for audio and video: if none exists, mark the first track as default.", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_INFER_NO_SUBS }, 0, 0, FLAGS, "default_mode" }, + { "passthrough", "Use the disposition flag as-is", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_PASSTHROUGH }, 0, 0, FLAGS, "default_mode" }, { NULL }, }; diff --git a/tests/ref/fate/matroska-flac-extradata-update b/tests/ref/fate/matroska-flac-extradata-update index 890bf1ac52..8b575903e6 100644 --- a/tests/ref/fate/matroska-flac-extradata-update +++ b/tests/ref/fate/matroska-flac-extradata-update @@ -1,5 +1,5 @@ -2b82ee67ace359edb464e289486b3ebd *tests/data/fate/matroska-flac-extradata-update.matroska -2008 tests/data/fate/matroska-flac-extradata-update.matroska +332bf4d9c92d24478d2a218e81223433 *tests/data/fate/matroska-flac-extradata-update.matroska +2011 tests/data/fate/matroska-flac-extradata-update.matroska #extradata 0: 34, 0x7acb09e7 #extradata 1: 34, 0x7acb09e7 #extradata 2: 34, 0x443402dd From patchwork Sun Apr 5 15:59:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18682 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C764D44BC7D for ; Sun, 5 Apr 2020 19:03:12 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 522CE68B527; Sun, 5 Apr 2020 19:00:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0291D68B4E6 for ; Sun, 5 Apr 2020 19:00:19 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id w10so14471801wrm.4 for ; Sun, 05 Apr 2020 09:00:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qoFLbunH/C1mgORd9Oi7SZTo9sEgf+GayX3Yy/Zqnbg=; b=ZTNOhtj+yxMVdBrOBuStwpblrmgOQ290xM/HDLTJ4/rTlTHzTk6NIN1IUpOVxr83TJ vs+RmXJonSwpV2KQoBnp1hRoZfEQOyjcZl4SXZY/f1kjtqkYYyZ+pNxXnI6Ph5/ffKfL oe2LjUcHR0JC8kaXK4pw7BjJFA1wVJlMR5zb40eOpvR2lQ6WpUOiQR9NZtVt+BMK9mc/ xx4ZWRJPEPFfTewuX6VF5gQ+cFzxpOT37tU9msQ1xPywpDqNT61XSOrYoqsB0aNIs8Kv cuSTXlV7rnmNFEYTMMxIlAboEpDdOjCiIpWUnFZ3DuA2eh2eHi9o7Q5BcqKEa7fj4lxz MsCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qoFLbunH/C1mgORd9Oi7SZTo9sEgf+GayX3Yy/Zqnbg=; b=gS/G8xwLia54Y3ceZOvUd7d9vbgIOjcYp6GN+y/Xr1G6N2ZT5Yh1MrQs2n5X5yciNv c7QrzuVXs+xEZgLAqbU5KsLvD/g2fekbuHjoldapM3I1NHSrUpTEwG4AgIuHoZm6umhp 80kHNeXS+37f1ujh9M7l7GGXZjqsuAl1OaSHJU8BBJLs28TRy0/8hgixvotqxUhyEROL /3Zxc4maJmSt8/fxd23mlsEtJcMzXspzXoXAnVLBHnzV3nDQaFXYPj4IKpF02QDpjQqF MSSED6IDffp8Itz3cpv0q6rWz7eFNurbJdHB5n9MEHgjvngLIUYi+FNDjilGy4wCSc7X fYPw== X-Gm-Message-State: AGi0PuY3BU/xJDCcfKjFLobvYDMcedet6enl2jM6Qo0z45K6v5Rkydzw Sn+izU740yHrQA1jyvYI0yFerWIx X-Google-Smtp-Source: APiQypJ+nTndimqWatyU2M174sqYMeeQNfvy2wwwPmnf6QXJBTK4Z/jC8oC+1hqiVA3d5guVH3k1VQ== X-Received: by 2002:a5d:6645:: with SMTP id f5mr20103295wrw.280.1586102418627; Sun, 05 Apr 2020 09:00:18 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:18 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:28 +0200 Message-Id: <20200405155928.9323-21-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 20/20] avformat/matroskaenc: Cosmetics 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Reindentation, removal of { } if they contain only one statement, removal of other useless parentheses and moving the return statement to a line of its own in situations like "if (ret < 0) return ret;". Moreover, several overlong lines were made shorter and a camelCase variable received a name in line with our naming conventions. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 135 +++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 69 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 084e7ca416..571fde3ee8 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -261,7 +261,8 @@ static void put_ebml_sint(AVIOContext *pb, uint32_t elementid, int64_t val) int i, bytes = 1; uint64_t tmp = 2*(val < 0 ? val^-1 : val); - while (tmp>>=8) bytes++; + while (tmp >>= 8) + bytes++; put_ebml_id(pb, elementid); put_ebml_num(pb, bytes, 0); @@ -593,8 +594,8 @@ static int put_wv_codecpriv(AVIOContext *pb, const AVCodecParameters *par) return 0; } -static int put_flac_codecpriv(AVFormatContext *s, - AVIOContext *pb, const AVCodecParameters *par) +static int put_flac_codecpriv(AVFormatContext *s, AVIOContext *pb, + const AVCodecParameters *par) { int write_comment = (par->channel_layout && !(par->channel_layout & ~0x3ffffULL) && @@ -616,7 +617,7 @@ static int put_flac_codecpriv(AVFormatContext *s, av_dict_set(&dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", buf, 0); len = ff_vorbiscomment_length(dict, vendor, NULL, 0); - if (len >= ((1<<24) - 4)) { + if (len >= ((1 << 24) - 4)) { av_dict_free(&dict); return AVERROR(EINVAL); } @@ -1109,9 +1110,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, int j, ret; const AVDictionaryEntry *tag; - if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT) { + if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT) return 0; - } if (par->codec_id == AV_CODEC_ID_AAC) { ret = get_aac_sample_rates(s, par->extradata, par->extradata_size, &sample_rate, @@ -1123,9 +1123,9 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, track_master = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); put_ebml_uint(pb, MATROSKA_ID_TRACKNUMBER, track->track_num); put_ebml_uid (pb, MATROSKA_ID_TRACKUID, track->uid); - put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) + put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGLACING, 0); // no lacing (yet) - if ((tag = av_dict_get(st->metadata, "title", NULL, 0))) + if (tag = av_dict_get(st->metadata, "title", NULL, 0)) put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value); tag = av_dict_get(st->metadata, "language", NULL, 0); put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, @@ -1439,7 +1439,8 @@ static int mkv_write_chapters(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_CHAPTERS, avio_tell(pb)); ret = start_ebml_master_crc32(&dyn_cp, mkv); - if (ret < 0) return ret; + if (ret < 0) + return ret; editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0); if (mkv->mode != MODE_WEBM) { @@ -1468,7 +1469,7 @@ static int mkv_write_chapters(AVFormatContext *s) put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0); put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGENABLED, 1); } - if ((t = av_dict_get(c->metadata, "title", NULL, 0))) { + if (t = av_dict_get(c->metadata, "title", NULL, 0)) { chapterdisplay = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERDISPLAY, 0); put_ebml_string(dyn_cp, MATROSKA_ID_CHAPSTRING, t->value); put_ebml_string(dyn_cp, MATROSKA_ID_CHAPLANG , "und"); @@ -1556,8 +1557,8 @@ static int mkv_check_tag_name(const char *name, uint32_t elementid) av_strcasecmp(name, "mimetype"))); } -static int mkv_write_tag(AVFormatContext *s, const AVDictionary *m, uint32_t elementid, - uint64_t uid, ebml_master *tag) +static int mkv_write_tag(AVFormatContext *s, const AVDictionary *m, + uint32_t elementid, uint64_t uid, ebml_master *tag) { MatroskaMuxContext *mkv = s->priv_data; const AVDictionaryEntry *t = NULL; @@ -1568,7 +1569,7 @@ static int mkv_write_tag(AVFormatContext *s, const AVDictionary *m, uint32_t ele if (ret < 0) return ret; - while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) { + while (t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)) { if (mkv_check_tag_name(t->key, elementid)) { ret = mkv_write_simpletag(mkv->tags_bc, t); if (ret < 0) @@ -1586,7 +1587,7 @@ static int mkv_check_tag(const AVDictionary *m, uint32_t elementid) { const AVDictionaryEntry *t = NULL; - while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) + while (t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)) if (mkv_check_tag_name(t->key, elementid)) return 1; @@ -1603,7 +1604,8 @@ static int mkv_write_tags(AVFormatContext *s) if (mkv_check_tag(s->metadata, 0)) { ret = mkv_write_tag(s, s->metadata, 0, 0, NULL); - if (ret < 0) return ret; + if (ret < 0) + return ret; } tagp = (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live ? &tag : NULL; @@ -1619,7 +1621,8 @@ static int mkv_write_tags(AVFormatContext *s) ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, track->uid, tagp); - if (ret < 0) return ret; + if (ret < 0) + return ret; if (tagp) { AVIOContext *pb = mkv->tags_bc; @@ -1628,7 +1631,7 @@ static int mkv_write_tags(AVFormatContext *s) simpletag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 2 + 1 + 8 + 23); put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION"); - mkv->tracks[i].duration_offset = avio_tell(pb); + track->duration_offset = avio_tell(pb); // Reserve space to write duration as a 20-byte string. // 2 (ebml id) + 1 (data size) + 20 (data) @@ -1693,7 +1696,8 @@ static int mkv_write_attachments(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb)); ret = start_ebml_master_crc32(&dyn_cp, mkv); - if (ret < 0) return ret; + if (ret < 0) + return ret; for (i = 0; i < s->nb_streams; i++) { const AVStream *st = s->streams[i]; @@ -1747,19 +1751,19 @@ static int mkv_write_attachments(AVFormatContext *s) static int64_t get_metadata_duration(AVFormatContext *s) { - int i = 0; + const AVDictionaryEntry *duration = av_dict_get(s->metadata, "DURATION", + NULL, 0); int64_t max = 0; int64_t us; - const AVDictionaryEntry *explicitDuration = av_dict_get(s->metadata, "DURATION", NULL, 0); - if (explicitDuration && (av_parse_time(&us, explicitDuration->value, 1) == 0) && us > 0) { + if (duration && (av_parse_time(&us, duration->value, 1) == 0) && us > 0) { av_log(s, AV_LOG_DEBUG, "get_metadata_duration found duration in context metadata: %" PRId64 "\n", us); return us; } - for (i = 0; i < s->nb_streams; i++) { + for (unsigned i = 0; i < s->nb_streams; i++) { int64_t us; - const AVDictionaryEntry *duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0); + duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0); if (duration && (av_parse_time(&us, duration->value, 1) == 0)) max = FFMAX(max, us); @@ -1815,18 +1819,17 @@ static int mkv_write_header(AVFormatContext *s) pb = mkv->info_bc; put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000); - if ((tag = av_dict_get(s->metadata, "title", NULL, 0))) + if (tag = av_dict_get(s->metadata, "title", NULL, 0)) put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value); if (!(s->flags & AVFMT_FLAG_BITEXACT)) { put_ebml_string(pb, MATROSKA_ID_MUXINGAPP, LIBAVFORMAT_IDENT); - if ((tag = av_dict_get(s->metadata, "encoding_tool", NULL, 0))) + if (tag = av_dict_get(s->metadata, "encoding_tool", NULL, 0)) put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, tag->value); else put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT); - if (mkv->mode != MODE_WEBM) { + if (mkv->mode != MODE_WEBM) put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 16); - } } else { const char *ident = "Lavf"; put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , ident); @@ -2081,14 +2084,12 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, if (data != pkt->data) av_free(data); - if (blockid == MATROSKA_ID_BLOCK && !keyframe) { + if (blockid == MATROSKA_ID_BLOCK && !keyframe) put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp - ts); - } track->last_timestamp = ts; - if (discard_padding) { + if (discard_padding) put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding); - } if (side_data_size) { block_additions = start_ebml_master(pb, MATROSKA_ID_BLOCKADDITIONS, 0); @@ -2101,9 +2102,8 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, end_ebml_master(pb, block_more); end_ebml_master(pb, block_additions); } - if (side_data_size || discard_padding) { + if (side_data_size || discard_padding) end_ebml_master(pb, block_group); - } return 0; } @@ -2115,7 +2115,7 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, const AVPac ebml_master blockgroup; int id_size, settings_size, size; uint8_t *id, *settings; - int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; + int64_t ts = track->write_dts ? pkt->dts : pkt->pts; const int flags = 0; id_size = 0; @@ -2305,7 +2305,8 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) (par->codec_type == AVMEDIA_TYPE_VIDEO || !mkv->have_video && !track->has_cue)) { ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, mkv->cluster_pos, relative_packet_pos, -1); - if (ret < 0) return ret; + if (ret < 0) + return ret; track->has_cue = 1; } } else { @@ -2358,36 +2359,34 @@ static int mkv_write_packet(AVFormatContext *s, const AVPacket *pkt) return ret; if (mkv->cluster_pos != -1) { - if (mkv->tracks[pkt->stream_index].write_dts) - cluster_time = pkt->dts - mkv->cluster_pts; - else - cluster_time = pkt->pts - mkv->cluster_pts; - cluster_time += mkv->tracks[pkt->stream_index].ts_offset; - - cluster_size = avio_tell(mkv->cluster_bc); - - if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) { - // WebM DASH specification states that the first block of every cluster - // has to be a key frame. So for DASH video, we only create a cluster - // on seeing key frames. - start_new_cluster = keyframe; - } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO && - cluster_time > mkv->cluster_time_limit) { - // For DASH audio, we create a Cluster based on cluster_time_limit - start_new_cluster = 1; - } else if (!mkv->is_dash && - (cluster_size > mkv->cluster_size_limit || - cluster_time > mkv->cluster_time_limit || - (codec_type == AVMEDIA_TYPE_VIDEO && keyframe && - cluster_size > 4 * 1024))) { - start_new_cluster = 1; - } else { - start_new_cluster = 0; - } + if (mkv->tracks[pkt->stream_index].write_dts) + cluster_time = pkt->dts - mkv->cluster_pts; + else + cluster_time = pkt->pts - mkv->cluster_pts; + cluster_time += mkv->tracks[pkt->stream_index].ts_offset; + + cluster_size = avio_tell(mkv->cluster_bc); + + if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) { + // WebM DASH specification states that the first block of + // every Cluster has to be a key frame. So for DASH video, + // we only create a Cluster on seeing key frames. + start_new_cluster = keyframe; + } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO && + cluster_time > mkv->cluster_time_limit) { + // For DASH audio, we create a Cluster based on cluster_time_limit. + start_new_cluster = 1; + } else if (!mkv->is_dash && + (cluster_size > mkv->cluster_size_limit || + cluster_time > mkv->cluster_time_limit || + (codec_type == AVMEDIA_TYPE_VIDEO && keyframe && + cluster_size > 4 * 1024))) { + start_new_cluster = 1; + } else + start_new_cluster = 0; - if (start_new_cluster) { - mkv_end_cluster(s); - } + if (start_new_cluster) + mkv_end_cluster(s); } if (!mkv->cluster_pos) @@ -2568,9 +2567,8 @@ static int mkv_write_trailer(AVFormatContext *s) avio_seek(pb, endpos, SEEK_SET); } - if (!mkv->is_live) { + if (!mkv->is_live) end_ebml_master(pb, mkv->segment); - } return mkv->reserve_cues_space < 0 ? AVERROR(EINVAL) : 0; } @@ -2653,9 +2651,8 @@ static int mkv_init(struct AVFormatContext *s) mkv->mode = MODE_MATROSKAv2; mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks)); - if (!mkv->tracks) { + if (!mkv->tracks) return AVERROR(ENOMEM); - } if (!(s->flags & AVFMT_FLAG_BITEXACT)) { av_lfg_init(&c, av_get_random_seed()); @@ -2676,7 +2673,7 @@ static int mkv_init(struct AVFormatContext *s) } // ms precision is the de-facto standard timescale for mkv files - avpriv_set_pts_info(s->streams[i], 64, 1, 1000); + avpriv_set_pts_info(st, 64, 1, 1000); if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) { if (mkv->mode == MODE_WEBM) {