From patchwork Mon Jun 10 18:44:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49773 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2724455vqo; Mon, 10 Jun 2024 11:44:44 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWFpOpMujHOO08RrgKigSYv9ZDViNvpn3D0Nu1mSgAOJBW/zUcdmlftDFpmNsuekLBWP6Yn+QYbMpyGqW/IpxQJTfOLWw1rkmDzeA== X-Google-Smtp-Source: AGHT+IHda66iEh0l5xIRnzs+IHQKtkTVgipbfhapCLnaDJ1iT7KZdq6NyPUot1D7fIB/WEQFAwjG X-Received: by 2002:a50:9b46:0:b0:578:6959:9d36 with SMTP id 4fb4d7f45d1cf-57c506c1b39mr6812236a12.0.1718045083989; Mon, 10 Jun 2024 11:44:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718045083; cv=none; d=google.com; s=arc-20160816; b=bLsDuYutkOtzNMkW4RVZ7Ll/qAeHjmufdHlSOE91pYbZdqDwoUcHR92prnyEL5Ebwy PufKK115i39tKjL3THy9dgcnFIPheTw8oCwet7hYNFam73kJPBTWt3lbE7uwAmc4uCgg LeUXscJHlp4/xLkiHrqcAScpOj3XahE6qXN7ZzR6hg2CQd2sLprFVgGNl1nzPIDjpfLm UK+zpUDTTNHSBFo44iUBKiaca4m+2/bx0U6LHilHuU/XiyS1zjTHMr1GOZpz8vfN1JPi 8S4s/WbQ0ss8cz1qutBTcJU0VuIDPzeEPUDPUSbVYvLphAM5Ybg+FsSU8rbDfS5bYF6E y+7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=YA2JGmprXidUww9EEZei8SVgomN4EziROg2gKnf785M=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Pb2a9N5/EA2Jh2pMrUFQmn3oNuPX90bs/jatHP/NeeuX1/LNHk69eNQhSy0qgybhKI QUo+n89OTuxGmwDmofbdBzSPwdnx6Ks9RQ4QfJ0xBjte3fiQ2x1qGb2D4uZVs7CAaAwR 6tNrlyXqbw+t/TBgn9a3I6BRJwjocRA2CRPDbSZsI1UNlsxAgbxXySXKqV98cBEEGUo+ zPQP1A5ElFstebN2YiRpf/w8u4o7qeGrGDmR/iHPNj4Yh0NHa5Ho4e9YjhcNOV63m6p/ abU+lP7uVQrqa6qbX9wqU/8qGawnxUsndcVn5TaKX4ebZOsWL6fvodkxO5m7t6Mik5o/ SiqA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=GOf01xr2; 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 4fb4d7f45d1cf-57c90fc95b3si123850a12.243.2024.06.10.11.44.42; Mon, 10 Jun 2024 11:44:43 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=GOf01xr2; 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 4319168D79A; Mon, 10 Jun 2024 21:44:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6921668D6D7 for ; Mon, 10 Jun 2024 21:44:22 +0300 (EEST) Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-42122ac2f38so29301775e9.1 for ; Mon, 10 Jun 2024 11:44:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718045061; x=1718649861; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=rSgl6RAgJtMupYizncaIz9vuI9oa1l1MHXA7Bfd9Qog=; b=GOf01xr2b3cOnpBzQcGtfcluCQNH6oe8Wrwfk41dQI4YefYlszPojBPrv9QHze3NKD EWAyZvN7VIlrN2vzlz6ZShURKz9Ya9huY/PWRI5Lv5/PJ5Sm49RY69X194e+ZBLezk11 bYW7gqYK58WPWesMLZno8UTXN3Dj5xKTYwQPzto0bIeYiTYRQy+RL1uNXflRir/vIE5f pP/sFQNyjZAUCuENOV/WmqIGzULCZXg1LS+4S2ki8qqJEOsvUCAeVhzZjzMTQFeMau4R lS9BQrX6vXDBNCOP3tYmtX+9eM0ImoUCVqrVxTxAUN2G6MlN3gn2HTZBN/S3c8seBWwu hCwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718045061; x=1718649861; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rSgl6RAgJtMupYizncaIz9vuI9oa1l1MHXA7Bfd9Qog=; b=np2NohsSPCvBKD8EbK0UiBg19Nzd5a8lYYjylecXkq9Er5pamFgSIvMZ0Q6lffFSs9 Tuphmsej3kAA1GCCV6GbBLEe2yLExZVnm5/Yh271fF34wd17GnHMqF+BwCrGsB4dxk3I AcivwJX4iKecs7ZFusAXXIJxv+Nz5HrRsgVHKtIpZ8rIpS3GmjodGYwK5bN/0nfJocSc Zu6O65SMKp1G845bRdI+1BHcJrqzmt7RQYJJhpu6RKOXbeRXdz4pJiHAgo17Po2s9qhF iCq89PcsB6Ffxm7TSq6lPXI8RF6I2Cqu3Jt7/clVJE2BaBALi2eolUXauPFgzjWA/Lnv IdJw== X-Gm-Message-State: AOJu0Yx/E5w2R44rdEvurnX6bc7SXFcWXgaO1a5Lg+X+uh7wSHJE3dAf oHt6fXW7yzXbD4SqtoISRt/CI+5kaT6cYIVMLMBB/Syx5fY9E3sJOvM22Q== X-Received: by 2002:a05:600c:5108:b0:422:fdb:efb3 with SMTP id 5b1f17b1804b1-4223c6617c7mr5010565e9.12.1718045060748; Mon, 10 Jun 2024 11:44:20 -0700 (PDT) Received: from localhost.localdomain ([51.191.0.41]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4218193b0c0sm64659165e9.31.2024.06.10.11.44.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 11:44:20 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Jun 2024 19:44:03 +0100 Message-ID: <20240610184408.68171-2-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240610184408.68171-1-derek.buitenhuis@gmail.com> References: <20240610184408.68171-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/5] avutil/spherical: Add more spherical types X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ob9yENdx0G8M These originate from the Apple Vision Pro, and are documented here: https://developer.apple.com/documentation/coremedia/cmprojectiontype Signed-off-by: Derek Buitenhuis --- libavutil/spherical.c | 3 +++ libavutil/spherical.h | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/libavutil/spherical.c b/libavutil/spherical.c index 800d3459a5..d78f98f945 100644 --- a/libavutil/spherical.c +++ b/libavutil/spherical.c @@ -57,6 +57,9 @@ static const char *const spherical_projection_names[] = { [AV_SPHERICAL_EQUIRECTANGULAR] = "equirectangular", [AV_SPHERICAL_CUBEMAP] = "cubemap", [AV_SPHERICAL_EQUIRECTANGULAR_TILE] = "tiled equirectangular", + [AV_SPHERICAL_HALF_EQUIRECTANGULAR] = "half equirectangular", + [AV_SPHERICAL_RECTANGULAR] = "rectangular", + [AV_SPHERICAL_FISHEYE] = "fisheye", }; const char *av_spherical_projection_name(enum AVSphericalProjection projection) diff --git a/libavutil/spherical.h b/libavutil/spherical.h index 828ac836da..118fbcc3d1 100644 --- a/libavutil/spherical.h +++ b/libavutil/spherical.h @@ -66,6 +66,22 @@ enum AVSphericalProjection { * the position of the current video in a larger surface. */ AV_SPHERICAL_EQUIRECTANGULAR_TILE, + + /** + * Video frame displays as a 180 degree equirectangular projection. + */ + AV_SPHERICAL_HALF_EQUIRECTANGULAR, + + /** + * Video contentframe displays on a flat, rectangular 2D surface. + */ + AV_SPHERICAL_RECTANGULAR, + + /** + * Fisheye projection (Apple). + * See: https://developer.apple.com/documentation/coremedia/cmprojectiontype/fisheye + */ + AV_SPHERICAL_FISHEYE, }; /** From patchwork Mon Jun 10 18:44:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49774 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2724515vqo; Mon, 10 Jun 2024 11:44:52 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXlGuuhYFVWhOUXcttK5eqSARjxo1Hijrx/PwXjVyZIgJz0hSB5S01CVQy23GxFiSbAujEvk1PsZhkB3liDzNV/8lxJxW38ZqfYUA== X-Google-Smtp-Source: AGHT+IF6Oql5JpTBs7fNcrpYPgUw/+WIZemdUniwrk+IP/8dU1fqFBD03T/zBVv2omt87gAEwEL4 X-Received: by 2002:a05:6512:2348:b0:52c:9055:b257 with SMTP id 2adb3069b0e04-52c9055b46cmr1055507e87.44.1718045092573; Mon, 10 Jun 2024 11:44:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718045092; cv=none; d=google.com; s=arc-20160816; b=gksEZS6BHJPslEHh7xLEvL2Xbmk5PoOceZT+bdrjU5/w4NlP3Bt20eZSfruYwnWbA/ GMUzg5q4PWITGSXJbUSn8KlzcxR/45XsbKUUmSX3s8gIktjPreL/uoxrasDJZnRBb3ky SlcFP8jVgiHhrgbmxcIhjZq3Bt6YOoUcLBAcJzqP6NdNxc6H6O7j6d8K8XJO51yeHN/z agmqjAFBgnSdfE+dQ+3J3MpAI3AlaJHcy0DcUgUWbSnJ9KGVvaBAfERZYxCofKHgAhEg p77zIZpTSp6agYQGzNAy3widEZd9w7kx+JmrMedCYpEv7RvL5W5v09z3147b06fTqYb7 oMEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=P+S0dInchLMZoMsYoh+T6H0WQAaGnEGb9WpPhl45BHo=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=x7gZJHTK562YXbwHCgohygv/K5XefJMBcA14LYSHUJD7zGWs6asqjfdxLvudbCj/27 Yj0BWM1AXYeVDyWZYgQl3SvDe17THPppxIfPsyGkkkOav6xGiDWKF4HAiWDYKkuZxXeg pWI/l2OpXQXsb1gpouzl2s9tgFuDbTW5F5cI8y6dpGqJ4CWt27CmryN5fg297eg04hLD 5FyYT2VI8YVT8uRogg7dseMsRYGU6A5SN+DQjh9zMothrrHLiuIwawT5ZFW/2uI6Fynv NIz/yldd1Ln/tRJyJdWIPrZJvgdk80KHJABRjUNiIwBq93nc31w6G6PezDfgyhXL0jM3 clug==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=jNcZ5vtE; 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 2adb3069b0e04-52c902c6c0csi208291e87.636.2024.06.10.11.44.52; Mon, 10 Jun 2024 11:44:52 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=jNcZ5vtE; 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 499D668D5E3; Mon, 10 Jun 2024 21:44:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D56FD68D6EC for ; Mon, 10 Jun 2024 21:44:22 +0300 (EEST) Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-421d32fda86so12527985e9.0 for ; Mon, 10 Jun 2024 11:44:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718045062; x=1718649862; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=dQGf/6/jFlhhew6Rka6Rg8tBjey/2nDYwUZr6c9waLg=; b=jNcZ5vtE7jwHOrsCz/6I0gxJL6tWEmYNELk4F8oIDb0Afc0ZC9QSywbNvPt+Ca1TnH XtYuUXOjviCm8wyvrJjWaD896K3sg4C38CzE5ew5y5T1QHmmsrDS7z5S+pU+2dYhnXPg 3Fd7YZP/3QE/Ah22bTj0OKwL1Dm7tz7gsOqYeSmk1a5z1BBfY9qd7v3dPE+OSwQ8weMB tw/Bj79xZ28GEce1l/p6meeKzoLR/U7hpQYW9JDn+4Km/8MHJr9bkKBh/bRsZS8Rrflo OdUvIPbC3v5rBg6dwVZyYMnIFHD0jCgrcb1ksABeyay1eb+O0a/XDry9y0f39LbGMvnw DTEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718045062; x=1718649862; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dQGf/6/jFlhhew6Rka6Rg8tBjey/2nDYwUZr6c9waLg=; b=cvWRnCHKz3CWl89BKs2y1R2mdrnN6f1Qf8rlS/unOhB15y7wvj32BwNl2YT82wDHan rMAoEIPzO4W5ZtQ375zRL5CaH2Za//84cSUzo8AmQL5lcCKTJgFdyE+Y9ldo3XHSDRUs zD1712U6u10Y0dvD/jqRLwyRXI6MlOSJbHa0rbtmju/lwX/ZgsmrkNlcrTHTKRU+Yj3N vUKnP1ExUwjI2jBD5T+HWpZ911wbmysP71hke3fMz9TOjp0rBLUHvesOSSaBx8dm09A0 lLK/7tNj6VZ6+K31A18Hqiwp/+37wx6M0Tk3cJ1M3NUGih8vGbSrtT989qF1YnLfcKF2 17jg== X-Gm-Message-State: AOJu0YzdZm9SRCdfBvhzObgoNaAOsaHwAs4sWOQzPvqUUPaRuQkpdSPw +KDhXjayDoq1PFj+/wQiRKbUsU9H6gZqmq+iv0R79TXSrdefHCmLlEMANg== X-Received: by 2002:a05:600c:1913:b0:421:756f:b2e8 with SMTP id 5b1f17b1804b1-421756fb522mr73470975e9.11.1718045061723; Mon, 10 Jun 2024 11:44:21 -0700 (PDT) Received: from localhost.localdomain ([51.191.0.41]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4218193b0c0sm64659165e9.31.2024.06.10.11.44.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 11:44:21 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Jun 2024 19:44:04 +0100 Message-ID: <20240610184408.68171-3-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240610184408.68171-1-derek.buitenhuis@gmail.com> References: <20240610184408.68171-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/5] avutil/stereo3d: Fill out stereo info provided by Vision Pro files X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Ru0kQ7487fUt Based on what is in the files themselves, and what the API provides to users. URLs: * https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_heroeye * https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_stereocamerabaseline * https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_horizontaldisparityadjustment * https://developer.apple.com/documentation/coremedia/kcmformatdescriptionextension_horizontalfieldofview Signed-off-by: Derek Buitenhuis --- libavutil/stereo3d.c | 52 ++++++++++++++++++++++++++++ libavutil/stereo3d.h | 80 ++++++++++++++++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 3 files changed, 133 insertions(+), 1 deletion(-) diff --git a/libavutil/stereo3d.c b/libavutil/stereo3d.c index 9c29ab01b5..a40a9439bb 100644 --- a/libavutil/stereo3d.c +++ b/libavutil/stereo3d.c @@ -55,6 +55,18 @@ static const char * const stereo3d_type_names[] = { [AV_STEREO3D_COLUMNS] = "interleaved columns", }; +static const char * const stereo3d_view_names[] = { + [AV_STEREO3D_VIEW_PACKED] = "packed", + [AV_STEREO3D_VIEW_LEFT] = "left", + [AV_STEREO3D_VIEW_RIGHT] = "right", +}; + +static const char * const stereo3d_primary_eye_names[] = { + [AV_PRIMARY_EYE_NONE] = "none", + [AV_PRIMARY_EYE_LEFT] = "left", + [AV_PRIMARY_EYE_RIGHT] = "right", +}; + const char *av_stereo3d_type_name(unsigned int type) { if (type >= FF_ARRAY_ELEMS(stereo3d_type_names)) @@ -74,3 +86,43 @@ int av_stereo3d_from_name(const char *name) return -1; } + +const char *av_stereo3d_view_name(unsigned int view) +{ + if (view >= FF_ARRAY_ELEMS(stereo3d_view_names)) + return "unknown"; + + return stereo3d_view_names[view]; +} + +int av_stereo3d_view_from_name(const char *name) +{ + int i; + + for (i = 0; i < FF_ARRAY_ELEMS(stereo3d_view_names); i++) { + if (av_strstart(name, stereo3d_view_names[i], NULL)) + return i; + } + + return -1; +} + +const char *av_stereo3d_primary_eye_name(unsigned int eye) +{ + if (eye >= FF_ARRAY_ELEMS(stereo3d_primary_eye_names)) + return "unknown"; + + return stereo3d_primary_eye_names[eye]; +} + +int av_stereo3d_primary_eye_from_name(const char *name) +{ + int i; + + for (i = 0; i < FF_ARRAY_ELEMS(stereo3d_primary_eye_names); i++) { + if (av_strstart(name, stereo3d_primary_eye_names[i], NULL)) + return i; + } + + return -1; +} diff --git a/libavutil/stereo3d.h b/libavutil/stereo3d.h index 3aab959b79..6efbb09b32 100644 --- a/libavutil/stereo3d.h +++ b/libavutil/stereo3d.h @@ -158,6 +158,26 @@ enum AVStereo3DView { AV_STEREO3D_VIEW_RIGHT, }; +/** + * List of possible primary eyes. + */ +enum AVStereo3DPrimaryEye { + /** + * Neither eye. + */ + AV_PRIMARY_EYE_NONE, + + /** + * Left eye. + */ + AV_PRIMARY_EYE_LEFT, + + /** + * Right eye + */ + AV_PRIMARY_EYE_RIGHT, +}; + /** * Inverted views, Right/Bottom represents the left view. */ @@ -185,6 +205,28 @@ typedef struct AVStereo3D { * Determines which views are packed. */ enum AVStereo3DView view; + + /** + * Which eye is the primary eye when rendering in 2D. + */ + enum AVStereo3DPrimaryEye primary_eye; + + /** + * The distance between the centres of the lenses of the camera system, + * in micrometers. Zero if unset. + */ + uint32_t baseline; + + /** + * Relative shift of the left and right images, which changes the zero parallax plane. + * Range -10000 to 10000, mapped to -1.0 to 1.0. Zero if unset. + */ + int32_t horizontal_disparity_adjustment; + + /** + * Horizontal field of view in thousanths of a degree. Zero if unset. + */ + uint32_t horizontal_field_of_view; } AVStereo3D; /** @@ -222,6 +264,44 @@ const char *av_stereo3d_type_name(unsigned int type); */ int av_stereo3d_from_name(const char *name); +/** + * Provide a human-readable name of a given stereo3d view. + * + * @param type The input stereo3d view value. + * + * @return The name of the stereo3d view value, or "unknown". + */ +const char *av_stereo3d_view_name(unsigned int view); + +/** + * Get the AVStereo3DView form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DView value, or -1 if not found. + */ +int av_stereo3d_view_from_name(const char *name); + +/** + * Provide a human-readable name of a given stereo3d primary eye. + * + * @param type The input stereo3d primary eye value. + * + * @return The name of the stereo3d primary eye value, or "unknown". + */ +const char *av_stereo3d_primary_eye_name(unsigned int eye); + +/** + * Get the AVStereo3DPrimaryEye form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DPrimaryEye value, or -1 if not found. + */ +int av_stereo3d_primary_eye_from_name(const char *name); + + + /** * @} */ diff --git a/libavutil/version.h b/libavutil/version.h index 9d08d56884..bd4c5a2ab3 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 21 +#define LIBAVUTIL_VERSION_MINOR 22 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Mon Jun 10 18:44:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49775 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2724599vqo; Mon, 10 Jun 2024 11:45:03 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUfDMJUdB+Tq4ioFs5tnSMIHqs6mTD8PsjdB7YxVaKxgTFp8WIr4fl4iMGSTUzXU7MHnTuvJhWi80E9ZEwu3eqNMhYv7gdLQa/dOA== X-Google-Smtp-Source: AGHT+IE9jVs5DvARd2LJhpcaJ5k2EZFUvKL5IcGGFzuZl8q0L1BACz6+5Z0Fe1UwOPHQJQ9vJ0e9 X-Received: by 2002:a17:906:45a:b0:a6f:7c8:4fd6 with SMTP id a640c23a62f3a-a6f07c8518bmr445199466b.0.1718045101229; Mon, 10 Jun 2024 11:45:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718045101; cv=none; d=google.com; s=arc-20160816; b=cN6o+Tz+wtmq/t9wxKLpY/AYbAYOdxsbZwbeq3lhfOhMP/oZz6c1563jZdNwpl1r84 MPru6WHqk4QlE2sin2QXWGfipdoLJdVimH36X7MgmIspjsH8+Lks69GeVe5TVgF9oDjz URsDvlVlBCNAUVX2vxZ13S8YNJdrCKgSO1QDVUS9vl6lnIQ/hgSgpGDE1ujoiDp9w9y3 M3jh8pNTDR5Smu3TOZCkxZYWCInLML+trlNkzEJ9y4Gch8XDhcuL3tYq1+qx9DbhZjqL 9pFwnvX6Nd0Xc2SPLRvbfNMyNDnR+oem8kiTZRnAju3KIsayBVzluR5bg0q3VdbZamE3 2Dng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=q/YmIlW8giVPzJg/r/Nhk46+LHQeNCO3/VLQbkbvPTI=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=yR9WWL+QdicYTwLbfYJsK4XQKdj4nKZOkorCgAP9WRoLzXguSmp1zpUPDpraKmsALz yAL7XR/A9hECFYYx21fCEZgCv1perdBCJJ49mlXv8r3MHsDe2Wp6Ewi3rQ94ISdYM5MH vEmbi6UgySGgybRWxoF53tbTwtM397satNqTSYtu3vfLOuUuf4pZiOBhZWmdwBUVlTyW vBpyOH2wJbSwY9kalwd3rvPhBUqqUwr8VmqqGxw4ZeOWBMTgAP8bisyJ5+p51SgTNmsl pRYYr7aJvukCRQDAjyTsrv/RAeeiGRDi6axpUP8TsBAGkThIPpzyxd/UqHwFFjh3iR4M zJLQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=fCyllRfa; 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 a640c23a62f3a-a6e98261e59si341295366b.185.2024.06.10.11.45.00; Mon, 10 Jun 2024 11:45:01 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=fCyllRfa; 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 AD5B168D6BD; Mon, 10 Jun 2024 21:44:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B6AD568D77E for ; Mon, 10 Jun 2024 21:44:24 +0300 (EEST) Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-42198492353so2543765e9.1 for ; Mon, 10 Jun 2024 11:44:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718045063; x=1718649863; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=THGrnj/IKOOmpIyReB3VWcdnKq7UGlqWPOmLYYPhWVQ=; b=fCyllRfaQki5B8GmJALVE/TiKToJkwcyHRJomyCzK+HWBFx8TQPHr/njyDP2HNYuTW JPvtilgJFyure/Ac055nkA49h3tlJiaF0R0qxykbWmVneCA+AZsTwvP/zidNw9sk4+Fv hWTT23N88KZ5nKUHL673a09AxV65S2aTqpUan/DKv+5TzazrsxgKZtT1zDSgDxOGJbnP P4xxDnWa7iK/4gttvQ2CEKn+4bHxgnNO+FT7zZQcwtm1vSr8fdltoEHc0G9vEp+iyNAZ XLoI+sEYY4tazocnhC/oSHPFIPFBEq/zggZ7k52NH021Y7ZBtKwNVfVYmAldqbHO7kgx Iecg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718045063; x=1718649863; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=THGrnj/IKOOmpIyReB3VWcdnKq7UGlqWPOmLYYPhWVQ=; b=SP662ktM2Z/jGcnwKpMhP8BGh2rmKG2jM/K4Nw2WoPyCmWBX49GWEoU3OrT9NLcOQB R3VZn+prwQIbYptGCPNzE7cWxeD6IG5Z5SyrAlG0+/2OjAh6gHdSJbnvDa3wk1NV6DNk M6TZuBEatue82qlkcMxyCdlfOK/m+xkUhntaTVlYyBtoCuhwjbQTy01I7T4sQXvecWjK SsQuyu2ls5m5LiDX+EGzNsYliONlduULL33d5MebXCaYVWjMoPq1fiNTXICNaQ7rGJJF xhJYv8TJNN6bQ/yOI6yH5Eh6WjydwjC21X652gKsZAWmW1unjPrb3+ExJL3f4Q28kAuf jjPA== X-Gm-Message-State: AOJu0YzzYRvcQ8rBA8VTNJqVL66XQzxnZPh+LeAQvL5G+hmQ6uFcvlwr hV7cwcLYvyJBx/eb9pfONKpfO6cknV5hrX61fvB+lvcyZpUpfsf6GbmJRw== X-Received: by 2002:a05:600c:3d95:b0:421:5609:115d with SMTP id 5b1f17b1804b1-42164a510afmr63235215e9.41.1718045063414; Mon, 10 Jun 2024 11:44:23 -0700 (PDT) Received: from localhost.localdomain ([51.191.0.41]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4218193b0c0sm64659165e9.31.2024.06.10.11.44.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 11:44:22 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Jun 2024 19:44:05 +0100 Message-ID: <20240610184408.68171-4-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240610184408.68171-1-derek.buitenhuis@gmail.com> References: <20240610184408.68171-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/5] fftools/ffprobe: Print more Stereo 3D info from side data X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: AM/cm8xMVR0m Signed-off-by: Derek Buitenhuis --- fftools/ffprobe.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 2d38e5dfdc..082cec8a64 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -2544,6 +2544,14 @@ static void print_pkt_side_data(WriterContext *w, const AVStereo3D *stereo = (AVStereo3D *)sd->data; print_str("type", av_stereo3d_type_name(stereo->type)); print_int("inverted", !!(stereo->flags & AV_STEREO3D_FLAG_INVERT)); + print_str("view", av_stereo3d_view_name(stereo->view)); + print_str("primary_eye", av_stereo3d_primary_eye_name(stereo->primary_eye)); + if (stereo->baseline) + print_int("baseline", stereo->baseline); + if (stereo->horizontal_disparity_adjustment) + print_int("horizontal_disparity_adjustment", stereo->horizontal_disparity_adjustment); + if (stereo->horizontal_field_of_view) + print_int("horizontal_field_of_view", stereo->horizontal_field_of_view); } else if (sd->type == AV_PKT_DATA_SPHERICAL) { const AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data; print_str("projection", av_spherical_projection_name(spherical->projection)); From patchwork Mon Jun 10 18:44:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49776 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2724656vqo; Mon, 10 Jun 2024 11:45:11 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVN/UpJWwp7sHFl6Cjs3XMyNb1/5P/DK0ZCNMVV0x6aqpREzvGz6knImtbEqQeWfo2cfNpot2f94YI4gqeBvO3qwaqMk3zaSn3gPw== X-Google-Smtp-Source: AGHT+IEseesrgBnwWD09wr0xQg0nGxVjhzfdwnw2PMaUh60s+uQuEGyxuKK2cVKww/5W5Q0Uu7cW X-Received: by 2002:a50:8748:0:b0:57c:5eca:a333 with SMTP id 4fb4d7f45d1cf-57c90c1b2ffmr379282a12.5.1718045111053; Mon, 10 Jun 2024 11:45:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718045111; cv=none; d=google.com; s=arc-20160816; b=pJt6l9iN3ByK+DZIM+CyxjOPHqckdQB29MKaju/2CtX+dPdPsix4zAGzrDZnwSA4Ya ukPnzTtOOK72miuyVDMRj6WeU31rC29EAqK2DujojgrRdJI+PNpV1crPmhYI8rFmJnWh /UDOsLDgEp3lVMyFwHI20oXN5N3k5Ne7w03t7KMVPZbm2DJQA7wURX0rHtr+8S766NRk 0bxIKx4ouOMIxY2vREz750FnTvXrqcorrqN9QhwDCZrXI2fnl7r0iaTVciSogxdCq6C0 gUalMN3XqcVEhEH+zB9OhJWZQh6KFUVR/bUreqFMFl6014YTit8tVZpDsDl/sXKDI5Jn 81zg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=eiJCvpdyJaS8OJMoO+Bcizb+RQsYcuE/1sgdcUQb3p4=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=GEBbs87I83tMEa6QFO4I89950i7rI2X0ose95nQDGzHEd0eAkRskK3F4tc558mLfyG fh0x+K7SIj7nhiEPADGok8hH028EzgYdXKImdvhkh/C2gT3xmA5b4nAbOeRLAe+wKXk6 YPHqoVBFZZxpGa9opSwSfpn1PsS0Z3f4ar2p8PDbMlsnYF09vJP5wKAZSWHnAnyVZAr5 r8+CUY3Y23G3eNZt1v1YAYah4MX2qgZFstJZZutboeL0X6ZGUzybWo0e7VXGN+NLXfyv t2H9h1kTP6s4XNkkClxk5TCDznjjYKTzcs1/tVZmEfYPZIVvfoKmVWHhUdysZuclIZ0r 7N0w==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=Cc95IH1n; 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 4fb4d7f45d1cf-57c6e971d99si2821680a12.514.2024.06.10.11.45.10; Mon, 10 Jun 2024 11:45:11 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=Cc95IH1n; 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 D721968D7AC; Mon, 10 Jun 2024 21:44:33 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9719068D7AE for ; Mon, 10 Jun 2024 21:44:26 +0300 (EEST) Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-42179dafd6bso14905005e9.0 for ; Mon, 10 Jun 2024 11:44:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718045065; x=1718649865; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=qVCr9dC5yUZThd2X17+Uy6UV3siOlYPXFdum/UIeE5M=; b=Cc95IH1nssKhIJmWYgkqWMfN0A1Zp3mWcNP6JQa822OWTiKasfVGG8a3vKqKwpIUxi Fkj6ducbckUN8NXVRje8cr2C/4wx6wAIfn2G2AZlCx/bZYmo0PQicvF/9gUPd31+HZ0H kKFZ6RiyZfUAOyqjFuRGxA2Gtz45fulWPk2hSLNeGJtByOOLZgjvW7PVRh8NFp6JQPMm iP5z0pThDdXapQjvso8GEaTsR+rJhOC2qEmxunT07gKKzIuKLNrvji5flltGzFLPlXjl iYF9wIYbF0Uzp1mT3+ZP6XKvUTtJ/WpEZYxov0DZyhuU+9+xyNhTzAjz36H9GRsLUO+J MR2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718045065; x=1718649865; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qVCr9dC5yUZThd2X17+Uy6UV3siOlYPXFdum/UIeE5M=; b=D9KHuR1jHnb78mVQTh+s/HdyZvHI4gw5EhA+FVyLmImTuOTMhiDAiZ1wf/OXqQXZJX T8RX7dV3Rs4kDfDMrKYMp9gvF/l1VQxGY8/SkR4nKlrFws+UXqbFq7fSdbmygB/JRX/d hHokvChElrDL+20Xuloja+G+9iWEN8l1FldxNsClmd8adWsJ3Rksr8YiiBZgsgi71eNc UvtPOm520F2aHmU017d0dM+6G36L2GoxnPraK+RLCes4iYpDyoYFa8jE6KXA7PzY22To MwVk5gVVQYYpxt9PLTgswa9/H08ozvF2HUFcj2ZOZOx98dJX7chHq6Riav8BY0cweuxu NlDg== X-Gm-Message-State: AOJu0Yz0p9vIl455cXaeYYxqHBOv7fdbsbABoSoNWxaCXgsA267wYT4O /qEiycPfj7JSEPYrw3DEYffi7fi8OABCIwmXoSHolRvWIHotMj/4IVcesg== X-Received: by 2002:adf:ef06:0:b0:35f:1796:3394 with SMTP id ffacd0b85a97d-35f2b27bd92mr553498f8f.8.1718045064975; Mon, 10 Jun 2024 11:44:24 -0700 (PDT) Received: from localhost.localdomain ([51.191.0.41]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4218193b0c0sm64659165e9.31.2024.06.10.11.44.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 11:44:23 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Jun 2024 19:44:06 +0100 Message-ID: <20240610184408.68171-5-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240610184408.68171-1-derek.buitenhuis@gmail.com> References: <20240610184408.68171-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/5] avformat/mov: Add support for exporting Video Extension Usage info X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: DBEXPE36vy4T This box is provided by files created by the Apple Vision Pro, as well as the iPhone 15+ when capture for Vision Pro is enabled. The boxes are a mix of things documented by Apple in some PDFs, their API docs, and reverse engineering. Ideally we will have a real spec one day. Links: * https://developer.apple.com/av-foundation/Stereo-Video-ISOBMFF-Extensions.pdf * https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_horizontaldisparityadjustment * https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_stereocamerabaseline * https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_heroeye Signed-off-by: Derek Buitenhuis --- libavformat/mov.c | 279 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) diff --git a/libavformat/mov.c b/libavformat/mov.c index 160e9626d7..b164bb0adb 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -6477,6 +6477,284 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_vexu_proj(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + MOVStreamContext *sc; + int size; + uint32_t tag; + enum AVSphericalProjection projection; + + if (c->fc->nb_streams < 1) + return 0; + + st = c->fc->streams[c->fc->nb_streams - 1]; + sc = st->priv_data; + + if (atom.size != 16) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size for proj box: %"PRIu64"\n", atom.size); + return AVERROR_INVALIDDATA; + } + + size = avio_rb32(pb); + if (size != 16) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size for prji box: %d\n", size); + return AVERROR_INVALIDDATA; + } + + tag = avio_rl32(pb); + if (tag != MKTAG('p','r','j','i')) { + av_log(c->fc, AV_LOG_ERROR, "Invalid child box of proj box: 0x%08X\n", tag); + return AVERROR_INVALIDDATA; + } + + avio_skip(pb, 1); // version + avio_skip(pb, 3); // flags + + tag = avio_rl32(pb); + switch (tag) { + case MKTAG('r','e','c','t'): + projection = AV_SPHERICAL_RECTANGULAR; + break; + case MKTAG('e','q','u','i'): + projection = AV_SPHERICAL_EQUIRECTANGULAR; + break; + case MKTAG('h','e','q','u'): + projection = AV_SPHERICAL_HALF_EQUIRECTANGULAR; + break; + case MKTAG('f','i','s','h'): + projection = AV_SPHERICAL_FISHEYE; + break; + default: + av_log(c->fc, AV_LOG_ERROR, "Invalid projection type in prji box: 0x%08X\n", tag); + return AVERROR_INVALIDDATA; + } + + sc->spherical = av_spherical_alloc(&sc->spherical_size); + if (!sc->spherical) + return AVERROR(ENOMEM); + + sc->spherical->projection = projection; + + return 0; +} + +static int mov_read_eyes(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + MOVStreamContext *sc; + int size, flags = 0; + int64_t remaining; + uint32_t tag, baseline = 0; + enum AVStereo3DView view = AV_STEREO3D_VIEW_PACKED; + enum AVStereo3DPrimaryEye primary_eye = AV_PRIMARY_EYE_NONE; + int32_t horizontal_disparity_adjustment = 0; + + if (c->fc->nb_streams < 1) + return 0; + + st = c->fc->streams[c->fc->nb_streams - 1]; + sc = st->priv_data; + + remaining = atom.size; + while (remaining > 0) { + size = avio_rb32(pb); + if (size < 8 || size > remaining ) { + av_log(c->fc, AV_LOG_ERROR, "Invalid child size in eyes box\n"); + return AVERROR_INVALIDDATA; + } + + tag = avio_rl32(pb); + switch (tag) { + case MKTAG('s','t','r','i'): { + int has_right, has_left; + uint8_t tmp; + if (size != 13) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size of stri box: %d\n", size); + return AVERROR_INVALIDDATA; + } + avio_skip(pb, 1); // version + avio_skip(pb, 3); // flags + + tmp = avio_r8(pb); + + // eye_views_reversed + if (tmp & 8) { + flags |= AV_STEREO3D_FLAG_INVERT; + } + // has_additional_views + if (tmp & 4) { + // skip... + } + + has_right = tmp & 2; // has_right_eye_view + has_left = tmp & 1; // has_left_eye_view + + if (has_left && has_right) + view = AV_STEREO3D_VIEW_PACKED; + else if (has_left) + view = AV_STEREO3D_VIEW_LEFT; + else if (has_right) + view = AV_STEREO3D_VIEW_RIGHT; + break; + } + case MKTAG('h','e','r','o'): { + int tmp; + if (size != 13) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size of hero box: %d\n", size); + return AVERROR_INVALIDDATA; + } + avio_skip(pb, 1); // version + avio_skip(pb, 3); // flags + + tmp = avio_r8(pb); + if (tmp == 0) + primary_eye = AV_PRIMARY_EYE_NONE; + else if (tmp == 1) + primary_eye = AV_PRIMARY_EYE_LEFT; + else if (tmp == 2) + primary_eye = AV_PRIMARY_EYE_RIGHT; + else + av_log(c->fc, AV_LOG_WARNING, "Unknown hero eye type: %d\n", tmp); + + break; + } + case MKTAG('c','a','m','s'): { + uint32_t subtag; + int subsize; + if (size != 24) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size of cams box: %d\n", size); + return AVERROR_INVALIDDATA; + } + + subsize = avio_rb32(pb); + if (subsize != 16) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size of blin box: %d\n", size); + return AVERROR_INVALIDDATA; + } + + subtag = avio_rl32(pb); + if (subtag != MKTAG('b','l','i','n')) { + av_log(c->fc, AV_LOG_ERROR, "Expected blin box, got 0x%08X\n", subtag); + return AVERROR_INVALIDDATA; + } + + avio_skip(pb, 1); // version + avio_skip(pb, 3); // flags + + baseline = avio_rb32(pb); + + break; + } + case MKTAG('c','m','f','y'): { + uint32_t subtag; + int subsize; + if (size != 24) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size of cmfy box: %d\n", size); + return AVERROR_INVALIDDATA; + } + + subsize = avio_rb32(pb); + if (subsize != 16) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size of dadj box: %d\n", size); + return AVERROR_INVALIDDATA; + } + + subtag = avio_rl32(pb); + if (subtag != MKTAG('d','a','d','j')) { + av_log(c->fc, AV_LOG_ERROR, "Expected dadj box, got 0x%08X\n", subtag); + return AVERROR_INVALIDDATA; + } + + avio_skip(pb, 1); // version + avio_skip(pb, 3); // flags + + horizontal_disparity_adjustment = (int32_t) avio_rb32(pb); + + break; + } + default: + av_log(c->fc, AV_LOG_WARNING, "Unknown tag in eyes: 0x%08X\n", tag); + avio_skip(pb, size - 8); + break; + } + remaining -= size; + } + + if (remaining != 0) { + av_log(c->fc, AV_LOG_ERROR, "Broken eyes box\n"); + return AVERROR_INVALIDDATA; + } + + if (!sc->stereo3d) { + sc->stereo3d = av_stereo3d_alloc(); + if (!sc->stereo3d) + return AVERROR(ENOMEM); + } + + sc->stereo3d->flags = flags; + sc->stereo3d->view = view; + sc->stereo3d->primary_eye = primary_eye; + sc->stereo3d->baseline = baseline; + sc->stereo3d->horizontal_disparity_adjustment = horizontal_disparity_adjustment; + + return 0; +} + +static int mov_read_vexu(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + int size; + int64_t remaining; + uint32_t tag; + + if (c->fc->nb_streams < 1) + return 0; + + if (atom.size < 8) { + av_log(c->fc, AV_LOG_ERROR, "Empty video extension usage box\n"); + return AVERROR_INVALIDDATA; + } + + remaining = atom.size; + while (remaining > 0) { + size = avio_rb32(pb); + if (size < 8 || size > remaining ) { + av_log(c->fc, AV_LOG_ERROR, "Invalid child size in vexu box\n"); + return AVERROR_INVALIDDATA; + } + + tag = avio_rl32(pb); + switch (tag) { + case MKTAG('p','r','o','j'): { + MOVAtom proj = { tag, size - 8 }; + int ret = mov_read_vexu_proj(c, pb, proj); + if (ret < 0) + return ret; + break; + } + case MKTAG('e','y','e','s'): { + MOVAtom eyes = { tag, size - 8 }; + int ret = mov_read_eyes(c, pb, eyes); + if (ret < 0) + return ret; + break; + } + default: + av_log(c->fc, AV_LOG_WARNING, "Unknown tag in vexu: 0x%08X\n", tag); + avio_skip(pb, size - 8); + break; + } + remaining -= size; + } + + if (remaining != 0) { + av_log(c->fc, AV_LOG_ERROR, "Broken vexu box\n"); + return AVERROR_INVALIDDATA; + } + + return 0; +} + static int mov_parse_uuid_spherical(MOVStreamContext *sc, AVIOContext *pb, size_t len) { int ret = 0; @@ -8595,6 +8873,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('d','f','L','a'), mov_read_dfla }, { MKTAG('s','t','3','d'), mov_read_st3d }, /* stereoscopic 3D video box */ { MKTAG('s','v','3','d'), mov_read_sv3d }, /* spherical video box */ +{ MKTAG('v','e','x','u'), mov_read_vexu }, /* video extension usage */ { MKTAG('d','O','p','s'), mov_read_dops }, { MKTAG('d','m','l','p'), mov_read_dmlp }, { MKTAG('S','m','D','m'), mov_read_smdm }, From patchwork Mon Jun 10 18:44:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49777 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2724701vqo; Mon, 10 Jun 2024 11:45:20 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWHEJXjvMP8r4gHqq4FoMw+3kpNqWdYLW0nYXZ2kveSLXaYuDljsuS8rzMiX2qE+ClDkz9hlf1s0E9ayYsfvTYYenfWJcuGJNTb8w== X-Google-Smtp-Source: AGHT+IE8iRZUz6sf5m1L5mqHMNk0gPf925uFGp+uoENzkHN6qDlAnUsftyF90bhZ0iAOJQu1lQ8X X-Received: by 2002:a2e:9811:0:b0:2eb:d87f:7d78 with SMTP id 38308e7fff4ca-2ebd87f7ecdmr30105821fa.30.1718045120014; Mon, 10 Jun 2024 11:45:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718045119; cv=none; d=google.com; s=arc-20160816; b=QVA2Rmh/m+/mBYaE/GG/po0F78QnwFSgchs/HrHJ2e1vOUgxZ8kMukBmMXfbTF11H/ nWMbHYeVwytq7zSYBXuFKKQ0E2qJjNu1cr9ACCpB+3ViQU7YNjIe/XJ1SJ/NrSQQQZRv /leFZIqbtqrvDEK8x1YYEe1NOwZE0dChnHtU5TGkQh6EaKu8ObrENoFF0v8z3xaAVz1E 9njjSR+ES1ZO4MkO04GDm/ywn/Dk8HH39PaPm1ByjjB30sesdTBi60vnnGQdYDz5ySNp ikINlw4uMIYwhsk+/93Wz676GCutULAKrsPmM0qBJsouTEL/jhIw+/cDD0X3aJXkX4Mh 4iMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=PTad6eseV46yBj5UH39lP4S88TKtpoG9EKRYIymigvc=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=artxUe2J5/P1IAtqlI45+qSecjIaxF9pOLbT2ixfi5q9y8prTdV+nJtZ9sKmF4tBkH 2vx0c+B9Gs6guqSMSedrC/b9zZLAKguiosRi6OMSKnR5tsRTKmoqKGojl+XuG1+OY02V RrrduX+BBQ7VoNi+rVY2BdTDXUhWkEtZ7W+/tlx6Aar5QQ4QMzU8T1Syjqi8vKJJZeiM TOW/mHYSSfR6RA5Wp97eMDHOX5HwK1UywsR211zI+0HJBUZqHwSbV/FJ4jJlDlwLkF5D Bw3FkM4+XcFK+4dp3KV2/9sG/ah9Yt4PcpHQtToNoLL6FlWYfmYcD+CXvNifgQgGAkri Y3kg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=OKn3gggw; 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 4fb4d7f45d1cf-57c86337033si864730a12.242.2024.06.10.11.45.19; Mon, 10 Jun 2024 11:45:19 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=OKn3gggw; 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 1F7FC68D7C4; Mon, 10 Jun 2024 21:44:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 239B168D721 for ; Mon, 10 Jun 2024 21:44:27 +0300 (EEST) Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-421820fc26dso13381135e9.2 for ; Mon, 10 Jun 2024 11:44:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718045066; x=1718649866; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=6p2QZrm5rm9Q5zwyniEl/BIzhSrwtK9lasf9smGdW7Q=; b=OKn3gggw0psw8aOz/3Z1BfA6xXzpkLjP7w+smdPY0u1OIdrNfZ6C5L94GXg5jgkkkw +RYy9P8/DxyTzDV6mA4UWkaC8XYRjpJuHz7p2lVteaZpwbow6LM1Aze4/zMAxCjJnySI JwVmzao3s5BcAxyGCQ+WNKvQm5SYXIrZa2nzZPu3SalSJE6GLrAmcc7ebMjRTmHlLQ94 Y912vRo2kdjNA9BmEnX3HKmgw3wfDeldKWz7gOdz65RtQs9s4Oa7WsrtTBWilBg/9k5g YYqQTGnUTrumipFi6beYyPY9nNoUS7ojcF/wbyQHHoaMFn8ICUnYkQuy36w8bCiS8DT+ Igkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718045066; x=1718649866; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6p2QZrm5rm9Q5zwyniEl/BIzhSrwtK9lasf9smGdW7Q=; b=HVXpSAUB4EGZxWWK7oLso8ES8O0Ak992n10ZOjEwpYvz1UqME4Jm6YNbkhyghUYfHn 1IFS+4ySqsLY92s+6b43LqHgQndUTECYAMTkFoMQulN43Q2vj8aXydNja70Dfga5bqNb vVQKenJtsoo3VDmbus73ZQxQV9wnMQYGwjnbS2/yVDTGsTQLQ+MRR8YzHx32y0UZVZO3 HsABqLG+yFy1a/zNtYpoyEJ2UEA+gCPsdTdp7nYtAM6ON8pz22MXiuFOoX56QzQ+GdSR GucZSjQ+Owd5zL8cNOPxXvWGwrNGZf429nszmpmJTNPOJ+ZLljI8y3285BH1rnqZdftH dD+Q== X-Gm-Message-State: AOJu0YyfxCnt/WY85numMYBfUDU4M/Va02Gi7ami1cQLMuCWJtbTD50a sHmDlTUSYIGYDsTjZjVR37peXraOL192yNfNOrzpQOlU/Ax9F+3PmSepTQ== X-Received: by 2002:a05:600c:b8a:b0:422:47a:15c8 with SMTP id 5b1f17b1804b1-422047a1766mr19701245e9.12.1718045065852; Mon, 10 Jun 2024 11:44:25 -0700 (PDT) Received: from localhost.localdomain ([51.191.0.41]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4218193b0c0sm64659165e9.31.2024.06.10.11.44.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 11:44:25 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Jun 2024 19:44:07 +0100 Message-ID: <20240610184408.68171-6-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240610184408.68171-1-derek.buitenhuis@gmail.com> References: <20240610184408.68171-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/5] avformat/mov: Add support for reading and exporting horizontal field of view X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Xt6YHSxY8Imk These boxes are created by the Apple Vision Pro and the iPhone 15+ when capture for the Vision Pro is enabled. Based off of the swift API: * https://developer.apple.com/documentation/coremedia/kcmformatdescriptionextension_horizontalfieldofview Signed-off-by: Derek Buitenhuis --- libavformat/mov.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/libavformat/mov.c b/libavformat/mov.c index b164bb0adb..a118ade089 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -6755,6 +6755,34 @@ static int mov_read_vexu(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_hfov(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + MOVStreamContext *sc; + + if (c->fc->nb_streams < 1) + return 0; + + st = c->fc->streams[c->fc->nb_streams - 1]; + sc = st->priv_data; + + if (atom.size != 4) { + av_log(c->fc, AV_LOG_ERROR, "Invalid size of hfov box: %"PRIu64"\n", atom.size); + return AVERROR_INVALIDDATA; + } + + + if (!sc->stereo3d) { + sc->stereo3d = av_stereo3d_alloc(); + if (!sc->stereo3d) + return AVERROR(ENOMEM); + } + + sc->stereo3d->horizontal_field_of_view = avio_rb32(pb); + + return 0; +} + static int mov_parse_uuid_spherical(MOVStreamContext *sc, AVIOContext *pb, size_t len) { int ret = 0; @@ -8874,6 +8902,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('s','t','3','d'), mov_read_st3d }, /* stereoscopic 3D video box */ { MKTAG('s','v','3','d'), mov_read_sv3d }, /* spherical video box */ { MKTAG('v','e','x','u'), mov_read_vexu }, /* video extension usage */ +{ MKTAG('h','f','o','v'), mov_read_hfov }, { MKTAG('d','O','p','s'), mov_read_dops }, { MKTAG('d','m','l','p'), mov_read_dmlp }, { MKTAG('S','m','D','m'), mov_read_smdm },