From patchwork Wed Jan 1 00:58: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: 17081 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp216417qvb; Tue, 31 Dec 2019 16:59:12 -0800 (PST) X-Google-Smtp-Source: APXvYqz6aKVWweaLsawVx5YcxY0Y41j6Cp5hdrkGSJzePoNVHvjdfZYXmGf1brJvXqcyiqBZFsGr X-Received: by 2002:a50:f391:: with SMTP id g17mr77966452edm.52.1577840352330; Tue, 31 Dec 2019 16:59:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840352; cv=none; d=google.com; s=arc-20160816; b=jTmcBxRqB3CY3U28am18NRs45/+5wPNjiDUv26jPEBguqZo2hrWMVegT6mklBLu/uk 47AUJgAaEMu6PYO4o8shDCVn0+KCTk9YgraTOju5JXyANIEsOjUyvozgK3c12LRdAF/5 JrdvELn1f8G62cAtnWVUcbE+J0ZVsJZUm7RXSCnHPhzQmVrahGxCp4gA26t8zpIAIwNk C+ZLQ9gVBKWoQ7ylULeMzlxGpQ8QkUlR1k7lMchWu7Hy1iqsjkukcY5i1e5/7UAhwu+j a7zeg/4MGu4sxa7eaok7zxTjBIVfB4/0OsnfYpRe13tmvfVB3QcdpHOAG+S9ThKgTxNu 4Uiw== 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=lie25QnRSY5tqWyEXiK2Dl/nfHH2jISWpMuVPKb2sZ4=; b=N8n9IORL7oLBkZ0SXhuQtvSYpwvaSTFXpTZAC/MNWlzkyQ055nXO3QtL64AgraDHBH 6aAvIUQ1uOw7pLVtUK2Ju3/UjEenL0TbnML4+9pC9UHIK/MuAoXp8NrcOMsRDqOE/eNt w/2vEWEDbNlGqNZp+XZFgosTIXkSP+HE21+Ddl4Y2CI7mS9q/JudF1GS3mwYvJ9DfHy2 IWRyUoCEgC1Jh6wynEVaousqK8y6L1kcv6AnKWmnzwPP8/nQeGOG1/u2pFuEnZBDUL20 WzMJumD1k2UvKyTYTqoQOdPLLVtO5VYLVGeFjicGPCa8x3EnBBc3f1PWeNu92tfO4rK7 /Hnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=SG7ivgJ+; 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 rv11si32670683ejb.407.2019.12.31.16.59.12; Tue, 31 Dec 2019 16:59:12 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=SG7ivgJ+; 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 7099768AC85; Wed, 1 Jan 2020 02:59:09 +0200 (EET) 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 7730768AC3F for ; Wed, 1 Jan 2020 02:59:02 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id g17so36197772wro.2 for ; Tue, 31 Dec 2019 16:59:02 -0800 (PST) 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=e8iuLWlL8yX28XR72Owwrp0lRHF0ct2gRiSEL9LR0xM=; b=SG7ivgJ+RzbkrnwrkzZLB6bsIiiJmDocfA5dOe3Q8Tve/w79xUOPiHLpTdZOP9K34k 2hwT8C3HpwLBpRFz3eiHQ6M+4aZpkwCxNin5vrH5G5iirqZMCuU8zAmT80EaeMQ/CTHI WlBYYEqJPG9LKacVSCEAmmsyXdVSLtaOYaLA2P3Zy28CyaGbadT0LU6qHGc5SXH5yIRa xThT9bkcqtDSEgfwnS0hmPAbUMK2vAqQAkrE2BAIHdRuU4A2woY+/HjFwYNsSzhhZNiH 0hRlSE/qXzFwW4nkfd2xHhyHh3isaSTVv9+nK47FK4z9U0WeoI8YEks8hY2WjvaTCfvF xZ9w== 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=e8iuLWlL8yX28XR72Owwrp0lRHF0ct2gRiSEL9LR0xM=; b=LXxdm1WY9hYbeNS0b58yrkQNrgmy1E9Lkym9RYe3CBE78x9xON+yXhMscZxNs4IgA2 9XD5tGXKpqBU6jUmP6Aum2jt0UDja88fjofuuOTLD5Yuv3yqDu86G9lnnOCB557MPw1g wemyCBZMHzcNDu63eTDLzsVe/FHZqrwh4oiMBfNZgYNnAjOS7T/fEwD24AUVz8gpvXh6 ureZK+S078nSSicBmSOzpHROvObkWUL0evVuZCHTGLxY10/4bVHS69Z2I8yOhofYtUQX 8PrGfv8A+CvPkNp9w6kTm/ZJlPM6V6RgCYTNzoirvl/kq2SaX5fuihca9mOANu9mby7V 51aQ== X-Gm-Message-State: APjAAAU8kSBBjiTBdR+wuhEsOfInOah51uAHSBBs4McpcHe8SjocyfxX jayaVNSkws1KAl8Jgew1kujaG/5M X-Received: by 2002:a5d:51c6:: with SMTP id n6mr3017574wrv.250.1577840341665; Tue, 31 Dec 2019 16:59:01 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:01 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:18 +0100 Message-Id: <20200101005837.11356-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/20] avformat/matroskaenc: Fix ReferenceBlock timestamp 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: UhJK24T+XyZh Content-Length: 2242 In order to indicate that the frames in a BlockGroup are not keyframes, one has to add a ReferenceBlock element containing the timestamp of a referenced Block that has already been written. The timestamp ought to be relative to the timestamp of the Block it is attached to. Yet the Matroska muxer used the relative timestamp of the preceding Block of the track, i.e. the timestamp of the preceding block relative to the timestamp of the Cluster containing said block (that need not be the Cluster containing the current Block). This has been fixed. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 469b604de6..9cf840c9be 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2167,9 +2167,9 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, av_free(data); if (blockid == MATROSKA_ID_BLOCK && !keyframe) { - put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp); + put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp - ts); } - track->last_timestamp = ts - mkv->cluster_pts; + track->last_timestamp = ts; if (discard_padding) { put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding); From patchwork Wed Jan 1 00:58: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: 17090 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp216549qvb; Tue, 31 Dec 2019 16:59:19 -0800 (PST) X-Google-Smtp-Source: APXvYqw6J1xdLvEavSWc2V7v/xnzoJrDFHl2tTOEDCp8jUkdh0pTFR24Cpv5iKmGyDpgnA2C/6nY X-Received: by 2002:a17:906:ed1:: with SMTP id u17mr79443311eji.286.1577840359661; Tue, 31 Dec 2019 16:59:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840359; cv=none; d=google.com; s=arc-20160816; b=gvfQLltyZWkh4Dciin4DPsCbNO2V/a4OFq8Cc8kyxGe3cYFuaPEl97M0e3JL24trpg o1nhMiQNufuHwR/xGY6s0PPtCI3LjlR3TrXFsZOU/ZkeZc1s4OhRMo0I9csFnhpE+DTf Pdr5uH8S5jSHUfwIR0kTZ5SZViIKu5ohjPlRxFQz++VRb5j0RPX9RKJ7E638MLiNwyrF WJX4R9zfA7dfnYGlaquX3TZPMcN0zWoE1P5iiUJ5E1er6WJsCnG2ulvFyEJ5qUy68Up4 P80Ud7MXH9J+tywpYlapBkk/X72ZebujQHqTwFtEkcIL1VSGTeS+ZO0wjGxWLCx69wPd xMVA== 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=SNMt+bN0snV1B38s/9r51YttYNMxR+2H3qw6Kj8pCUE=; b=JeMyl/G0U5bNjKKLEX9PUtyjAK5Owm8J9kedC7JBiE4Tw86TY3CJSp9DnhC5r7dztc 4C524PnAa0C8zjl7rCbHaslcgWlhxph267MNnOkPnRhmlI0pJJj0bruQrfRsqWKvsPRe L5W2r2zvApHsPrw2StHlXV1Soph4Vdc6zsPPW+WkqnVa5rs4MRIuC4ZvRS3mddR419xB SomRC/msaTuPA6zYMraEGLGbiFafFpxwQJa5c+BEgG6NTFgqwdmcXCSdFBW+smilI0pt bsKIVDaS85hkg1yI1vDgeEwC/gEsAyUhRCsF/RfUgdjwEuCK/e+kmolPVjSQ4JmHDU70 VFpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=jf6QTVnN; 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 jx14si31430427ejb.440.2019.12.31.16.59.19; Tue, 31 Dec 2019 16:59:19 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=jf6QTVnN; 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 211A068AC9E; Wed, 1 Jan 2020 02:59:10 +0200 (EET) 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 82527688177 for ; Wed, 1 Jan 2020 02:59:03 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id d139so2604249wmd.0 for ; Tue, 31 Dec 2019 16:59:03 -0800 (PST) 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=8wVsD4xhdWOGDmIoJHIdguNBtHfqQIQtfzXP4Z5HEak=; b=jf6QTVnNXnCqUqZafAs47lew0DMryBrWhmYYK38VtWUB/lEZhE9IimrpmnS5yBGMxp F37YkygTzVXpNpHf88kRQbaQtLe6bJW1afvnV70a1ErgXmcjHzk39YDUQZZhrF16KzBe TueRI6UAwLfVc5DKA9h5W/8d03IqKXzubqOoyRSmrdOuoa6sAUmK8/deQw/bTru0xyB4 EKRbEaCUqiFDVc4+sR9Xd20OJsoXxebEDcxfmH4UpfKEbs77uz8a+vPJtkhMEabcH/at Wh89PYi39AVoDyJPA9vMx+NviUdT/39rIZxlS+d9zl14ub8q2EAhKAr1a4n+qoD7lhT5 M5dg== 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=8wVsD4xhdWOGDmIoJHIdguNBtHfqQIQtfzXP4Z5HEak=; b=Nj6of9oeNnrwvKfypzZ0dsUxtG2hkKF56qIuEi8mMtuZPAXkn2B2PrwwVLngg/K6jw h3sSPPmx6FRo/wkfWlH9mD7HmeOIQp3Y8u+7mjkLrfP4nalwXCbRhSaZWkqr5cMg+Fs6 wPiCyzpGf+c4gswyB9LBeBv2F3D9ocIFVSAkZbXV/FVYa+vCLZfBYzl2Ij/d0CPd/4tu OaP2z3YwfU1dY2HVoYcLYYj/IFKetBWaWI1tBGbtyb616qi7Yk1uIjQZvAp8vTFk2zKX /7+nCJa83jppGTIX89hfc44mydv/yNyKuojFi8lwhf6xfcv3kXat0FijthOowza1oxuf HZ2g== X-Gm-Message-State: APjAAAVPnxloCu7kdI6XI2KuPqS0wxa7fctTaHMpnVxINS30ppEXa+Li f1UU0XftCt8+cxMRy8D0bvhwXUI8 X-Received: by 2002:a1c:f20c:: with SMTP id s12mr6642168wmc.173.1577840342597; Tue, 31 Dec 2019 16:59:02 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:02 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:19 +0100 Message-Id: <20200101005837.11356-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/20] avformat/matroskaenc: Improve writing Projection 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: iDm6yA0oRMxQ Content-Length: 6813 The Matroska Projection master element has such a small maximum length that it can always be written with a length field of length one. So it is unnecessary to first write the element into a dynamic buffer to get the accurate length in order not to waste bytes on the length field. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 48 +++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 9cf840c9be..bbf9b55e78 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -947,10 +947,8 @@ static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, AVStream *st) { AVIOContext b; - AVIOContext *dyn_cp; + ebml_master projection; int side_data_size = 0; - int ret, projection_size; - uint8_t *projection_ptr; uint8_t private[20]; const AVSphericalMapping *spherical = @@ -960,62 +958,58 @@ static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, if (!side_data_size) return 0; - ret = avio_open_dyn_buf(&dyn_cp); - if (ret < 0) - return ret; + if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR && + spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE && + spherical->projection != AV_SPHERICAL_CUBEMAP) { + av_log(s, AV_LOG_WARNING, "Unknown projection type\n"); + return 0; + } + + // Maximally 4 8-byte elements with id-length 2 + 1 byte length field + // and the private data of the AV_SPHERICAL_EQUIRECTANGULAR_TILE case + projection = start_ebml_master(pb, MATROSKA_ID_VIDEOPROJECTION, + 4 * (2 + 1 + 8) + (2 + 1 + 20)); switch (spherical->projection) { case AV_SPHERICAL_EQUIRECTANGULAR: - put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE, + put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE, MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR); break; case AV_SPHERICAL_EQUIRECTANGULAR_TILE: ffio_init_context(&b, private, 20, 1, NULL, NULL, NULL, NULL); - put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE, + put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE, MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR); avio_wb32(&b, 0); // version + flags avio_wb32(&b, spherical->bound_top); avio_wb32(&b, spherical->bound_bottom); avio_wb32(&b, spherical->bound_left); avio_wb32(&b, spherical->bound_right); - put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, + put_ebml_binary(pb, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, private, avio_tell(&b)); break; case AV_SPHERICAL_CUBEMAP: ffio_init_context(&b, private, 12, 1, NULL, NULL, NULL, NULL); - put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE, + put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE, MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP); avio_wb32(&b, 0); // version + flags avio_wb32(&b, 0); // layout avio_wb32(&b, spherical->padding); - put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, + put_ebml_binary(pb, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, private, avio_tell(&b)); break; - default: - av_log(s, AV_LOG_WARNING, "Unknown projection type\n"); - goto end; } if (spherical->yaw) - put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, + put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, (double) spherical->yaw / (1 << 16)); if (spherical->pitch) - put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, + put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, (double) spherical->pitch / (1 << 16)); if (spherical->roll) - put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, + put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, (double) spherical->roll / (1 << 16)); -end: - projection_size = avio_close_dyn_buf(dyn_cp, &projection_ptr); - if (projection_size) { - ebml_master projection = start_ebml_master(pb, - MATROSKA_ID_VIDEOPROJECTION, - projection_size); - avio_write(pb, projection_ptr, projection_size); - end_ebml_master(pb, projection); - } - av_freep(&projection_ptr); + end_ebml_master(pb, projection); return 0; } From patchwork Wed Jan 1 00:58: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: 17084 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp216738qvb; Tue, 31 Dec 2019 16:59:30 -0800 (PST) X-Google-Smtp-Source: APXvYqxislB6FoHu2mW3Ps7CKadYpGn+W6QmsRD9i1Yn6N/cJMdfLvHdJ3C5UCc3v2T1OBub0Gc0 X-Received: by 2002:a17:906:b2c3:: with SMTP id cf3mr78490770ejb.247.1577840369934; Tue, 31 Dec 2019 16:59:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840369; cv=none; d=google.com; s=arc-20160816; b=irayld5Wq02GuS0XUNF7Dmzg5/rl65tGlEXVjDX+/o/Om1VpLv8EVmRCBM5mtvsTTi BMa+uYQGKidJfQdNh80YEknM9rOpRRpW3eKN+21ylW3+xPuqv3rYt1oXUKW7xf7TUGmM HBdpM3Jv6YRLodBAOjrzdgwbtrdQTRlc5/SqTPTL/cVCSmcHpXwa0VDE2tSiKhZmaOYV qt18fpTrXgZ2RigwJ81F0T7BLrelkK97ZjfO8a3Suxe/22zBOF5ywljYvEKJUb3YZkMG aiAAur5EVxn6dmPjEFcaTjq+1QTdFUYVlem8ZaIe0aqwRXfzu7UovQ4t0OVjAFYBPHOr j+nA== 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=bL8lMXPvTexdh9VlBatj1btJp+hnCD+3XahugN6WHM4=; b=GRCmIykyZOzzgJM3xILLyTjuAaDy+dtQEtm77AR4eCmEafzZsYZLD4os0ELWACUm5T 0bY81+Wk+swdAg1Yt6eZA/pZfz+pWSMeUCwr7+7IzB2L2GCAuYo7Z1jw2X7oekaGvavG WAZ/pdcZ2/kPdbkLh5KP+TmEtKjzbLsyN1FdgOou3Eyr08dn0n6w4c1CxrDFiiQBclnO c3OBm9+/FDiG8nNka7fPJsDNjnqWqp8pRpLLjYGZgmDBlb1HjGQfrdmXr/OdOs+WaKH1 d9oTqDTOsW3c7XvE0Z14nmZk4ahHEIqjI0h8aWBzpKY87lpJFSbZp3/0MIOUzqN/CTKM klgg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=EIJYbxBV; 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 w16si30594243eju.247.2019.12.31.16.59.29; Tue, 31 Dec 2019 16:59:29 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=EIJYbxBV; 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 652A468AD2F; Wed, 1 Jan 2020 02:59:11 +0200 (EET) 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 147AF68ACE8 for ; Wed, 1 Jan 2020 02:59:04 +0200 (EET) Received: by mail-wm1-f67.google.com with SMTP id d73so2825632wmd.1 for ; Tue, 31 Dec 2019 16:59:04 -0800 (PST) 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=5gUkiNMzyr46MInQMLLFkeWGc3sd1hk4f35vulxhv0U=; b=EIJYbxBVDMJKYHLQPrNZ2h/BP2/ftUZD5OonC4uv2NSWrQ5lkjBlXRXk2Ryo3PDup/ XO3sh+DksJu7bU0MplyQQL9YMoxaO9Akk8OUZGyIMPV7Ws8dPuE14lGvhhneLjovIq52 e/YQm14hzHWAWPyFIEFPo7YosMuvZdqlgCWFHsxNlbwnBQwhoQYeZllTB1g88dp+NZvT rGn4kvhGr/a0WHuKOTuJyIlJ7hNiokJvLoce3j0WPj1ohMfjvxc+shtm7YHk4mgm+f+n pc1h8DsQ2Jza6sAoJkeUeaJ+2bQKo5P7wmvUro3TQsQCQz7Ekacal09VsSioj68jAqbz ZASQ== 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=5gUkiNMzyr46MInQMLLFkeWGc3sd1hk4f35vulxhv0U=; b=DufNB+HoerqMKVMh4S1AJMJQIQ2ayB7ssrWRf7Ogso820uWd4zmOF0pkvszYrIi9eM 6q9RxkgJs7Sy54OdsLsmcK+e97eVIJaUy1OS7MIl1Fkc/bsI+JX0XVw04Fsl2yuDi29g EAPd0ZzzAgXlemzTUhq3sKCPb0SeUmmKii149jzUeqOE58B3s7WCJfRht+dBybVwO7Ge fMsQ1P3GcG+OLdT0T+foC/WDWUbyguGrDHTQNQ+dqRPoqUCZV0y8f2f+xR7zF82hQTv9 h9VDvlNc3uMicGxJuIsg0g0NayD09c/iMbwe4bz0l4iBYZ/POXD/Cv2qLjMobWKmk0DH T9pA== X-Gm-Message-State: APjAAAUdA8JqDZkFzPPQVMyQJ4yU/Nj/tkpo3/lvlBvVfE7vIYipQapR UifLukA9HP98GNKhDNARed3Q9CBh X-Received: by 2002:a1c:9d81:: with SMTP id g123mr6468394wme.29.1577840343340; Tue, 31 Dec 2019 16:59:03 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:02 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:20 +0100 Message-Id: <20200101005837.11356-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/20] avformat/matroskaenc: Remove useless AVIOContext 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: DxAfK0aivIwR Content-Length: 3952 Write a few numbers directly via AV_WB32 instead of using an AVIOContext (that is initialized only for this very purpose) to write these numbers at known offsets into a fixed buffer. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index bbf9b55e78..d51c8cbebf 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -946,7 +946,6 @@ static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStre static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, AVStream *st) { - AVIOContext b; ebml_master projection; int side_data_size = 0; uint8_t private[20]; @@ -976,26 +975,24 @@ static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR); break; case AV_SPHERICAL_EQUIRECTANGULAR_TILE: - ffio_init_context(&b, private, 20, 1, NULL, NULL, NULL, NULL); put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE, MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR); - avio_wb32(&b, 0); // version + flags - avio_wb32(&b, spherical->bound_top); - avio_wb32(&b, spherical->bound_bottom); - avio_wb32(&b, spherical->bound_left); - avio_wb32(&b, spherical->bound_right); + AV_WB32(private , 0); // version + flags + AV_WB32(private + 4, spherical->bound_top); + AV_WB32(private + 8, spherical->bound_bottom); + AV_WB32(private + 12, spherical->bound_left); + AV_WB32(private + 16, spherical->bound_right); put_ebml_binary(pb, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, - private, avio_tell(&b)); + private, 20); break; case AV_SPHERICAL_CUBEMAP: - ffio_init_context(&b, private, 12, 1, NULL, NULL, NULL, NULL); put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE, MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP); - avio_wb32(&b, 0); // version + flags - avio_wb32(&b, 0); // layout - avio_wb32(&b, spherical->padding); + AV_WB32(private , 0); // version + flags + AV_WB32(private + 4, 0); // layout + AV_WB32(private + 8, spherical->padding); put_ebml_binary(pb, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, - private, avio_tell(&b)); + private, 12); break; } From patchwork Wed Jan 1 00:58: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: 17098 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp216928qvb; Tue, 31 Dec 2019 16:59:39 -0800 (PST) X-Google-Smtp-Source: APXvYqzgP8e6eN33uCxQyoKQ8OHYb4u91hzUYJP/oADkWmGPBaVeM8zvYzS6ZbKyerDS+SozBR1B X-Received: by 2002:a17:907:10da:: with SMTP id rv26mr77106087ejb.242.1577840379524; Tue, 31 Dec 2019 16:59:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840379; cv=none; d=google.com; s=arc-20160816; b=KxpENjMzoxbY9NVd7cBYSgXosBHNk3rc1pU4VspmdOLlC8ZXxVzgVF555B4JX66pGp 0wJiAStcySslnB4s6lJSSU4SgEP2kumbpqDitLynB0dNPyTMsaGvsoXO87dfArcvlybe hW29OblWTyfprTKVoh8mkwyIsdAoWwSwsXc8CxXo6zMrjnTSloAzMSiaMOQscChEoQ8E n7/6Fz2+hWm8G8nTGMCjjcAnO+pHqteAQ6VLqBXd25Ohmlr7s9LzDVqpEoRKKRmv7gHr Zf2t5L9KB3ch9/81au8LpOWBlUMZVtAQq9U2bdnEPxIMiepv7a3sP8vBFBkTFPWg3FtF HL8A== 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=e1aE83mMiYZUm6lIlVly1fg8A90C1JwvJ3txBnAnCkE=; b=A/pFoFCWix/WJHasqkB75vG+ibLAaTFQqwJWCnf4u9ABdqcRUMNDYU52GAH+eClQwC Uw2Md4hO7u2wCKODB5TTd1ExlVCcO3U7B2xsF9OWvSklV2wjgoe7FRQPcmU5/tSteRfb iIsv/7wYMqGCNnJqescJyFcT2cs7Kcr584bJpJCX2Cva7/BQUmGpcWpowVpjEecznZxx ZSoRg235fBaGLEzuLAy8RuoJjfhglVsTycnE65ThFZS4HEE6doWIR0N/764fMRkuU5RL sNtm8inOernJzFVfRiYyIyjfdvIHUcj/vGuyjTw5URoEnRZ8eJHdlDIyDkYjiTx57IjG knAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=RsTqa1Mg; 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 rv11si32671548ejb.407.2019.12.31.16.59.39; Tue, 31 Dec 2019 16:59:39 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=RsTqa1Mg; 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 71F0768AD82; Wed, 1 Jan 2020 02:59:13 +0200 (EET) 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 BE4DF68AC9E for ; Wed, 1 Jan 2020 02:59:04 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id d16so36206613wre.10 for ; Tue, 31 Dec 2019 16:59:04 -0800 (PST) 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=Oi2iMvlJzNdP3AiR+VuXwV+NP98qzA5vRj/7oMOJbNg=; b=RsTqa1MgHvPdi2g/tZ4LfO4m3gmnwiw1A1uFKnMEH81URyGX9CB6BlhIT2IsnQx1AQ f8DHyYcfNASTh6XwGQ1BE15anjF6muSBLVBnQTK+UNLvEF4ihklinPLmkh3EkhGI2RAN MKuLUgUZZYDxb3XwyiWXSAXVKjIPUCdy3IZx75YQTemkiFwJvs7t4Zn/y/SjcIwWeU1Y fwbbw/1XCfE/z/WK9RwTW8673fE4iH9p0NhBCyOM7/51DXgtkfi46ViMRz4HISYc+9ls OoQZb/ML0BO6BUk2/q+kUpUzvQbUbCIYM35RFBGS0lINaPXEfaRxb6GosVd2xeZvvb6P rCZg== 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=Oi2iMvlJzNdP3AiR+VuXwV+NP98qzA5vRj/7oMOJbNg=; b=KWhAf0+6tcqOLwXymfed9v/KSI36mefg+gkh48UBREeCYFFL/rMk4dV82DgVURt+xc FI5FGt/DUg6vc3CxOSrpXUCnPutS5THB9bhT9xEiU4s0ZMOo+CoYrZKAqdc1TMRENmSG rZOsuKWvuubwz4IhrIetnKn5MJCJGAp6BTJT0tamCSED4/AZ1KDyOd2otl+QdRo2n4i8 SJHG9KPvfyN/0A0cA7DX9wKzO0C3iG+kK/4MK1I6u6xf72onXaDGMuikpqdSt65KAD0N YMVdv2fK+bgQhBs5Pm1SmTj5xTIc15kZTU5KSLy6g02rgEaW6tuI62DxwxQyIs5f8/F9 BydQ== X-Gm-Message-State: APjAAAVHxqlSL4El9ZguAv6lb4uOuf8gNlYUHn3gz1lKCQzmSKHuwO2J 5ZyhRGnpzwXSaVQW8TaSjPLscJc6 X-Received: by 2002:adf:f18b:: with SMTP id h11mr71399037wro.56.1577840344105; Tue, 31 Dec 2019 16:59:04 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:03 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:21 +0100 Message-Id: <20200101005837.11356-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/20] avformat/matroskaenc: Adapt documentation of put_ebml_num 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: BeZahjDP169/ Content-Length: 2781 to its actual behaviour: That it uses the least amount of bytes unless overridden. The current documentation leaves it undefined how many bytes will be used when no number to use has been given explicitly. But several estimates (used to write EBML Master elements with a small length field) require this number to be the least amount of bytes to work. Therefore change the documentation; and remove a comment about writing length fields indicating "unkown length". It has been outdated since 0580a122. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index d51c8cbebf..76c38b8d09 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -218,7 +218,7 @@ static int ebml_num_size(uint64_t num) * Write a number in EBML variable length format. * * @param bytes The number of bytes that need to be used to write the number. - * If zero, any number of bytes can be used. + * If zero, the minimal number of bytes will be used. */ static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes) { @@ -228,10 +228,9 @@ static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes) av_assert0(num < (1ULL << 56) - 1); if (bytes == 0) - // don't care how many bytes are used, so use the min bytes = needed_bytes; - // the bytes needed to write the given size would exceed the bytes - // that we need to use, so write unknown size. This shouldn't happen. + // The bytes needed to write the given size must not exceed + // the bytes that we ought to use. av_assert0(bytes >= needed_bytes); num |= 1ULL << bytes * 7; From patchwork Wed Jan 1 00:58: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: 17088 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp217077qvb; Tue, 31 Dec 2019 16:59:47 -0800 (PST) X-Google-Smtp-Source: APXvYqxWlpxVn+7HK6SS/VPwu/PrdQfciWFrAGPoVYhq5ye2ikW9HkeC9XkskB/fs82sdA8Ed4tt X-Received: by 2002:a17:906:1392:: with SMTP id f18mr80117095ejc.280.1577840387513; Tue, 31 Dec 2019 16:59:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840387; cv=none; d=google.com; s=arc-20160816; b=Cj7xFjQroa5P2AZPaPDZl4qsyISCuUB3Tk6ycNeLy4Rm07JOOpwQvvIzjvaXfmDTH9 AFtyWL7pYz+AXzu+L+x28DF18oTD4HAQmabo7UOKtzVmTJCmjuP07AxVNeIDJe8bavvG ePlzHgLc97Q7QNde/NamCIoOAb9Q37xN16t/4NJuhCA0Fc+v+M5jbFGe4IigaMLjvI3T 1cUhgSbTTR6TfZcVnnjJVge1Lu40CGsZSDRpeYowYmTqUz+dpK8q134mGx1//a8cXYTw IcGzoEa+yttiM92xcS51iMyncKSFyoEcoh2MOz74CgdJzxI1gcBQKZrM6pBtUWtkEoJC KjJA== 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=ohxKJBzeGCExvIKzvPl4R2v/qHnyTibzueQ82IZ01WI=; b=Tts9rQdnfiEK3KNZSWjQq3w5iTII6WJxQ0QWwMa/HzH/FH1HyQGZLMRhXxexhndL18 86/l95bjgaqwmIt/kCjVkYLmj97dkMFCk+wIs6edpVNwGMD0+77lySl71aWs3CvUn3Kp CL/OHmsse4EmPZHpl/cvH9XAAE0iwq/rpu/GmD2ytOnm55SNZ5ZCJ/PcH0pnDg8RLg4G t7nVyZpcktEmZdS86COAVQxCFESish9HmbjazvPKr8X+HZWIqLrQ8c1Et/NrZF0tFsMy lULygQI9nhb7sgtkT+cUqvmCVwj6P0CPTG0M/4klK8cK9WwmwDeL95HqxaUS8jt5OSfg BOKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=UAmXTx+M; 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 f21si32956616edx.391.2019.12.31.16.59.47; Tue, 31 Dec 2019 16:59:47 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=UAmXTx+M; 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 449B468AD24; Wed, 1 Jan 2020 02:59:14 +0200 (EET) 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 7656868ACD5 for ; Wed, 1 Jan 2020 02:59:05 +0200 (EET) Received: by mail-wr1-f67.google.com with SMTP id t2so36224744wrr.1 for ; Tue, 31 Dec 2019 16:59:05 -0800 (PST) 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=AT/N14wH6dtZZ/8dgFRCi/gc9e/suERPgROSJbTmxxs=; b=UAmXTx+M0E2oxDyAoYDZe2axCvuJPA5MZ1yXkkv4lJDShG0rSaf4MgFc9gzPc/uxGY NEdjiYvxKKVgvQb9IlRtJl8+1YpzGCmfZF1CDTSO9eFab5Cli3dIjvluEJdhv4z6Fk5/ zAVoERiWnwAEZoz+bBAsJTBB3Dg2S2+aoZl9cNiD90qIDytIgVXa4Gz94RIudCgL5eZP xvuxKQbCeasWvnFr3avtoqhDtvHUh35yljDsD1g1aF5CXF1aNkmAWJ96eSPC/8piijDp GmWLzaxIa2ACZ1Z28ToxogHYIXjqOe6/fninOe8QCupsHz0mBUm5YHQct4sR2wS0nwhk 4Ugw== 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=AT/N14wH6dtZZ/8dgFRCi/gc9e/suERPgROSJbTmxxs=; b=jI3A0FiWUxqXg87DfcKX/zyZwZucOX9apD5oNwHqP6y5GTrqWIKSXwiDH+HMq3Ut42 4ldxONyHQ0HzQSPopKfzPDnbCjP+yZGt/jrQDDdjcnzTuW3ekJ7L1iD3NwVUCEYlGh+/ wS+tPP/1gl9q5PDqHPE/0f4hOJVrS71b0Bk1SgCxyUP0RUmPUijPi52Zij97a/R/B6jI 0JJogYvVE0oNvk6H9NEnwZPsdpQrFlsrPnLNSrCS8NsmZM3Z5jBI5xb6qixh5xQb5otv o0ISUUnoimQn9dgWq80URsRoIOx3Hw31+auom66P/zL91PUSocT8hhly49UX/6tikAjW JRXg== X-Gm-Message-State: APjAAAVeyWNFlxEnxvaiyXVsAwRlQeNyG8m4Tg0nVzzl6vacZuQgRKwa rUM0IXlWFxMpbLnU+WhuKkkmx4hF X-Received: by 2002:a5d:5487:: with SMTP id h7mr71917261wrv.18.1577840344816; Tue, 31 Dec 2019 16:59:04 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:04 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:22 +0100 Message-Id: <20200101005837.11356-6-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/20] avformat/matroskaenc: Check return value of ff_isom_write_hvcc() 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: OjfPgHMthspQ Content-Length: 2408 The Matroska muxer currently does not check the return value of ff_isom_write_hvcc(), the function used to write mp4-style HEVC-extradata as Matroska also uses it. This was intentionally done in 7a5356c72 to allow remuxing from mpeg-ts. But if ff_isom_write_hvcc() fails, it has not output anything and the file ends up without CodecPrivate and, if the input was Annex B, with Annex B data, which is against the spec. So check the return value again. The underlying issue of not having extradata seems to have been fixed by the introduction of the extract_extradata bitstream filter. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 76c38b8d09..8cea829b31 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -748,9 +748,8 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, return ff_isom_write_avcc(dyn_cp, par->extradata, par->extradata_size); case AV_CODEC_ID_HEVC: - ff_isom_write_hvcc(dyn_cp, par->extradata, - par->extradata_size, 0); - return 0; + return ff_isom_write_hvcc(dyn_cp, par->extradata, + par->extradata_size, 0); case AV_CODEC_ID_AV1: if (par->extradata_size) return ff_isom_write_av1c(dyn_cp, par->extradata, From patchwork Wed Jan 1 00:58: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: 17093 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp217410qvb; Tue, 31 Dec 2019 17:00:04 -0800 (PST) X-Google-Smtp-Source: APXvYqww5DewE9rtWo9JIJp6jJ0c4jEkJwk5SunAih4y7X3y12O+6VE0XRxHnqcb4TUDQSS4lqca X-Received: by 2002:a50:a2c7:: with SMTP id 65mr78683947edm.144.1577840404875; Tue, 31 Dec 2019 17:00:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840404; cv=none; d=google.com; s=arc-20160816; b=JK3FNZMhSlHhJS1ZX+T3yAln8bXTUs48ylP+xqQX4uP7kUzFyW+b4anRmxuXg+WmBQ 5hhOh57YRfLZGv1/yrJisJGpdJaWhlqM507vObOgHFxj4yOMqU4ytI/rTgHd7ZUptpxa 7je8ciaKLMbnLJfuz2wmBCwgDojZnmCgdHgZr3if0Rtn+CoxmyUpvUd1Bjweq8YVbDTw Od0HcM64oZejpCLGqKFInqYPM3HMN8F73APCb5q0/yPQzVx4yjNl+lLQoEN3yvfPk+pZ Kbq9GRQQ9mgHS4biMI/dDYh9R/SVf8udLhmXH5yNRuB7obqNygAmeoyWO/03rYbtAGmX rSxQ== 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=SCTzM5aeviafz7pD7ORo32y6ABUKxZYeXmiH3BfnsSE=; b=xSsvjDPPAnvRqkgkhDtGVbZA6RLnQNdDzEsdC01q7JT2tDyejT62BMhTnZFJoQ/Am7 xjvl0PAHI7OygURTpQGB8v5o/Q8z/FOVxwIs4voBZHoPQtN/iNnI0czCAj9TTTe+S/io KNfTtAFpeS1m7heEUMznietwzRM0Lhv0b2cwhuYqy0W4YV5labEw3471O5culWc6ttLq 7nKUA2Dr3vOChY5w5cn/1aNZXIh9IJNzCbM7NQWezlcZx8rzN83SVg35ve/LPmGQSlsg Z9SO2wroKwIIMhIWu2neO+bY+zZUyQ4Bjhj4qmAlApRJYGu+ppYCdCb7ehiFG8TJlcPY og4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=aDEGVgvk; 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 cy13si33738927edb.436.2019.12.31.17.00.04; Tue, 31 Dec 2019 17:00:04 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=aDEGVgvk; 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 06ACA68ACD5; Wed, 1 Jan 2020 02:59:16 +0200 (EET) 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 19E4B68AD2A for ; Wed, 1 Jan 2020 02:59:06 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id y11so36197236wrt.6 for ; Tue, 31 Dec 2019 16:59:06 -0800 (PST) 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=yl/sZ/E24u2Yy0lExop8LuiCBInbYtb1MDCCxFdpi28=; b=aDEGVgvkfrw2XV0d+CY1DpCAQsGEK+1yrbGDt7wyGx9pY/KUFMSgedhTyRufrilW2R xHwcbIzqgqnWeMweCMENNJ9jm/r+jtDLollnHZoTmRuMYZqvdOI9oBcimF2Nn2ck4tvt 08PEgjanU87OTlGmwfxxT7SuzcZUZOvQq7AIDSc8w0pScLkVb0dsdxEhzg0+T2VDru47 Rp+u3RyVw7rn4YKMbVXMPbTbQg5RpOJvxqhh8vCk514FQkWBrJEc0CCb6YSWTC+m/ucG f0azMMVs71jxCcyKismic11j4wr5osNJwmJLlR7lTUVV7Aqj75MV0M0DuXJ4oo6LZHch MaFA== 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=yl/sZ/E24u2Yy0lExop8LuiCBInbYtb1MDCCxFdpi28=; b=ttLcIbg8iz0xGt9zC5ss7XHitxLE1A2gHKr0AGnGd564Q57u1Rs0bhg/CgUdL8EZFE wlnCVaMxNL88Nk6py3cQ3ZJITv6rkiUD3oS/Lnu2uPbzEhuYtbqAJUVw+wfTBd2pGmiF p93ML15yXKj5Q8k5mnkmAuUtlRFOhK6tdI9nc49v/ERnQHto7kzIjfW/wXzxM3X8s/OD xwrjprQnfo/Y8DuPdXCvMGrmYaSsAwV3W9KvXET8m7CGz6rPVqk26A3qLdBbE5WSgqtD 1besbfY3ey/YfjbHCbUYdUozNW0V9/u0LgMM88W6tecLzTYE94zT1xL80BXDlt1asVgi O6ew== X-Gm-Message-State: APjAAAWOp/gChOeIlegPfUxPRS6Kz5J3Zs6WyFQErkoQy7QHvzlKcs26 5Jbj86VGczf3z9chQW9U8GwaBadJ X-Received: by 2002:a5d:690e:: with SMTP id t14mr73540637wru.65.1577840345516; Tue, 31 Dec 2019 16:59:05 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:05 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:23 +0100 Message-Id: <20200101005837.11356-7-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/20] avformat/matroskaenc: Check functions that can fail 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: rMHxNbOfaG4c Content-Length: 2351 Sometimes it has not been checked whether opening the dynamic buffer for writing Tags fails; this might have led to segfaults. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 8cea829b31..7857656309 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1557,7 +1557,9 @@ static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid, ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb)); if (ret < 0) return ret; - start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); + ret = start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); + if (ret < 0) + return ret; } pb = mkv->tags_bc; @@ -1653,7 +1655,10 @@ static int mkv_write_tags(AVFormatContext *s) if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) continue; - mkv_write_tag_targets(s, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &tag_target); + ret = mkv_write_tag_targets(s, MATROSKA_ID_TAGTARGETS_TRACKUID, + i + 1, &tag_target); + if (ret < 0) + return ret; pb = mkv->tags_bc; tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0); From patchwork Wed Jan 1 00:58: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: 17101 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp218201qvb; Tue, 31 Dec 2019 17:00:35 -0800 (PST) X-Google-Smtp-Source: APXvYqxYIaeNRcxErtPeR1QzQKOMrkk6ogHx+HoGKsNGDRyKxNEzeVfaI+KPgs3fnguj5PN9LHK6 X-Received: by 2002:a50:aacd:: with SMTP id r13mr79786550edc.129.1577840434995; Tue, 31 Dec 2019 17:00:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840434; cv=none; d=google.com; s=arc-20160816; b=x1CPcJXDO8yFx1E5kSq8kOJEh7FkUfDefMPZYTCIWAB3MJn/PDyiLNb8ukeiji/mWt URM1yQNUMQCjVb1SXIpMJgUxKVGkiCusAlybJnp5E+vL7Bo5TU2rSTz+WpZQBqXXnlZV j5eghWbx8z4jCOWUA8ELBsUFo9ftuUvZjy5xq/5fjuW0ern934YmnWYHD6uHdTn8LZ/x RoKBfIsCa74+gVS7sF6wQKrvm+CLY8LS8vdbnmmDMwnTFJFgTl1BkvdNBALIg0BCTREb L8w3D45IJAyhUbDwbK7DX+QBNQMBPmITcxCBVoqWOvHRIjEgYQEcHSvfUkZP36MqyH/G tNFg== 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=JZBd8kc7DAmLq5gJEl7doE1jGj4Ll0mso8I4VhSrDb8=; b=bEVZryur3ylCDijoHffS7eCD0Qjk7R/zpFi7eGfSHmFkCDk7aiD+ZBsDNf2ZH9HEOU G6ZWkhMDaQaneek/EC+lIqsZOC2A19UGRBEoZeZUDIjLrwLT5M6zbQY+l/Y47kXl4Z1R pQHj9KUQaByFbkf6SDl0/oAAxE2CbgLTuaM3X4RJ0MSPyPDRTXAQA1d4DurNhpBCkdk/ ttdciYIW/ifOYesKELer4w013BUSxSekqmVCK9bEb17ayyy9z6ZfkOGt7XWPadKrvzXr RGs88gjv++uiWGdtakap+0RSG0q2Bxo/jypMNtAPFAZrunrDAQMACICpzQ+P9c+wdvGM d9zA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=QenLBTxv; 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 t3si32781095ejd.319.2019.12.31.17.00.34; Tue, 31 Dec 2019 17:00:34 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=QenLBTxv; 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 C00D668ADE4; Wed, 1 Jan 2020 02:59:18 +0200 (EET) 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 4797F68AC62 for ; Wed, 1 Jan 2020 02:59:07 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id f129so2844111wmf.2 for ; Tue, 31 Dec 2019 16:59:07 -0800 (PST) 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=lbVz2oiAQEpgKRrZ7Ymjc6wxJKMx6yxfKczuo708SFc=; b=QenLBTxvNrHbUGpu6ZJnDxP5sFVkR8/VPnksyNkZzqVNaUGpmp8DyINn9pzfg4MSSJ 517GuBvNQnBBjy589rmB4PsoY/UqYtxOxn+nNLG1ujwq+jyLU1Nf/twNEgeNZgzvPznQ 9A2b0AMUeJ2qmsAnmiXUz3Zage85fm/pqPm8B0L5s9Y4zlo2oMUiQsIRNbCUnzv6PPxB cqtjdTU/lXeWmzOELjy4dMtIMZEwtu/kPF/f4azfj+gUaujyWUJXV4BRYkcHW9akt6Ms QjFbQXI3peyhaoODhjungxE89wfo/NRl5Eg6P0gYhl5YKYSw+Aj/oo48rTl+8mLCMArb Atcg== 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=lbVz2oiAQEpgKRrZ7Ymjc6wxJKMx6yxfKczuo708SFc=; b=Crc6Sy8KZOFKyPkU5R+Rp91RhYjpihTtMt8xFBM04gbuNrb8JNLdjJsj0kvNXs/GuF 7SpxQwTUMHhKKBRr59wR7b1xg60pp3yEybw5W+w9Y6kl2FH5c1OX4XJB2thr84FVBYJS U02eCE/IvFXwve6NsxD/gcwfLpy1f/AxsbFQq0i0F/x6lrIwvZJfpL1ilMC48CDOSMo9 A5c8jafM6G0tNHsyyJAxdkwsY4cLym5wDIF6+3KfEr1bbjjXhDaCMTy86Rr+pmJNlP3m RXxu492r4RgxoNg0mM6+RWuDw+SVUJidGMlZ9gHVD5TxeQFWVn0stxalaKl8W9ynq4Ka I7fg== X-Gm-Message-State: APjAAAV1vQfZnIcQ2dQYJhJDXXbrfYJi3jGxaRxaQttg4xZ4Jr5s/fLj HQk5r/QUfnUWkC4KLicQLpYV8DEi X-Received: by 2002:a7b:c3d2:: with SMTP id t18mr6676480wmj.90.1577840346248; Tue, 31 Dec 2019 16:59:06 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:05 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:24 +0100 Message-Id: <20200101005837.11356-8-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/20] avformat/matroskaenc: Avoid allocations for SeekHead 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: oO0lAJq7lUSJ Content-Length: 28952 Up until e7ddafd5, the Matroska muxer wrote two SeekHeads: One at the beginning referencing the main level 1 elements (i.e. not the Clusters) and one at the end, referencing the Clusters. This second SeekHead was useless and has therefore been removed. Yet the SeekHead-related functions and structures are still geared towards this usecase: They are built around an allocated array of variable size that gets reallocated every time an element is added to it although the maximum number of Seek entries is a small compile-time constant, so that one should rather include the array in the SeekHead structure itself; and said structure should be contained in the MatroskaMuxContext instead of being allocated separately. The earlier code reserved space for a SeekHead with 10 entries, although we currently write at most 6. Reducing said number implied that every Matroska/Webm file will be 84 bytes smaller and required to adapt several FATE tests; furthermore, the reserved amount overestimated the amount needed for for the SeekHead's length field and how many bytes need to be reserved to write a EBML Void element, bringing the total reduction to 89 bytes. Signed-off-by: Andreas Rheinhardt --- Slightly changed since last time: The five bytes mentioned at the end of the commit message have been stripped away, too. libavformat/matroskaenc.c | 119 ++++++++------------------- 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/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 +++++----- 10 files changed, 71 insertions(+), 120 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 7857656309..25ad337844 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -57,6 +57,10 @@ #include "libavcodec/mpeg4audio.h" #include "libavcodec/internal.h" +/* Level 1 elements we create a SeekHead entry for: + * Info, Tracks, Chapters, Attachments, Tags and Cues */ +#define MAX_SEEKHEAD_ENTRIES 6 + 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 @@ -69,11 +73,9 @@ typedef struct mkv_seekhead_entry { typedef struct mkv_seekhead { int64_t filepos; - int64_t segment_offset; ///< the file offset to the beginning of the segment - int reserved_size; ///< -1 if appending to file - int max_entries; - mkv_seekhead_entry *entries; + mkv_seekhead_entry entries[MAX_SEEKHEAD_ENTRIES]; int num_entries; + int reserved_size; } mkv_seekhead; typedef struct mkv_cuepoint { @@ -136,7 +138,7 @@ typedef struct MatroskaMuxContext { int64_t cluster_pts; int64_t duration_offset; int64_t duration; - mkv_seekhead *seekhead; + mkv_seekhead seekhead; mkv_cues *cues; mkv_track *tracks; mkv_attachments *attachments; @@ -396,10 +398,6 @@ static void mkv_deinit(AVFormatContext *s) ffio_free_dyn_buf(&mkv->tracks_bc); ffio_free_dyn_buf(&mkv->tags_bc); - if (mkv->seekhead) { - av_freep(&mkv->seekhead->entries); - av_freep(&mkv->seekhead); - } if (mkv->cues) { av_freep(&mkv->cues->entries); av_freep(&mkv->cues); @@ -412,61 +410,33 @@ static void mkv_deinit(AVFormatContext *s) } /** - * Initialize a mkv_seekhead element to be ready to index level 1 Matroska - * elements. If a maximum number of elements is specified, enough space - * will be reserved at the current file location to write a seek head of - * that size. - * - * @param segment_offset The absolute offset to the position in the file - * where the segment begins. - * @param numelements The maximum number of elements that will be indexed - * by this seek head, 0 if unlimited. + * Initialize the SeekHead element to be ready to index level 1 Matroska + * elements. Enough space to write MAX_SEEKHEAD_ENTRIES SeekHead entries + * will be reserved at the current file location. */ -static mkv_seekhead *mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset, - int numelements) +static void mkv_start_seekhead(MatroskaMuxContext *mkv, AVIOContext *pb) { - mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead)); - if (!new_seekhead) - return NULL; - - new_seekhead->segment_offset = segment_offset; - - if (numelements > 0) { - new_seekhead->filepos = avio_tell(pb); - // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID - // and size, 6 bytes for a CRC32 element, and 3 bytes to guarantee - // that an EBML void element will fit afterwards - new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 19; - new_seekhead->max_entries = numelements; - put_ebml_void(pb, new_seekhead->reserved_size); - } - return new_seekhead; + mkv->seekhead.filepos = avio_tell(pb); + // 21 bytes max for a Seek entry, 6 bytes max for the SeekHead ID + // and size, 6 bytes for a CRC32 element, and 2 bytes to guarantee + // that an EBML void element will fit afterwards + mkv->seekhead.reserved_size = MAX_SEEKHEAD_ENTRIES * MAX_SEEKENTRY_SIZE + 14; + put_ebml_void(pb, mkv->seekhead.reserved_size); } -static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, uint32_t elementid, uint64_t filepos) +static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid, + uint64_t filepos) { - mkv_seekhead_entry *entries = seekhead->entries; + mkv_seekhead *seekhead = &mkv->seekhead; - // don't store more elements than we reserved space for - if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries) - return -1; - - entries = av_realloc_array(entries, seekhead->num_entries + 1, sizeof(mkv_seekhead_entry)); - if (!entries) - return AVERROR(ENOMEM); - seekhead->entries = entries; + av_assert1(seekhead->num_entries < MAX_SEEKHEAD_ENTRIES); seekhead->entries[seekhead->num_entries].elementid = elementid; - seekhead->entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset; - - return 0; + seekhead->entries[seekhead->num_entries++].segmentpos = filepos - mkv->segment_offset; } /** - * Write the seek head to the file and free it. If a maximum number of - * elements was specified to mkv_start_seekhead(), the seek head will - * be written at the location reserved for it. Otherwise, it is written - * at the current location in the file. + * Write the SeekHead to the file at the location reserved for it. * * @return The file offset where the seekhead was written, * -1 if an error occurred. @@ -474,19 +444,17 @@ static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, uint32_t elementid, ui static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv) { AVIOContext *dyn_cp; - mkv_seekhead *seekhead = mkv->seekhead; + mkv_seekhead *seekhead = &mkv->seekhead; ebml_master seekentry; - int64_t currentpos; + int64_t currentpos, remaining; int i; currentpos = avio_tell(pb); - if (seekhead->reserved_size > 0) { if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) { currentpos = -1; goto fail; } - } if (start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD) < 0) { currentpos = -1; @@ -507,16 +475,13 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv) } end_ebml_master_crc32(pb, &dyn_cp, mkv); - if (seekhead->reserved_size > 0) { - uint64_t remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); + remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); put_ebml_void(pb, remaining); avio_seek(pb, currentpos, SEEK_SET); currentpos = seekhead->filepos; - } + fail: - av_freep(&mkv->seekhead->entries); - av_freep(&mkv->seekhead); return currentpos; } @@ -1427,9 +1392,7 @@ static int mkv_write_tracks(AVFormatContext *s) AVIOContext *pb = s->pb; int i, ret, default_stream_exists = 0; - ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_TRACKS, avio_tell(pb)); - if (ret < 0) - return ret; + mkv_add_seekhead_entry(mkv, MATROSKA_ID_TRACKS, avio_tell(pb)); ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS); if (ret < 0) @@ -1464,8 +1427,7 @@ static int mkv_write_chapters(AVFormatContext *s) if (!s->nb_chapters || mkv->wrote_chapters) return 0; - ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb)); - if (ret < 0) return ret; + mkv_add_seekhead_entry(mkv, MATROSKA_ID_CHAPTERS, avio_tell(pb)); ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS); if (ret < 0) return ret; @@ -1554,8 +1516,7 @@ static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid, int ret; if (!mkv->tags_bc) { - ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb)); - if (ret < 0) return ret; + mkv_add_seekhead_entry(mkv, MATROSKA_ID_TAGS, avio_tell(s->pb)); ret = start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); if (ret < 0) @@ -1725,8 +1686,7 @@ static int mkv_write_attachments(AVFormatContext *s) av_lfg_init(&c, av_get_random_seed()); - ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb)); - if (ret < 0) return ret; + mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb)); ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS); if (ret < 0) return ret; @@ -1875,16 +1835,10 @@ static int mkv_write_header(AVFormatContext *s) mkv->segment_offset = avio_tell(pb); // we write a seek head at the beginning to point to all other level - // one elements, which aren't more than 10 elements as we write only one - // of every other currently defined level 1 element - mkv->seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10); - if (!mkv->seekhead) { - return AVERROR(ENOMEM); - } + // one elements (except Clusters). + mkv_start_seekhead(mkv, pb); - ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_INFO, avio_tell(pb)); - if (ret < 0) - return ret; + mkv_add_seekhead_entry(mkv, MATROSKA_ID_INFO, avio_tell(pb)); ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO); if (ret < 0) @@ -2570,10 +2524,7 @@ static int mkv_write_trailer(AVFormatContext *s) cuespos = mkv_write_cues(s, mkv->cues, mkv->tracks, s->nb_streams); } - ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_CUES, - cuespos); - if (ret < 0) - return ret; + mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos); } mkv_write_seekhead(pb, mkv); diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak index 4aca4dc8eb..b9ed7322fd 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 = e5457e5fa606d564a54914bd12f426c8 +fate-matroska-remux: REF = 49a60ef91cf7302ab7276f9373f8a429 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 286e17f2ae..a89cc1293d 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 = c5a2b46d8b31c9c2e7bfb436f9d56f02 +fate-wavpack-matroska_mux-mono: REF = 0a1a7c6d3b413925f8261c92d1d53363 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 = 22fc2a591be22657d19cab89ad6eef55 +fate-wavpack-matroska_mux-61: REF = 1f012f7c237f46f2f63089ba84c589c5 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 9bf9dfe78f..45b68b62bd 100644 --- a/tests/ref/fate/aac-autobsf-adtstoasc +++ b/tests/ref/fate/aac-autobsf-adtstoasc @@ -1,5 +1,5 @@ -b09fc2f554712adbf84fe7899eb679d4 *tests/data/fate/aac-autobsf-adtstoasc.matroska -6695 tests/data/fate/aac-autobsf-adtstoasc.matroska +d10b73732b32f6b2f08885b40c41c77f *tests/data/fate/aac-autobsf-adtstoasc.matroska +6606 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 4b13ef217a..3266501de6 100644 --- a/tests/ref/fate/binsub-mksenc +++ b/tests/ref/fate/binsub-mksenc @@ -1 +1 @@ -a5811caa0caba3a3f9a449b91569745c +03d376cc2e8622e7af540d4d9809dbf7 diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv index b9db53f592..43b4ee2e19 100644 --- a/tests/ref/fate/rgb24-mkv +++ b/tests/ref/fate/rgb24-mkv @@ -1,5 +1,5 @@ -ffe2c21083d56764aaae7945fd146326 *tests/data/fate/rgb24-mkv.matroska -58305 tests/data/fate/rgb24-mkv.matroska +92861b36a8220a3dae10d91cba614892 *tests/data/fate/rgb24-mkv.matroska +58216 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 a244893cf2..e8239442e9 100644 --- a/tests/ref/lavf/mka +++ b/tests/ref/lavf/mka @@ -1,3 +1,3 @@ -a91bfdb08ff5a1e62b039748d16b07f7 *tests/data/lavf/lavf.mka -43652 tests/data/lavf/lavf.mka +58936d3ad4eb1372bd2e5845963fe17c *tests/data/lavf/lavf.mka +43563 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 05999b79fb..4d73fbf39d 100644 --- a/tests/ref/lavf/mkv +++ b/tests/ref/lavf/mkv @@ -1,3 +1,3 @@ -3cddd26ed41f34925d3f34acabab174e *tests/data/lavf/lavf.mkv -320555 tests/data/lavf/lavf.mkv +6ec6d6a058a85bf616e0b981bb8e383f *tests/data/lavf/lavf.mkv +320466 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 230dff369a..2e9711483f 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -4a25c53150c09537cd4fcbff8f8f14ff *tests/data/lavf/lavf.mkv_attachment -472706 tests/data/lavf/lavf.mkv_attachment +41b4f132ada6e0faedf92e909526a899 *tests/data/lavf/lavf.mkv_attachment +472617 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 6ed1f3a763..223e098829 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: 803 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 714 size: 208 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 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: 320276 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320187 size: 209 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146987 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146898 size: 27925 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 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: 292435 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 ret: 0 st: 1 flags:0 ts:-0.058000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 803 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 714 size: 208 ret: 0 st: 1 flags:1 ts: 2.836000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320276 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320187 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: 146987 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146898 size: 27925 ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 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: 803 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 714 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 ret: 0 st: 0 flags:0 ts: 0.883000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292435 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292346 size: 27834 ret: 0 st: 0 flags:1 ts:-0.222000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 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: 320276 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320187 size: 209 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146987 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146898 size: 27925 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 1019 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 930 size: 27837 From patchwork Wed Jan 1 00:58: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: 17082 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp218408qvb; Tue, 31 Dec 2019 17:00:42 -0800 (PST) X-Google-Smtp-Source: APXvYqxEc+qH/U4aqsynvsrJvzrm0Br0FoFfr0gq0rvTmDykyDPqNulTYU8jlWTCnh85OMUx4dSF X-Received: by 2002:aa7:c5d0:: with SMTP id h16mr79258556eds.116.1577840442835; Tue, 31 Dec 2019 17:00:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840442; cv=none; d=google.com; s=arc-20160816; b=sHYGlYp3ip3uwFX+3d5L6zPgW+kDGQHBrEWTe11CyUTr5858RUpz+3BE3hS3u0ZBTA 3UyNBqXNi0UkBJPiRgd/l3hH/4WibbDv8G8kh7mV8T80UjmMxZAo+HxDoL1Hil6oQ2Y3 /QlPJLAZD/zghE1EXfm5Y3LPLIXAkxUvOhyGXdUq7BWRFMNy1L28DD5+dxNySJaeq1Fv 7IYimSTkSLD6sMMohtKOJjWADufRq/4sJYtfTz/RG/Rfe8y6Sml4n6oeNvt0z59aSKfx LUcUhw4I7SZKjldKcTr5cRRJtnEfnLBLhfZclA283Bo1PEYAO9ppje1IuWd7g/YIzaOt tBjw== 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=Gm5Grv6LraLCXGlkiwxiLiESbfZ1Ro4Jzf2So8hzdTk=; b=GP9vR2P6q3h/Btks4WMWzkqE6C8YaJAEtY+KW3n0xP6tHIPOTZI1BR1sgl8h0Z+XFK jBVb9CDleMFczCAVB6cWJ1r+ERRckIcWuhOhQVQL6JF8nFdXRDS1H4/KAQ5desDdwYjc zh04wu4t8GfzRwopDxQoSh9aACLNaaQQPmUL/E48XslIKcobwBkTJj/uMPQV19YyYfSJ 3FL2TRU2FW07hyA+fveAgDSFi/xm1l/XicC5B5/+/lhBSW6zc02STMsFKQb9iKjqAsvq 5a5rPLLmvQguR6xBxczZH6Exk0atJyVyMFvx5NxG/G/YoOAGwf5NwFxocSsRoREZY1/R lI4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=UzYUsQMr; 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 qp6si32080582ejb.21.2019.12.31.17.00.42; Tue, 31 Dec 2019 17:00:42 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=UzYUsQMr; 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 C8D5B68ADEA; Wed, 1 Jan 2020 02:59:19 +0200 (EET) 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 0D46368AD82 for ; Wed, 1 Jan 2020 02:59:08 +0200 (EET) Received: by mail-wr1-f67.google.com with SMTP id z7so36141742wrl.13 for ; Tue, 31 Dec 2019 16:59:08 -0800 (PST) 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=q/23xalTh7Hfwf+EwD72G6dmtd6gphEDzH2SgE4mDbg=; b=UzYUsQMriGrcrw98qBcLMeyId1ytHKC/RlQqV01yYHzCAKqsqTCKG6lFgNRqJwOq8m 4bKVlSsTyaqqfpjbCKF1gllIXm1s7ALbsIBEgpVdsP5gvYMD1bMkxV3A1NWK42cLuT27 AlYeDV/5ptF5dXDxozquvwvu6mxoDJPXZiQnX7KEKpVZ1blweuk5W5Zeewf7UFa4Za+C is9wFoSLI+AvrnJzLLuEPBY9jDBxTWXTXH5JcZEApeLWVf6ih0igB3ekvzZrAz9MaDTz v2O84kjqOL1rSI7aj734hhujF5JwHTEweFFhADGLqQUKeKqxnICwVd6xD9bq3xM98T8Q jrRg== 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=q/23xalTh7Hfwf+EwD72G6dmtd6gphEDzH2SgE4mDbg=; b=KOXMmsLoT27FvdHSQx4v5WUm4oaTIYQG1MIUOfx5mem4MDRlZ5CXYtl/iPKSf/6W4g /C6v1YxXIBcO8CnLZoQ8Okqmu4Lcq1i1El4DtTwKQyNLBj9Uf62FM14h0jeVyy8ZZI0q XnInPNUyccswGuyL7Goz93aJGgg7sOSgggPC5puJzuqBL5ZVu4D60AWrn35AYmZeu5Ea EkVWWgmo+1BIlyIeY9Z0VPiD6d8NN+5ef5Zz5LocSImtaq5fA4+476hHfR81pc4nF4Cy BxILoNtzaN2o4clsaNGoFlQGu1oBUnRb99/h8Vq922VkdSIXJpj5xhPaZe/N4622vyYF YBUA== X-Gm-Message-State: APjAAAVfK+4CviP0AomwVgeFe8emWtGyFHeevMnKOm5pXrMzwbjkvnfF 2k0O6rdIUzT0cR1P8TphMg11ybGw X-Received: by 2002:a05:6000:1052:: with SMTP id c18mr74066878wrx.268.1577840347467; Tue, 31 Dec 2019 16:59:07 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:07 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:25 +0100 Message-Id: <20200101005837.11356-9-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/20] avformat/matroskaenc: Improve calculating EBML ID size 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: xn78vk2Ccx6N Content-Length: 2440 When the Matroska muxer writes an EBML ID, it calculates the length of said ID before; and it does this as if this were a number that needs to be encoded as EBML number: The formula used is (av_log2(id + 1) - 1) / 7 + 1. But the constants used already contain the VINT_MARKER (the leading bit indicating the length of the EBML number) and therefore the algorithm used makes no sense. Instead the position of the most significant byte set gives the desired length. The algorithm used until now worked because EBML numbers are subject to restrictions: If the EBML number takes up k bytes, then the bit 1 << (7 * k) is set and av_log2(id) is 7 * k. So the current algorithm produces the correct result unless the EBML ID is of the form 7 * k - 1 because of the "id + 1". But contrary to encoding lengths as EBML number (where the + 1 exists to avoid the encodings reserved for unknown length), such EBML numbers are simply forbidden as EBML IDs and as such none of them were ever written. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 25ad337844..cecf7589e5 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -183,7 +183,7 @@ typedef struct MatroskaMuxContext { static int ebml_id_size(uint32_t id) { - return (av_log2(id + 1) - 1) / 7 + 1; + return (av_log2(id) + 7U) / 8; } static void put_ebml_id(AVIOContext *pb, uint32_t id) From patchwork Wed Jan 1 00:58: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: 17102 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp218808qvb; Tue, 31 Dec 2019 17:01:00 -0800 (PST) X-Google-Smtp-Source: APXvYqwTf3jkJp13Qh6kRkHYKUpqblrkuwr6VUnuIoQI73iK+2inMiGP+N41EOJnb62A+yC9emEE X-Received: by 2002:a17:906:aec7:: with SMTP id me7mr77452367ejb.81.1577840460737; Tue, 31 Dec 2019 17:01:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840460; cv=none; d=google.com; s=arc-20160816; b=xjFEr2E29ouIX22YHdgwdAeJKledzoQkcD4CVzQl6uK2+L15H+71dO1rzMRH3T69Qd UJEWwsCtKs/acdo7rFsmPXIy8mNpjEoUfjoCauJHTFJupj5f82zemlYNq2M3rjR+M8ks MlXufkhXPeiaOd2RRo0bH66UlDL7eV512jI3CXjI0fFMdO6OmDRj5zjkru8ymDmgdnTO V0kSexcA9RpXcUwan4mN7/033xeJzmurxi7RJ1gMOxito+169GSjMQ1dVP+yRtxYpmgH hCojaxMRi5d8RGZu+zT3zwZpMOHZDPjJrEYyLH9QA5rCDBYF12Q6ePskpbJwhiFGbqzn iEHQ== 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=OBhHu+MWxAx8JD/RRTrLKkWfnsOwS05zO3C7Nm/Stp0=; b=IprhJHCLKdex+E61QIhtlilSvpQY/8fm2DkkiRkBvJ3WmI75tUqjORNhJM9W7RlJrU MTXwL2kRoALhQ43WvMjbvIdDaebHt1SLikxak4mHvpfLdupt49Ic9Hwq6VEhaLJUaIBO RDGXTdR4/6HqfPxxJ0PMT18XO3YzA2OdJdmteaCPKjGOs7tm72b4r8XsmoUKhAVSCroA NP9MkF76Z0XmtgCXrHiQAbe4rh69msG82600jsbOE5JH43Tw8vJVBa6cKJEgQfQztOLu rZsxKhl79UX7QogIIIYr6Tz6r6bR6xKfO3g2Zf2N8NVCVxbfq2MOXZ8u7+TfmLdZnuM5 BWoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=KTKqlQwK; 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 w26si33789850edl.301.2019.12.31.17.01.00; Tue, 31 Dec 2019 17:01:00 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=KTKqlQwK; 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 9DE5A68ADF6; Wed, 1 Jan 2020 02:59:21 +0200 (EET) 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 061A968AD24 for ; Wed, 1 Jan 2020 02:59:09 +0200 (EET) Received: by mail-wm1-f68.google.com with SMTP id p9so2833351wmc.2 for ; Tue, 31 Dec 2019 16:59:09 -0800 (PST) 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=zAjtu36LanZAVtelwcacU+QkpCRtYLcrwTgoYItYXF8=; b=KTKqlQwK/6s4il515xumylPkph+oZNhtVqMDxF7JKAPPH2hejg3Mtk6nrHT0vUjhq6 eHMLXg5ooQe3qdb1L3R02aG3pHUqbV6u/FgLkK3TKEeoXJMRnpC4SdkdRQIlZYkcLxtE 0av9MgnsaD26SJRYaOvLRlAF7uvTQmpgjcbq75fepIXfXCNaLakBAZ76NSL3rVkbQ+cu FhvNz2mR1INj+NurrYH/7wyFqXaooJqxEJOeXjhq6ewQ+fmBiHYl77HigqkZHVvwl8dZ 71VTBQ9kFP+Juk6msdNTcblXkHEPh6wjzORrDgVV82TfVoRDlpTRJ63qwXSJjly/I/WP /Psw== 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=zAjtu36LanZAVtelwcacU+QkpCRtYLcrwTgoYItYXF8=; b=GQBjyvMPSLsFXRKPInIHQJFL23vrcG/yFRanSot37xws9yFcAN0Oa2ytjK4ZeMwpou 8Mr616/IdJIGbD0S2PUBPSTnMa0/h+JH/JWJ9KXIelWEjWO5ucMWW2L/TG16f97NPDFm WvzfBWzq3VGoQ+SuGGiNoMakroeHLNBsEITtWVbpBcR2eIRGpvEjl0L+QFTMHZLZhfUK ummhyaAvcFnlogoOA0gMIKuTqNPVQERJ/vC1o5NTt7xgONDF7J6+qWXk8W1Lj0/uqcmI zHEZcf1nfC2jhQCfiWg5U4qrVFC+Tal4NAxoL3IsM+76eBtn/TLU+bvJ57R27ETjUMOg Fawg== X-Gm-Message-State: APjAAAUoVJFy6l0sUXYzww+1xukv+avI3CvYA9mv5lmIegJuFadACmw3 JhfCch7S/zoqz9+4OCa9AS4rSq6P X-Received: by 2002:a1c:16:: with SMTP id 22mr6660992wma.8.1577840348307; Tue, 31 Dec 2019 16:59:08 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:07 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:26 +0100 Message-Id: <20200101005837.11356-10-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/20] avformat/matroskaenc: Check for failure when writing SeekHead 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: Z4Ih6ImAubPM Content-Length: 5881 mkv_write_seekhead() would up until now try to seek to the position where the SeekHead ought to be written, write the SeekHead and seek back. The first of these seeks was checked as was writing, yet the seek back was unchecked. Moreover the return value of mkv_write_seekhead() was unchecked (the ordinary return value was the position where the SeekHead was written). This commit changes this: Everything is checked. In the unseekable case (where the first seek may nevertheless work when it happens in the buffer) a failure at the first seek is not considered an error. In any case, failure to seek back is an error. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 52 ++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index cecf7589e5..c7948fb643 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -436,31 +436,35 @@ static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid, } /** - * Write the SeekHead to the file at the location reserved for it. + * Write the SeekHead to the file at the location reserved for it + * and seek back to the initial position. When error_on_seek_failure + * is not set, failure to seek to the position designated for the + * SeekHead is not considered an error; failure to seek back afterwards + * is always an error. * - * @return The file offset where the seekhead was written, - * -1 if an error occurred. + * @return 0 on success, < 0 on error. */ -static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv) +static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, + int error_on_seek_failure) { AVIOContext *dyn_cp; mkv_seekhead *seekhead = &mkv->seekhead; ebml_master seekentry; - int64_t currentpos, remaining; - int i; + int64_t currentpos, remaining, ret64; + int i, ret; currentpos = avio_tell(pb); - if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) { - currentpos = -1; - goto fail; - } - - if (start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD) < 0) { - currentpos = -1; - goto fail; + if ((ret64 = avio_seek(pb, seekhead->filepos, SEEK_SET)) < 0) { + if (error_on_seek_failure) + return ret64; + goto seek_back; } + ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD); + if (ret < 0) + return ret; + for (i = 0; i < seekhead->num_entries; i++) { mkv_seekhead_entry *entry = &seekhead->entries[i]; @@ -477,13 +481,12 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv) remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); put_ebml_void(pb, remaining); - avio_seek(pb, currentpos, SEEK_SET); - currentpos = seekhead->filepos; +seek_back: + if ((ret64 = avio_seek(pb, currentpos, SEEK_SET)) < 0) + return ret64; -fail: - - return currentpos; + return 0; } static mkv_cues *mkv_start_cues(int64_t segment_offset) @@ -1925,8 +1928,11 @@ static int mkv_write_header(AVFormatContext *s) if (ret < 0) return ret; - if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) - mkv_write_seekhead(pb, mkv); + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { + ret = mkv_write_seekhead(pb, mkv, 0); + if (ret < 0) + return ret; + } mkv->cues = mkv_start_cues(mkv->segment_offset); if (!mkv->cues) { @@ -2527,7 +2533,9 @@ static int mkv_write_trailer(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos); } - mkv_write_seekhead(pb, mkv); + ret = mkv_write_seekhead(pb, mkv, 1); + if (ret < 0) + return ret; // update the duration av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); From patchwork Wed Jan 1 00:58: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: 17094 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp219310qvb; Tue, 31 Dec 2019 17:01:20 -0800 (PST) X-Google-Smtp-Source: APXvYqxwgK1n4HjFk4bF+D8YKkoib+PE8WALm6UTfdABN6HxuPtK316vlBA+yQImVPA4VXSEKZJw X-Received: by 2002:a17:907:20a8:: with SMTP id pw8mr78050016ejb.248.1577840479949; Tue, 31 Dec 2019 17:01:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840479; cv=none; d=google.com; s=arc-20160816; b=XTarLPr8M0SYpOQQInDhKuQWS2xLUY0lCMsa+XjHSnaSpm7pnEhbaAdB3DGixwG45w AAegjMZ40yw/rHbliG1S9clDq3Fm4/1HLyGY23nGfp6rEU6/2DeYyq9JQtRTXfWrqZqC j3GUWJ96SAp+DCaMvvkB7/K3WSKqtIwpwBRVIawCyZYQT8P2cqEJzCSOrkHTz2RLFGGl 1DxVlWyU0NZg9eSXocGcpDgu00O048mfkHjAjLs5s9MZecGm14ZMOTIMu2ah5okO4Xiq RGegS1IlVjd+c7USdmiaqII5rXNRQT3Ba6OUrPSPUg5LyWbyvSxnjbwRZ4wGOXwTqQzt jMmg== 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=XJkKNiAaOUXS0cagc0vw2vjaX+ZJfOrTG1eNBrbcCVc=; b=j7m2lM+xoND3d0VM8AAhFeePC9D0D7H3yqMTt/7I254a2gY18if4jUCvB+Ak45aJl1 unzKa1n336ozKOCvwy3QtmtLTfCh+rHdzD/hnMPy+TTmr1zwbTNs4O006DSkFH3KeyL6 Z7fd1DPZdndk/mMTCW2DxSN+pptTaUUyFsjkdxLT6awOY86O7TJSP82Xcv1JsjP4Cz6E EEe9e9P2wqodAuKNenjlaNlQ8WS7kyIWnF5yEOWiN3dIog3b2Q9JEB9YYqSQTBxj8FRn imYQCtpxx89e5gMEn3oRAtl4ffvTAovsyG41qYy6XMaZfX0pQBZl0sNdxcbsfJAImJh+ HO1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=YlUsfhMt; 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 z16si32567767edq.340.2019.12.31.17.01.19; Tue, 31 Dec 2019 17:01:19 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=YlUsfhMt; 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 AD3A668AE3E; Wed, 1 Jan 2020 02:59:23 +0200 (EET) 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 9C17568AD93 for ; Wed, 1 Jan 2020 02:59:09 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id t2so36224818wrr.1 for ; Tue, 31 Dec 2019 16:59:09 -0800 (PST) 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=Jfplpd5gdlyL5xQxsrkxKor0RSuvOvGDevBT6u1RRd4=; b=YlUsfhMtCPbdx0zm2vMudjla+McVPuBXzGCNljKO9gVmI59vtlLVbty0C74IuHVeWz 3315W2q/JjjZFsro2UNb37w7f2dzRF4dOCYPGhZ5APp5qdgRwpy13IbcmlRXDrbABSzc PkT88Q0sWKKy6trXNMk9DyB+kdTIPQcpb5peo+pLskC+mngcHcDxT6zEQ3epnuuqN3XF 9/MluuBGXlUmquk0ujC7/mOnO15yJEAXMk15B581rJtwuJEKbjg+fzUwfvYDDnDuUeEd ate7m2LitvmdouVPGbliAtmecLfVzpbsZRwRA3Azf9MXoY0/PoMgtuALTIW18CWZg/G9 8/pw== 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=Jfplpd5gdlyL5xQxsrkxKor0RSuvOvGDevBT6u1RRd4=; b=lBPTBvghdjwSVuoe7eT/g5ST5sh5KOK7+sqeRVsWct4yPaMJzzDg4kt89bLSjpIFeo srXilCD6UyainzMCSFZbqq44BquNJUs/m7RtaSON3kkE2MSiRpNX7Ha2UINpFDyv032L e7jFEJZAc9KhlnW1k5AvMMVCl3yaRzakY1KM6fMEJvPuNTcPWUMDAEGHIkoAY008HPww lga98YToVVo8nZumvAJ2kj3CvE8lMyvnSxHgJGYNwHKn5kg42h3+mN5a2nCKdBVj0OdQ 10KPK2a4wOgV6rJPgXaoT330LzX6MoinNHnd1PUOAd3w5PCV5gAlLDVHpqIIbLUQNXVA 5+ow== X-Gm-Message-State: APjAAAWa/+lShv5lOxryZ8AxH3hdAa3ldAx4OrP6uoqZ3yMxrxUywF1F SPGi6XGlylsA2/yrbbwe12DY1luf X-Received: by 2002:adf:e74f:: with SMTP id c15mr77641386wrn.274.1577840349007; Tue, 31 Dec 2019 16:59:09 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:08 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:27 +0100 Message-Id: <20200101005837.11356-11-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/20] avformat/matroskaenc: Avoid unnecessary seek 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: BpYSsYuam9tH Content-Length: 5524 When writing the SeekHead (a form of index) at the end of the muxing process, mkv_write_seekhead() would first seek to the position where the SeekHead ought to be written, then write it there and seek back to the original position afterwards. Which means: To the end of the file. Afterwards, a seek to the beginning of the file is performed to update further values. This of course means that the second seek in mkv_write_seekhead() was unnecessary. This has been changed: A new parameter was added to mkv_write_seekhead() containing the destination for the second seek, effectively eliminating the seek to the end of the file after writing the SeekHead. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index c7948fb643..8040c8311c 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -437,28 +437,26 @@ static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid, /** * Write the SeekHead to the file at the location reserved for it - * and seek back to the initial position. When error_on_seek_failure + * and seek to destpos afterwards. When error_on_seek_failure * is not set, failure to seek to the position designated for the - * SeekHead is not considered an error; failure to seek back afterwards - * is always an error. + * SeekHead is not considered an error; failure to seek to destpos + * afterwards is always an error. * * @return 0 on success, < 0 on error. */ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, - int error_on_seek_failure) + int error_on_seek_failure, int64_t destpos) { AVIOContext *dyn_cp; mkv_seekhead *seekhead = &mkv->seekhead; ebml_master seekentry; - int64_t currentpos, remaining, ret64; + int64_t remaining, ret64; int i, ret; - currentpos = avio_tell(pb); - if ((ret64 = avio_seek(pb, seekhead->filepos, SEEK_SET)) < 0) { if (error_on_seek_failure) return ret64; - goto seek_back; + goto seek; } ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD); @@ -482,8 +480,8 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); put_ebml_void(pb, remaining); -seek_back: - if ((ret64 = avio_seek(pb, currentpos, SEEK_SET)) < 0) +seek: + if ((ret64 = avio_seek(pb, destpos, SEEK_SET)) < 0) return ret64; return 0; @@ -1929,7 +1927,7 @@ static int mkv_write_header(AVFormatContext *s) return ret; if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { - ret = mkv_write_seekhead(pb, mkv, 0); + ret = mkv_write_seekhead(pb, mkv, 0, avio_tell(pb)); if (ret < 0) return ret; } @@ -2533,16 +2531,16 @@ static int mkv_write_trailer(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos); } - ret = mkv_write_seekhead(pb, mkv, 1); + currentpos = avio_tell(pb); + + ret = mkv_write_seekhead(pb, mkv, 1, mkv->info_pos); if (ret < 0) return ret; // update the duration av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); - currentpos = avio_tell(pb); avio_seek(mkv->info_bc, mkv->duration_offset, SEEK_SET); put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration); - avio_seek(pb, mkv->info_pos, SEEK_SET); end_ebml_master_crc32(pb, &mkv->info_bc, mkv); // write tracks master From patchwork Wed Jan 1 00:58: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: 17096 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp217273qvb; Tue, 31 Dec 2019 16:59:57 -0800 (PST) X-Google-Smtp-Source: APXvYqxxnRL3IuErZfsygXrTCwAwJyIC0FWXXB3IV1BvCHYbM9ftlQgIdVl0leb/2grmapcwXSvK X-Received: by 2002:a17:906:c40d:: with SMTP id u13mr80751943ejz.178.1577840397896; Tue, 31 Dec 2019 16:59:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840397; cv=none; d=google.com; s=arc-20160816; b=FvYFctrsBkkCrmaS2d9NbT0t4Hj9JzMnmfDb/urAD/jboMN+sHe+bUyIAE6qmwEfgP HUukBhHACtfg5K9SQ/Y5aJz5mJMdlW1Q/Oa68/5FIoJNmC9ckdTqcSLXRxT/zqqw7GFO B4mWCbYMdP3VDbtCeQSTXu9cCic+ikwe63+JxCMUAH/vKFC0xa46ZzbZ0zyZxGr4mwQ5 9dMc4BWxTma/PEVFB1HGxwCPYhZr2Rx8WsBrI0asL1nHtATO8oYvbfpNOVjsS5I8fU/W IWVEP2jHsdyTYKDa50QIF47Kd/6qzjBXVchzy9vCllLqyIF7vDqQlLTcePNVrByHT5Qo NZtQ== 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=IOYlkmLCawZNJxBQ5nJK1q7P8QyvQjzyn92+Ng8yx2A=; b=CtWPHyCLXbETBqHRfxXJvanc2TCnVqoGvtXEYwOVx8cn9v/OAYfWBsyAwOvg7jfK/t eu7WgW2SWDreaDayEGBuABwkCAaWKgI7xfUTErUMQpfBMCXp+VA11csb+02jsP9wY4ej x59D/jykQDBg4vgkHlXK/VXP+Nw4ANULBFVPz1lGlsE+/uibI3wNIiGNveXdw0uOJDja iVxwD2CzUheX9pqJ4ENN5qY/OxkD8rQOuhXih7ftEcAQY61xso1LDtpxBNr12HnjiYAV xp/A7kVKWSg/p/19tJj/EsOc646SRNyUJjdZEvJ87QGidvO5tdSrpFqdF3klLwn3KlWB KDkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=VHrAVuOI; 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 v24si2507193edl.427.2019.12.31.16.59.57; Tue, 31 Dec 2019 16:59:57 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=VHrAVuOI; 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 3556268AD93; Wed, 1 Jan 2020 02:59:15 +0200 (EET) 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 88D7168AD25 for ; Wed, 1 Jan 2020 02:59:10 +0200 (EET) Received: by mail-wr1-f65.google.com with SMTP id z3so36239194wru.3 for ; Tue, 31 Dec 2019 16:59:10 -0800 (PST) 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=BAaOXqwIuwMmU0XNJH63ODl96QA/74OCOcIUY7ISELg=; b=VHrAVuOImFBrXXwCbeIpDzNVIjGJIJ34iuxVXGjkKwXgv4JpZjCm33eGcnfR+QZcVf 5rDuoWsuNDu8lIib5SJ5MLNt4uNU7AchuDkomTSEcv5LRyVeMy04j1UHHwOWjsDEynTc RLBHr/LcVEfrboaTuoFBg4NbU4aUrpB4sVg+1zFIluwCOPmzGu2mbFL26+I2oSOlaNpr umI3XTxrwrzd5FBeK2JgZeUI/8ooIu5uPXmDcUf8jtLtjBVq6uuT7s+zIQQo/h26sD5k LNwZrVzi36SQON7QX2hwoWrl/4BTGhMIfZsH889f3+PFkJ9NYutXAF5X3CMQvajWXTi1 T0xA== 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=BAaOXqwIuwMmU0XNJH63ODl96QA/74OCOcIUY7ISELg=; b=HlFGgrhM1fEquYoEerp56GXb6tkwaQJijFftasIjIOKdGk6I0OdCZ/NpsICGFDQCrA ZfkP/6n4Xq3KhdEYxIRyqtYnJeVMnn91QTa5xFDPaIOYtDB8IZDkFKU9zYliqTTQhsQA Gr9n39ChRT8QqLFerSxEiosFm7ACpEVDfyIVTNaSTXyyT2h9jdeJZqv8ob7wTDUsY3T+ StKhH5QMYiIQ3GquW4zJDP/N0lucnSpTOz8N2z58ew4xlDaQ+D5BlS43wVOqYw9Irw78 FwOxbSu/a492OqmHE+ceStX+wWsBXloDOnDBAxWSEVItMVVnfxAc+g4G+efCpe+BB+I7 ivhg== X-Gm-Message-State: APjAAAXVxST5+Ukpx0np5ZfSJsnIxAHQdQh4A9Lq/hkRXOEyIYbjHO8N DKFceEhcKWqXEWxhZdbPqLCEqAKh X-Received: by 2002:a5d:5452:: with SMTP id w18mr59679892wrv.333.1577840349738; Tue, 31 Dec 2019 16:59:09 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:09 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:28 +0100 Message-Id: <20200101005837.11356-12-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/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" X-TUID: BMAgs3uwxanR Content-Length: 2379 Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 8040c8311c..6dd731eb90 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -449,7 +449,6 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, { AVIOContext *dyn_cp; mkv_seekhead *seekhead = &mkv->seekhead; - ebml_master seekentry; int64_t remaining, ret64; int i, ret; @@ -465,8 +464,8 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, for (i = 0; i < seekhead->num_entries; i++) { mkv_seekhead_entry *entry = &seekhead->entries[i]; - - seekentry = start_ebml_master(dyn_cp, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE); + ebml_master seekentry = start_ebml_master(dyn_cp, MATROSKA_ID_SEEKENTRY, + MAX_SEEKENTRY_SIZE); put_ebml_id(dyn_cp, MATROSKA_ID_SEEKID); put_ebml_num(dyn_cp, ebml_id_size(entry->elementid), 0); @@ -478,7 +477,7 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, end_ebml_master_crc32(pb, &dyn_cp, mkv); remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); - put_ebml_void(pb, remaining); + put_ebml_void(pb, remaining); seek: if ((ret64 = avio_seek(pb, destpos, SEEK_SET)) < 0) From patchwork Wed Jan 1 00:58:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17085 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp217702qvb; Tue, 31 Dec 2019 17:00:16 -0800 (PST) X-Google-Smtp-Source: APXvYqze5LIT5/sm4FykOgi+ImGgRUFAE6U1laLAtlOuQZ3BfSDsnoK9XhjMMIEVgYpvLWOcSlMa X-Received: by 2002:a17:906:3299:: with SMTP id 25mr79440316ejw.118.1577840416081; Tue, 31 Dec 2019 17:00:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840416; cv=none; d=google.com; s=arc-20160816; b=K8ddpPD8pwP9trkAPoC63Z1t9yXqAgRw73cfwm5AeitN13vWsfyA7D/BGNNikg92yU fAvW/olJNQ5lyvXky70mVyV1NFdikwK4qjmm8Mm++bT694D3S+eV5mu7B10LhupSXO2L r2DCtGuy/B23W+9C27DnYHBJPnvB2mRN8WCWZ2TgnrSestoCuU0/9eURrpLEeo1eGSR9 S8BxzE+SnSCfaJj52FlSRhvXKTTEhIoWn/cd3SmBos6xrE9W5Eqd8+daRE8ERHTHWuZP /j8/xWpUO9bILGXdaPwQwFUM3dNtE3bOe+oScotRy249YRFFkTQKHF7XdBQr3j7+umK1 cWXg== 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=6+BNrxpIbXxbqET4uVKCcz81CJC+4NeZbZIoSAWnJLo=; b=j9qpN7/uVHhr8hugTMEVk3bRPttxoxyFKljTZm9R5zOddzNdnadAISZ0npw037PQAB OKVnlaCSJ2SxqPPxXIzYiWJCs8j8dzoKdYCk3Xo2ryaQaiPRTSvouqck8dSChLfk1hz7 nZbLbTAQw4l96zZhVo3WfE1O9WF4HATx6UfkDZt02zhjXUek3EVk/1crDUVxiffSFvpl 3NM3WKiQ6JkUa2JamR+cVWNi7weumUGEv1pAGM3MynaAJu1M719Yx2qJBGuX40d8seVH BXQ60FoUXAmxbogfcXoWNtECl5In/GLcIhpP55alO4KVzR+dx1aP3bA9rPuFEnCSg6sG 1F1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ddl32nCE; 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 c4si32840923edd.147.2019.12.31.17.00.15; Tue, 31 Dec 2019 17:00:16 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ddl32nCE; 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 2191068AD9D; Wed, 1 Jan 2020 02:59:17 +0200 (EET) 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 590F668AD2A for ; Wed, 1 Jan 2020 02:59:11 +0200 (EET) Received: by mail-wr1-f67.google.com with SMTP id c9so36215637wrw.8 for ; Tue, 31 Dec 2019 16:59:11 -0800 (PST) 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=qiPb+3pwfJXYPM5X7zoYBIZbV3jfUvxqavszezkkx7M=; b=ddl32nCEmWbTzO+UnSBCQLd2alcY8+B9U+LKp3dlsQOAA0r8VNST8qjOV61Po0h7/1 ObgPULty4f28NDv1IChNbYCsvEr86zixHCgwFaYI7byShlG2NRtjzXu01JP3veI6++dr deF23adSE8LT9A6oCiM498povRsLG6gP+VUZ/C5JFXollA7sXGdgov4VfAVkwQi/B7OE 61W5ealtF8U2u1kMV951QJsxBX8Uia6kPSSd1WEq9xTFqugZMg2Hxs/7RgjxDM4sgVNR YRjwlt6hyUBoJsf38j/eS8W1VC0moPkxavxdXqSd2QgQtHpq5U3btafJE+DWWU8UASsl t8Vw== 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=qiPb+3pwfJXYPM5X7zoYBIZbV3jfUvxqavszezkkx7M=; b=TjHOCQ+5mdeGerT2Q7SWkd1NXDcOzud3W0TdZ04OvY0fPD5IWeuqRIikgWx7tMpOwM Fz2iebPPs1v03x2oz2BHxQJ9c2b44TEk0lvOoqY5VtqI1GqS+a1WSeJnucRNlarMnXC6 oUgRVHi4EdzmCG9uOfhhdd/kPwhQDUC+lBnpEOaA9lmzSnJawR/5niEZadiKfAkrOCOu OTM4lwuUHcWfoh84IkbSKxKdAVfD3HDT9VS2LySGFMVg/w/f8KuxXp9iuyMY9zMF0ycY V0nOsip7jaLsRhVjXvAtOxl+9JehXDb8AGBJZWjjzVmANaP/5w4k+MMMnE0HDs5ytSmR A//w== X-Gm-Message-State: APjAAAUp4DJD2Ai8HEKElRA4PbEqbgjSGPxrFUqUSD5sYtzf5tI7xW3L lRch8MffqHpNgGaxDyieRksq4yqX X-Received: by 2002:adf:cd92:: with SMTP id q18mr73664083wrj.261.1577840350609; Tue, 31 Dec 2019 16:59:10 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:10 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:29 +0100 Message-Id: <20200101005837.11356-13-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/20] avformat/matroskaenc: Avoid allocation for 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" X-TUID: +9PltNeHvNAP Content-Length: 7790 Up until now, the Matroska muxer would allocate a structure containing three members: The segment offset, a pointer to an array containing Cue (index) entries and a counter for said array. It is unnecessary to allocate it separately and it is unnecessary to contain the segment offset in said structure, as it duplicates another field contained in the MatroskaMuxContext. This commit implements the corresponding changes. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 6dd731eb90..2c4d3c338f 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -88,7 +88,6 @@ typedef struct mkv_cuepoint { } mkv_cuepoint; typedef struct mkv_cues { - int64_t segment_offset; mkv_cuepoint *entries; int num_entries; } mkv_cues; @@ -139,7 +138,7 @@ typedef struct MatroskaMuxContext { int64_t duration_offset; int64_t duration; mkv_seekhead seekhead; - mkv_cues *cues; + mkv_cues cues; mkv_track *tracks; mkv_attachments *attachments; @@ -398,10 +397,7 @@ static void mkv_deinit(AVFormatContext *s) ffio_free_dyn_buf(&mkv->tracks_bc); ffio_free_dyn_buf(&mkv->tags_bc); - if (mkv->cues) { - av_freep(&mkv->cues->entries); - av_freep(&mkv->cues); - } + av_freep(&mkv->cues.entries); if (mkv->attachments) { av_freep(&mkv->attachments->entries); av_freep(&mkv->attachments); @@ -486,19 +482,10 @@ seek: return 0; } -static mkv_cues *mkv_start_cues(int64_t segment_offset) -{ - mkv_cues *cues = av_mallocz(sizeof(mkv_cues)); - if (!cues) - return NULL; - - cues->segment_offset = segment_offset; - return cues; -} - -static int mkv_add_cuepoint(mkv_cues *cues, int stream, int tracknum, int64_t ts, +static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int tracknum, int64_t ts, int64_t cluster_pos, int64_t relative_pos, int64_t duration) { + mkv_cues *cues = &mkv->cues; mkv_cuepoint *entries = cues->entries; if (ts < 0) @@ -512,7 +499,7 @@ static int mkv_add_cuepoint(mkv_cues *cues, int stream, int tracknum, int64_t ts 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 - cues->segment_offset; + 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; @@ -1931,11 +1918,6 @@ static int mkv_write_header(AVFormatContext *s) return ret; } - mkv->cues = mkv_start_cues(mkv->segment_offset); - if (!mkv->cues) { - return AVERROR(ENOMEM); - } - if (s->metadata_header_padding > 0) { if (s->metadata_header_padding == 1) s->metadata_header_padding++; @@ -2346,7 +2328,8 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ if (par->codec_type != AVMEDIA_TYPE_SUBTITLE) { mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe); if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (par->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) { - ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, tracknum, ts, mkv->cluster_pos, relative_packet_pos, -1); + ret = mkv_add_cuepoint(mkv, pkt->stream_index, tracknum, ts, + mkv->cluster_pos, relative_packet_pos, -1); if (ret < 0) return ret; } } else { @@ -2371,7 +2354,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) { - ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, tracknum, ts, + ret = mkv_add_cuepoint(mkv, pkt->stream_index, tracknum, ts, mkv->cluster_pos, relative_packet_pos, duration); if (ret < 0) return ret; @@ -2501,14 +2484,14 @@ static int mkv_write_trailer(AVFormatContext *s) if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { - if (mkv->cues->num_entries) { + if (mkv->cues.num_entries) { if (mkv->reserve_cues_space) { int64_t cues_end; currentpos = avio_tell(pb); avio_seek(pb, mkv->cues_pos, SEEK_SET); - cuespos = mkv_write_cues(s, mkv->cues, mkv->tracks, s->nb_streams); + cuespos = mkv_write_cues(s, &mkv->cues, mkv->tracks, s->nb_streams); cues_end = avio_tell(pb); if (cues_end > cuespos + mkv->reserve_cues_space) { av_log(s, AV_LOG_ERROR, @@ -2524,7 +2507,7 @@ static int mkv_write_trailer(AVFormatContext *s) avio_seek(pb, currentpos, SEEK_SET); } else { - cuespos = mkv_write_cues(s, mkv->cues, mkv->tracks, s->nb_streams); + cuespos = mkv_write_cues(s, &mkv->cues, mkv->tracks, s->nb_streams); } mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos); From patchwork Wed Jan 1 00:58:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17099 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp217899qvb; Tue, 31 Dec 2019 17:00:24 -0800 (PST) X-Google-Smtp-Source: APXvYqzLuldVPfiJxyvHwxSjHc+wWF6wQg1EqqgL/8R1q5G7n2BqGTJxKuVaPJ3cqjkI8HzMpk4k X-Received: by 2002:a05:6402:17cf:: with SMTP id s15mr78899018edy.189.1577840423969; Tue, 31 Dec 2019 17:00:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840423; cv=none; d=google.com; s=arc-20160816; b=m89sPRjZbbz0YB5MwCNuVOb76R7lF4yVph45nK7bPt0cQuf2LbVLrPFd+WVbOE8+JS sztxmem2mK75T1+CLlNUtB/NqiY2rzqvXLxxWioSqCMe1snqJQ0c12ylRpMSwWCNKzSs 9thLeXdxUB0FuW8SRdKTV6MqZFrwhN0JUbT7CoQQS0db6Q0+g0kNyR8d2O3IbKxh6DPT ODQ1z8PwxmggxQRjqBKuJjcMpIEGUyqYyjkIj31pAOFgsbCMIpThf8ga661E8NM/P5cb mOdqIas2aMNsEyFhjB4MNl1v6RqXsgAZStFtMoQoZw4/RW2P2bnpBJZ8YqBf6KsRtpgu bogw== 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=viPklEqNZaiTzIApNN8EheukLDntrcGdNkRVSsnPR1Q=; b=Zq6iw41jH8EejyKYNlKwPl1sjk0rOnBP0uSQmInmbK+s34V85/A4WpCYmfI5xVVaLS gXPr8ckm5jB3ojJoOI1KkLJ1DbkydRQcbIb9n/uVybxbN+/StDApnzQPAh2OCWps7tdF HRixxUgUh5XcTIktJ5I8FmFESMr/wFVHt7kwaKqVBK9DIFinyCvSYJL7di3T3rOQYn5d 7iG5KKM7tCP+nSoHNQcz9L2P92/XDldZpful4WcG8LLJReXwqrSApy/Y0jYFNjkb8+MC 1o2W4VGDqFKbGnQzgJK/HHJiwS9/LD1BXCv6WhWjPCrBWXJdtTGvba/xoX5/JlIwV8Qn ZEMQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=csjYQD7v; 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 f19si32704552edq.319.2019.12.31.17.00.23; Tue, 31 Dec 2019 17:00:23 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=csjYQD7v; 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 80A7F68ADCD; Wed, 1 Jan 2020 02:59:17 +0200 (EET) 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 2274868AD10 for ; Wed, 1 Jan 2020 02:59:12 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id g17so36197903wro.2 for ; Tue, 31 Dec 2019 16:59:12 -0800 (PST) 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=N7laOIV8gFlsOwgy7c1ecXcTqEabqSLIk/MPGTCcAMA=; b=csjYQD7vCe/2ikulckSJb/RYdt5rHbJjQpXJHUnCd2H9LPh3v2L7mg0sgkX9U0U+SQ YLruhUkU3ttM6l+6AxK9Gwg8/SXKisIwjgakEnjMbSHRRwdeK8IpxcwLHrcScuSD3/ZW nIVFGO59FOh0uxTD+LoPkcN1lwr0BVQeeaE3hotA+sesdklND6t0HShWvmjiTqtqjBSk pRVwtqyri2GWp1QgbM5uN5jcbq3a1t0zKcRn+vkzJj/v5lBRgUnOQiF9FK4dMtpQJqxb HSQtU+quHvhqH9agTlm/A6vHiIaANmV7khPSVwSYu19rAtkglUyThnnLZWn0Ap1y50g/ F9IQ== 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=N7laOIV8gFlsOwgy7c1ecXcTqEabqSLIk/MPGTCcAMA=; b=GLnt5np/J06rTeNaoKVqUcT7R3qySlh0eRnJ3PbuqVTlqJekH+ApKrrHUj8UtaSA5F 4mdVUwH6DH77CRby2StxtKxxFZBj8YU5LZ29894I2AokZCVyC8BlW7BLnntEnjmB2ihl xMmEVpcWJX6ZqwHAbnB70NHvnTlHD5S+WGkbz6aqJ9WpNw3OvkRqipElE1AGJcHazsRU MjaZZamN+SArWfQCoYhOWW0EooqWVd6OGghD/G+horBajMutQN0lPB6p3vX7K+DspP/4 omhvu6vYoQc/Iovky225YOMZJFUBGKP3Q5o2We1h/iO3nuu5Ew5ByWlrJRFKIkznPPAi e7uQ== X-Gm-Message-State: APjAAAUegDAOyDMntkjOFqbv8IkNvm8zQceDD1xEs7yLWRsJRdQionq/ yGJwBSqA760aHYHUBR8LGU2s39EY X-Received: by 2002:a5d:50ce:: with SMTP id f14mr74277813wrt.254.1577840351484; Tue, 31 Dec 2019 16:59:11 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:10 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:30 +0100 Message-Id: <20200101005837.11356-14-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/20] avformat/aviobuf: Add function to reset dynamic buffer 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: iWdzDva3M4XI Content-Length: 3101 Resetting a dynamic buffer means to keep the AVIOContext and the internal buffer used by the dynamic buffer. This is done in order to save (re)allocations when one has a workflow where one opens and closes dynamic buffers in sequence. Signed-off-by: Andreas Rheinhardt --- This function might also be beneficial in the mpegts muxer when converting AAC to ADTS (currently a new dynamic buffer is opened for every packet) or in the nut muxer. Besides the application in this very patchset, there is another way that this can be used in the Matroska muxer: By not reallocating the buffer used for writing packets one can improve speed on platforms where realloc is slow (namely Windows). A patch for this comes soon. libavformat/avio_internal.h | 7 +++++++ libavformat/aviobuf.c | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h index eb628ac493..c575df8035 100644 --- a/libavformat/avio_internal.h +++ b/libavformat/avio_internal.h @@ -171,6 +171,13 @@ int ffio_open_whitelist(AVIOContext **s, const char *url, int flags, */ int ffio_close_null_buf(AVIOContext *s); +/** + * Reset a dynamic buffer. + * + * Resets everything, but keeps the allocated buffer for later use. + */ +void ffio_reset_dyn_buf(AVIOContext *s); + /** * Free a dynamic buffer. * diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 70e1d2ca10..d44ee0fa35 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -1461,6 +1461,17 @@ int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer) return d->size; } +void ffio_reset_dyn_buf(AVIOContext *s) +{ + DynBuffer *d = s->opaque; + int max_packet_size = s->max_packet_size; + + ffio_init_context(s, d->io_buffer, d->io_buffer_size, 1, d, NULL, + s->write_packet, s->seek); + s->max_packet_size = max_packet_size; + d->pos = d->size = 0; +} + int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer) { DynBuffer *d; From patchwork Wed Jan 1 00:58:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17092 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp218643qvb; Tue, 31 Dec 2019 17:00:53 -0800 (PST) X-Google-Smtp-Source: APXvYqyibpgg04Qs8/4fZMsikFGeotxvUiTk87HYK0IRdL50j6HlOX1cBdRD/55I4ho9xWsITXtO X-Received: by 2002:aa7:d6d1:: with SMTP id x17mr43422891edr.57.1577840453060; Tue, 31 Dec 2019 17:00:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840453; cv=none; d=google.com; s=arc-20160816; b=xPzS8Qq5ksGHfT4TkQS5VWtZUVqpqt8iaTNhFuvvO9ZqbhnZeyl+jIHgBRZbX8j3jV DhG1kG11arcYKYkb6eLpUJ5vwqkQcz/YHF5VaWn/c0TRc7RhQRsHSzCnoupnTO8YBz+U TJzV0zNLFW54B9t6CTuVvpTLsT2RpRvPBSBAiNxPlCJedkJwI4TAj3Rp1lcyjV9mAMEa cTz2Ms51yQZRLR4GRvlGiZ4msDvXhnx5qawNz9wBH7+Jl8/MdnyZp4gZR0aU93IL7D9E fEgtWRWm6aVKbrHL1bkaUKsCcUeiuHSO09bN5RnDq0qo7eY3Q2S+r1rvJIgFqgP9xgY3 EYKA== 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=ge0C/663UADFnq8yUJb01j6FnyZCpQgabWlxKyl5V2A=; b=X0ko0wpRhEiV74mC96iLzqHxaZHN+AzI82nkazJQ2cP0jQbeSuP3QZBDSCALl9Q7a7 4nSsgn4CVCt4ySU56yLP+Nr6YmW2/8y4mrgUxHxa/ih2gHJsOZ8WcyReN+JkFSyMrpEk GccNSyVb8HoeC0d4wj3IU++lV10W7bK3lJzuPx1hiaM5o/jbzpmQApV5/FSwIdVnW0T8 HcTHEgjeOozTIBomha4or8U6S3NDSCwzhH+bdWg8cCGS85L5BWUxvzMlPoDnXi3I+JJU GyLcHdpwCQRiuC5YZVAJEDI01AW0LlLaiYmDCj0qgD9kpABZqJpuLxPqhl3oVGWp08HV LctQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=QE9QxobN; 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 z13si32820557eja.299.2019.12.31.17.00.52; Tue, 31 Dec 2019 17:00:53 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=QE9QxobN; 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 C60F068AD91; Wed, 1 Jan 2020 02:59:20 +0200 (EET) 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 25C3268AD85 for ; Wed, 1 Jan 2020 02:59:13 +0200 (EET) Received: by mail-wr1-f67.google.com with SMTP id g17so36197914wro.2 for ; Tue, 31 Dec 2019 16:59:13 -0800 (PST) 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=Fq5a8yG/pcTS7VKDvhIl4Y/IlGp96/3wOmxjFnJs9NU=; b=QE9QxobNh7OvY0knB9TDkmnXGqWamvXph9VVxc5m5tW8srM0p7uxRjvrmpqBT/KHax NcOkbRFOgwejqoBH5NynNW3uJzA2fgHza17gxgegK9RzwKvxrryOnNoka8opfP8JXSrD qTdoV/jnOlWjBBeT2aipEkOTzl7XzN+t575DEaWVUMd5u90EhPB6fWK3uL5lA/b/6/8N fPfflreXE6Ug9wZv9DlKirzbg8r+z09G3oit/EPifC06APkr/7M6B/3u0Ak00iGa/HDL wdPIp3NeeNfQlWN3i0vC+v9i/sXdVjkQZaByL/OXVNVzw14gDmqvgWgtjVQdt7deMpBV qVaQ== 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=Fq5a8yG/pcTS7VKDvhIl4Y/IlGp96/3wOmxjFnJs9NU=; b=LRaYolfqLdPiTKhGf4Rbs8C9tZLvswIiBYHMZx9Zr/A9bhVLjymvCiMWgSUowcUWk1 FyWtYd5aAACrOi4BrGDDpotthjbRw+p7tBbljoQiWWaWtLxiJtQb/D5HJR7fzgUkavqy Rxzr97Vj9QIon67WRIA8J/sBIwqKa6dnCwwWwpfaUGbg1NhanpRKqRSZ2GRZiJW/s4Sj +BGTUoxCo5SMqNjYNYOX/ZapN6+aKk+fOGlyjqbU/HV4+tQ2DyEAZHpZLVQYQ7bBrUgF qCw2x4eCWscIfsGOqt5pX80EKgqFQ4d8+xPDSsRjOGiGX2pH3swVINeinmqpHzaxK7eY TKjA== X-Gm-Message-State: APjAAAWV2Grl7BYgMMUp5VWWA5W1bQ2KtxaGt/wnuBa1aceDsfxVB6ta f/1pQjvZmh0d0BjlDEkPR84eF3n9 X-Received: by 2002:a5d:4386:: with SMTP id i6mr74101799wrq.63.1577840352237; Tue, 31 Dec 2019 16:59:12 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:11 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:31 +0100 Message-Id: <20200101005837.11356-15-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/20] avformat/matroskadec: Simplify writing 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" X-TUID: XeUf3TS18jiy Content-Length: 8884 When the Matroska muxer writes the Cues (the index), it groups index entries with the same timestamp into the same CuePoint to save space. But given Matroska's variable-length length fields, it either needs to have an upper bound of the final size of the CuePoint before writing it or the CuePoint has to be assembled in a different buffer, so that after having assembled the CuePoint (when the real size is known), the CuePoint's header can be written and its data copied after it. The first of these approaches is the currently used one. This entails finding out the number of entries in a CuePoint before starting the CuePoint and therefore means that the list is read at least twice. Furthermore, a worst-case upper-bound for the length of a single entry was used, so that sometimes bytes are wasted on length fields. This commit switches to the second approach. This is no longer more expensive than the current approach if one only resets the dynamic buffer used to write the CuePoint's content instead of opening a new buffer for every CuePoint: Writing the trailer of a file with 540.000 CuePoints improved actually from 219054414 decicycles to 2164379394 decicycles (based upon 50 iterations). Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 74 +++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 41 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 2c4d3c338f..6f0760fa69 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -170,12 +170,8 @@ typedef struct MatroskaMuxContext { * offset, 4 bytes for target EBML ID */ #define MAX_SEEKENTRY_SIZE 21 -/** per-cuepoint-track - 5 1-byte EBML IDs, 5 1-byte EBML sizes, 3 8-byte uint max - * and one 1-byte uint for the track number (this assumes MAX_TRACKS to be <= 255) */ -#define MAX_CUETRACKPOS_SIZE 35 - -/** per-cuepoint - 1 1-byte EBML ID, 1 1-byte EBML size, 8-byte uint max */ -#define MAX_CUEPOINT_CONTENT_SIZE(num_tracks) 10 + MAX_CUETRACKPOS_SIZE * num_tracks +/** 4 * (1-byte EBML ID, 1-byte EBML size, 8-byte uint max) */ +#define MAX_CUETRACKPOS_SIZE 40 /** Seek preroll value for opus */ #define OPUS_SEEK_PREROLL 80000000 @@ -509,58 +505,54 @@ static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int tracknum, i static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tracks, int num_tracks) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *dyn_cp, *pb = s->pb; + AVIOContext *dyn_cp, *pb = s->pb, *cuepoint; int64_t currentpos; - int i, j, ret; + int ret; currentpos = avio_tell(pb); ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CUES); if (ret < 0) return ret; - for (i = 0; i < cues->num_entries; i++) { - ebml_master cuepoint, track_positions; - mkv_cuepoint *entry = &cues->entries[i]; - uint64_t pts = entry->pts; - int ctp_nb = 0; - - // Calculate the number of entries, so we know the element size - for (j = 0; j < num_tracks; j++) - tracks[j].has_cue = 0; - for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) { - int idx = entry[j].stream_idx; + ret = avio_open_dyn_buf(&cuepoint); + if (ret < 0) { + ffio_free_dyn_buf(&dyn_cp); + return ret; + } - av_assert0(idx >= 0 && idx < num_tracks); - if (tracks[idx].has_cue && s->streams[idx]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) - continue; - tracks[idx].has_cue = 1; - ctp_nb ++; - } + for (mkv_cuepoint *entry = cues->entries, *end = entry + cues->num_entries; + entry < end;) { + uint64_t pts = entry->pts; + uint8_t *buf; + int size; - cuepoint = start_ebml_master(dyn_cp, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_CONTENT_SIZE(ctp_nb)); - put_ebml_uint(dyn_cp, MATROSKA_ID_CUETIME, pts); + put_ebml_uint(cuepoint, MATROSKA_ID_CUETIME, pts); // put all the entries from different tracks that have the exact same // timestamp into the same CuePoint - for (j = 0; j < num_tracks; j++) + for (int j = 0; j < num_tracks; j++) tracks[j].has_cue = 0; - for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) { - int idx = entry[j].stream_idx; + do { + ebml_master track_positions; + int idx = entry->stream_idx; + av_assert0(idx >= 0 && idx < num_tracks); if (tracks[idx].has_cue && s->streams[idx]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) continue; tracks[idx].has_cue = 1; - track_positions = start_ebml_master(dyn_cp, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE); - put_ebml_uint(dyn_cp, MATROSKA_ID_CUETRACK , entry[j].tracknum ); - put_ebml_uint(dyn_cp, MATROSKA_ID_CUECLUSTERPOSITION , entry[j].cluster_pos); - put_ebml_uint(dyn_cp, MATROSKA_ID_CUERELATIVEPOSITION, entry[j].relative_pos); - if (entry[j].duration != -1) - put_ebml_uint(dyn_cp, MATROSKA_ID_CUEDURATION , entry[j].duration); - end_ebml_master(dyn_cp, track_positions); - } - i += j - 1; - end_ebml_master(dyn_cp, cuepoint); - } + 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_CUECLUSTERPOSITION , entry->cluster_pos); + put_ebml_uint(cuepoint, MATROSKA_ID_CUERELATIVEPOSITION, entry->relative_pos); + if (entry->duration != -1) + put_ebml_uint(cuepoint, MATROSKA_ID_CUEDURATION , entry->duration); + end_ebml_master(cuepoint, track_positions); + } while (++entry < end && entry->pts == pts); + size = avio_get_dyn_buf(cuepoint, &buf); + put_ebml_binary(dyn_cp, MATROSKA_ID_POINTENTRY, buf, size); + ffio_reset_dyn_buf(cuepoint); + } + ffio_free_dyn_buf(&cuepoint); end_ebml_master_crc32(pb, &dyn_cp, mkv); return currentpos; From patchwork Wed Jan 1 00:58:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17100 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp219084qvb; Tue, 31 Dec 2019 17:01:12 -0800 (PST) X-Google-Smtp-Source: APXvYqzfeUyLMnm7uhV84LTbbZmw5ulc6QXOmpB8/C6lLsmdrd04iPUrr0FWvHCcZ1AsEgOqNpDV X-Received: by 2002:a17:907:2173:: with SMTP id rl19mr45757331ejb.83.1577840471978; Tue, 31 Dec 2019 17:01:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840471; cv=none; d=google.com; s=arc-20160816; b=mlOZXXz23KjwPoBJj62FXrotrQuAvOciAb8ykqlvrDOicLJlOdpoOlapFBG58Edk2X kGKF1EAhWdLvZG+N3AHsAoPFwWBXMaYfm8ARbuP86dGYwsAIbffJdxEdp6NwfgyIGIr+ IT0ImZZpphu7Se0+DEGUugJJmxY6IipFaY4cHFymt2vf0n+sUr64M2sCY50XlzaLQTW/ h5GDMDF3N8DJi6rN03WiBzWvlR4XWnvphp7zmAg430ZvmiD1wz+SmKVdxiWFRp8b+ysQ ydqX7jGEVMjAbK7MXGMSVnffWc0avNL421HLiM7CN/UwWJi9kurI6noZmlJ7E5+x/yeD QSPg== 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=c0at2NebxVCggKe5s3bSKNCZT6D+2mU7jbgqTkfgrnQ=; b=ACa9rv2WVFubhiGMLXUvSLHfJYoYA2bIoq/ZjAHTcw8zxXVuMMBzZlFPgN679fm/PI HVBX5LSIBmvFfFacf/vdqy1off3x/XYjrIFPNMbq+tpVND49ITlupkIs4MRGDlP1QA+W 85yMD1Mfltbm5TuKsV6qFwNWlkaXQxUyPV7XrCRJahkRNT0yGi/hW84SVG0EmN2GZa/R HwC1DFIMtwk/qfwYWY4xzRbybOPIRN/QZOBsWb4AwgMtRtqqgv0k+gjaZFBQi9CNYpjO sSOQrBrqT0KqGoPhleVnZfIMHZtLYZNe2zRNb+qLtLKU/YKKA5Ttgi7q0/CLMnbPVJSY 0EGg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="RPTBi/D6"; 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 21si32844614ejz.34.2019.12.31.17.01.11; Tue, 31 Dec 2019 17:01:11 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="RPTBi/D6"; 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 D0C4E68AE33; Wed, 1 Jan 2020 02:59:22 +0200 (EET) 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 1943268AD9C for ; Wed, 1 Jan 2020 02:59:14 +0200 (EET) Received: by mail-wm1-f68.google.com with SMTP id q9so2811989wmj.5 for ; Tue, 31 Dec 2019 16:59:14 -0800 (PST) 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=vlnJq5uvq+vloKFsiJGv5tlMbA49v9xRoK+rLPIXGnM=; b=RPTBi/D6tyDCThoPczvHjZ81zl7eePmJMQIredw/hZcLzAz6nl+r3eEuFtmo0VudZr 3dCHmNNudg5Z7L3cwfyNNJ0XlJaQ3Ss/uLY8Ip7s6vs7EL1SlTnzcssGdIxfG4ExIONt 9AizXM1+JDMy9yHBDLudkNEdtsV/RNUnH088wd75VWRDnpCINtsiZrbf2pmxnqvDYusL mRsGrVj1XAlUGsqjEZC3IQpuPSmVlSlpeO42DYyP7vuwa8ofjPd3ExxSbH+8GHOIz4MK +IoBf5qcMzqc1D899ilfiuWqKocXIxcY7E6OPMxbf7O85sAsq0NwXu3v8tpnNxxLTY4B 6H/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=vlnJq5uvq+vloKFsiJGv5tlMbA49v9xRoK+rLPIXGnM=; b=SBAKUbylI98au3GuF4c5CFtvZdzsW9iGIH9D1kP/bqlsbpCeK8FJhX5OD8YVXfSd8g IAb+5emdMHK4+b96ZQKkt9F75kyq2XJITTtZAyvwDZ6F6cD3yCg/A+Nozcw71YaOhlxg +H/dqH51/fsfcnYOXPIqiBAGp6zDmqu5X19gr8Lm/mNZV/zqyXdNgHduniEgIfXDfIBW pb/cklyBR973kVanFsfklH0vu+upci2gGOeESR+r06LHOTgRIves2TmLQxOtpPcF+HAy rEsZtDobvugvNyuQB+cImf7ZNQS1q95YcxRQDuacAbhjkeswQOLglzST/cKalwbGfE8p DP6A== X-Gm-Message-State: APjAAAU9S+VOU7FnPrmJmZjb49KwrwtONATnZ7VNZt2jNgMMSkAKTFQt /KIXuV1wl0jtYaCuG/I3vOtafDFd X-Received: by 2002:a1c:f30e:: with SMTP id q14mr6449492wmq.65.1577840353316; Tue, 31 Dec 2019 16:59:13 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:12 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:32 +0100 Message-Id: <20200101005837.11356-16-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 15/20] avformat/matroskaenc: Write level 1 elements in one go 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: S2BEBt5YwPvj Content-Length: 14861 Up until now, writing level 1 elements proceeded as follows: First, the element id was written to the ordinary output AVIOContext and a dynamic buffer was opened for the content of the level 1 element in start_ebml_master_crc32(). Then this buffer was actually used and after it was closed (in end_ebml_master_crc32()), the size field corresponding to the buffer's size was written, after which the actual data was written. This commit changes this: Nothing is written to the main AVIOContext any more in start_ebml_master_crc32(). end_ebml_master_crc32() now writes both the id, the length field as well as the data. This implies that one can start a level 1 element in memory without outputting anything. This is done to enable to test whether enough space has been reserved for the Cues (if space has been reserved for them) before writing them. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 60 +++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 6f0760fa69..f9509129c8 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -325,26 +325,26 @@ static void end_ebml_master(AVIOContext *pb, ebml_master master) avio_seek(pb, pos, SEEK_SET); } -static int start_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, - uint32_t elementid) +static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv) { int ret; if ((ret = avio_open_dyn_buf(dyn_cp)) < 0) return ret; - put_ebml_id(pb, elementid); if (mkv->write_crc) put_ebml_void(*dyn_cp, 6); /* Reserve space for CRC32 so position/size calculations using avio_tell() take it into account */ return 0; } -static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv) +static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, + MatroskaMuxContext *mkv, uint32_t id) { uint8_t *buf, crc[4]; int size, skip = 0; + put_ebml_id(pb, id); size = avio_close_dyn_buf(*dyn_cp, &buf); put_ebml_num(pb, size, 0); if (mkv->write_crc) { @@ -362,13 +362,14 @@ static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, Matrosk * Complete ebml master without destroying the buffer, allowing for later updates */ static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, - int64_t *pos) + uint32_t id, int64_t *pos) { uint8_t *buf; int size = avio_get_dyn_buf(*dyn_cp, &buf); *pos = avio_tell(pb); + put_ebml_id(pb, id); put_ebml_num(pb, size, 0); avio_write(pb, buf, size); } @@ -450,7 +451,7 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, goto seek; } - ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD); + ret = start_ebml_master_crc32(&dyn_cp, mkv); if (ret < 0) return ret; @@ -466,7 +467,7 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos); end_ebml_master(dyn_cp, seekentry); } - end_ebml_master_crc32(pb, &dyn_cp, mkv); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD); remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); put_ebml_void(pb, remaining); @@ -510,7 +511,7 @@ static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tra int ret; currentpos = avio_tell(pb); - ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CUES); + ret = start_ebml_master_crc32(&dyn_cp, mkv); if (ret < 0) return ret; @@ -553,7 +554,7 @@ static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tra ffio_reset_dyn_buf(cuepoint); } ffio_free_dyn_buf(&cuepoint); - end_ebml_master_crc32(pb, &dyn_cp, mkv); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CUES); return currentpos; } @@ -1373,7 +1374,7 @@ static int mkv_write_tracks(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_TRACKS, avio_tell(pb)); - ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS); + ret = start_ebml_master_crc32(&mkv->tracks_bc, mkv); if (ret < 0) return ret; @@ -1388,9 +1389,10 @@ static int mkv_write_tracks(AVFormatContext *s) } if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) - end_ebml_master_crc32_preliminary(pb, &mkv->tracks_bc, mkv, &mkv->tracks_pos); + end_ebml_master_crc32_preliminary(pb, &mkv->tracks_bc, mkv, + MATROSKA_ID_TRACKS, &mkv->tracks_pos); else - end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS); return 0; } @@ -1408,7 +1410,7 @@ static int mkv_write_chapters(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_CHAPTERS, avio_tell(pb)); - ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS); + ret = start_ebml_master_crc32(&dyn_cp, mkv); if (ret < 0) return ret; editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0); @@ -1446,7 +1448,7 @@ static int mkv_write_chapters(AVFormatContext *s) end_ebml_master(dyn_cp, chapteratom); } end_ebml_master(dyn_cp, editionentry); - end_ebml_master_crc32(pb, &dyn_cp, mkv); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS); mkv->wrote_chapters = 1; return 0; @@ -1497,7 +1499,7 @@ static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid, if (!mkv->tags_bc) { mkv_add_seekhead_entry(mkv, MATROSKA_ID_TAGS, avio_tell(s->pb)); - ret = start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); + ret = start_ebml_master_crc32(&mkv->tags_bc, mkv); if (ret < 0) return ret; } @@ -1642,9 +1644,10 @@ static int mkv_write_tags(AVFormatContext *s) if (mkv->tags_bc) { if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) - end_ebml_master_crc32_preliminary(s->pb, &mkv->tags_bc, mkv, &mkv->tags_pos); + end_ebml_master_crc32_preliminary(s->pb, &mkv->tags_bc, mkv, + MATROSKA_ID_TAGS, &mkv->tags_pos); else - end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv); + end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); } return 0; } @@ -1667,7 +1670,7 @@ static int mkv_write_attachments(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb)); - ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS); + ret = start_ebml_master_crc32(&dyn_cp, mkv); if (ret < 0) return ret; for (i = 0; i < s->nb_streams; i++) { @@ -1740,7 +1743,7 @@ static int mkv_write_attachments(AVFormatContext *s) 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); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS); return 0; } @@ -1819,7 +1822,7 @@ static int mkv_write_header(AVFormatContext *s) mkv_add_seekhead_entry(mkv, MATROSKA_ID_INFO, avio_tell(pb)); - ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO); + ret = start_ebml_master_crc32(&mkv->info_bc, mkv); if (ret < 0) return ret; pb = mkv->info_bc; @@ -1878,9 +1881,10 @@ static int mkv_write_header(AVFormatContext *s) } } if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) - end_ebml_master_crc32_preliminary(s->pb, &mkv->info_bc, mkv, &mkv->info_pos); + end_ebml_master_crc32_preliminary(s->pb, &mkv->info_bc, mkv, + MATROSKA_ID_INFO, &mkv->info_pos); else - end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv); + end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO); pb = s->pb; ret = mkv_write_tracks(s); @@ -2162,7 +2166,7 @@ static void mkv_end_cluster(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; - end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv); + end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER); mkv->cluster_pos = -1; avio_flush(s->pb); } @@ -2303,7 +2307,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ if (mkv->cluster_pos == -1) { mkv->cluster_pos = avio_tell(s->pb); - ret = start_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER); + ret = start_ebml_master_crc32(&mkv->cluster_bc, mkv); if (ret < 0) return ret; put_ebml_uint(mkv->cluster_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts)); @@ -2467,7 +2471,7 @@ static int mkv_write_trailer(AVFormatContext *s) } if (mkv->cluster_bc) { - end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv); + end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER); } ret = mkv_write_chapters(s); @@ -2515,11 +2519,11 @@ static int mkv_write_trailer(AVFormatContext *s) av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); avio_seek(mkv->info_bc, mkv->duration_offset, SEEK_SET); put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration); - end_ebml_master_crc32(pb, &mkv->info_bc, mkv); + end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO); // write tracks master avio_seek(pb, mkv->tracks_pos, SEEK_SET); - end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS); // update stream durations if (!mkv->is_live) { @@ -2549,7 +2553,7 @@ static int mkv_write_trailer(AVFormatContext *s) } if (mkv->tags_bc && !mkv->is_live) { avio_seek(pb, mkv->tags_pos, SEEK_SET); - end_ebml_master_crc32(pb, &mkv->tags_bc, mkv); + end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); } avio_seek(pb, currentpos, SEEK_SET); From patchwork Wed Jan 1 00:58:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17091 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp219621qvb; Tue, 31 Dec 2019 17:01:30 -0800 (PST) X-Google-Smtp-Source: APXvYqyBKSFA1kVKPjaqDJYMHMD/RmvUy/eqXcVEnYifZBcrBsY+FUKxOdsBlrU2tOn8A+P464XJ X-Received: by 2002:a17:906:4d43:: with SMTP id b3mr80900835ejv.109.1577840490557; Tue, 31 Dec 2019 17:01:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840490; cv=none; d=google.com; s=arc-20160816; b=Y2gDwNhTS8JGWcEqSaM4/4FLRBxXa6te2nL/GZFkwrSMb8Qyd16MnoUBjD5wNFUQ4N usHlU1IOs8ix8eOKQdXrPxw6U2KNif+9l4hRGAOhnuSJAJesGruSlCNwMEOL6yJo0USz 6tZOp+mSFaK0V8qo20jXPSLkylNWm3SY6aNDzON1pAscd7K+E7g3fcHQaCnEHgms0eGH LNmZ12Qmvy70cXyBnVJAz+iXQbi+dtDRETHYEb4JA9hgVC4/qxJ2lr/TDM8U+oHq0t8e yejc9+SbSnysWfbPHUwfxmZok9TqJv87X+59nMoG8BL9HNAWsdClLbWsfcp4yYi/ZFnW CezA== 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=aE9yhSbJu660g7/BrGGA0gQIphgOklddT1ce2GfaGHE=; b=KELy9Rh9moG83YvyzZvLj2JL13cvpMY7Mm4kCHxXKH9pScX8I1NyKbPjb+kcFXxbmm FQbsm/yW0Y2SU2fU68CZwEc9W9ypIXVajksMChh8b87j/YBMc3ysZ+dAfpwApcXKsYnL 2mr+iiIc7NOzHe6MyhAUWZmOtf1mkp1+WYvhfRe1KzU/7oxT6cDb3pA+UWRJB69Q7KyM /8O0E6axWjz85l+35NFjzs8TmHTB5lY7xzGjZ8HmUIm+izRxsgnp5nck4GQ2flI2Xs4E vi6L81hCITSpnkIaF6pjkkHx0tlR9F8Rb6fFnz71ISZ5C23azwB3OAEN2UE1LwN0dbwD hm5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Z5vXB6DL; 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 u2si32040215edy.95.2019.12.31.17.01.30; Tue, 31 Dec 2019 17:01:30 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Z5vXB6DL; 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 2801868AE48; Wed, 1 Jan 2020 02:59:25 +0200 (EET) 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 A471868ADB0 for ; Wed, 1 Jan 2020 02:59:14 +0200 (EET) Received: by mail-wr1-f65.google.com with SMTP id q10so36209829wrm.11 for ; Tue, 31 Dec 2019 16:59:14 -0800 (PST) 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=9PY8dbaD09Lv4B5/apSnbN+qpLesrLjy8w40ZkrsN1E=; b=Z5vXB6DLGQenbUFSlYZm+xQYoyI96rxqXZptDg4RWReXwiv4lmj078yTNnga7D0TR1 7hGPeZZGsM8WOWbxshnFZ/aJ8CIsw+cXfoUJO9Z8m5cNrjTujaKf5yKrHKOhhoNjQmZS rIUh81G3bNtjZlixgh5ukACzh1GF5Qdw2ijzO/cgwccCLsopIMP4Pz8N/BeXog8nS/g9 N1ytjQg+qGb4U4OglX5sWQmfeG0jE3of/i+iEqpYowSDTKUDkS8BgID86JpiG7hGP1px vd3udb9q7Z9C15yQBYz3q9JE7UNUD20XrqounC0ghA4YeBKTDWLu+5agQzVHMh34OC7b UsKA== 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=9PY8dbaD09Lv4B5/apSnbN+qpLesrLjy8w40ZkrsN1E=; b=KQQ+aFYezds5QL+VvjiiwV1k+pD2UlfEvpuaTrtlhkJsrjgnN47peGUQ02xuB8ygq2 ziOp4AXSqOpxPKY1snFIN7dwNU46ZbxreUw1GdyaAespodsRakxrPbx9oO5azJLP8Uon lsbLwRmw7c5aStuEEvq3djgdFSG6IagtvZy1wHRszF3OF7/OzHmjAYpe3X8mKKv6r/bI X6qxfLcipC7fQYAIKoyVg6UtIqeVT5Bl6zbheHblKfYbpJyibUJCzQAEcaS3YSLbtZOc tcMBzkx29qVD/s9be00GorU/ArnPo9XwvBSRPazm3SEoqdlq0us7AuwPqYONaA/PzxWF SKRg== X-Gm-Message-State: APjAAAW3jzfOAweWxLWF6yL7f9iWvz6KOaj3rputv6hvxaCI2spSN0vU l3ZMAZ68QJNrK76qrXGytPBrb7O/ X-Received: by 2002:a5d:528e:: with SMTP id c14mr77740200wrv.308.1577840354042; Tue, 31 Dec 2019 16:59:14 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:13 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:33 +0100 Message-Id: <20200101005837.11356-17-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 16/20] avformat/matroskaenc: Remove unused function parameter 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: w9LEAWVq81GZ Content-Length: 3879 end_ebml_master_crc32_preliminary() has a MatroskaMuxContext as parameter that isn't used at all. So remove it. Furthermore it doesn't close its dynamic buffer; it just uses the underlying buffer and therefore it only needs a pointer to the dynamic buffer, not a pointer to a pointer. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index f9509129c8..c0979feb88 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -361,11 +361,11 @@ static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, /** * Complete ebml master without destroying the buffer, allowing for later updates */ -static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, +static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext *dyn_cp, uint32_t id, int64_t *pos) { uint8_t *buf; - int size = avio_get_dyn_buf(*dyn_cp, &buf); + int size = avio_get_dyn_buf(dyn_cp, &buf); *pos = avio_tell(pb); @@ -1389,7 +1389,7 @@ static int mkv_write_tracks(AVFormatContext *s) } if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) - end_ebml_master_crc32_preliminary(pb, &mkv->tracks_bc, mkv, + end_ebml_master_crc32_preliminary(pb, mkv->tracks_bc, MATROSKA_ID_TRACKS, &mkv->tracks_pos); else end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS); @@ -1644,7 +1644,7 @@ static int mkv_write_tags(AVFormatContext *s) if (mkv->tags_bc) { if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) - end_ebml_master_crc32_preliminary(s->pb, &mkv->tags_bc, mkv, + end_ebml_master_crc32_preliminary(s->pb, mkv->tags_bc, MATROSKA_ID_TAGS, &mkv->tags_pos); else end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); @@ -1881,7 +1881,7 @@ static int mkv_write_header(AVFormatContext *s) } } if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) - end_ebml_master_crc32_preliminary(s->pb, &mkv->info_bc, mkv, + end_ebml_master_crc32_preliminary(s->pb, mkv->info_bc, MATROSKA_ID_INFO, &mkv->info_pos); else end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO); From patchwork Wed Jan 1 00:58:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17083 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp219864qvb; Tue, 31 Dec 2019 17:01:39 -0800 (PST) X-Google-Smtp-Source: APXvYqzv7hLEu0eW10PX83R69J35i0RAyROs3EQYqd43+XtiSXvOuRFeL0oqojfQiRp/3NuQPoZT X-Received: by 2002:aa7:c389:: with SMTP id k9mr79075101edq.63.1577840499190; Tue, 31 Dec 2019 17:01:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840499; cv=none; d=google.com; s=arc-20160816; b=lBizE3lWyJZWzvd3Mz2wAeLlM9uWtrcJ3WTPPkBwXxXbYEyE7+/x9jrlSnh2v3Hkan fW7ud6i3tJJsol1y0THF7FI4Z6G9YgGWo44BLotIy03CPtX4vvvTfbYvS7YaptECWRdU AnIQy2FQeuO1HG0SXqFO/X/VXDmhjr8Kdlsxi3JcuMf2F2pDcy7MXURpZw6tIm6RysbM sRKtTHXZd+jjVTwPfLXbah2slNHU6KPIAphcMn1V7Ech4gfRVSaLwvjdnuaWcBVouAEE G0o9UIv6BATyw78AxZ76l4/1bn3GWFOilVvBwwGWbafhZq6uCVj9jKvWDUZtRX8DCX4B 6ISg== 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=oiu9whldDfxyWlOFJPwKXs8jfGcaxlUbD6gIHIBXaIc=; b=sIJM/GV53whFBfNwRf41rCCYU1MxU7C+WMinPowCijQvmKdwRSNY9+3NEqbrzJ+IVQ JY8ypTaZvjsPXrsDuGFs7pr9sbrigWhY+nB/akIDsKExZdrovbPaYWQqTHpQ52VTxG/R CrxQuEEV/oQbFdqYpP13OXZeQh7wpy2YyaUBfusve6EnXqyNoWjhXAYEJhORhZG5o5YD VgvQggzIwpkJHKDh+VvFi3M+fY2o80KRY5mGu8wHgGYhFdYgqaREBbLrpmCx/Uunx/ku fcPuo1PL0m3dI8TsVcuCfB9USriqvZpfIcw00J7oCrb+Q7h/lkE5FrbFYtgKGIZDPRV6 MlWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=h375hcJZ; 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 i8si22352312edv.38.2019.12.31.17.01.38; Tue, 31 Dec 2019 17:01:39 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=h375hcJZ; 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 09CF468AE4E; Wed, 1 Jan 2020 02:59:26 +0200 (EET) 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 3086168AD2B for ; Wed, 1 Jan 2020 02:59:15 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id b6so36270354wrq.0 for ; Tue, 31 Dec 2019 16:59:15 -0800 (PST) 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=2Mhh32fFEsWZXpXNvlTJ8OIoSwn+hrvJLYK5c+ottEc=; b=h375hcJZ46jPqdKAR7cIPWZSdb5+SS3E9LHX+TTiKgwWwBKX4RVJajy2rZJMKaYKw+ DDuXZ1uYnUKOevfjlUTeC3J4jf7CW+GGuMixxtGQ3JqZbRggUqC7eqkVMuIVIy07RlgR SCxxbn1eyAodPrBwNtVKOcSyoSiNY1vne+JoRn5G3Nys0Yuws3Iqx1dUqKguCsFLPQ0h TFr13Urq9yDIGKzU9qDds5l1TwKkMu3EsW8VV5CJJEnQGUyGH+Bl4cNmEYXRwI1GqoF8 73MHwrEfd1DRgZx3/oM0NO4QWFBIaWk7Vd7Q2X4FebJK38Wam9qomw+2DJXlhOcokdE7 EGnQ== 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=2Mhh32fFEsWZXpXNvlTJ8OIoSwn+hrvJLYK5c+ottEc=; b=gZnW2fQc/6Fac5jDGMTdmBbiURT2rupf3m1/7MNuIIvZwMpfjZQwyRxKcoOvar8FRe cvkh/jQKrR+p/YdFv/NJlBoxp4kb/evVJ5tJxmcfRZ5UAptzOh0/+iFDuWmgKYhFQ6iI mBqQBvLJ68TM7zBXYl8n1CgtuHbxvVjpORDWCPTAwCkD2HOhejk2GFohIzwUjw7XTIc8 qqPh0+ujSF6Z1Da3wVA1dDiMIHZbsXqywauQ9mp6ehhABm/4CBVUU9QqdQal8OnVz/g9 j476AyyN4dBSbzb1iowrVQsoUAoo7o1R8HKMO2oU00NWYr/+i07vILaUH4+tWCGsihzE J1Ag== X-Gm-Message-State: APjAAAXAjl0LmEdYgUBN1kjJHqgzMO86njmyMaVmZCJR6McdDSbFFUoY qybIXmVxuvl8Uh0cySkNtu75cMjb X-Received: by 2002:a5d:6144:: with SMTP id y4mr75910633wrt.367.1577840354784; Tue, 31 Dec 2019 16:59:14 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:14 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:34 +0100 Message-Id: <20200101005837.11356-18-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 17/20] avformat/matroskaenc: Check that Cluster has been opened 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: p7X/amx0YlYe Content-Length: 1569 before setting the field indicating that a Cluster has been opened. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index c0979feb88..d7aa832eb3 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2306,10 +2306,10 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ } if (mkv->cluster_pos == -1) { - mkv->cluster_pos = avio_tell(s->pb); ret = start_ebml_master_crc32(&mkv->cluster_bc, mkv); if (ret < 0) return ret; + mkv->cluster_pos = avio_tell(s->pb); put_ebml_uint(mkv->cluster_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts)); mkv->cluster_pts = FFMAX(0, ts); av_log(s, AV_LOG_DEBUG, From patchwork Wed Jan 1 00:58:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17087 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp220055qvb; Tue, 31 Dec 2019 17:01:47 -0800 (PST) X-Google-Smtp-Source: APXvYqwL4TIaQTuOZ5tR9KB9YUBTsQ1IP0V01CeaBY87RKH5nibOlIA5EB+OfYFujRBb/lCEQNO1 X-Received: by 2002:a50:fb90:: with SMTP id e16mr80353873edq.64.1577840506916; Tue, 31 Dec 2019 17:01:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840506; cv=none; d=google.com; s=arc-20160816; b=oPXQTjJgKYICc4a9XBdCgyiq/94rh7+bhhYkgCiefE6uymQ8QpDLXzaCupkCaEwP2u BKgCTdsSR9tsBGrgBlGY2L1wNNN0lamCQLdZlYwZFhuNUFcZMX9UqjCX8akX3MA9BHS5 iJGuiV8gs3wpGhEkJQDfaGwMu+27NP/ubq3LlafpCHV98nHBwLTVsHpeb9rAST2F2OrS KvJAnhUCQumcsVujHMqEnIWCRkzUVHu312j/N4bhHVdv1qRkYVaAYWaG2R/ZdDiMN6oM ELFKyMjWjf9lknvs1SWNhw6ahoCbUsLNI3Mh5ALnrIELHJcHABFAdyfgiXWjq5wvmpQS 5Rfg== 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=KhOLrEJzYjNmwYxZiO0Z/xWd6eqEtK9xByZFLP8MGts=; b=1BmCvV3BCtYCkaR5p9PsrQflHViHvSrmCojvoGw1wEaOA6UY2bbRf2A5/GFyte13fI SjxfOGMtjnpO42QVuMe5lGP2kCzsC/2i0zujFcAUlMnra3yXWZSX9KqmlJ1d5d3GxKaC 8i1Pkw6JgFCyX08C0mFFRV71DoRscXw1Nu6K+fOzH+B2eu7dJ9JW+RXurhGZsTsNUJC2 oD2YD/uKhIPj5cHEf2DEt+LxuWFKnrKQRkltLmNyD/9gwZhTgyDH3VNmE2soWtU4K771 4bEQ9En4EKcb7nwKSQ8vwlN1uvyZ5R5TpV4TSSrOvO/40AABs+BnV0+YGRTd+2KLYA3Y EZwg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=k6ICt8SW; 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 t17si34728554edt.379.2019.12.31.17.01.46; Tue, 31 Dec 2019 17:01:46 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=k6ICt8SW; 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 B188E68AD57; Wed, 1 Jan 2020 02:59:26 +0200 (EET) 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 5373068AC3F for ; Wed, 1 Jan 2020 02:59:16 +0200 (EET) Received: by mail-wm1-f68.google.com with SMTP id m24so2819557wmc.3 for ; Tue, 31 Dec 2019 16:59:16 -0800 (PST) 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=/SM5FzkVQCqHr4FIchXv3lzquYIGkfkjO9l05skGgbw=; b=k6ICt8SW8SfWLHDk/A5TGUR+yj0RzcfGdeXzXpypUwbDJrNaIY31s0tyVZS6NAiTF2 5eNwZLo5MTmTHdiKWS1T9DCmFe85BSeeIkI/4hfDoXphhA2bRLdes6TlUGWUG8F2BzKz C90FLx1Zg6LLCM+h5/rRbhYSo6oFUJ7MfTW7WTE2i58zD1BSyfiSd11EbJV/A7UtF9DP Wy6rI9bueGItoFXoVDxux7Yc1OlDENAoWvzGMtT3R4JjTrXxD7A2te5FlUS95IxQP16Y FFBuKnLBXuf8/z8tJ2T4g085vizTXVppfAgDyfpykWQunABHcJ12617SoyrAhUuMqtTI Bdjg== 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=/SM5FzkVQCqHr4FIchXv3lzquYIGkfkjO9l05skGgbw=; b=uiegCNa2a5g0bLqdzWOhn2fFY30SUPhQJpxwnc2/CfyI0v55ZBKos+skUKaqAQ+0Y8 BXK8lO2f/3M8F9KU4siGQcS7SBOsAzLb/epqozL0rFFbkCHkInVA/LaB3fwqUgrM2KZp jGADfrr4lWtp1mPnouxMCzq2dzOmY5vFY/q2ZVuiIjnzUGsbNPK9gyaTSsEklSL1ITCt Y9u1CK9N68XoCPApYituUFFOGX/Nxu4xkVVS97paSHlHl/GLXqyBggZ3s2PQNApy/WqC Kh/LHPXWU6wWU6p2/52v9T2uH2zB0zsWZnkYxE1cKlCo8MwbyPuqlRUORXmN8xF5yHac V4Iw== X-Gm-Message-State: APjAAAXFoENMSn28zVlFiOhNZ0GB4/3+vJCLdvkFOvacSvxP/6l/x1Bm 72gm1RYn1MK3a9DpFF1zzZoOpzW2 X-Received: by 2002:a1c:a404:: with SMTP id n4mr6026925wme.109.1577840355547; Tue, 31 Dec 2019 16:59:15 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:15 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:35 +0100 Message-Id: <20200101005837.11356-19-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 18/20] avformat/matroskaenc: Don't fail if reserved Cues space doesn't suffice 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: HtFdiWP8mzTS Content-Length: 9350 When the user opted to write the Cues at the beginning, the Cues were simply written without checking in advance whether enough space has been reserved for them. If it wasn't enough, the data following the space reserved for the Cues was simply overwritten, corrupting the file. This commit changes this by checking whether enough space has been reserved for the Cues before outputting anything. If it isn't enough, the Cues will be output at the end as usual. Signed-off-by: Andreas Rheinhardt --- doc/muxers.texi | 4 +- libavformat/matroskaenc.c | 79 ++++++++++++++++++++------------------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index 5d7ff1ab3b..9eca32c1ca 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -1314,8 +1314,8 @@ index at the beginning of the file. If this option is set to a non-zero value, the muxer will reserve a given amount of space in the file header and then try to write the cues there when the muxing -finishes. If the available space does not suffice, muxing will fail. A safe size -for most use cases should be about 50kB per hour of video. +finishes. If the reserved space does not suffice, the Cues will be written at +the end. 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. diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index d7aa832eb3..4e739d245b 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -503,23 +503,15 @@ static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int tracknum, i return 0; } -static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tracks, int num_tracks) +static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp, + mkv_cues *cues, mkv_track *tracks, int num_tracks) { - MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *dyn_cp, *pb = s->pb, *cuepoint; - int64_t currentpos; + AVIOContext *cuepoint; int ret; - currentpos = avio_tell(pb); - ret = start_ebml_master_crc32(&dyn_cp, mkv); - if (ret < 0) - return ret; - ret = avio_open_dyn_buf(&cuepoint); - if (ret < 0) { - ffio_free_dyn_buf(&dyn_cp); + if (ret < 0) return ret; - } for (mkv_cuepoint *entry = cues->entries, *end = entry + cues->num_entries; entry < end;) { @@ -538,7 +530,7 @@ static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tra int idx = entry->stream_idx; av_assert0(idx >= 0 && idx < num_tracks); - if (tracks[idx].has_cue && s->streams[idx]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) + if (tracks[idx].has_cue && streams[idx]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) continue; tracks[idx].has_cue = 1; track_positions = start_ebml_master(cuepoint, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE); @@ -554,9 +546,8 @@ static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tra ffio_reset_dyn_buf(cuepoint); } ffio_free_dyn_buf(&cuepoint); - end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CUES); - return currentpos; + return 0; } static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par) @@ -2457,7 +2448,7 @@ static int mkv_write_trailer(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb = s->pb; - int64_t currentpos, cuespos; + int64_t currentpos; int ret; // check if we have an audio packet cached @@ -2480,33 +2471,45 @@ static int mkv_write_trailer(AVFormatContext *s) if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { + int64_t ret64; + if (mkv->cues.num_entries) { - if (mkv->reserve_cues_space) { - int64_t cues_end; - - currentpos = avio_tell(pb); - avio_seek(pb, mkv->cues_pos, SEEK_SET); - - cuespos = mkv_write_cues(s, &mkv->cues, mkv->tracks, s->nb_streams); - cues_end = avio_tell(pb); - if (cues_end > cuespos + mkv->reserve_cues_space) { - av_log(s, AV_LOG_ERROR, - "Insufficient space reserved for cues: %d " - "(needed: %" PRId64 ").\n", - mkv->reserve_cues_space, cues_end - cuespos); - return AVERROR(EINVAL); - } + AVIOContext *cues; + uint64_t size; - if (cues_end < cuespos + mkv->reserve_cues_space) - put_ebml_void(pb, mkv->reserve_cues_space - - (cues_end - cuespos)); + ret = start_ebml_master_crc32(&cues, mkv); + if (ret < 0) + return ret; + ret = mkv_assemble_cues(s->streams, cues, &mkv->cues, + mkv->tracks, s->nb_streams); + if (ret < 0) + return ret; + + if (mkv->reserve_cues_space) { + size = avio_tell(cues); + size += 4 + ebml_num_size(size); + if (mkv->reserve_cues_space < size) { + av_log(s, AV_LOG_WARNING, + "Insufficient space reserved for Cues: %d < " + "%"PRIu64". Writing Cues at the end of the file.\n", + mkv->reserve_cues_space, size); + mkv->reserve_cues_space = 0; + } else { + currentpos = avio_tell(pb); + if ((ret64 = avio_seek(pb, mkv->cues_pos, SEEK_SET)) < 0) { + ffio_free_dyn_buf(&cues); + return ret64; + } + } + } + mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, avio_tell(pb)); + end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES); + if (mkv->reserve_cues_space) { + if (size < mkv->reserve_cues_space) + put_ebml_void(pb, mkv->reserve_cues_space - size); avio_seek(pb, currentpos, SEEK_SET); - } else { - cuespos = mkv_write_cues(s, &mkv->cues, mkv->tracks, s->nb_streams); } - - mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos); } currentpos = avio_tell(pb); From patchwork Wed Jan 1 00:58:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17095 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp220312qvb; Tue, 31 Dec 2019 17:01:57 -0800 (PST) X-Google-Smtp-Source: APXvYqzPu2LYtrvHhRWmIklCik3wHOoAhLHQpbkspy3DTUWQxkrjTU4z/Cg9au6bwC6NeTNrn75J X-Received: by 2002:a17:906:bd2:: with SMTP id y18mr62204722ejg.161.1577840517236; Tue, 31 Dec 2019 17:01:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840517; cv=none; d=google.com; s=arc-20160816; b=FpoTlPDhQQEnoPj0LaBIlcTfp3mnSyaO11LRhfi3X1D1AW33y/7gNNYKZCZ+QzE68p rAp71WTCcqYF3Jymdzt/UNfTuSz29LFYbUaNbtvCdt15s6TOa0fIageWq4NwU4CjhEVQ WbyNFknAMPqsRf5vyNemZk0wVeJ2m7UcWfU2YMHEC4Z+I6dMQbblZFn+DR1JlBa4GRJY VAsX65VdmsWM4KTWkxVCL4hs4kHU6Gs66rZktmyrX/XSI+EwnN1zxURz+r3ZcKZfMJuH jVxpF9KJlNL5zZ5/1OAbDDSSYsUKsj9DK56sbeC2hFUIeLpfG28bMnp5B7/GY9vdO1F2 3bLA== 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=s2ZYXyvOv/39Bm/HzfSHQ6s95Ox1kFvoXjVcid19YoU=; b=WW7tdqb0xihfKhZoORrL/HbNjsaJgJ+hYYNteN6Rgrv3MxU/okYQdFyGnC2qmmIkoa FfKPiyEINWe+FdKe9x8vtlPKOO8Z0y+WjPxlngSQymJjoBwA1u2MhSQygOtqXXSyCcUu DSmFF9WnTlZTGrRrNSRTRfNIiXSFN1MJ9+SC38MDJX8vMjGHKmRpJ0cfzIdVHVKOH0jG jmpeE9UsPxMTHSSg9vD9h4T7GfZKrMnQkLXstHOywqJk62/XUBpO9PbIlgXPBR8aEa5Z j3zQNk8e2FihGwtDQfMoNKCFvGhiZArpM35YsfHFhK5V92e/H5WI0c75u1LtxBOShcnR cDOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=qlxtYbzs; 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 bc28si9281366edb.68.2019.12.31.17.01.56; Tue, 31 Dec 2019 17:01:57 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=qlxtYbzs; 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 E742D68AE5E; Wed, 1 Jan 2020 02:59:27 +0200 (EET) 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 2CAAF68ADBD for ; Wed, 1 Jan 2020 02:59:17 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id z3so36239292wru.3 for ; Tue, 31 Dec 2019 16:59:17 -0800 (PST) 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=HTTPAU2u9fG7sTtn4uh5ppdp7o8pvQg3oy4F19Ne7yU=; b=qlxtYbzsjus1OOVj+svL3BCH6oSdTcicecpjNkOtvJk9SK6qHig9vuU+so1AxbM7Ua KswFf/oV0jE5iSKOjPCqDjPteq22r9wdKsqvqb14ieFEfd/aQOdsa/lvSzVHnKQXhAZO 3tf8x6Ihh2Vl9xKx5mSH7ijhG+7751jiAtKjpRFukQzMriai31d3Qx+L12QkKsFr2zh9 5bg51iufhdubX45iMh0IVMfk1K3HEqhqetsyNcVM4iTXzwNQicVov5L84jOIE4RtKYvO qkMIBKhV0k4ZHmS9EPzzb0XOt6v9JFQGbJmIiw+iC4Lhrv88fXRdYa9dCuv7c+8k72Z+ tFmA== 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=HTTPAU2u9fG7sTtn4uh5ppdp7o8pvQg3oy4F19Ne7yU=; b=HYXwB9Nl8Vr91WfmDStlR9rxiwGkEkstLIY2UwA55iCVqJCvrHrVbcYEjtskQbe3lf fCF/Y/NEEfKAAOc7kRR8jffqbRdqCyoRWgNpaiEMhSLA561G5+4kJ4gGBnvT4soX75aY 1w1KmPmlDpeK/c/lyYMsmT5vOkE6bF8s/Xt5BwMyOa0G3MhlVBC5L53zv2EtTwBaOALm hT5BBAA2bhzcW+T0ug3IFZ72DrBJIe7InvSL42idcFe7HJ4/C1aEWKv38W0YrADvCW4n zj8dJXwlRARRjIj3ArP8nfLMtB4NkOSWbkUtuCsQjxTW6GPXbD/wbzjSnuURRkstcnoS lk8Q== X-Gm-Message-State: APjAAAVTNjCOOYjtxyWwwfO8+jcYpDFh+vgGPM5RiOEMaFfAWg8K2dPs 7bKoEx3ni7uvLANLJPl8yUJjsClt X-Received: by 2002:adf:a109:: with SMTP id o9mr79620373wro.189.1577840356302; Tue, 31 Dec 2019 16:59:16 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:15 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:36 +0100 Message-Id: <20200101005837.11356-20-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 19/20] avformat/matroskaenc: Fix edge case of writing Cues at the beginning 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: y2NfNb8BtbeK Content-Length: 11696 The Matroska muxer has the ability to write the Cues (the index) at the beginning of the file (in front of the Cluster): The user inputs the amount of space that should be reserved at the beginning of the file and if this is sufficient, the Cues will be written there and the part of the reserved space not used up by the Cues will be filled with a "Void" element. There is just one problem with this: One can not fill a single byte this way, because said Void element is minimally two bytes long (one byte ID, one byte length field). Up until now, if one reserved one byte more than needed, one would run into an assert when writing the Void element. There are two solutions for this: Error out if it happens. Or adjust the length field of the Cues in order to ensure that the above situation can't happen (i.e. write the length on one byte more than necessary). The first solution is very unsatisfactory, as enough space has been reserved. Therefore this commit implements the second solution. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 42 +++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 4e739d245b..24317d3819 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -339,14 +339,15 @@ static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv } static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, - MatroskaMuxContext *mkv, uint32_t id) + MatroskaMuxContext *mkv, uint32_t id, + int length_size) { uint8_t *buf, crc[4]; int size, skip = 0; put_ebml_id(pb, id); size = avio_close_dyn_buf(*dyn_cp, &buf); - put_ebml_num(pb, size, 0); + put_ebml_num(pb, size, length_size); if (mkv->write_crc) { skip = 6; /* Skip reserved 6-byte long void element from the dynamic buffer. */ AV_WL32(crc, av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), UINT32_MAX, buf + skip, size - skip) ^ UINT32_MAX); @@ -467,7 +468,7 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos); end_ebml_master(dyn_cp, seekentry); } - end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD, 0); remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); put_ebml_void(pb, remaining); @@ -1383,7 +1384,7 @@ static int mkv_write_tracks(AVFormatContext *s) end_ebml_master_crc32_preliminary(pb, mkv->tracks_bc, MATROSKA_ID_TRACKS, &mkv->tracks_pos); else - end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0); return 0; } @@ -1439,7 +1440,7 @@ static int mkv_write_chapters(AVFormatContext *s) end_ebml_master(dyn_cp, chapteratom); } end_ebml_master(dyn_cp, editionentry); - end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0); mkv->wrote_chapters = 1; return 0; @@ -1638,7 +1639,7 @@ static int mkv_write_tags(AVFormatContext *s) end_ebml_master_crc32_preliminary(s->pb, mkv->tags_bc, MATROSKA_ID_TAGS, &mkv->tags_pos); else - end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); + end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0); } return 0; } @@ -1734,7 +1735,7 @@ static int mkv_write_attachments(AVFormatContext *s) 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); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0); return 0; } @@ -1875,7 +1876,7 @@ static int mkv_write_header(AVFormatContext *s) end_ebml_master_crc32_preliminary(s->pb, mkv->info_bc, MATROSKA_ID_INFO, &mkv->info_pos); else - end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO); + end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0); pb = s->pb; ret = mkv_write_tracks(s); @@ -2157,7 +2158,7 @@ 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); + end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 0); mkv->cluster_pos = -1; avio_flush(s->pb); } @@ -2462,7 +2463,7 @@ static int mkv_write_trailer(AVFormatContext *s) } if (mkv->cluster_bc) { - end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER); + end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 0); } ret = mkv_write_chapters(s); @@ -2476,6 +2477,7 @@ static int mkv_write_trailer(AVFormatContext *s) if (mkv->cues.num_entries) { AVIOContext *cues; uint64_t size; + int length_size = 0; ret = start_ebml_master_crc32(&cues, mkv); if (ret < 0) @@ -2488,7 +2490,8 @@ static int mkv_write_trailer(AVFormatContext *s) if (mkv->reserve_cues_space) { size = avio_tell(cues); - size += 4 + ebml_num_size(size); + length_size = ebml_num_size(size); + size += 4 + length_size; if (mkv->reserve_cues_space < size) { av_log(s, AV_LOG_WARNING, "Insufficient space reserved for Cues: %d < " @@ -2501,10 +2504,19 @@ static int mkv_write_trailer(AVFormatContext *s) ffio_free_dyn_buf(&cues); return ret64; } + if (mkv->reserve_cues_space == size + 1) { + /* There is no way to reserve a single byte because + * the minimal size of an EBML Void element is 2 + * (1 byte ID, 1 byte length field). This problem + * is solved by writing the Cues' length field on + * one byte more than necessary. */ + length_size++; + size++; + } } } mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, avio_tell(pb)); - end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES); + end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES, length_size); if (mkv->reserve_cues_space) { if (size < mkv->reserve_cues_space) put_ebml_void(pb, mkv->reserve_cues_space - size); @@ -2522,11 +2534,11 @@ static int mkv_write_trailer(AVFormatContext *s) av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); avio_seek(mkv->info_bc, mkv->duration_offset, SEEK_SET); put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration); - end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO); + end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0); // write tracks master avio_seek(pb, mkv->tracks_pos, SEEK_SET); - end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0); // update stream durations if (!mkv->is_live) { @@ -2556,7 +2568,7 @@ static int mkv_write_trailer(AVFormatContext *s) } if (mkv->tags_bc && !mkv->is_live) { avio_seek(pb, mkv->tags_pos, SEEK_SET); - end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS); + end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0); } avio_seek(pb, currentpos, SEEK_SET); From patchwork Wed Jan 1 00:58:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17097 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp220482qvb; Tue, 31 Dec 2019 17:02:04 -0800 (PST) X-Google-Smtp-Source: APXvYqzjZc9/u59cMJ3e/eqQrh//P+4FOkhFCP152UOEj0/pjunlQ4i6l0MWUD9fPEy5ydZ5VXZV X-Received: by 2002:aa7:da42:: with SMTP id w2mr79229310eds.3.1577840524450; Tue, 31 Dec 2019 17:02:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577840524; cv=none; d=google.com; s=arc-20160816; b=xCzNBNvQjigDFXUA/u959J2HgTXI80nsVtgJM+r/P4WVVr81FuAVT5qCwrD0u+V4Ny BVgZnyBXz8OlrIJUq+PGYiUOI0xM6b+bBDWOTvLOisBowmvQRsC7/LbTXkLE5Teaxqb0 1C+38dnkfN2vinztJu6IGql9yk7c3VdxdN2GHrOmIfadoOJSY/j8XOMDJsQRbi/LUE6x baN5tNpfN0/tjxF53uo522yogFmTQv5qXVgcY0iR34fAESZv08LJOJM6WsWquNMwUbSw 8ibokrfO/uw7d9mif/xxWPouogbn3fu5/9gQolpZs1/iReBzzB6lix8BSY8jq0XzhVby p3uA== 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=0w4p1KfyfaNyFSMrzAT6LCdISnrG76wSuC337FeACVE=; b=y8YfYF3BAvUYbH7aG/x9cnW/ttJwuMTP4Jco0la/mDSLZznS0TOaaclEkyyBtjCWBM o4Li0X2oLcD2DX0MsBuJYPfdyOCYsAL+mjdQDwM1miTGIEY6ex00b/Af6y8jM7+/BEjc 1xS6tnhHrklEVYiYCs2Ri16sNuUZK8qiVJOW8hQumWKKKyfMrDbUNJXToo1Kh/SmMDxn A0e3JacIC5fbW0QZtTRcYnRH/Tz/fEzkLjApJSVzuQkaxtC/h02PfkvNKan0zINOBKfM 9WEsYy87VmbPEZBB8gRAfr5YjYQZNoL5bZrnXVkbOsbe8LMF97GfqWiLbVRV0xM/QImf ZtEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=kZ3ndYnD; 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 k5si31539631edx.80.2019.12.31.17.02.04; Tue, 31 Dec 2019 17:02:04 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=kZ3ndYnD; 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 821F768AE68; Wed, 1 Jan 2020 02:59:28 +0200 (EET) 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 F17D568ADE4 for ; Wed, 1 Jan 2020 02:59:17 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id z7so36141936wrl.13 for ; Tue, 31 Dec 2019 16:59:17 -0800 (PST) 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=31O6WEM3hG8R0JBd1jMwCA258ObawktcOWWYeH5F6bo=; b=kZ3ndYnD7aznPr/mQn68S0z104MLdxzY9x6rPLBfUXJKqkqYCSBpf4iboxZjxnMJku tI5oHl0+UwBV7wfChLqEUBidwzQqs36waK5I9SqwRfwV4T7FRvOZRxNNUIfx8dgK1mb1 +lfAbuDg8z+hDFO7iM1VAuDTIsMJQiZyeLq3iooXFgBRAocTnR21BF72UxYoMQuttmA6 3JWGPtiPjBt5ELQGVLBrXystKFtng1cow1YEBnSG7b395Y8SH28g0oQBJfABdM6tv5t/ 7MGw1U+K+rcQqNJYNGgsoIXkwMcYFGF1ov4BjTdaOgXotmP8ZF1y7JI2UGpdrLwYGxlj oq5A== 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=31O6WEM3hG8R0JBd1jMwCA258ObawktcOWWYeH5F6bo=; b=J1/U6dC1EFNJxdvtKRdUhOe+X3ulGcliar/WfOxmkGRPxCMucUEG3tNNVNHtk4bEOL 19vwnoJzLqJR6ii+npPni/ojI3S1A+Prw1ffW9PtGVCtKBz/rGgA1S0UiirySTPvpCEx 64EggTUGvVpiz1Lb440Q8UVAvk0lojkJ5wT1oFVWkprZC1/Aff4TtjX2XHVCyLwGvmV2 Mjs4YBg0W+D0EFal+C0j7UWTidgNWVZ8ue3jpWXelpmTZXwX3D8AIRGuKas8yCa6WAsH BzhAK+6ZTFYJQ745jcam4Y+Aprl+45Rwsd/hNJ9pueXYWuo1F3hUE/OR2fS4ekhyXZcQ RBsA== X-Gm-Message-State: APjAAAU3y40T5ntTM+Mivm7N/7d42LwdCssl4annI77gyMOb2vMTc1KE NYZ1htxeGlj7Os6sRNIFrNys1rny X-Received: by 2002:adf:b591:: with SMTP id c17mr72342240wre.108.1577840357329; Tue, 31 Dec 2019 16:59:17 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id w17sm52431655wrt.89.2019.12.31.16.59.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Dec 2019 16:59:16 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Jan 2020 01:58:37 +0100 Message-Id: <20200101005837.11356-21-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 20/20] avformat/matroskaenc: Avoid seek when writing Cues at the front 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: eGDNqBWVWm41 Content-Length: 4325 When the Cues are written in front of the Cluster, the muxer would seek to the beginning (to where the Cues ought to be written) and write the Cues; afterwards it would seek back to the end of the file only to seek to the beginning once again to update several elements there. This commit removes the seek to the end. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 24317d3819..95d97a10c5 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2449,7 +2449,6 @@ static int mkv_write_trailer(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb = s->pb; - int64_t currentpos; int ret; // check if we have an audio packet cached @@ -2472,11 +2471,14 @@ static int mkv_write_trailer(AVFormatContext *s) if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { - int64_t ret64; + int64_t endpos, ret64; + + endpos = avio_tell(pb); if (mkv->cues.num_entries) { AVIOContext *cues; uint64_t size; + int64_t cuespos = endpos; int length_size = 0; ret = start_ebml_master_crc32(&cues, mkv); @@ -2499,7 +2501,7 @@ static int mkv_write_trailer(AVFormatContext *s) mkv->reserve_cues_space, size); mkv->reserve_cues_space = 0; } else { - currentpos = avio_tell(pb); + cuespos = mkv->cues_pos; if ((ret64 = avio_seek(pb, mkv->cues_pos, SEEK_SET)) < 0) { ffio_free_dyn_buf(&cues); return ret64; @@ -2515,17 +2517,15 @@ static int mkv_write_trailer(AVFormatContext *s) } } } - mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, avio_tell(pb)); + mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos); end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES, length_size); if (mkv->reserve_cues_space) { if (size < mkv->reserve_cues_space) put_ebml_void(pb, mkv->reserve_cues_space - size); - avio_seek(pb, currentpos, SEEK_SET); - } + } else + endpos = avio_tell(pb); } - currentpos = avio_tell(pb); - ret = mkv_write_seekhead(pb, mkv, 1, mkv->info_pos); if (ret < 0) return ret; @@ -2571,7 +2571,7 @@ static int mkv_write_trailer(AVFormatContext *s) end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0); } - avio_seek(pb, currentpos, SEEK_SET); + avio_seek(pb, endpos, SEEK_SET); } if (!mkv->is_live) { From patchwork Mon Jan 13 14:51:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17324 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 7FD534491EF for ; Mon, 13 Jan 2020 17:16:33 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 66A3E68AF75; Mon, 13 Jan 2020 17:16:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f193.google.com (mail-lj1-f193.google.com [209.85.208.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6640668AF4B for ; Mon, 13 Jan 2020 17:16:27 +0200 (EET) Received: by mail-lj1-f193.google.com with SMTP id a13so10476803ljm.10 for ; Mon, 13 Jan 2020 07:16:27 -0800 (PST) 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=oj/Sj67nBSp4ftBpiCzS61w2o47VL+WUcSnzEZcJffY=; b=IXRNCyhidSyPFa+D9LY2cXMTHb/qi8Dlodc4l037iK0k/m4KZ6PwFiDgps7qtSsve6 HRDAJ9/aM6G5KJg0jKMtb6Asnb8rEKb8xdIErPAqvxD1pd9aciSecobooRi67Sx7Su1d spd4y7Qi7RnuyL47x20f+XuyTLxlv3VEh8/6S0/ivj2nw6yXCCt97glxXtGBjQtpLvyh qK8cMLpwHIs3FyVODYSgXBGHM8YKO5IMz540bthuNL+7gmunBKTykMX8UUgFIuI5RsFK T/pUJrts2OMtaZlLDkk+N9JCDAXIFqqeLva3BrS6HKRXGOWTxCgmc1KljRWe2FqXN+hO fNMg== 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=oj/Sj67nBSp4ftBpiCzS61w2o47VL+WUcSnzEZcJffY=; b=I1P2gXhqht8rMddCx8M/8r8fIVwryd4SHu2sEneCE6vdUDO3knzu30RMSxm7tBAkT1 JG3wWGGr2CO9kQg3voo6KcfkgWM18Ij9mhUUi1GJE2/HwkBrLAuKfpESS+A4UdFezqNu dUcbR89MgXdhdYneDqIwUc5Nji0zjYXk+jZU/OHW9Lc9aofGc3Sw7ETlB7Tb9Y8rP85/ ZeeXOH0uQNrM7uuzJXZftUWxt0xUA70nZdkwgNCgRxZdzsKtmp/0RW6Uu4v2+WEJhUSB eyU28hCKAOf4mgfgew5UZs6V+9bF5mAhRBlm+ST+7JrG5HaOmle/Bg+Qak6+VI+8AE5A mJrA== X-Gm-Message-State: APjAAAXeW1d5TUEU9MuHquIKHY9KTlOXz0dUhaOMJnn6EEI+DRVNZqA/ PQk+QiHAg6SJ0dXaRkTDxOZpEn23 X-Google-Smtp-Source: APXvYqy4lmwHBWbojv/gRcWr94tdc98sd4aGjeE+09vkpUr9Yr6ZDhKG3CdbT5yxVFOr96io/xm0yg== X-Received: by 2002:a5d:4d8d:: with SMTP id b13mr19967615wru.6.1578927101166; Mon, 13 Jan 2020 06:51:41 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id u14sm14955198wrm.51.2020.01.13.06.51.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jan 2020 06:51:40 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Jan 2020 15:51:34 +0100 Message-Id: <20200113145134.24086-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 21/21] avformat/matroskaenc: Simplify writing Void elements 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" Reserving space in Matroska works by writing a Void element. And until now this worked as follows: The current position was recorded and the EBML ID as well as the length field written; then the new position was recorded to know how much more to write. Afterwards the actual writing has been performed via ffio_fill(). But it is unnecessary to explicitly use the positions (obtained via avio_tell()) to find out how much still needs to be written, because the length of the ID and the length field are known. So rewrite the function to no longer use them. Also, given that ffio_fill() uses an int parameter and given that no current caller (and no sane future caller) will want to reserve several GB of space, make the size parameter of put_ebml_void() itself an int. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 258638e459..e74d59d271 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -288,21 +288,22 @@ static void put_ebml_string(AVIOContext *pb, uint32_t elementid, * * @param size The number of bytes to reserve, which must be at least 2. */ -static void put_ebml_void(AVIOContext *pb, uint64_t size) +static void put_ebml_void(AVIOContext *pb, int size) { - int64_t currentpos = avio_tell(pb); - av_assert0(size >= 2); put_ebml_id(pb, EBML_ID_VOID); // we need to subtract the length needed to store the size from the // size we need to reserve so 2 cases, we use 8 bytes to store the // size if possible, 1 byte otherwise - if (size < 10) - put_ebml_num(pb, size - 2, 0); - else - put_ebml_num(pb, size - 9, 8); - ffio_fill(pb, 0, currentpos + size - avio_tell(pb)); + if (size < 10) { + size -= 2; + put_ebml_num(pb, size, 0); + } else { + size -= 9; + put_ebml_num(pb, size, 8); + } + ffio_fill(pb, 0, size); } static ebml_master start_ebml_master(AVIOContext *pb, uint32_t elementid, From patchwork Fri Jan 17 19:59:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17397 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 A9F3D44A829 for ; Fri, 17 Jan 2020 22:00:16 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 722A0680505; Fri, 17 Jan 2020 22:00:16 +0200 (EET) 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 7D13568A862 for ; Fri, 17 Jan 2020 22:00:09 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id c9so23880186wrw.8 for ; Fri, 17 Jan 2020 12:00:09 -0800 (PST) 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=vl+tW5CqiwTJWCVDqIxBjJ/ctMpwyjx0tjiJdotdRQc=; b=qCrlESvfeRHOqlqQtadi/W5aeRs5PunwHSUlDbW0H2ac4naC2rSR/vcgR+81sMoQ30 b4JXwdSTc3oSKBlBqijReeq8IRzAqt5WfFRFgRA3W18dqSSq7CzCCHNWD6qU0xXhBbHH Abth8T0Zg4Xt7BDcilP7bUzgzoPJHhwLfFQSkKv8ZKer9Dah2pkQ54y43T0aLPHVg7Ea +DAyAZHNbSyML4DvG6hr+0d7o6MuLuZsTM+cGc61J4DVEb1WnVNe3r0ZzIBcPyDXEDKs r9P7K8btMi8/gKRy1V78ZEziQ8d74NAqwyQhuAcDSKTmZj395jRc9yq63WfVkqfo936V ZaDA== 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=vl+tW5CqiwTJWCVDqIxBjJ/ctMpwyjx0tjiJdotdRQc=; b=oYAhkeIGTd+qrShAHh1aakb/I9wbDJemBzKGRjErixGCK65nNsFaJVx5+jmS3uO0cw TjvZfqYb1/0Pl3Eo9kztV3zLhu+gLbkF3JUgKrGh5MFakUtN9C4WIhUQBEsd8NhgqPDT fikZC2Kup4xa0HRr4eaa52HULr54njcU3oKRmBvV2aDdCUCr/aFO0m3xXndC3Q4iF3Sz Pn/kQksnj+uPAonSouHeaBlin8QQWGdpF/6kmbZTfjLe7z2RZ5kta9/d9gjz4baK2nEy AN0iVQ2ZqKSb1ATHDhfhPjsmElPhxk2yge+qg9SCD2KwBco8ZdZKAEQHAkYJSnJ/ZJyl NMvQ== X-Gm-Message-State: APjAAAUl8d/h1iTwbzJdqvGuq/fFKmHSJn55WAUv8q2ZssjQWVNcyGCX H3qCJ8yDJMkn7L1jeZjUN+aZVKRK X-Google-Smtp-Source: APXvYqyhhbfV60x87d4ZHCjMDV8Wn8dzxgrEB5KhRmJ30OeZbZC2ibZnyCgaVp+fWI4c0xg9pYuo/g== X-Received: by 2002:a5d:5347:: with SMTP id t7mr4804933wrv.401.1579291208614; Fri, 17 Jan 2020 12:00:08 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id b16sm37086908wrj.23.2020.01.17.12.00.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2020 12:00:08 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 17 Jan 2020 20:59:57 +0100 Message-Id: <20200117195958.27367-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 22/23] avformat/matroskaenc: Combine checks for audio 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_write_track() currently has three places where it checks for whether the current codec type is audio: One in a switch and two outside of it. These checks can be combined by moving the code after the other two checks inside the audio-related part of the switch. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 59 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index e74d59d271..93f01da930 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1092,7 +1092,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, ebml_master subinfo, track; int native_id = 0; int qt_id = 0; - int bit_depth = av_get_bits_per_sample(par->codec_id); + int bit_depth; int sample_rate = par->sample_rate; int output_sample_rate = 0; int display_width_div = 1; @@ -1105,17 +1105,6 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, return 0; } - if (par->codec_type == AVMEDIA_TYPE_AUDIO) { - if (!bit_depth && par->codec_id != AV_CODEC_ID_ADPCM_G726) { - if (par->bits_per_raw_sample) - bit_depth = par->bits_per_raw_sample; - else - bit_depth = av_get_bytes_per_sample(par->format) << 3; - } - if (!bit_depth) - bit_depth = par->bits_per_coded_sample; - } - if (par->codec_id == AV_CODEC_ID_AAC) { ret = get_aac_sample_rates(s, par->extradata, par->extradata_size, &sample_rate, &output_sample_rate); @@ -1202,24 +1191,6 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } } - if (par->codec_type == AVMEDIA_TYPE_AUDIO && par->initial_padding && par->codec_id == AV_CODEC_ID_OPUS) { - int64_t codecdelay = av_rescale_q(par->initial_padding, - (AVRational){ 1, 48000 }, - (AVRational){ 1, 1000000000 }); - if (codecdelay < 0) { - 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); - - put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay); - } - if (par->codec_id == AV_CODEC_ID_OPUS) { - put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL); - } - switch (par->codec_type) { case AVMEDIA_TYPE_VIDEO: mkv->have_video = 1; @@ -1313,6 +1284,24 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, break; case AVMEDIA_TYPE_AUDIO: + if (par->initial_padding && par->codec_id == AV_CODEC_ID_OPUS) { + int64_t codecdelay = av_rescale_q(par->initial_padding, + (AVRational){ 1, 48000 }, + (AVRational){ 1, 1000000000 }); + if (codecdelay < 0) { + 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); + + put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay); + } + if (par->codec_id == AV_CODEC_ID_OPUS) { + put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL); + } + put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO); if (!native_id) @@ -1326,6 +1315,16 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate); if (output_sample_rate) put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate); + + bit_depth = av_get_bits_per_sample(par->codec_id); + if (!bit_depth && par->codec_id != AV_CODEC_ID_ADPCM_G726) { + if (par->bits_per_raw_sample) + bit_depth = par->bits_per_raw_sample; + else + bit_depth = av_get_bytes_per_sample(par->format) << 3; + } + if (!bit_depth) + bit_depth = par->bits_per_coded_sample; if (bit_depth) put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth); end_ebml_master(pb, subinfo); From patchwork Fri Jan 17 20:00:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17398 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 500CB4498FA for ; Fri, 17 Jan 2020 22:08:30 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2C02468AE56; Fri, 17 Jan 2020 22:08:30 +0200 (EET) 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 AAE4668A821 for ; Fri, 17 Jan 2020 22:08:23 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id p9so8622557wmc.2 for ; Fri, 17 Jan 2020 12:08:23 -0800 (PST) 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=CxN/85qwqT6QCUKi3pxYoKXlYxHKzis4ULjVWdczbxU=; b=BhiBSFGi8QZF0liWFcsSYcmnBHDYxyO6pDPQOJyltMQDL8ibw/6zZmx8+9DCvtf3pg +s2MPdl14IhqAk5NgktBLD5xOpIBA9uRwJL3l1OOAKWgjUWo7dhh8QQFdf6iz0I1wlFp a7IEf5OKGM43G59dgmVayijVPLtETOmImqgkB7wVTqU4AlinoHaEjtKxReNTdL1ojOGh OOKIm4dZfLmnZOBgSCGUu95c/IGlqVQh20JVpzdIDpA92tUt6N3ABgbMRF7H4K1ekN4a 4q7M/LI8wxAZYvKCCZJrszqawQYtxgsfpb2U/j42ZPyAqPGtP4hmkb5yosS0K13aETov yByg== 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=CxN/85qwqT6QCUKi3pxYoKXlYxHKzis4ULjVWdczbxU=; b=aP70filRAdT2WpmCWlyVFr+PjU9wVqSRI6ZoPv2E5m6tfMtc+gIFLr/fHsiJq/Z0oE zljJSO5ZAGZJz6P6NZhDGOitOh+lLXicXtEs6JEH6atApZ5+wdFaIG9KtWMLO7XW69er sj5GEF6ZePfu462YTZDDC3pj4CdUJCXI8Zfhynme5YzgfcDUZI5P3P55nFEl78HO9GuN VKEBOYuJRLq9t8DC8Tnqi+T0CRvowGsqzjvTYA0mQg2xBeKkjZbU8YvjpZ5om75sgd81 U99SQwOPMIyjVxi9cQ6UqmYGp1J/IspvXB4B6arumtxoPhvZDBikGYWjbHrpNMHS2bFL Z6tw== X-Gm-Message-State: APjAAAVaZK7JP5cjDd76iYg8R8VurCVzz+iQ9VQNLc0xnSoVhqq2DUoW attp+AlrcqNtIqOd82q2cHywZx3C X-Google-Smtp-Source: APXvYqwEo/QxSbIZBPuWEToaXCytVcO2hKCVIBIQBRmiZeIBumWxCdHa08WDVrHMKgCLJ5Gzi0J/iA== X-Received: by 2002:a05:600c:2406:: with SMTP id 6mr6355729wmp.30.1579291257794; Fri, 17 Jan 2020 12:00:57 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id z187sm678124wme.16.2020.01.17.12.00.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2020 12:00:57 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 17 Jan 2020 21:00:51 +0100 Message-Id: <20200117200051.30727-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 23/23] avformat/matroskaenc: Reindent after previous commit 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" Also remove { } after an if if there is only one statement inside { }. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 93f01da930..83ed43ab77 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1285,22 +1285,21 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, case AVMEDIA_TYPE_AUDIO: if (par->initial_padding && par->codec_id == AV_CODEC_ID_OPUS) { - int64_t codecdelay = av_rescale_q(par->initial_padding, - (AVRational){ 1, 48000 }, - (AVRational){ 1, 1000000000 }); - if (codecdelay < 0) { - 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); + int64_t codecdelay = av_rescale_q(par->initial_padding, + (AVRational){ 1, 48000 }, + (AVRational){ 1, 1000000000 }); + if (codecdelay < 0) { + 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); - put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay); - } - if (par->codec_id == AV_CODEC_ID_OPUS) { - put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL); - } + put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay); + } + if (par->codec_id == AV_CODEC_ID_OPUS) + put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL); put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO); From patchwork Sat Jan 18 02:03:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17404 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 669D644A90E for ; Sat, 18 Jan 2020 04:03:22 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3769868AFF5; Sat, 18 Jan 2020 04:03:22 +0200 (EET) 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 27389689AA9 for ; Sat, 18 Jan 2020 04:03:16 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id u2so9379655wmc.3 for ; Fri, 17 Jan 2020 18:03:16 -0800 (PST) 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=wI+/Xu3AYNM3M73yiKC51+FlKzDbfwnLGDmGl2n2ay8=; b=azk2jMOuaIvbciV3gfuxkOAsg8M6gyq8TYb6bVfp+wqRlKn1JiqnmBOgTOPP/wYDqf FL0i4z+zhzha4YVHcd52uBfvdt/+zcEdQ5Cj5a7pC2T8/PUq9/I9nSE4NhqBrVb/snkf waD3U8XAvhFVngip+q++8KwMu5Z5xGd3F0AJ54ms5KFVIXLuv+Fwe8MYproDA6Gq4w9x 9QHtt2mJEDhnEq+5+7h0OXHfl1FqSOEsmFdjlSIwB0kZi/vJcLH5tuLobvQSTSxTo3vY bh6Xve8Q8N9Tr9ZkgAOU9X3Myu28oOQVQ7eNNPQ/sajatzNQdhiykrm4lc5XmJ4TwTKO k2NQ== 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=wI+/Xu3AYNM3M73yiKC51+FlKzDbfwnLGDmGl2n2ay8=; b=QpapeQf2uUnDk6/NaX+SD2gyG5xDpnQcITED61lHWMoTFjufNQY+GXst5ACxxob8Zi Oh8umeiGjKc0YtT+uGeAViM+OYfHUAcTLig+GWSnJzd/LtiXOKzhBVVFdZJOtl7E2PpR Vum7g1rHYMWt6m5d6R2aZmmdbsg8O19TssL3aKYeqCpxBQp3NY5CT2k0jFEcOGOrSOfV bP7VEN/YZRaqS0E1SaKCX+vIIgeuJyPN8DEdZx39jnuD8a3SPxIAnGIM2fnCsUJtsWx9 Mx5ozCO7MhjtC46a+G4LtEXo2MATFwFSYL8UC3eoFAxYRLGpEOM9h6aqP+cc8HFLLXQG GV7g== X-Gm-Message-State: APjAAAW9ubLTqkX3sGFCSkxRZbC1Q3kHqhPm7Bl0bB9aRULNelT3we25 cwN+ija8lhEV7h4GVc6Qb57V1rbv X-Google-Smtp-Source: APXvYqz7jilIYMxPMHnZDunM8NAYbuuxXzGUPn8MLEnSzvMHR3yARGoIvicHaEQw4ttfjeM8Duqi+Q== X-Received: by 2002:a7b:ce8b:: with SMTP id q11mr7606687wmj.100.1579312995346; Fri, 17 Jan 2020 18:03:15 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id o1sm36308020wrn.84.2020.01.17.18.03.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2020 18:03:14 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jan 2020 03:03:01 +0100 Message-Id: <20200118020301.32579-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 24/24] avformat/matroskaenc: Don't implicitly mark WebVTT in WebM as English 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" Writing the language of WebVTT in WebM proceeded differently than the language of all other tracks: In case no language was given, it does not write anything instead of "und" (for undefined). Because the default value of the Language element in WebM (that inherited it from Matroska) is "eng" (for English), any such track will actually be flagged as English. Doing it this way goes back to commit 509642b4 (the commit adding support for WebVTT) and no reason for this has been given in the commit message or in the discussion about this patch on the mailing list; the best I can think of is this: the WebM wiki contains "The srclang attribute is stored as the Language sub-element." Someone unfamiliar with default values in Matroska/WebM could interpret this as meaning that no Language element should be written if there is no srclang attribute. But this is wrong and this commit changes it. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 83ed43ab77..2331e21ff8 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1122,11 +1122,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, 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); - if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) { - put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag && tag->value ? tag->value:"und"); - } else if (tag && tag->value) { - put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag->value); - } + put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, + tag && tag->value ? tag->value : "und"); // The default value for TRACKFLAGDEFAULT is 1, so add element // if we need to clear it. From patchwork Sat Jan 18 08:23:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 17407 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 82C5B4491F8 for ; Sat, 18 Jan 2020 10:46:03 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6280368AF82; Sat, 18 Jan 2020 10:46:03 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E081368AEA4 for ; Sat, 18 Jan 2020 10:45:56 +0200 (EET) Received: by mail-ed1-f47.google.com with SMTP id t17so24579813eds.6 for ; Sat, 18 Jan 2020 00:45:56 -0800 (PST) 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=tgMXXBrd2zcJkKBLZPj+ScMJ76lFTt/AKTDIw1YDZ/c=; b=MJjedz93SWVI03k+FUldgf5R5Q9BWxeF1yYl28A6PWzZPKh2NvOxrfhYakgDhTcFFF 73TQ5srypK3gr+b9CIPZN4chYmX3iFLvvvwpR4eTPZdVh3w1i/qH/ygxMODZL5TmCJHY A+Spa1vB9Gq9/lUA9Uu0nqhM6c2ByL4aABugcpQtsbqggFqJZx00otMP9AlpkUQsGr5g ABspO6MtyFJlDexlXyqNcLN9d3O/GbPifA1NLvDelTwy9XZrryqBtUF2XGeyC8VbEVt0 ALHoXec8p/+6QzM60WTpRKN1mmwewUGM7FhSt0EtUVQqtQ0DWPU0Q+aTTOOEz/U2tLDc ihgA== 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=tgMXXBrd2zcJkKBLZPj+ScMJ76lFTt/AKTDIw1YDZ/c=; b=XNHSrMxBDFsMiZwCEWbRKac9JNbJ80w57Tjmc2sxc9Q4S5XDBC0jcCTrOsh0oPWby/ 31x1X1CtQODWL2BVwFhz6plbUcm6JQfeMKrpjFidvyN3FPK0Xrr22KbgAhmOxkhGoC1+ KHATJoFljSbEHQ96g65ASt3Hr/wDZmfCbGPW+LZefnfe2HoYGl+9f8jmOAYHb4JOrz4H zzvrbdKKS9cV5LYdKpH/nZAVT4JCHC73yqFt0fow/fY8jP8N6Qs9spAkj5lGoLsQaAfw OxNmwUY5/QDPHy2UCHQcH8xLrP74cKPSJWj8ZiNORoGKGI9s1eDUrY0qG3h7t0uQH9Ci pzow== X-Gm-Message-State: APjAAAVJvtY920/W/Bh5oESWJjxuF6QXJNxH5ZE9LlhTMwjfXmnYd1k5 hfmUkBQzm4rEsvFYBfD2XshyRxgJ X-Google-Smtp-Source: APXvYqyrkgnXUavnQSjaw4NAIqxD4RH4G0/fQwEVONxddNg2ztiXQw6Yz83TRqdLni+2cuc0gMurag== X-Received: by 2002:adf:ea4f:: with SMTP id j15mr7446522wrn.356.1579335834328; Sat, 18 Jan 2020 00:23:54 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id l3sm34396031wrt.29.2020.01.18.00.23.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jan 2020 00:23:53 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jan 2020 09:23:46 +0100 Message-Id: <20200118082346.4573-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 25/25] 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" 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 --- Better naming suggestions than "infer_no_subs" welcome. Furthermore, I'd appreciate suggestions on how to shorten the AVOption documentation (without losing relevant information). doc/muxers.texi | 19 +++++++++++++ libavformat/matroskaenc.c | 56 +++++++++++++++++++++++++++++++++------ 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index 521d99140c..48f3896146 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -1341,6 +1341,25 @@ the end. 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 2331e21ff8..5065b2adbd 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -61,6 +61,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 @@ -160,6 +166,7 @@ typedef struct MatroskaMuxContext { int wrote_chapters; int allow_raw_vfw; + int default_mode; } MatroskaMuxContext; /** 2 bytes * 7 for EBML IDs, 7 1-byte EBML lengths, 6 1-byte uint, @@ -1085,7 +1092,7 @@ 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) + int i, AVIOContext *pb, int is_default) { AVStream *st = s->streams[i]; AVCodecParameters *par = st->codecpar; @@ -1127,8 +1134,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); @@ -1358,7 +1365,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; mkv_add_seekhead_entry(mkv, MATROSKA_ID_TRACKS, avio_tell(pb)); @@ -1366,12 +1373,41 @@ 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++) { - ret = mkv_write_track(s, mkv, i, mkv->tracks_bc, default_stream_exists); + int is_default = mkv->default_mode == DEFAULT_MODE_PASSTHROUGH ? + s->streams[i]->disposition & AV_DISPOSITION_DEFAULT : + i == video_default_idx || i == audio_default_idx || + i == subtitle_default_idx; + ret = mkv_write_track(s, mkv, i, mkv->tracks_bc, is_default); if (ret < 0) return ret; } @@ -2696,6 +2732,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 }, }; From patchwork Wed Jan 22 19:27: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: 17473 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 9533944B208 for ; Wed, 22 Jan 2020 21:27:33 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 78C7368B3A0; Wed, 22 Jan 2020 21:27:33 +0200 (EET) 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 556A7689CCC for ; Wed, 22 Jan 2020 21:27:27 +0200 (EET) Received: by mail-wr1-f65.google.com with SMTP id y17so341371wrh.5 for ; Wed, 22 Jan 2020 11:27:27 -0800 (PST) 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=IN9b1BM0VujMAjjpiVBHDVcZ2ZK28RucpCN8F3QVo48=; b=A72WqumJ1m2Plleqz0IXj8ipvOWcg3ftct78eVhnIN936QAmHj4gzR9xGh+Uf7WwK/ lfjWhSFi5YsJmOlS6hE/i+8N8i6GD7HLI2cLPux7eDf09xd0GhCkWVqH3dVpc6VD51sD V88OJTi2tdz6sPYoX0EA/u1R1fzK9tCPsRHEf0TByDi8SfvA/QWmFhTzqTUefl2pfjyk QT9slHwyNtLY1oiGaPaxO5ZWMlrViPAg3+7oHgPVNn+Dse0WeENjfnaJ8b4s63x8xBLy zV4Dxfgmb2ClbizW/EgYvWeOwlIJeys0rdBakL9jTbTsUqYly1+L2Evwmts7fwNVESZf X9LA== 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=IN9b1BM0VujMAjjpiVBHDVcZ2ZK28RucpCN8F3QVo48=; b=fmi53puyMf8kBBwY/PM1FBkHa42eWSxphmsklSqTQPCXAhiz98gK7MzYFCBpHjSPrt m4UJEd8aSHKuJwf0AsVp5p/u2u88wNGpj4n19I1GPVNzgxic+ntdDOztG0sHk7WtnGZ4 88oHA/Mm/E7BqOhc1bkOPugtzmvvmR0ias2n6AfWCfOAnzB7pGQwoPlHsmMGBXz4cIly nbM8O/ixBTyv+WfGxQwOrI/KkHFWnd4ag6r/6kDhg13sJ1X6SuwLmhrvSVqMdWN/KlLS HdcA+/dZHbHB8HK+zewI+q1MCCMvtNG6neqhadaCnT7adoLw3jQuAqhrBfiOIGt7Jdxs +HlQ== X-Gm-Message-State: APjAAAVZjQQ7sYVWnq2DSBpucKY8iIRkmaFFMFosl2uuVnL6iaa/L7kJ QyQx6eoC/+AxU965sLPbkaUBKODf X-Google-Smtp-Source: APXvYqwuAcrX4HtgEkwi8Ct/FY/VDl/9jErjryQehOenEW74fxvolqKDctoG6XLmDmCmVl/RVogTVQ== X-Received: by 2002:adf:dd4d:: with SMTP id u13mr13601757wrm.394.1579721246510; Wed, 22 Jan 2020 11:27:26 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id v3sm58196792wru.32.2020.01.22.11.27.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 11:27:25 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Jan 2020 20:27:15 +0100 Message-Id: <20200122192717.11678-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 26/28] avformat/matroskaenc: Stop reallocating of Cluster buffer 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 uses a dynamic buffer to buffer the content of Clusters before eventually writing them. Up until now, each time a Cluster was written, the dynamic buffer was closed, i.e. freed; now it is only reset, saving allocations of the AVIOContext itself, its opaque as well as most of the reallocations of the buffer. This is advantageous performance-wise, in particular on systems where reallocations are slow (namely Windows). The following table shows the decicyles for writing a frame on Linux (Ubuntu 19.10) and Windows (7) on an x64 Haswell (to /dev/null on Linux, to stdout which is discarded on Windows (the default values of the size and duration of clusters for seekable output have been explicitly set in this case); in all tests, writing CRC-32 values has been disabled in all tests; calls to the muxer's write_packet function in write_packet() in libavformat/mux.c have been timed; each of the following tests has been repeated 50 times): | Windows before | Windows after | Linux before | Linux after diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 5065b2adbd..8bbacf5cd3 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -337,7 +337,7 @@ static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv { int ret; - if ((ret = avio_open_dyn_buf(dyn_cp)) < 0) + if (!*dyn_cp && (ret = avio_open_dyn_buf(dyn_cp)) < 0) return ret; if (mkv->write_crc) @@ -348,13 +348,13 @@ static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, uint32_t id, - int length_size) + int length_size, int keep_buffer) { uint8_t *buf, crc[4]; int size, skip = 0; put_ebml_id(pb, id); - size = avio_close_dyn_buf(*dyn_cp, &buf); + size = avio_get_dyn_buf(*dyn_cp, &buf); put_ebml_num(pb, size, length_size); if (mkv->write_crc) { skip = 6; /* Skip reserved 6-byte long void element from the dynamic buffer. */ @@ -363,8 +363,11 @@ static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, } avio_write(pb, buf + skip, size - skip); - av_free(buf); - *dyn_cp = NULL; + if (keep_buffer) { + ffio_reset_dyn_buf(*dyn_cp); + } else { + ffio_free_dyn_buf(dyn_cp); + } } /** @@ -449,7 +452,7 @@ static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid, static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, int error_on_seek_failure, int64_t destpos) { - AVIOContext *dyn_cp; + AVIOContext *dyn_cp = NULL; mkv_seekhead *seekhead = &mkv->seekhead; int64_t remaining, ret64; int i, ret; @@ -476,7 +479,7 @@ static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos); end_ebml_master(dyn_cp, seekentry); } - end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD, 0); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD, 0, 0); remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb); put_ebml_void(pb, remaining); @@ -1416,7 +1419,7 @@ static int mkv_write_tracks(AVFormatContext *s) end_ebml_master_crc32_preliminary(pb, mkv->tracks_bc, MATROSKA_ID_TRACKS, &mkv->tracks_pos); else - end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0, 0); return 0; } @@ -1424,7 +1427,7 @@ static int mkv_write_tracks(AVFormatContext *s) static int mkv_write_chapters(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *dyn_cp, *pb = s->pb; + AVIOContext *dyn_cp = NULL, *pb = s->pb; ebml_master editionentry; AVRational scale = {1, 1E9}; int i, ret; @@ -1472,7 +1475,7 @@ static int mkv_write_chapters(AVFormatContext *s) end_ebml_master(dyn_cp, chapteratom); } end_ebml_master(dyn_cp, editionentry); - end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0, 0); mkv->wrote_chapters = 1; return 0; @@ -1671,7 +1674,7 @@ static int mkv_write_tags(AVFormatContext *s) end_ebml_master_crc32_preliminary(s->pb, mkv->tags_bc, MATROSKA_ID_TAGS, &mkv->tags_pos); else - end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0); + end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0, 0); } return 0; } @@ -1679,7 +1682,7 @@ static int mkv_write_tags(AVFormatContext *s) static int mkv_write_attachments(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *dyn_cp, *pb = s->pb; + AVIOContext *dyn_cp = NULL, *pb = s->pb; AVLFG c; int i, ret; @@ -1767,7 +1770,7 @@ static int mkv_write_attachments(AVFormatContext *s) 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); + end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0, 0); return 0; } @@ -1908,7 +1911,7 @@ static int mkv_write_header(AVFormatContext *s) end_ebml_master_crc32_preliminary(s->pb, mkv->info_bc, MATROSKA_ID_INFO, &mkv->info_pos); else - end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0); + end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0, 0); pb = s->pb; ret = mkv_write_tracks(s); @@ -2188,7 +2191,7 @@ 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); + end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 0, 1); mkv->cluster_pos = -1; avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT); } @@ -2492,7 +2495,8 @@ static int mkv_write_trailer(AVFormatContext *s) } if (mkv->cluster_bc) { - end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 0); + end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv, + MATROSKA_ID_CLUSTER, 0, 0); } ret = mkv_write_chapters(s); @@ -2506,7 +2510,7 @@ static int mkv_write_trailer(AVFormatContext *s) endpos = avio_tell(pb); if (mkv->cues.num_entries) { - AVIOContext *cues; + AVIOContext *cues = NULL; uint64_t size; int64_t cuespos = endpos; int length_size = 0; @@ -2548,7 +2552,8 @@ static int mkv_write_trailer(AVFormatContext *s) } } mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos); - end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES, length_size); + end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES, + length_size, 0); if (mkv->reserve_cues_space) { if (size < mkv->reserve_cues_space) put_ebml_void(pb, mkv->reserve_cues_space - size); @@ -2564,11 +2569,11 @@ static int mkv_write_trailer(AVFormatContext *s) av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); avio_seek(mkv->info_bc, mkv->duration_offset, SEEK_SET); put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration); - end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0); + 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); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0, 0); // update stream durations if (!mkv->is_live) { @@ -2598,7 +2603,7 @@ static int mkv_write_trailer(AVFormatContext *s) } if (mkv->tags_bc && !mkv->is_live) { avio_seek(pb, mkv->tags_pos, SEEK_SET); - end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0); + end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0, 0); } avio_seek(pb, endpos, SEEK_SET); From patchwork Wed Jan 22 19:27: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: 17474 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 A6F8544B208 for ; Wed, 22 Jan 2020 21:27:44 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8E86268B433; Wed, 22 Jan 2020 21:27:44 +0200 (EET) 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 0575868089B for ; Wed, 22 Jan 2020 21:27:38 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id g17so360736wro.2 for ; Wed, 22 Jan 2020 11:27:37 -0800 (PST) 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=Pd0poDYGjGyGeMZs1XilFdKSgmzEsSuPuf8aP/R4/+s=; b=I5HwavO6FwIoZLciRyafJI/8Us7lJS925+7L5QLQN4jltadaZXspm1xZvLIIEG1ZeW oC5fNWNoHC3M86ETZ83smu1DfJszV4jOX1OXfyZJIK5LdUcFNowXkPqzmo5Zq2fhrAWB bh6Dwc1QM9IG0TKUDYvdM3l8wfvLx3LtzfAdu5P9C9JmiCudZzftc+2L4w+rwmmFY62G XeERU6iu0W7aWWScml5tMPVLdgD8Zd1waYgMdKA4gRqgHoFud2vOJ0JSwXUO7sCPQOlX qypSlTIGp6Nr/bCVO9FrxCWtOTaf0dFPkEo+khx+WBszr4Nke2LRpa5ydbxVf5EIZTDL Awag== 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=Pd0poDYGjGyGeMZs1XilFdKSgmzEsSuPuf8aP/R4/+s=; b=ZHI/dywkbQU7v5qYwTvFsNBdGiIiI/Z2irS/2rBu3dzatz9YklLP0t0eOWX8v6EuxJ D4lG1oFR07Dtnq7n4Lwnak0AVieH0siLBHw90eXdTJoA5cVbURSIDNjRn6Rem4aYJ09j BLrDFsf3KGHrooWrWWm/6AJeCGhAd5rhMvXaKwLHTwRkrWoTtDLfs669Zmu5fFxaQKbh u0PxFJ0JmBDIHx93z6/hF+SSofDiQ/sukLKq3IPTnxajZFbrHzGXjjbV81D+dHa8ShZ7 EFbsR8Zf+fyiPfVSNtHZUnHxV+DyVcyNacQ9EIRMyPdMLnoB+2I8JQJp91r0Ld0d23X+ eUpA== X-Gm-Message-State: APjAAAVMQ8S/6AWerO/Qy25XYIxH4H1U7INwTGF82YEa9ozfCnHugRgG LlFYF6oY7wcJfTv5woD3CmAQ139z X-Google-Smtp-Source: APXvYqy/8Vnt7jSWqkCocqFTG2QjSnBNmuraQpfvtFmGbDKHAB8Ra422BK4YW77wj4UsIrwdhmz/vw== X-Received: by 2002:adf:e550:: with SMTP id z16mr12578397wrm.315.1579721257248; Wed, 22 Jan 2020 11:27:37 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id v3sm58196792wru.32.2020.01.22.11.27.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 11:27:36 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Jan 2020 20:27:16 +0100 Message-Id: <20200122192717.11678-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 27/28] avformat/matroskaenc: Remove unnecessary avio_tell(), avio_seek() 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" avio_close_dyn_buf() has a bug: When the write pointer does not point to the end of the written data when calling it (i.e. when one has performed a seek back to update already written data), it would not add padding to the end of the buffer, but to the current position, overwriting other data; furthermore the reported size would be wrong (off by the amount of data it has overwritten with padding). In order not to run into this when updating already written elements or elements for which size has only been reserved, the Matroska muxer would first record the current position of the dynamic buffer, then seek to the desired position, perform the update and seek back to the earlier position. But now that end_ebml_master_crc32() does not make use of avio_close_dyn_buf() any more, this is no longer necessary. Signed-off-by: Andreas Rheinhardt --- avio_close_dyn_buf() even has more bugs: Besides the design flaw of freeing a resource without setting the pointer to it to NULL, it returns a size of -AV_INPUT_BUFFER_PADDING_SIZE if a memory allocation failure happened (but not if the arbitrary limit of INT_MAX/2 has been surpassed); and this despite its documentation not allowing returning negative values at all. This will definitely need to be fixed (and this muxer will need to check for whether the allocations failed). libavformat/matroskaenc.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 8bbacf5cd3..354096266d 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2211,7 +2211,6 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) case AV_CODEC_ID_AAC: if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { int filler, output_sample_rate = 0; - int64_t curpos; ret = get_aac_sample_rates(s, side_data, side_data_size, &track->sample_rate, &output_sample_rate); if (ret < 0) @@ -2222,7 +2221,6 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; memcpy(par->extradata, side_data, side_data_size); - curpos = avio_tell(mkv->tracks_bc); avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET); mkv_write_codecprivate(s, mkv->tracks_bc, par, 1, 0); filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->tracks_bc) - track->codecpriv_offset); @@ -2231,7 +2229,6 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) avio_seek(mkv->tracks_bc, track->sample_rate_offset, SEEK_SET); put_ebml_float(mkv->tracks_bc, MATROSKA_ID_AUDIOSAMPLINGFREQ, track->sample_rate); put_ebml_float(mkv->tracks_bc, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate); - avio_seek(mkv->tracks_bc, curpos, SEEK_SET); } else if (!par->extradata_size && !track->sample_rate) { // No extradata (codecpar or packet side data). av_log(s, AV_LOG_ERROR, "Error parsing AAC extradata, unable to determine samplerate.\n"); @@ -2241,7 +2238,6 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) case AV_CODEC_ID_FLAC: if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) { AVCodecParameters *codecpriv_par; - int64_t curpos; 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); @@ -2256,10 +2252,8 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) return ret; } memcpy(codecpriv_par->extradata, side_data, side_data_size); - curpos = avio_tell(mkv->tracks_bc); avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET); mkv_write_codecprivate(s, mkv->tracks_bc, codecpriv_par, 1, 0); - avio_seek(mkv->tracks_bc, curpos, SEEK_SET); avcodec_parameters_free(&codecpriv_par); } break; @@ -2271,7 +2265,6 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) AVIOContext *dyn_cp; uint8_t *codecpriv; int codecpriv_size; - int64_t curpos; ret = avio_open_dyn_buf(&dyn_cp); if (ret < 0) return ret; @@ -2281,12 +2274,10 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) av_free(codecpriv); return AVERROR_INVALIDDATA; } - curpos = avio_tell(mkv->tracks_bc); avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET); // Do not write the OBUs as we don't have space saved for them put_ebml_binary(mkv->tracks_bc, MATROSKA_ID_CODECPRIVATE, codecpriv, 4); av_free(codecpriv); - avio_seek(mkv->tracks_bc, curpos, SEEK_SET); ret = ff_alloc_extradata(par, side_data_size); if (ret < 0) return ret; @@ -2578,7 +2569,6 @@ static int mkv_write_trailer(AVFormatContext *s) // update stream durations if (!mkv->is_live) { int i; - int64_t curr = avio_tell(mkv->tags_bc); for (i = 0; i < s->nb_streams; ++i) { AVStream *st = s->streams[i]; mkv_track *track = &mkv->tracks[i]; @@ -2599,7 +2589,6 @@ static int mkv_write_trailer(AVFormatContext *s) put_ebml_binary(mkv->tags_bc, MATROSKA_ID_TAGSTRING, duration_string, 20); } } - avio_seek(mkv->tags_bc, curr, SEEK_SET); } if (mkv->tags_bc && !mkv->is_live) { avio_seek(pb, mkv->tags_pos, SEEK_SET); From patchwork Wed Jan 22 19:27: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: 17475 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 A06CC44B208 for ; Wed, 22 Jan 2020 21:27:48 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 89A8668B469; Wed, 22 Jan 2020 21:27:48 +0200 (EET) 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 28AD768B45F for ; Wed, 22 Jan 2020 21:27:41 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id t14so271874wmi.5 for ; Wed, 22 Jan 2020 11:27:41 -0800 (PST) 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=2BdvTe6DsRf88oYiCn7g0XJn0tsZhmiuNhJg11z0F4Y=; b=nQhmN6PEEIZpFL70wuIkHKx164yxcVhjt2ZhcKOpbyElbXs6vVimHMs2+uLOkpKcJo ZteCFXXy2FNocY/a2wsspk6+oxIEktPea5YZAB8TmXczyhJS9kAxO8a7JoqN6EPeI6+O QUcEQ8mL2BLFyiovEmUMm4Oax2V0/4KZC11wZt4iZAyto3wPYuSRwziqi/vS5yPdtKcs OX5u+uz4TcURFGsFnK8VBqisZhnid7LPFEHwESVCnlqQ5TfrMmaE8nTz8udftPwvCyt1 8nwu0p1RyrXyfWyChvZ9h/wiwovVRDwjmJ0OyfAyf6hwcedsyRbIH2KKrXtKrhnQvFBj /puw== 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=2BdvTe6DsRf88oYiCn7g0XJn0tsZhmiuNhJg11z0F4Y=; b=rG8P1B6I1wP0H+95oopKus3BQr6ionUDIldE66KFzrbdSQ5ydNxcrdstby9fP2pe8z aqxqUGpKiPib2RRsd/De5E9Uo/EVNZ4hMQi83KtQ59tg3p8AXHMNQsqOZfEmzIcYbA9j nly8uHLJWv7B1VKWYdJXr/7ZfDxS3qYTZWpXrNNvNrurFlFr8wxJThi8hix0loKFh9Kd 3GBsgeHbY91sd1Rjb1bAJQY8PlwI4ghjH0btvPVVe9Ip/FcGwmvJbyZ3m+ycQiuaF685 rE8gBpkj5McLUBX3FK3Gkwb6qoJdOMTJYnZ+LZhgy/PnFtXbGAbYsf3zep8VvL4pXRUX F3Bw== X-Gm-Message-State: APjAAAX0+82vDhFA29L2u8WtxlyR/tmQPHNMZAMAa9xtG3Die1LwVadv 0Oji/WLROGS65uXFAWhUQJIe+QDc X-Google-Smtp-Source: APXvYqwwC3OPzE8HSOQ/P20ej8JsoDhAtLbNlkJ8Idl8Td5fd6pqwXMD7Ysy5nZgx0OWRtu9BKNaxA== X-Received: by 2002:a1c:96c4:: with SMTP id y187mr4629142wmd.112.1579721259615; Wed, 22 Jan 2020 11:27:39 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id v3sm58196792wru.32.2020.01.22.11.27.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 11:27:39 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Jan 2020 20:27:17 +0100 Message-Id: <20200122192717.11678-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 28/28] avformat/matroskaenc: Improve checks for updating Tags 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 updating the Tags at the end, the Matroska muxer would twice check for whether (!mkv->is_live) is true, despite this code being only executed if it is. Furthermore, a loop iterates over all the streams even when there is no Tags element to update at all, because the check for whether there are Tags is only performed later. This commit fixes this. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 354096266d..444032b431 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2567,7 +2567,7 @@ static int mkv_write_trailer(AVFormatContext *s) end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0, 0); // update stream durations - if (!mkv->is_live) { + if (mkv->tags_bc) { int i; for (i = 0; i < s->nb_streams; ++i) { AVStream *st = s->streams[i]; @@ -2589,8 +2589,7 @@ static int mkv_write_trailer(AVFormatContext *s) put_ebml_binary(mkv->tags_bc, MATROSKA_ID_TAGSTRING, duration_string, 20); } } - } - if (mkv->tags_bc && !mkv->is_live) { + avio_seek(pb, mkv->tags_pos, SEEK_SET); end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0, 0); } From patchwork Sun Jan 26 05:10: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: 17550 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 31EF7449CE2 for ; Sun, 26 Jan 2020 07:10:47 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0E82468AEDB; Sun, 26 Jan 2020 07:10:47 +0200 (EET) 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 34FA268AD3C for ; Sun, 26 Jan 2020 07:10:40 +0200 (EET) Received: by mail-wm1-f67.google.com with SMTP id t14so3556405wmi.5 for ; Sat, 25 Jan 2020 21:10:40 -0800 (PST) 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=/LvOlb2vPP9lriZygRNd029s1lKfWxupkE5qm/JPUM4=; b=sgsEEP9sGi67vsyLQ8G8kz5kR2U+X2NPu/sQDhEA7FJSs3IS/gjrrfThceL7txGbWL vYGc7gmx+da45ulPKJMxlYW16mpfKh8OilO0x0MQTbccWAsiFA/X8gvcm7HS5vqOo8uH UZydEGp6z7qtZTrYD/AYyu5DKDw2yCrckDKy00Tni9y/NRya0ydN6JxOEfPPZXYTCTqr XUkAHVh1oG3LMZw24onNJ5wN6NUv3SfVhoFY5zpkLsszeguoSWcCY9a/XckR2wN7xgN/ uOEZIESGTqJM7ExVBkIgSwXkM86SS4ZDjrsuUGFnH1k4zNIhIfBHgn2idLMMhx0geHT+ 5NDg== 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=/LvOlb2vPP9lriZygRNd029s1lKfWxupkE5qm/JPUM4=; b=uQiKg/51FdfRBzwwgeTE8VMcTdpadWG2euSrr3nARpkRZwVzfsjw30yKnXmQ1v96sj jeNcOGpX2+bi6E5YzwkLIVIDNcDjrnChZT9rQKv8TGtU1w5yHDAcj4di+yJsnxNBzrrb dcd1l9j3oD2xjuFJgPeHC7NfPzlhF2S8Ey4kIK4+k4PL6Q+S247KAx1+O+n7V9LbI2+K hWfeiLsN1/js3l8XYKHLnoMishZQrrSkQYKVdG359yF5QVlTdGsZQsjnxbvWF7L/aPcg 7AKG8n6kj/ASAbdriGKEBZRa24sKzgQhP9lH0IwPpx77sS06wSaQIuFOvQUREhl+M3lz FmBQ== X-Gm-Message-State: APjAAAVgqqYaMQdvl3YT42iqoAQfvdpemqWMiy6FZgtuVODXXJM0HAoR fUCD2YSOF2dEdeuLTFWUBjNSMefe X-Google-Smtp-Source: APXvYqwDrXzZ27xZvrX0JWLc1e8rRT2UE6+X9U2/D3OeTqPEKryAObVw56/+anpcLT2VXKHCaAY1XA== X-Received: by 2002:a1c:7c05:: with SMTP id x5mr6776479wmc.15.1580015439086; Sat, 25 Jan 2020 21:10:39 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id y139sm13486305wmd.24.2020.01.25.21.10.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Jan 2020 21:10:38 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 26 Jan 2020 06:10:27 +0100 Message-Id: <20200126051028.27455-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 29/30] avformat/matroskaenc: Check BlockAdditional size before use 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" Don't read a 64bit number before having checked that the data is at least 8 bytes long. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 444032b431..8fc672a31f 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2100,9 +2100,13 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, &side_data_size); if (side_data) { - additional_id = AV_RB64(side_data); - side_data += 8; - side_data_size -= 8; + if (side_data_size < 8) { + side_data_size = 0; + } else { + additional_id = AV_RB64(side_data); + side_data += 8; + side_data_size -= 8; + } } if ((side_data_size && additional_id == 1) || discard_padding) { From patchwork Sun Jan 26 05:10: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: 17551 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 E52C044338E for ; Sun, 26 Jan 2020 07:10:48 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C0F8268AF18; Sun, 26 Jan 2020 07:10:48 +0200 (EET) 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 BDAAE68AD3C for ; Sun, 26 Jan 2020 07:10:40 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id c84so3574305wme.4 for ; Sat, 25 Jan 2020 21:10:40 -0800 (PST) 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=Y45Cgo9NiKgLApgj8N+kU5MblO8Z1JiAc1fU0p2Lgmc=; b=fD1Mb5MxZmNIzV6s3uW/QtPBqdbzRHSnW4IBHjJLfvWw2WyGIGr/U04xJdOAgARhVh UPILtshRqJQ6A/DS8Madb79iQ8LCYUlEpK9J5b/4gpYebqqo9CWfKgblDxDqCi2Vx+34 k0iyQH2PA2af7STEx7FOEvvkAFs60x8BP0agZCJavyUtnE97VLkpFYVtbfyhR7IViwij RtNmdAiL0oU4N2NlClIHwpocdpMjRYIgbMoFe1XtrV2ZdjgpnZstKUxgxRi4bPgDFxTv s3Vym4i72IZnJQLGrfCLzjWyDZH4Vvb12YuyVolyPF2Z95ceFSr20+SqjjzOEDhW3E+k k3Hg== 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=Y45Cgo9NiKgLApgj8N+kU5MblO8Z1JiAc1fU0p2Lgmc=; b=qse9jLxW3jPN69t6Ox2gLqBBAfn0d/ahCZZiSSrBgsrJ/c5sQX3Q9OHw+w0VLEOiO+ kB+nce1LPKjSw9zCav3YL7nL8vLMvo05GTKGbeqL/WwHR91PhPoqpWgvqIJDV98rqn/o 8hCtxkOKbp9bXCPyOjuXKwi5HuBi2E7G9Vm2UUouqf4cmkxDjP4F+PejuDH//G+FTFoV LaMbAMN1W5ech1gsxqNyqg9PW56GAAHuiNS/iRuZz3gLwSgQMJ0x5hgSuvKRXRsRj3Eg 5yg5RWWb/XbLHiLm7cCcYJP8hN2gRgGAccoaoXsbvW2wG9yerAXX0yV2gxWpidwjr2qn f9pg== X-Gm-Message-State: APjAAAWE9v9Bec8ArlHhRt0bAPNc5d94CnzxVf7SpHEwApQOIU4jJvMR eBgMFYhjGPQ7uq8+2SMgJw/zKrJO X-Google-Smtp-Source: APXvYqwtks651Gvs/nl8wubyMQ2r5TNr/zqriua8TUh6LM9kNXVjGvTpG5fOeGlejZROg/MGkgrY7A== X-Received: by 2002:a05:600c:2152:: with SMTP id v18mr5745375wml.11.1580015439968; Sat, 25 Jan 2020 21:10:39 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08bbf.dynamic.kabel-deutschland.de. [188.192.139.191]) by smtp.gmail.com with ESMTPSA id y139sm13486305wmd.24.2020.01.25.21.10.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Jan 2020 21:10:39 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 26 Jan 2020 06:10:28 +0100 Message-Id: <20200126051028.27455-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> References: <20200101005837.11356-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 30/30] avformat/matroskaenc: Improve BlockAdditions 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" 8ffcc826 added support for muxing BlockAdditions with BlockAddID equal to one. The restriction to BlockAddID == 1 probably resulted from a limitation to what was needed; yet over time this led to three occurences of "(side_data_size && additional_id == 1)". This commit changes this by setting side_data_size to 0 if additional_id != 1. It also stops hardcoding 1 for the value of BlockAddID to write; but it still upholds the requirement that it is 1. See below. Despite BlockAddID actually having a default value of 1, it is still written, because until very recently (namely dbc50f8a) our demuxer used a wrong default value of 0. Furthermore, use put_ebml_binary() to write the BlockAdditional element. (The Matroska specifications have evolved and now the BlockAddID 1 is reserved for the codec (as described in the codec's codec mapping), BlockMore elements with BlockAddID > 1 are now of a more codec-independent nature and require a BlockAdditionalMapping in the track's TrackEntry. Given that this muxer does not support writing said BlockAdditionalMapping yet (actually, none have been defined yet), we have to uphold the requirement that BlockAddID == 1.) Signed-off-by: Andreas Rheinhardt --- Btw: When writing BlockAdditions in Matroska mode, one also has to write the MaxBlockAdditionID in the corresponding TrackEntry. Yet we don't (and we don't have the information to do that reliably when writing the header). libavformat/matroskaenc.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 8fc672a31f..de3fff2043 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2046,7 +2046,7 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, uint8_t *data = NULL, *side_data = NULL; int offset = 0, size = pkt->size, side_data_size = 0; int64_t ts = track->write_dts ? pkt->dts : pkt->pts; - uint64_t additional_id = 0; + uint64_t additional_id; int64_t discard_padding = 0; uint8_t track_number = (mkv->is_dash ? mkv->dash_track_number : (pkt->stream_index + 1)); ebml_master block_group, block_additions, block_more; @@ -2100,16 +2100,16 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, &side_data_size); if (side_data) { - if (side_data_size < 8) { + // Only the Codec-specific BlockMore (id == 1) is currently supported. + if (side_data_size < 8 || (additional_id = AV_RB64(side_data)) != 1) { side_data_size = 0; } else { - additional_id = AV_RB64(side_data); side_data += 8; side_data_size -= 8; } } - if ((side_data_size && additional_id == 1) || discard_padding) { + if (side_data_size || discard_padding) { block_group = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, 0); blockid = MATROSKA_ID_BLOCK; } @@ -2133,17 +2133,18 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding); } - if (side_data_size && additional_id == 1) { + if (side_data_size) { block_additions = start_ebml_master(pb, MATROSKA_ID_BLOCKADDITIONS, 0); block_more = start_ebml_master(pb, MATROSKA_ID_BLOCKMORE, 0); - put_ebml_uint(pb, MATROSKA_ID_BLOCKADDID, 1); - put_ebml_id(pb, MATROSKA_ID_BLOCKADDITIONAL); - put_ebml_num(pb, side_data_size, 0); - avio_write(pb, side_data, side_data_size); + /* Until dbc50f8a our demuxer used a wrong default value + * of BlockAddID, so we write it unconditionally. */ + put_ebml_uint (pb, MATROSKA_ID_BLOCKADDID, additional_id); + put_ebml_binary(pb, MATROSKA_ID_BLOCKADDITIONAL, + side_data, side_data_size); end_ebml_master(pb, block_more); end_ebml_master(pb, block_additions); } - if ((side_data_size && additional_id == 1) || discard_padding) { + if (side_data_size || discard_padding) { end_ebml_master(pb, block_group); } }