From patchwork Tue Feb 21 22:35:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vittorio Giovara X-Patchwork-Id: 2632 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.65.149 with SMTP id x21csp605216vsf; Tue, 21 Feb 2017 14:42:07 -0800 (PST) X-Received: by 10.223.179.78 with SMTP id k14mr24607740wrd.34.1487716927229; Tue, 21 Feb 2017 14:42:07 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 8si12587254wrt.162.2017.02.21.14.42.06; Tue, 21 Feb 2017 14:42:07 -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; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0CB656882FD; Wed, 22 Feb 2017 00:41:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6BA316882D3 for ; Wed, 22 Feb 2017 00:41:49 +0200 (EET) Received: by mail-qt0-f194.google.com with SMTP id n13so19528065qtc.0 for ; Tue, 21 Feb 2017 14:41:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=fjdP7/b2jT4o3aCVsEkUDRW2+/8nSNOqFM1IlsJtLEY=; b=cq6fpUUzmfhmEReaFsWdyG3vTd2DqV5Oc1wlK4IxRmh/80u6PZF12Rrv64KzliwG/S 6fTWpNT05GgK05fL3ylFD/C/Di0od68ukpGMqErNF+XGp3Qvnm0pLfDa4YQHYXPaNY32 0FOeCS2hZeYfPhbgBlnQhRg5w05poEHzTbQjyeRxQqgTTMK6ERRVJQ0UmELkCg8/zC8Z OhScEyhZ5XHrLAr1RSOAW60s/uTDDhMlRmBeHCfcri5cKctaT2Xfp2EkZhrmxiF+pBLB 7jMXitsuFGA7UvGlcD9hGjeV1p6I+9v332QNUUReoOAXfGtWRDMtXf8HTsVZIfyRWszX XcLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=fjdP7/b2jT4o3aCVsEkUDRW2+/8nSNOqFM1IlsJtLEY=; b=HE0VzMTnhUvS9WzMZ+O4dmn2BgQxGvxjRIBMQHgpgzJvxAVLtZzbjbKI/+KAC/2XiK +oWdFMNWyj+YE5Z0gjT2CObbEWJ6LiS8vfQ4hFnd1aYwYNG3HTQ9dIh3jEzeJLD3Q3y7 gGPTLESg5qL4tdz9IlCu2ixYw0ZHqOozb8HtLGZefsRnHpgLSDixMI4r4bi689pKp63y HkuEexbBFPFVg1L7u36iPYyp9j7ix1BiBfTDHtlbnYYU1LPUBcAAL1yeQgr3Ewj3xkAt mmTMY3zTVa/zH5GrpIEhbFpaTmb6e9Mf3+RjMC/PVEa3VweE7jUCNApViu+umFK41YHu BCkA== X-Gm-Message-State: AMke39mUKsY5NxA8Hb5iLi/pAP75+3YqT60d5hwzpFY5B4W57V40gIbLo7w8pv1Olzy9rg== X-Received: by 10.237.44.103 with SMTP id f94mr29645605qtd.292.1487716557374; Tue, 21 Feb 2017 14:35:57 -0800 (PST) Received: from vimacbookpro.vimeows.com (nyv-exweb.iac.com. [216.112.252.10]) by smtp.gmail.com with ESMTPSA id t34sm1959074qtc.3.2017.02.21.14.35.56 for (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 21 Feb 2017 14:35:56 -0800 (PST) From: Vittorio Giovara To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Feb 2017 17:35:53 -0500 Message-Id: <20170221223553.65520-3-vittorio.giovara@gmail.com> X-Mailer: git-send-email 2.10.0 In-Reply-To: <20170221223553.65520-1-vittorio.giovara@gmail.com> References: <20170221223553.65520-1-vittorio.giovara@gmail.com> Subject: [FFmpeg-devel] [PATCHv3 3/3] mkv: Export bounds and padding from spherical metadata X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/matroskadec.c | 64 ++++++++++++++++++++++++++++++++-- tests/ref/fate/matroska-spherical-mono | 6 +++- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 7223e94..0a02237 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1913,16 +1913,65 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track) AVSphericalMapping *spherical; enum AVSphericalProjection projection; size_t spherical_size; + size_t l, t, r, b; + size_t padding = 0; int ret; + GetByteContext gb; + + bytestream2_init(&gb, track->video.projection.private.data, + track->video.projection.private.size); + + if (bytestream2_get_byte(&gb) != 0) { + av_log(NULL, AV_LOG_WARNING, "Unknown spherical metadata\n"); + return 0; + } + + bytestream2_skip(&gb, 3); // flags switch (track->video.projection.type) { case MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR: - projection = AV_SPHERICAL_EQUIRECTANGULAR; + if (track->video.projection.private.size == 0) + projection = AV_SPHERICAL_EQUIRECTANGULAR; + else if (track->video.projection.private.size == 20) { + t = bytestream2_get_be32(&gb); + b = bytestream2_get_be32(&gb); + l = bytestream2_get_be32(&gb); + r = bytestream2_get_be32(&gb); + + if (b >= UINT_MAX - t || r >= UINT_MAX - l) { + av_log(NULL, AV_LOG_ERROR, + "Invalid bounding rectangle coordinates " + "%zu,%zu,%zu,%zu\n", l, t, r, b); + return AVERROR_INVALIDDATA; + } + + if (l || t || r || b) + projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE; + else + projection = AV_SPHERICAL_EQUIRECTANGULAR; + } else { + av_log(NULL, AV_LOG_ERROR, "Unknown spherical metadata\n"); + return AVERROR_INVALIDDATA; + } break; case MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP: - if (track->video.projection.private.size < 4) + if (track->video.projection.private.size < 4) { + av_log(NULL, AV_LOG_ERROR, "Missing projection private properties\n"); + return AVERROR_INVALIDDATA; + } else if (track->video.projection.private.size == 12) { + uint32_t layout = bytestream2_get_be32(&gb); + if (layout == 0) { + projection = AV_SPHERICAL_CUBEMAP; + } else { + av_log(NULL, AV_LOG_WARNING, + "Unknown spherical cubemap layout %"PRIu32"\n", layout); + return 0; + } + padding = bytestream2_get_be32(&gb); + } else { + av_log(NULL, AV_LOG_ERROR, "Unknown spherical metadata\n"); return AVERROR_INVALIDDATA; - projection = AV_SPHERICAL_CUBEMAP; + } break; default: return 0; @@ -1937,6 +1986,15 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track) spherical->pitch = (int32_t)(track->video.projection.pitch * (1 << 16)); spherical->roll = (int32_t)(track->video.projection.roll * (1 << 16)); + spherical->padding = padding; + + if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) { + spherical->bound_left = l; + spherical->bound_top = t; + spherical->bound_right = r; + spherical->bound_bottom = b; + } + ret = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, (uint8_t *)spherical, spherical_size); if (ret < 0) { diff --git a/tests/ref/fate/matroska-spherical-mono b/tests/ref/fate/matroska-spherical-mono index 8048aff..a70d879 100644 --- a/tests/ref/fate/matroska-spherical-mono +++ b/tests/ref/fate/matroska-spherical-mono @@ -8,7 +8,11 @@ inverted=0 [SIDE_DATA] side_data_type=Spherical Mapping side_data_size=56 -projection=equirectangular +projection=tiled equirectangular +bound_left=148 +bound_top=73 +bound_right=147 +bound_bottom=72 yaw=45 pitch=30 roll=15