Patch Detail
Show a patch.
GET /api/patches/12767/?format=api
{ "id": 12767, "url": "https://patchwork.libcamera.org/api/patches/12767/?format=api", "web_url": "https://patchwork.libcamera.org/patch/12767/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20210702103800.41291-3-paul.elder@ideasonboard.com>", "date": "2021-07-02T10:37:46", "name": "[libcamera-devel,RFC,v4,02/16] android: Add infrastructure for determining capabilities and hardware level", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "f02ea87f040578bc45f7394a547db444d2ae950d", "submitter": { "id": 17, "url": "https://patchwork.libcamera.org/api/people/17/?format=api", "name": "Paul Elder", "email": "paul.elder@ideasonboard.com" }, "delegate": { "id": 17, "url": "https://patchwork.libcamera.org/api/users/17/?format=api", "username": "epaul", "first_name": "Paul", "last_name": "Elder", "email": "paul.elder@ideasonboard.com" }, "mbox": "https://patchwork.libcamera.org/patch/12767/mbox/", "series": [ { "id": 2199, "url": "https://patchwork.libcamera.org/api/series/2199/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2199", "date": "2021-07-02T10:37:44", "name": "Preliminary FULL plumbing", "version": 3, "mbox": "https://patchwork.libcamera.org/series/2199/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/12767/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/12767/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 B4ED3C3222\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 2 Jul 2021 10:38:18 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6FE59684F5;\n\tFri, 2 Jul 2021 12:38:18 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8486A684F4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 2 Jul 2021 12:38:16 +0200 (CEST)", "from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1D8384AB;\n\tFri, 2 Jul 2021 12:38:14 +0200 (CEST)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"lcFeDnjz\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1625222296;\n\tbh=suJnK99d9R8uCjtGTWwDvgmBLODHQYMksj5ADPhFG8Q=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=lcFeDnjzyRfF+HjtozDUjpZtLXb8Kv88DXQf2FqhwUKtakIpL3uUUEF6ziT4p1n3C\n\t+SY3cMQjv/4Sb12E9Em9kh3d+yp2HNx7e/XB2vPpFwT17Tw0xEd4Zd8JMutt1OjN+7\n\tfa9iRo9z6+goMrMYScZbW5jbzZFLcspaiBVfar5E=", "From": "Paul Elder <paul.elder@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 2 Jul 2021 19:37:46 +0900", "Message-Id": "<20210702103800.41291-3-paul.elder@ideasonboard.com>", "X-Mailer": "git-send-email 2.27.0", "In-Reply-To": "<20210702103800.41291-1-paul.elder@ideasonboard.com>", "References": "<20210702103800.41291-1-paul.elder@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [RFC PATCH v4 02/16] android: Add infrastructure\n\tfor determining capabilities and hardware level", "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>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Add the infrastructure for checking and reporting capabilities. Use\nthese capabilities to determine the hardware level as well.\n\nSince the raw capability is set to true when support is determined to be\navailable, leave that as default false and set to true, since copying\nthe pattern of the other capabilities would cause redundant code.\n\nNote that this will cause CTS to fail, as we don't yet declare the lack\nof support for FULL based on the available controls.\n\nBug: https://bugs.libcamera.org/show_bug.cgi?id=55\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\nChanges in v4:\n- rebase on camera capabilities refactoring\n- switch to std::set from std::map\n- make hwlevel similar to capabilities\n\nChanges in v3:\n- fix some compiler errors\n- go ahead and initialize the capabilities to true, update the commit\n message accordingly\n\nChanges in v2:\n- add a flag for FULL, since there are a few requirements that are not\n obtained from capabilities alone\n- add burst capture capability, since that is required for FULL as well\n\nThis is my vision of how we would support the various capabilities.\nAlthough we don't have anything for FULL yet; I imagine that we would\nstart the flags for manual sensor and manual post processing with true,\nand then if a required control is unavailable, then we would set the\nflag to false.\n\nI considered declaring an enum in CameraDevice to mirror the android\nones, just for shorthand, but it seemed like a lot of code for not much\ngain. Unless the shorthand would be valuable because these constant\nnames are so long?\n\nI think the available keys lists will have to be moved to the head of\nthe function, and then as available controls are discovered add them to\nthat list.\n---\n src/android/camera_capabilities.cpp | 50 +++++++++++++++++++++++------\n 1 file changed, 40 insertions(+), 10 deletions(-)", "diff": "diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\nindex 6b5edb66..54bd71da 100644\n--- a/src/android/camera_capabilities.cpp\n+++ b/src/android/camera_capabilities.cpp\n@@ -9,6 +9,7 @@\n \n #include <array>\n #include <cmath>\n+#include <map>\n \n #include <hardware/camera3.h>\n \n@@ -114,6 +115,15 @@ const std::map<int, const Camera3Format> camera3FormatsMap = {\n \t},\n };\n \n+const std::map<camera_metadata_enum_android_info_supported_hardware_level, std::string>\n+hwLevelStrings = {\n+\t{ ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED, \"LIMITED\" },\n+\t{ ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL, \"FULL\" },\n+\t{ ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, \"LEGACY\" },\n+\t{ ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3, \"LEVEL_3\" },\n+\t{ ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL, \"EXTERNAL\" },\n+};\n+\n } /* namespace */\n \n int CameraCapabilities::initialize(std::shared_ptr<libcamera::Camera> camera,\n@@ -376,6 +386,19 @@ int CameraCapabilities::initializeStaticMetadata()\n \tconst ControlInfoMap &controlsInfo = camera_->controls();\n \tconst ControlList &properties = camera_->properties();\n \n+\tstd::set<camera_metadata_enum_android_request_available_capabilities>\n+\tcapabilities = {\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR,\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING,\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE,\n+\t};\n+\n+\tstd::set<camera_metadata_enum_android_info_supported_hardware_level>\n+\thwLevels = {\n+\t\tANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL,\n+\t};\n+\n \t/* Color correction static metadata. */\n \t{\n \t\tstd::vector<uint8_t> data;\n@@ -834,11 +857,6 @@ int CameraCapabilities::initializeStaticMetadata()\n \tuint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;\n \tstaticMetadata_->addEntry(ANDROID_SCALER_CROPPING_TYPE, croppingType);\n \n-\t/* Info static metadata. */\n-\tuint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;\n-\tstaticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,\n-\t\t\t\t supportedHWLevel);\n-\n \t/* Request static metadata. */\n \tint32_t partialResultCount = 1;\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n@@ -859,10 +877,6 @@ int CameraCapabilities::initializeStaticMetadata()\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,\n \t\t\t\t maxNumInputStreams);\n \n-\tstd::vector<uint8_t> availableCapabilities = {\n-\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,\n-\t};\n-\n \t/* Report if camera supports RAW. */\n \tbool rawStreamAvailable = false;\n \tstd::unique_ptr<CameraConfiguration> cameraConfig =\n@@ -874,7 +888,7 @@ int CameraCapabilities::initializeStaticMetadata()\n \t\tif (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW &&\n \t\t info.bitsPerPixel == 16) {\n \t\t\trawStreamAvailable = true;\n-\t\t\tavailableCapabilities.push_back(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW);\n+\t\t\tcapabilities.insert(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW);\n \t\t}\n \t}\n \n@@ -883,9 +897,25 @@ int CameraCapabilities::initializeStaticMetadata()\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,\n \t\t\t\t numOutStreams);\n \n+\t/* Check capabilities */\n+\tstd::vector<uint8_t> availableCapabilities(capabilities.begin(),\n+\t\t\t\t\t\t capabilities.end());\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_CAPABILITIES,\n \t\t\t\t availableCapabilities);\n \n+\tuint8_t hwLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;\n+\tif (capabilities.count(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR) &&\n+\t capabilities.count(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING) &&\n+\t capabilities.count(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE) &&\n+\t hwLevels.count(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL))\n+\t\thwLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;\n+\tstaticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,\n+\t\t\t\t hwLevel);\n+\n+\tLOG(HAL, Info)\n+\t\t<< \"Hardware level: \"\n+\t\t<< hwLevelStrings.find((camera_metadata_enum_android_info_supported_hardware_level)hwLevel)->second;\n+\n \tstd::vector<int32_t> availableCharacteristicsKeys = {\n \t\tANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,\n \t\tANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,\n", "prefixes": [ "libcamera-devel", "RFC", "v4", "02/16" ] }