Patch Detail
Show a patch.
GET /api/1.1/patches/15798/?format=api
{ "id": 15798, "url": "https://patchwork.libcamera.org/api/1.1/patches/15798/?format=api", "web_url": "https://patchwork.libcamera.org/patch/15798/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20220505141500.9064-2-david.plowman@raspberrypi.com>", "date": "2022-05-05T14:15:00", "name": "[libcamera-devel,v4,1/1] libcamera: controls: Controls for driving AF (autofocus) algorithms", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "df8747a6f204ddbafd5e3a4d298ff16fb2d767d5", "submitter": { "id": 42, "url": "https://patchwork.libcamera.org/api/1.1/people/42/?format=api", "name": "David Plowman", "email": "david.plowman@raspberrypi.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/15798/mbox/", "series": [ { "id": 3094, "url": "https://patchwork.libcamera.org/api/1.1/series/3094/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3094", "date": "2022-05-05T14:14:59", "name": "AF controls", "version": 4, "mbox": "https://patchwork.libcamera.org/series/3094/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/15798/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/15798/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 1AF7EC326C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 5 May 2022 14:15:21 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1678D6564A;\n\tThu, 5 May 2022 16:15:20 +0200 (CEST)", "from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com\n\t[IPv6:2a00:1450:4864:20::32d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F40E360424\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 5 May 2022 16:15:18 +0200 (CEST)", "by mail-wm1-x32d.google.com with SMTP id\n\tr1-20020a1c2b01000000b00394398c5d51so2731825wmr.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 05 May 2022 07:15:18 -0700 (PDT)", "from pi4-davidp.pitowers.org\n\t([2a00:1098:3142:14:e4a2:3070:eea4:e434])\n\tby smtp.gmail.com with ESMTPSA id\n\ti18-20020adfb652000000b0020c5253d8c4sm1374371wre.16.2022.05.05.07.15.17\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 05 May 2022 07:15:17 -0700 (PDT)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1651760120;\n\tbh=jxf4kD8kVze+gXkcvt7Cxcox2efO4mqhGJPMISDvAg0=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=1ib8c0FOLkt0SN8W6USj7h1ocxyps085im3ZSO5FTpNT09FxsW8hJzHw78TYs5uxU\n\t8GOzTgdbN0jZeskupswzn2eKRNGBwEx0SyKV2WJIGS0oMuVDLui3tGoCIwpKNyKe/R\n\t5y/pPYTyLBonC1ZuysdS5pEBbn6dUzIJyPerO6dGxqfAawPBBBp4pvBX2LBy8IdS3a\n\t9PRA8ChmwfXEhICXT94nMEprVfDfiYAHjjIWREN5a8IwD88Nm0ZCq4A+Y/MaEqloRY\n\tNqF0NdboKBHBkPs2dUgyfBP/k9zQ3829gfPiNtjRxqJYH4K5JBfk7aWx81SyTlNpMt\n\t6BM9nR4kTMBnQ==", "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=S8DUClASS6P4mlFtH9zRcy/MQhhArYxtujWagZBZqq0=;\n\tb=auT0v4QMonRhyS3IC61kr/vNDZmXPC08DhbzT01RLmNiJ6oYWjQabzG6GIK9x0R4+/\n\txmFEqEP5AvXhyYkQSkljdYqR8x09Qg/96hbe8IO6dmT1XPXw87texa7eJmHZHGSDIIXe\n\tEdNz9h3dS27Gxdli7jS/MMxwpuHPrE7OGIXq93wzAHUbF39nlA830+kih50FxpGSMaNp\n\tqDkcKu+FU4AnXZCy/2BryEeSxtEj8xcB1IpAYwEwtkgqiBX94nI6VB2hOOeVw37Zzh8v\n\trMrNfhhslam++TE/L7tOnyaFRXEPRWRgqB5mrzGk2RJV7QYYDbTeH7mMVGDx/l/N88pK\n\t3Iwg==" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"auT0v4QM\"; dkim-atps=neutral", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=S8DUClASS6P4mlFtH9zRcy/MQhhArYxtujWagZBZqq0=;\n\tb=e393DkHiHW6LY9t92FxGCngXeyMqvebSwfamG2zym1UheB5d2OUE+C9Bk6usLty18C\n\t3h2fhGOMspGN3Q4StAlKahKtGCs1FrxWRWs4KiSHuks60UoiOhtAMGNDhac2iBC6B6Yi\n\tpWGlzgr9JIplaWo27g3k6AcV7Yp6Lzl/xDGMtD5O7+9QfETHrWbJ6u6ugUHLrQ36XDt5\n\tbLuanhj62mZgYfDuGpbGnL3fOD4T3bSm902xw1Ps/17S4CdQ3/ECbWsTQ4QnTsRd16Dy\n\tBUGhAKS+32x/Zew2Gz8fvmn3i2dcNmLZStJrIgVkKQu260PNyJZlegfXAvyw3kctQ5vJ\n\t9FBw==", "X-Gm-Message-State": "AOAM531Q1izGaWFtc5Ni6T+V/rU3eOlH7VABqA2DpyKcH2gABogIosEY\n\tAaqBdo2SKwZ1vmIZCk1QEtjUcBbVmHpc3Siz", "X-Google-Smtp-Source": "ABdhPJytEnDEbCHxTi0TN0Phea24QXKJfT6pXlwl1eD6ADZfUagaGtNr+Tbzy/WZx6LoGt4aT3JPkg==", "X-Received": "by 2002:a05:600c:34c1:b0:394:32c8:848d with SMTP id\n\td1-20020a05600c34c100b0039432c8848dmr5113360wmq.78.1651760118215; \n\tThu, 05 May 2022 07:15:18 -0700 (PDT)", "To": "libcamera-devel@lists.libcamera.org, Jacopo Mondi <jacopo@jmondi.org>,\n\tHan-Lin Chen <hanlinchen@chromium.org>,\n\tJean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>,\n\tKate Hsuan <hpa@redhat.com>", "Date": "Thu, 5 May 2022 15:15:00 +0100", "Message-Id": "<20220505141500.9064-2-david.plowman@raspberrypi.com>", "X-Mailer": "git-send-email 2.30.2", "In-Reply-To": "<20220505141500.9064-1-david.plowman@raspberrypi.com>", "References": "<20220505141500.9064-1-david.plowman@raspberrypi.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v4 1/1] libcamera: controls: Controls for\n\tdriving AF (autofocus) algorithms", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "From": "David Plowman via libcamera-devel <libcamera-devel@lists.libcamera.org>", "Reply-To": "David Plowman <david.plowman@raspberrypi.com>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "This patch describes a series of controls that allow applications to\ndrive AF algorithms:\n\nAfMode - manual, auto or continuous\nAfRange - full, macro or normal\nAfSpeed - fast or slow\nAfMetering - how to choose where to measure focus\nAfWindows - AF window locations\nAfTrigger - start (trigger) an AF scan or cancel\nAfPause - pause continuous AF\nLensPosition - set or retrieve position of lens\nAfState - reports whether scanning/success/failure\nAfPauseState - reports whether continuous AF paused or not\n\nSigned-off-by: David Plowman <david.plowman@raspberrypi.com>\n---\n src/libcamera/control_ids.yaml | 345 +++++++++++++++++++++++++++------\n 1 file changed, 285 insertions(+), 60 deletions(-)", "diff": "diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml\nindex 9d4638ae..5af1676e 100644\n--- a/src/libcamera/control_ids.yaml\n+++ b/src/libcamera/control_ids.yaml\n@@ -381,6 +381,291 @@ controls:\n \\todo Define how the sensor timestamp has to be used in the reprocessing\n use case.\n \n+ - AfMode:\n+ type: int32_t\n+ description: |\n+ Control to set the mode of the AF (autofocus) algorithm. Applications\n+ are allowed to set a new mode, and to send additional controls for\n+ that new mode, in the same request.\n+\n+ An implementation may choose not to implement all the modes.\n+\n+ enum:\n+ - name: AfModeManual\n+ value: 0\n+ description: |\n+ The AF algorithm is in manual mode. In this mode it will never\n+ perform any action nor move the lens of its own accord, but an\n+ application can specify the desired lens position using the\n+ LensPosition control.\n+\n+ In this mode the AfState will always report AfStateIdle.\n+ - name: AfModeAuto\n+ value: 1\n+ description: |\n+ The AF algorithm is in auto mode. This means that the algorithm\n+ will never move the lens or change state unless the AfTrigger\n+ control is used. The AfTrigger control can be used to initiate a\n+ focus scan, the results of which will be reported by AfState.\n+\n+ If the autofocus algorithm is moved from AfModeAuto to another\n+ mode while a scan is in progress, the scan is cancelled\n+ immediately, without waiting for the scan to finish.\n+\n+ When first entering this mode the AfState will report\n+ AfStateIdle. When a trigger control is sent, AfState will\n+ report AfStateScanning for a period before spontaneously\n+ changing to AfStateFocused or AfStateFailed, depending on\n+ the outcome of the scan. It will remain in this state until\n+ another scan is initiated by the AfTrigger control. If a scan is\n+ cancelled (without changing to another mode), AfState will return\n+ to AfStateIdle.\n+ - name: AfModeContinuous\n+ value: 2\n+ description: |\n+ The AF algorithm is in continuous mode. This means that the lens\n+ can re-start a scan spontaneously at any moment, without any user\n+ intervention. The AfState still reports whether the algorithm is\n+ currently scanning or not, though the application has no ability\n+ to initiate or cancel scans (though it can \"pause\" them), nor to\n+ move the lens for itself.\n+\n+ When set to AfModeContinuous, the system will immediately initiate a\n+ scan so AfState will report AfStateScanning, and will settle on one\n+ of AfStateFocused or AfStateFailed, depending on the scan result.\n+\n+ - AfRange:\n+ type: int32_t\n+ description: |\n+ Control to set the range of focus distances that is scanned. An\n+ implementation may choose not to implement all the options here.\n+ enum:\n+ - name: AfRangeNormal\n+ value: 0\n+ description: |\n+ A wide range of focus distances is scanned, all the way from\n+ infinity down to close distances, though depending on the\n+ implementation, possibly not including the very closest macro\n+ positions.\n+ - name: AfRangeMacro\n+ value: 1\n+ description: Only close distances are scanned.\n+ - name: AfRangeFull\n+ value: 2\n+ description: |\n+ The full range of focus distances is scanned just as with\n+ AfRangeNormal but this time including the very closest macro\n+ positions.\n+\n+ - AfSpeed:\n+ type: int32_t\n+ description: |\n+ Control that determines whether the AF algorithm is to move the lens\n+ as quickly as possible or more steadily. For example, during video\n+ recording it may be desirable not to move the lens too abruptly, but\n+ when in a preview mode (waiting for a still capture) it may be\n+ helpful to move the lens as quickly as is reasonably possible.\n+ enum:\n+ - name: AfSpeedNormal\n+ value: 0\n+ description: Move the lens at its usual speed.\n+ - name: AfSpeedFast\n+ value: 1\n+ description: Move the lens more quickly.\n+\n+ - AfMetering:\n+ type: int32_t\n+ description: |\n+ Instruct the AF algorithm how it should decide which parts of the image\n+ should be used to measure focus.\n+ enum:\n+ - name: AfMeteringAuto\n+ value: 0\n+ description: The AF algorithm should decide for itself where it will\n+ measure focus.\n+ - name: AfMeteringWindows\n+ value: 1\n+ description: The AF algorithm should use the rectangles defined by\n+ the AfWindows control to measure focus.\n+\n+ - AfWindows:\n+ type: Rectangle\n+ description: |\n+ Sets the focus windows used by the AF algorithm when AfMetering is set\n+ to AfMeteringWindows. The units used are pixels within the rectangle\n+ returned by the ScalerCropMaximum property. Applications should ignore\n+ any offsets reported for the ScalerCropMaximum rectangle as we are only\n+ defining locations within it.\n+\n+ In order to be activated, a rectangle must be programmed with non-zero\n+ width and height. The rectangles are also implicitly bounded to the\n+ ScalerCropMaximum rectangle size. If no pixels remain after this\n+ operation for any of the defined windows, then the behaviour is platform\n+ dependent.\n+\n+ On platforms that support the ScalerCrop control (for implementing\n+ digital zoom, for example), no automatic recalculation or adjustment of\n+ AF windows is performed internally if the ScalerCrop is changed.\n+\n+ The details of how the windows are used are platform dependent. We note\n+ that when there is more than one AF window, a typical implementation\n+ might find the optimal focus position for each one and finally select\n+ the window where the focal distance for the objects shown in that part\n+ of the image are closest to the camera.\n+\n+ size: [n]\n+\n+ - AfTrigger:\n+ type: int32_t\n+ description: |\n+ This control starts an autofocus scan when AfMode is set to AfModeAuto,\n+ and can also be used to terminate a scan early.\n+\n+ It is ignored if AfMode is set to AfModeManual or AfModeContinuous.\n+\n+ enum:\n+ - name: AfTriggerStart\n+ value: 0\n+ description: Start an AF scan. Ignored if a scan is in progress.\n+ - name: AfTriggerCancel\n+ value: 1\n+ description: Cancel an AF scan. This does not cause the lens to move\n+ anywhere else. Ignored if no scan is in progress.\n+\n+ - AfPause:\n+ type: int32_t\n+ description: |\n+ This control has no effect except when in continuous autofocus mode\n+ (AfModeContinuous). It can be used to pause any lens movements while\n+ (for example) images are captured. The algorithm remains inactive\n+ until it is instructed to resume.\n+\n+ enum:\n+ - name: AfPauseImmediate\n+ value: 0\n+ description: |\n+ Pause the continuous autofocus algorithm immediately, whether or not\n+ any kind of scan is underway. AfPauseState will subsequently report\n+ AfPauseStatePaused. AfState may report any of AfStateScanning,\n+ AfStateFocused or AfStateFailed, depending on the algorithm's state\n+ when it received this control.\n+ - name: AfPauseDeferred\n+ value: 1\n+ description: |\n+ This is similar to AfPauseImmediate, and if the AfState is currently\n+ reporting AfStateFocused or AfStateFailed it will remain in that\n+ state and AfPauseState will report AfPauseStatePaused.\n+\n+ However, if the algorithm is scanning (AfStateScanning),\n+ AfPauseState will report AfPauseStatePausing until the scan is\n+ finished, at which point AfState will report one of AfStateFocused\n+ or AfStateFailed, and AfPauseState will change to\n+ AfPauseStatePaused.\n+\n+ - name: AfPauseResume\n+ value: 2\n+ description: |\n+ Resume continuous autofocus operation. The algorithm starts again\n+ from exactly where it left off, and AfPauseState will report\n+ AfPauseStateRunning.\n+\n+ - LensPosition:\n+ type: float\n+ description: |\n+ Acts as a control to instruct the lens to move to a particular position\n+ and also reports back the position of the lens for each frame.\n+\n+ The LensPosition control is ignored unless the AfMode is set to\n+ AfModeManual.\n+\n+ The units are dioptres divided by the hyperfocal distance. Non-integer\n+ values are permitted. For example:\n+ 0 moves the lens to infinity.\n+ 0.5 moves the lens to twice the hyperfocal distance.\n+ 1 moves the lens to the hyperfocal position.\n+ And larger values will focus the lens ever closer.\n+\n+ - AfState:\n+ type: int32_t\n+ description: |\n+ Reports the current state of the AF algorithm in conjunction with the\n+ reported AfMode value and (in continuous AF mode) the AfPauseState\n+ value. The possible state changes are described below, though we note\n+ the following state transitions that occur when the AfMode is changed.\n+\n+ If the AfMode is set to AfModeManual then the AfState will report\n+ AfStateIdle. This action on its own does not cause the lens to move; the\n+ LensPosition control must subsequently be used to achieve this.\n+\n+ If the AfMode is set to AfModeAuto then the AfState will report\n+ AfStateIdle. However, if AfModeAuto and AfTriggerStart are sent together\n+ then AfState will omit AfStateIdle and move straight to AfStateScanning\n+ (and start a scan).\n+\n+ If the AfMode is set to AfModeContinuous then the AfState will initially\n+ report AfStateScanning.\n+\n+ enum:\n+ - name: AfStateIdle\n+ value: 0\n+ description: |\n+ The AF algorithm is in manual mode (AfModeManual) or in auto mode\n+ (AfModeAuto) and a scan has not yet been triggered, or an\n+ in-progress scan was cancelled.\n+ - name: AfStateScanning\n+ value: 1\n+ description: |\n+ The AF algorithm is in auto mode (AfModeAuto), and a scan has been\n+ started using the AfTrigger control. The scan can be cancelled by\n+ sending AfTriggerCancel at which point the algorithm will either\n+ move back to AfStateIdle or, if the scan actually completes\n+ before the cancel request is processed, to one of\n+ AfStateFocused or AfStateFailed.\n+\n+ Alternatively the AF algorithm could be in continuous mode\n+ (AfModeContinuous) at which point it may enter this state\n+ spontaneously whenever it determines that a rescan is needed.\n+ - name: AfStateFocused\n+ value: 2\n+ description: |\n+ The AF algorithm is in auto (AfModeAuto) or continuous\n+ (AfModeContinuous) mode and a scan has completed with the result\n+ that the algorithm believes the image is now in focus.\n+ - name: AfStateFailed\n+ value: 3\n+ description: |\n+ The AF algorithm is in auto (AfModeAuto) or continuous\n+ (AfModeContinuous) mode and a scan has completed with the result\n+ that the algorithm did not find a good focus position.\n+\n+ - AfPauseState:\n+ type: int32_t\n+ description: |\n+ Only applicable in continuous (AfModeContinuous) mode, this reports\n+ whether the algorithm is currently running, paused or pausing (that is,\n+ will pause as soon as any in-progress scan completes).\n+\n+ Any change to AfMode will cause AfPauseStateRunning to be reported.\n+\n+ enum:\n+ - name: AfPauseStateRunning\n+ value: 0\n+ description: |\n+ Continuous AF is running and the algorithm may restart a scan\n+ spontaneously.\n+ - name: AfPauseStatePausing\n+ value: 1\n+ description: |\n+ Continuous AF has been sent an AfPauseDeferred control, and will\n+ pause as soon as any in-progress scan completes (and then report\n+ AfPauseStatePaused). No new scans will be start spontaneously until\n+ the AfPauseResume control is sent.\n+ - name: AfPauseStatePaused\n+ value: 2\n+ description: |\n+ Continuous AF is paused. No further state changes or lens movements\n+ will occur until the AfPauseResume control is sent.\n+\n # ----------------------------------------------------------------------------\n # Draft controls section\n \n@@ -406,27 +691,6 @@ controls:\n The camera will cancel any active or completed metering sequence.\n The AE algorithm is reset to its initial state.\n \n- - AfTrigger:\n- type: int32_t\n- draft: true\n- description: |\n- Control for AF trigger. Currently identical to\n- ANDROID_CONTROL_AF_TRIGGER.\n-\n- Whether the camera device will trigger autofocus for this request.\n- enum:\n- - name: AfTriggerIdle\n- value: 0\n- description: The trigger is idle.\n- - name: AfTriggerStart\n- value: 1\n- description: The AF routine is started by the camera.\n- - name: AfTriggerCancel\n- value: 2\n- description: |\n- The camera will cancel any active trigger and the AF routine is\n- reset to its initial state.\n-\n - NoiseReductionMode:\n type: int32_t\n draft: true\n@@ -507,45 +771,6 @@ controls:\n The AE algorithm has started a pre-capture metering session.\n \\sa AePrecaptureTrigger\n \n- - AfState:\n- type: int32_t\n- draft: true\n- description: |\n- Control to report the current AF algorithm state. Currently identical to\n- ANDROID_CONTROL_AF_STATE.\n-\n- Current state of the AF algorithm.\n- enum:\n- - name: AfStateInactive\n- value: 0\n- description: The AF algorithm is inactive.\n- - name: AfStatePassiveScan\n- value: 1\n- description: |\n- AF is performing a passive scan of the scene in continuous\n- auto-focus mode.\n- - name: AfStatePassiveFocused\n- value: 2\n- description: |\n- AF believes the scene is in focus, but might restart scanning.\n- - name: AfStateActiveScan\n- value: 3\n- description: |\n- AF is performing a scan triggered by an AF trigger request.\n- \\sa AfTrigger\n- - name: AfStateFocusedLock\n- value: 4\n- description: |\n- AF believes has focused correctly and has locked focus.\n- - name: AfStateNotFocusedLock\n- value: 5\n- description: |\n- AF has not been able to focus and has locked.\n- - name: AfStatePassiveUnfocused\n- value: 6\n- description: |\n- AF has completed a passive scan without finding focus.\n-\n - AwbState:\n type: int32_t\n draft: true\n", "prefixes": [ "libcamera-devel", "v4", "1/1" ] }