From patchwork Mon Jun 17 19:20:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49986 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6919:8997:b0:23b:d18a:469b with SMTP id jz23csp2078089ysc; Mon, 17 Jun 2024 12:21:15 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW8u9ce+wBtV5Qmv2hsjv94xvM1SIhA8Miz5risTa6PK/0E1peHRsdXxpXxPTbMmemZOogYxeBjVIk9sYN3f1MEzxM8NH14wWxkEA== X-Google-Smtp-Source: AGHT+IE9w8LN5sio7gIP2YZtAttm6Lb6zrvdKSR4riN2AAnnTi372YgQDtLFUtrdGPWWYODeGZNr X-Received: by 2002:a19:9108:0:b0:52c:8786:8aee with SMTP id 2adb3069b0e04-52ca6e9eca0mr6703693e87.56.1718652074952; Mon, 17 Jun 2024 12:21:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718652074; cv=none; d=google.com; s=arc-20160816; b=JeWALRPcnOZYCocSFUNSkAbOXEMJ6J9sNN6c+NM8u5hrWJAQ2bV6GDr2O0/enXA6Sg n5pQY+FT2MFilD6uDJfvcQMY3z89HfQ7rLwX4Oa2i0A+r+bbyJ2mBL/pILqccDkktlzm 6eUlLk+EfguQff9728u+3G247zCCWc213McK0bWmyBleYJVdma7pd/PTPTgZ+ltV3sy7 ECki/uAEL8ZtfS2UNbxSj/CVXlrt8J9KLJ4ScWd3wfnEP8M3+/d+O895pEAGUBqYk9CB uLw9twRmrDZXDHTDRFsOrOUYP1+RQGVludxiIvo5dA9pNOAp578gLwEwK/Wylwz4daUX 4NMw== 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=hPRYEPrS4a13NRbEHkn4GdhRyyYgu+lX/0dgyqThCVs=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=TeGg5Egc06JX9UIb+aaoFP0bkgAfbgDyeSsURZEY2hI7mK9057epxqCfxhVGXfSeWO oXKit4S1AYalJr7psVbs7tS+SWm1HHdJEnsQARnLxUeK3tuuSwD0HK7NAetknWuSih5X PthK7k4mK8FmIL82ctml0avzajAIlp91SjgSg/bw43ZV9XBBWw3WVeA5nFuRFNGCZfgE OQAuHqWyxZaQx9m7OIk3ta+AU5jZZl6dkMQ8UcYR4mj1DAdD+hBGHdKYeSiMxqWK0WD9 7nbGYtnkrGfMVJqvKZ+A/pkkr+RY6eFeFsAuRdxQlQqnLUz4T3OrF6jMW3rl1OD4QG8S LbWw==; 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=nJs7IRIQ; 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-52ca28725a9si2940496e87.280.2024.06.17.12.21.09; Mon, 17 Jun 2024 12:21:14 -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=nJs7IRIQ; 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 9220068D789; Mon, 17 Jun 2024 22:20:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1CB6068D586 for ; Mon, 17 Jun 2024 22:20:32 +0300 (EEST) Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-35f2d723ef0so4029812f8f.1 for ; Mon, 17 Jun 2024 12:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718652031; x=1719256831; 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=vl70ixDhP5Atv6Vc1oK+x81USvOLkG5e46JvJaNBNCQ=; b=nJs7IRIQ/V2Z33QvlNl/iOrd2NgQH9cP+htI8A176mBFoGai+vzAXzV+ZgJBSBdfPA sspxU8GTHh67oh9rBhyaTMNpV03p8fg9nFsHeOxWYQi7XVn+AN5qe9xtqL3Qqlq6t4hV F+ePyXlWUKO981zpDq65FANL+nMLTrfIj/S8qAYnJg7Bae4UwoFwMhYkbJ8Hn0ACaLWa 3lM9dxO9yz94uap9REt+xAVqNH2Vqs1Cx5Bkq2K0ROZFCaWxJOPaDfTHR/223g6+fcJ5 FVx65ZXCTda5P8LAP5J3tpVorkZ9jxUd7bIxwa4vd/Z1bD+GhtWz65aIdQqxUsZZ2z9B ciNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718652031; x=1719256831; 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=vl70ixDhP5Atv6Vc1oK+x81USvOLkG5e46JvJaNBNCQ=; b=M6Ls/pI9FJVIJgEVb8PCNXOy23O/EKgRFrfnzeQwVfZCCJPOuK7hmbs936io47eU5E KFhFKeqdmx62cG6jSVTlAZz9/nGu3/xiv5YcO3nxIzraVUzV8GKllk8b7xScxy2hunkm 8JDP6xrULGGfN4/f1Xoa48VmhYR032CuJReli6lhHjRYzyh6QIZo85Z0Y3Oits+4DNY7 sWnS1oTYNGi44K2Dz7CkUaesSInsBLpK5/ltOJ11u//qqiHfHSK1B56YhW6kgXEoC401 rMCseTG8mWQrjSWFmgxN8WaXVUNuxlyQpMDhINcPJaaIQwS6+tCGIbB/GUxUVNlT/DXI grEA== X-Gm-Message-State: AOJu0YwGAhEy97iawzuV91aVucyb+SzIOiXRvtRrM9gf02dbbVuTZ5Np 1ST8SHAmURi0GWAbwXzPpOr+uyQ0fNS2HjSowdND+cGQfwPj6yRyTWQNqw== X-Received: by 2002:a05:6000:188d:b0:360:79d2:a822 with SMTP id ffacd0b85a97d-3607a725821mr10098291f8f.14.1718652030781; Mon, 17 Jun 2024 12:20:30 -0700 (PDT) Received: from localhost.localdomain (0540dce9.skybroadband.com. [5.64.220.233]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3607509353csm12531797f8f.22.2024.06.17.12.20.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jun 2024 12:20:30 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jun 2024 20:20:15 +0100 Message-ID: <20240617192019.512769-2-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240617192019.512769-1-derek.buitenhuis@gmail.com> References: <20240617192019.512769-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 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: eJeel3GX8Ula 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 | 5 +++++ libavutil/spherical.h | 16 ++++++++++++++++ libavutil/version.h | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libavutil/spherical.c b/libavutil/spherical.c index 800d3459a5..64ade1d0ec 100644 --- a/libavutil/spherical.c +++ b/libavutil/spherical.c @@ -29,6 +29,8 @@ AVSphericalMapping *av_spherical_alloc(size_t *size) if (!spherical) return NULL; + spherical->projection = AV_SPHERICAL_RECTILINEAR; + if (size) *size = sizeof(*spherical); @@ -57,6 +59,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_RECTILINEAR] = "rectilinear", + [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..2e90f7752d 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 frame displays on a flat, rectangular 2D surface. + */ + AV_SPHERICAL_RECTILINEAR, + + /** + * Fisheye projection (Apple). + * See: https://developer.apple.com/documentation/coremedia/cmprojectiontype/fisheye + */ + AV_SPHERICAL_FISHEYE, }; /** diff --git a/libavutil/version.h b/libavutil/version.h index 2756f2aa03..7df546ee22 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 22 +#define LIBAVUTIL_VERSION_MINOR 23 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Mon Jun 17 19:20:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49984 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6919:8997:b0:23b:d18a:469b with SMTP id jz23csp2078051ysc; Mon, 17 Jun 2024 12:21:11 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVhGB0/1sPAd6I3apEUJdy/8Ezu0IKlv9yXtkq6UNpy7pc5Tm3qCwkTS/UxvPV8qR1Bks/lIKMlg83qOz++t2Yv9ckGL5YPitNeEQ== X-Google-Smtp-Source: AGHT+IGbpj+RC6GHvXicjEsTB0/lsGYaDeNV0sz3jmGm8ilnDAopYf+y++nedcQBzisNW6q6Dwxi X-Received: by 2002:adf:ee07:0:b0:360:7574:d6b9 with SMTP id ffacd0b85a97d-3607a7682b0mr8860511f8f.34.1718652071580; Mon, 17 Jun 2024 12:21:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718652071; cv=none; d=google.com; s=arc-20160816; b=HiZ0OqqH8EZg388C2FbeyVinkxqjZTTtByBSZCwlVzhYrWAwzGyExLDTeUyIxiR15U CblrVy125wRIdRSWElQORYaCXs36oPrC8U2J4KOVMuRFeay70EnlYcIvo5dRKdp0UgA8 pNvRR3iMtLnYUFlwEq8+ZgdLvQJ9w3R/knVKY0uxthvOBD3o1Q0gSHgfsN2Qx63NaBWV KBpG2sZ2CxifdfWYDfAXd9LQzzYYCbv20Pi3xMyk9Ow19TbSiKj8E3s8FO+F0VZE62ch JyPu2o3o6Z+cKhO5j7H68iRMwu6SMZZ7VhvpAbIqjfEyxdXItRL+ZJGnpuNWn0Hpz7vt IejA== 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=Jbxa0LkxsGPcui6V9bl/6FICAtD2Mj+s2/23ZNA2H8E=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=MiFAQ8DYTEUfu2VMEuZKw01xzIxjtj27KlD3MaBb4N1z4s97xpA7xj7sDUxtX9aK8/ xkV1yTvH8OnekcC9J9P89fVgxBqfAaHqHgSqmHafaMVD2DZ+7xhx2qmEKGGmS7y+z577 1/r4PygJ5WgHg8z+DFXfZYnZRrensfmTJLk+wm5JZhYILObdZlk8ZnbSdooiH/nzN4/G vLksr7FndZfWJpFHOLK0Y0j9nrwCCuQCC36XN9LM/D6g/NvBFfYxNEqDg6Wug7Gpx2hH Avq6plP2AyWNg2vDTWpYScaBTrj0+lfk3YxiFwkLXEBrrgAwRAKcY28PKUiGWo+T3yxE 5KbQ==; 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=SxR9rgz7; 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-a6f56df4ee3si454462766b.494.2024.06.17.12.21.01; Mon, 17 Jun 2024 12:21: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=SxR9rgz7; 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 3D08F68D798; Mon, 17 Jun 2024 22:20:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 627E068D6D4 for ; Mon, 17 Jun 2024 22:20:33 +0300 (EEST) Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-35f225ac23bso4600615f8f.0 for ; Mon, 17 Jun 2024 12:20:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718652032; x=1719256832; 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=nL0mdgOW72kgzLpFT8vkSwSrD900DqodbfntRceXdAA=; b=SxR9rgz7SSJvbAQLv4ckBLAHMG1cKVh+jAFYVL4rxlCKyIVBV5/oug5PNAZl5VJD5A Q34BabcAOmNQ8+vVEkjLaG6EImnIyMaNI+BwFstQP+zEQ6BOg3aEtiCyiXy5klGL8Ctn x0dB2U/xcNfmtyoHhs6EjXRQR+t2Aes/5Ba1jBswPseJGJpZXOM1MY6UbEkztDjdJdzi tcz9qWxVPA+vXIETHs1j8b8AayDCL0S2gcEyKvQtLEfWjfXjsD7B8CdgOi1b3otFJ3wq Cs3OK4Qj+LtLwNpoUgCujcUD66YKrpPBDrmnUlzZEUUfa0bLf2ko6tFkFd8WPN/Mgy2j 9Tiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718652032; x=1719256832; 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=nL0mdgOW72kgzLpFT8vkSwSrD900DqodbfntRceXdAA=; b=n7T4LMZ1Py9k5DKtx7ygrAO2mg18DGc5bSmqcHTjPB7ymJ61cRMao5vfx13tmUFbar CTcie03quAIHEhwGP6aYtBmtpofH40DFoy2k/QQS+NicqLuWVWgITiAL2O0+AkDHHtTM ukIAMFDxFXsoJa70UU15TxTaLuQgAyEZLQAMeFY4h3WAnuOy+w+sjA4lO1VOFa4CrgIL domhIZ1FjirsWqc1Pjx92ndRa0HR0lw23bwST6rxhF2fIzNvjGdFT64y1OJuxgnFnbAG eSrg2Tgc67I30cRywEdShgAUQ9fhC34vkMwMUC0O1+FlWOWDrco4jdDL0U/JeHYlAd9u XlFA== X-Gm-Message-State: AOJu0YzJGtq19pPQ+8PgUsJD0msCt7eOJsQyl9t+MYE47GNoju3U6mal 7ns2/4lXVfFa31zsaeFPDFAPF2Zwate165q6DjBKrOTJMpCDfj7dQQ2DLw== X-Received: by 2002:a05:6000:71c:b0:360:9dd6:cd04 with SMTP id ffacd0b85a97d-3609dd6d00fmr1440625f8f.67.1718652032225; Mon, 17 Jun 2024 12:20:32 -0700 (PDT) Received: from localhost.localdomain (0540dce9.skybroadband.com. [5.64.220.233]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3607509353csm12531797f8f.22.2024.06.17.12.20.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jun 2024 12:20:31 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jun 2024 20:20:16 +0100 Message-ID: <20240617192019.512769-3-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240617192019.512769-1-derek.buitenhuis@gmail.com> References: <20240617192019.512769-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 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: cjUUiBlmaPL5 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 | 78 ++++++++++++++++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 3 files changed, 131 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..00a5c3900e 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 is -1.0 to 1.0. Zero if unset. + */ + AVRational 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,42 @@ 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 7df546ee22..8044fd3935 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 23 +#define LIBAVUTIL_VERSION_MINOR 24 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Mon Jun 17 19:20:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49985 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6919:8997:b0:23b:d18a:469b with SMTP id jz23csp2078087ysc; Mon, 17 Jun 2024 12:21:15 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXDDTGw4HviRijrRNuyS6NJAEVH2UXh4+GCKpW33A7w6GRNlfK63hSNcHf+gQdYP739/ROwagnhQmN8bp0aG2u6YjRSZChKGaQhlg== X-Google-Smtp-Source: AGHT+IERVP7vd2EGwuuCEDiSMzOB7/hQVarV+BP5nSEF57cUn2gdLeqbyb75q5iD8rarJxO3BbCY X-Received: by 2002:a50:d4d8:0:b0:57c:6953:2cac with SMTP id 4fb4d7f45d1cf-57cbd67ed7dmr7283234a12.22.1718652074887; Mon, 17 Jun 2024 12:21:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718652074; cv=none; d=google.com; s=arc-20160816; b=ORpOUkUPNif1D5FKt+kiZad6IYtFWGxHq+4gzghrXe71q9afqS6R6S5g76pmF2JmPz EfaRqbFBz4hV/SbB4EM/mfvII6kBhlwP30rBEowvhSIBgWrd25dOctlUibBu4uDngVSt hJDMGvVpV0j55ZBfzqFbcz/u22V9NnhjMAR7VbDC+xQf0S6UEpEisWXRkoqEdiGOwkQ7 l/kRxIVVtZLe0RrhY6P8+YiUrDhQO4vJjKx7LFHPOlP0OI3LPChAgka3ftm8yVWvxH+7 p07avkECYcVkMz48FWOUhfjMCEl5BQxkeWf6EHUb53CsJeENpNKh1eRCgq3XAKgztWRI U5tA== 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=eW5fkWQA7g/pEcsC61E4vZ3ilHMgEdF2t8HtBk7fHKA=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=XExsC7kp3gUnSVYRqFuyBtSnYKvByJWISMZzTShupeUt69LDn58c0tg9LyncFjknUf 4LRPfVnTxKnC4ScnxqFNy0Ak4V1aFI+b8jcpK0ALFaDzGqvgPJxuZO7vAunnfwlSYuS3 kKfZNcl2uIyuTUavGjzv0gr4U6XxkFNWuu86RNiKDjyZstzgwIA/DAZwW8NVDxps7CoC GzvOCMvH7FXsZ9ztk0k/1iJe4CjEZP895eVEj4cbb8lH8/OtDNIQE82uU7zIema5hojh DZAgELBVdkByS+91UhzxIyRlLNmlTQ4CGbKfEqqv9j21MrYn7swp2R936rU3eo3v0NaE 8TVg==; 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="kV9SN4/I"; 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-57cb80bd7e5si4847776a12.36.2024.06.17.12.21.10; Mon, 17 Jun 2024 12:21:14 -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="kV9SN4/I"; 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 7698C68D79F; Mon, 17 Jun 2024 22:20:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 28F5668D1BB for ; Mon, 17 Jun 2024 22:20:35 +0300 (EEST) Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-35f1c567ae4so3645869f8f.1 for ; Mon, 17 Jun 2024 12:20:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718652034; x=1719256834; 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=0x3+Cobx/BiJUZ3wUvOZy4oKT0umpHHFJIukh+FN7VU=; b=kV9SN4/I2T0o4WUHBCIjS/VLGHkm+755Z8DcOMMavgByeyHEvepJpcrQ7D9l0lk/K0 B7tlwBeNTw/K5Rrb96SbOvSwoB0B4HL2t1WWomF7c7YammfYQ6SBWKLqCGyJhlrSjlye 8Z1muFQ7OC6TADpxfRF7XKFRMPiq5qH+AAzfAaE4V6JNLtfCUxy5pn6mstHb08CbsHZO FwykiFQRwlw+1LyQHZVHzMBp/SpDnAtTxiILi/eFzuJCA9lu7xIutf+28+HjHeqxmDmJ mtor3s/IAUukGzMxH35+rOZcgVD61L7PIGh2N6pKFJqN3Qk3PnZ2749t/WoYcgLoH/lr WrJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718652034; x=1719256834; 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=0x3+Cobx/BiJUZ3wUvOZy4oKT0umpHHFJIukh+FN7VU=; b=VIXDJiyjMBcYDZG7g96ERI+TZ1U6TQ2/a7LRbkhwtVZl+Lr7iwu/9oKpQhZZwfL49R UP0u5OqdpcKYx3VFKRwep03jAcShL+sjV3nResFQe2PWxNoJr0rvavinWvM+73b3FBWp AFi562KpZBR5odAm4+6RCo+p+VXRaqgIaLnbtdyx2ZxMCJ7M00WHNZ09sgqVH/0MWIK7 n2yloS5J/Z71gzBD+neoO7BIS0rDxmRM+ZLq8oYQA1FU/QRPpQrLAxLmYJWejzYwV3hL kyhUds9+6rjR5nXVAdt4/8vt4GgZpO6vlOTd8ZalfPvi8sbLOj1YNIrrGy29XHCzm4mY D1qw== X-Gm-Message-State: AOJu0Yy4EuFpH82z+bWlXILO5blaqwLNm/lX8J7wGEOfRBtipANoiMZ7 nMDqu2HCgNCp3ei763cysYlFI+nL5KX7QbjqWGGrka9JWZlZbzhKauGoaA== X-Received: by 2002:a05:6000:1203:b0:35f:18e6:845f with SMTP id ffacd0b85a97d-3607a768fe9mr6987884f8f.40.1718652033474; Mon, 17 Jun 2024 12:20:33 -0700 (PDT) Received: from localhost.localdomain (0540dce9.skybroadband.com. [5.64.220.233]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3607509353csm12531797f8f.22.2024.06.17.12.20.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jun 2024 12:20:32 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jun 2024 20:20:17 +0100 Message-ID: <20240617192019.512769-4-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240617192019.512769-1-derek.buitenhuis@gmail.com> References: <20240617192019.512769-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 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: dzR00nf+zls+ Signed-off-by: Derek Buitenhuis --- fftools/ffprobe.c | 8 ++++++++ tests/ref/fate/matroska-spherical-mono | 2 ++ tests/ref/fate/matroska-spherical-mono-remux | 4 ++++ tests/ref/fate/matroska-stereo_mode | 8 ++++++++ tests/ref/fate/matroska-vp8-alpha-remux | 2 ++ tests/ref/fate/mov-spherical-mono | 2 ++ 6 files changed, 26 insertions(+) diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 2d38e5dfdc..a814cb5ade 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.num && stereo->horizontal_disparity_adjustment.den) + print_q("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)); diff --git a/tests/ref/fate/matroska-spherical-mono b/tests/ref/fate/matroska-spherical-mono index bd57d94514..08b94e455b 100644 --- a/tests/ref/fate/matroska-spherical-mono +++ b/tests/ref/fate/matroska-spherical-mono @@ -3,6 +3,8 @@ side_data_type=Stereo 3D type=2D inverted=0 +view=packed +primary_eye=none [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping diff --git a/tests/ref/fate/matroska-spherical-mono-remux b/tests/ref/fate/matroska-spherical-mono-remux index 6fcda14822..0ca77c8074 100644 --- a/tests/ref/fate/matroska-spherical-mono-remux +++ b/tests/ref/fate/matroska-spherical-mono-remux @@ -27,6 +27,8 @@ DISPOSITION:forced=1 side_data_type=Stereo 3D type=2D inverted=0 +view=packed +primary_eye=none [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping @@ -51,6 +53,8 @@ DISPOSITION:forced=0 side_data_type=Stereo 3D type=2D inverted=0 +view=packed +primary_eye=none [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping diff --git a/tests/ref/fate/matroska-stereo_mode b/tests/ref/fate/matroska-stereo_mode index 739b789fea..13bce13cb8 100644 --- a/tests/ref/fate/matroska-stereo_mode +++ b/tests/ref/fate/matroska-stereo_mode @@ -132,6 +132,8 @@ TAG:DURATION=00:00:10.000000000 side_data_type=Stereo 3D type=side by side inverted=0 +view=packed +primary_eye=none [/SIDE_DATA] [/STREAM] [STREAM] @@ -147,6 +149,8 @@ TAG:DURATION=00:00:10.000000000 side_data_type=Stereo 3D type=top and bottom inverted=1 +view=packed +primary_eye=none [/SIDE_DATA] [/STREAM] [STREAM] @@ -160,6 +164,8 @@ TAG:DURATION=00:00:10.000000000 side_data_type=Stereo 3D type=interleaved lines inverted=1 +view=packed +primary_eye=none [/SIDE_DATA] [/STREAM] [STREAM] @@ -174,6 +180,8 @@ TAG:DURATION=00:00:10.000000000 side_data_type=Stereo 3D type=interleaved columns inverted=1 +view=packed +primary_eye=none [/SIDE_DATA] [/STREAM] [STREAM] diff --git a/tests/ref/fate/matroska-vp8-alpha-remux b/tests/ref/fate/matroska-vp8-alpha-remux index f6c24dead6..e54304cafd 100644 --- a/tests/ref/fate/matroska-vp8-alpha-remux +++ b/tests/ref/fate/matroska-vp8-alpha-remux @@ -35,5 +35,7 @@ DISPOSITION:still_image=0 side_data_type=Stereo 3D type=2D inverted=0 +view=packed +primary_eye=none [/SIDE_DATA] [/STREAM] diff --git a/tests/ref/fate/mov-spherical-mono b/tests/ref/fate/mov-spherical-mono index bd57d94514..08b94e455b 100644 --- a/tests/ref/fate/mov-spherical-mono +++ b/tests/ref/fate/mov-spherical-mono @@ -3,6 +3,8 @@ side_data_type=Stereo 3D type=2D inverted=0 +view=packed +primary_eye=none [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping From patchwork Mon Jun 17 19:20:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49987 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6919:8997:b0:23b:d18a:469b with SMTP id jz23csp2078156ysc; Mon, 17 Jun 2024 12:21:24 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX6rEKTcALNcZiE7Y/x/07DWDPp9UVSHT37F8wwUsTjdgrgV85VMttUD9CILzmUrkmZc4OzWeAzoUswAbO6p5/IApXNlde0yp8Dcw== X-Google-Smtp-Source: AGHT+IG799E7q7bBq1lpRh86igVtCOxWmIFYAJldS1L2r1lYZyt8d4AlMvHkX+LYfBh79uTkQnxT X-Received: by 2002:a17:907:9447:b0:a6f:6150:3f5c with SMTP id a640c23a62f3a-a6f61504062mr865756966b.76.1718652084398; Mon, 17 Jun 2024 12:21:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718652084; cv=none; d=google.com; s=arc-20160816; b=Ls9D8Mf6MWr3oFVH8hjSPtA7BZosIVb0pWSweXsuAKRBvOtpohHFjtbeWXa8XXbzOn qgXdMPmtKyM1DnPcj44T2n5J34ERfDvpkh9oXVt0GWB+cg4dyvgYf4EBNMjlrpDFkwbC DcVOD1RMcx99mU/VaFVJpJHKjvYnMToCsCcD9Cdi/Lc4AHM2McsAIagxCjVmlyjYZFx6 IQAjuEvw9J8TaKvH8LGdU9vFJ5zNjyilRFJnAqgUzbZELK526lkryKBXyBeyPo5wj/kW VPrywLfueV2/mD8Xt9FoCqh8dAywpYzySf+S7VIwq7l9X8v6RHrXyhlwWj3jBUnB0cVj xnlw== 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=MSTFPDiNAHLNves4D8ibyJc0QFk0PaKA+hsa/JNOEmU=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=W+AS44fKG82ZQ+iwffmnehjZAmYCMDaN6lfjvai8NDfgalfE4vf0NIBM6vkUYwdnvI C2F+5XuKIXnqn88p+LvJnJ7sS/zxXlwCbNyhgv5Ot3T9qv1HeigSxtu/V3LfpI7RevdH Yph4i1sHCshNWthrssfUQZrGfCD6xAybZWdIAU1KZJMxSNmwV1T9sVbrkTrLjqv8sGvF 9Z/U4XhVQ3ANyjUZTUVmd3LMjDTYsdj7rvi7tDiQnupu7XBpa1uSphMKu9tsCyPIThQ5 7J4nx8oQCbPdcGWI+y41lK4fmKSov0RpefTo+6g/F2n60qnG2dlggQps6Pm7TuZV90B7 ZThw==; 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="b3N7IF/Y"; 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-a6f8e53ebbfsi57880466b.805.2024.06.17.12.21.19; Mon, 17 Jun 2024 12:21:24 -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="b3N7IF/Y"; 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 1226968D7AC; Mon, 17 Jun 2024 22:20:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 18AA068D711 for ; Mon, 17 Jun 2024 22:20:36 +0300 (EEST) Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-356c4e926a3so4433731f8f.1 for ; Mon, 17 Jun 2024 12:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718652035; x=1719256835; 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=zWOWjZ5f74HFO6osESaqpNjmIOWO031L/UmmQ4NxUII=; b=b3N7IF/YtATiZt9e+OBdnX3hOVzty9IMEYwwGSq4yjGnqKBebfELz9B74k+ZeYL/rt 6/1GZr246Lu8VNxhkQ9cjlZJPUkKcrV1O7Vac5ChuPWmsa32KxGYh2IlmmgL3w7tkCdf klaqYDAEm3ewn5JC6u9mefGxNLztxilLEvCwnplNW9Wr1eQCV8YN/v4ljC0fu4QafZ8k po63AbWup8LRIXVCGkzBxqPLkgcxgPUjaQACZ2JPkJurM+XzgmYn+jMSrc1a0UNcK8O0 GsubaM0PSC+RVLsGX56G4lBWrqF2Dpw2Sckd5c1NeYbfuPV3gKCUSx9i4ZFszfbPLaO6 D1lQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718652035; x=1719256835; 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=zWOWjZ5f74HFO6osESaqpNjmIOWO031L/UmmQ4NxUII=; b=Vh+dTekTj9bjeCJyhfaa/71ycVPh5gKuhPICrQJuNCzk7vZyTFCYLrUd4NVBqFt6BS CCCQ3rSxEAZw+Z8KMuOhH1O8DmPOpGxwW+btwHLLB7Ro3slhP4g3heglUHupIVzfGema qmlFfpmOIh5dIKzDphu3KWvrI5qc4TtEsEl7NhlTBLWFdxtviWh7Gyo/JOYKKzlSugPs 205vN31sD/Mntug0OQPwRsGP80Be98rNsrHEUuQzlROCflGoSuLzRE6CLd/vqzeY7fZZ rtuwNoME3fv3tSo3BKXmNJ+UwKOip30TThTaM+qYa4eODRO8WoHVo/PSTnX0OMHYv67k gDGw== X-Gm-Message-State: AOJu0YxB/OlG8MZzqg0OAv6ATYv8YnFhbDiD8lcIb2H5FpivoXe9Fyes KBTbCWVmADGmyK9xnDjYDJIBf0ug9FqNA5/XrM/RJp3XGD0YDvdyNzkVhQ== X-Received: by 2002:adf:f003:0:b0:360:9cd3:c496 with SMTP id ffacd0b85a97d-3609cd3c612mr1455450f8f.54.1718652034323; Mon, 17 Jun 2024 12:20:34 -0700 (PDT) Received: from localhost.localdomain (0540dce9.skybroadband.com. [5.64.220.233]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3607509353csm12531797f8f.22.2024.06.17.12.20.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jun 2024 12:20:33 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jun 2024 20:20:18 +0100 Message-ID: <20240617192019.512769-5-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240617192019.512769-1-derek.buitenhuis@gmail.com> References: <20240617192019.512769-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 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: ENoEoeUYOtl3 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 | 283 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 283 insertions(+) diff --git a/libavformat/mov.c b/libavformat/mov.c index 9016cd5ad0..5724b4ef93 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -6477,6 +6477,288 @@ 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_RECTILINEAR; + 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; + AVRational horizontal_disparity_adjustment = { 0, 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; + int32_t adjustment; + 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 + + adjustment = (int32_t) avio_rb32(pb); + + horizontal_disparity_adjustment.num = (int) adjustment; + horizontal_disparity_adjustment.den = 10000; + + 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 +8877,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 17 19:20:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 49988 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6919:8997:b0:23b:d18a:469b with SMTP id jz23csp2078229ysc; Mon, 17 Jun 2024 12:21:33 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXBbNAQFg2TdkFxpwnHHfyCLh3pbUmScSiteAo/lVjgg8ieRJeRiI/x/BO+/joT1F2XaVlWLzs69Zzi0VpXRrExCnqK80SfjoQcbw== X-Google-Smtp-Source: AGHT+IHgCYw+BdmH8AAsJex+u2GWpSYw/+ek5vLH0sVD1D1es5FDmQ+MgLg9ihFPGY0qnr0nCkE1 X-Received: by 2002:a50:99d2:0:b0:57c:5637:b2ae with SMTP id 4fb4d7f45d1cf-57cbd69dc7emr6255979a12.12.1718652093385; Mon, 17 Jun 2024 12:21:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718652093; cv=none; d=google.com; s=arc-20160816; b=T690NL0ytTiuEFmf1DImo7gqPgtBgpCOJRt3IkPt97YQIjtVZGJVOtarPeAg9m63yQ BDPi5M8B+Go0HF6SgK+wX1nvRJh18FMisN8H++WB8gar72+3djRoV2efOpdG756QT/nN NNRC+AQ1aNoRGxJ5zvcEBIaCastKqEUPjUbvf8UBbjakytP6Fqf6Jqs/QCxeHTjj2VOP 0f6yxiazlEk0rvbQWDuDn8oOiYMhaO0jrByO3/ovuOp4D36XVv2f7mSJRoPlzIZn6HyB cRXcG87HfQxiMV4/PTjKA4pgUtWfvi3tEpYHWd3N4q/I/UwhKDsXNrvLcdiF8l2c2RTV yssQ== 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=+DFMja49kBfs2bqTBFRTipAxKut+Wo2O8fELpku7uf4=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=gAbcHaXQkuioK1EmoivnqcMZpfql62mzbHQtk/9jP5ATMJ/HyM+GNcMkDdsrzdXDdj Z63g4s8neMAHFN4oYPSKKD2NSgeMOz0GUYX7xBGxPcKVNSd6bIHimVH24o0RoC/uvQPu N/J9b+ElvX3B/cWs6K+Rtqfif92fUmqBpUm+OHcvtZg9jodSKiQvkN2bnuOzbefmSnAh jE7n51nMqAfotum+1bFXjJQNV/8OsOcaO8Ppf4KBU8EJjlbwiaI/yvLWDc029o4FHbL0 RdG+shOdryCWJa/zxi+vDOUzUlu78Nxlvv9ATj0z5nDOaHDup3kRRPDyeK3EGLyBW0HX Y2Vw==; 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=UdVAFozH; 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-57cb74fb524si4947621a12.378.2024.06.17.12.21.28; Mon, 17 Jun 2024 12:21:33 -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=UdVAFozH; 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 EE32368D7B2; Mon, 17 Jun 2024 22:20:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A35D168D1BB for ; Mon, 17 Jun 2024 22:20:36 +0300 (EEST) Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-36084187525so2253452f8f.3 for ; Mon, 17 Jun 2024 12:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718652035; x=1719256835; 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=j01LhqEfoMblKhauX4+KfMQ8Mww5tnyQUfXiz6ydeKg=; b=UdVAFozHtAI0h09QYyQikbBM2bc0oCB4PDoZ2t2U+lWdnjG6IpJvMqxQ+Ja4rw3AFG kV/iAT9JCAE1AFtscz9lXGhvvl+vcbw/QVAShV2pRO/UmVQpmGZsKfHcsiYfyZjZVD0z DVL5RlZUTRXP5Zz08tS6zLKFozAVtmkSttXGm5cJx/ICnnKy4Am+dF4LKtZdn+sYxkTp t436X2wFCm5gZja2UmQNW01/QhL41fWEAtiA9pPCYUMx1v2PfxJcLdfO8NAlxI2u1v3x nz4f6U38+jXzcJsbxQ7Yy4AFCV6GkmnEsV8E3qnclYm7i/bE8Bl9a0rGXSQG0wN/TtUW kNiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718652035; x=1719256835; 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=j01LhqEfoMblKhauX4+KfMQ8Mww5tnyQUfXiz6ydeKg=; b=VCsMuEg7XyfF5/dcVGST1o09lQDbTSZGn4QLdpnJvTbz81FzOMuMe1oF56QXvB0Q4O XnHc4pNHxjWG5lpe36IIylL9hkrlcDcQdeRYWMUJkrq+FndlRtheAWAsE1Xf7hBVLl72 nIk7NldjXtv6Uu4N/IQPUFboq4uoOgthHqyQjcl4yGAG9vVWwyHo1938K1d3t1VZBjsw mRe7AJaCDvmwhUhASJejJSDJz0aFOb+ir+ythsXpKojHeFfuYhjBhTFW6IxZJHtrpZCr nhUORzVuprMj6kspdmbXoxgL+BNDENSjZs1sbJQA7+KYVE09esN7OYkUUkwQi05Pzl1h lc5Q== X-Gm-Message-State: AOJu0Yz7tdiTaMrXUN8kXbS/m/9qlzCE4sGyV7c0cmJalh8CAWN0qENG eQKTgzmzSlCitX9haxoyOFZq3d8i1dghUD5Knl41CYI/r8Wa7ny55H+V6w== X-Received: by 2002:adf:e68e:0:b0:35f:2fd3:85c1 with SMTP id ffacd0b85a97d-3607a74e617mr7463025f8f.12.1718652035260; Mon, 17 Jun 2024 12:20:35 -0700 (PDT) Received: from localhost.localdomain (0540dce9.skybroadband.com. [5.64.220.233]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3607509353csm12531797f8f.22.2024.06.17.12.20.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jun 2024 12:20:34 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jun 2024 20:20:19 +0100 Message-ID: <20240617192019.512769-6-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240617192019.512769-1-derek.buitenhuis@gmail.com> References: <20240617192019.512769-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 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: aRC1xzOhlF6w 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 5724b4ef93..367af8478b 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -6759,6 +6759,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; @@ -8878,6 +8906,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 },