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; }