{"id":13128,"url":"https://patchwork.libcamera.org/api/1.1/patches/13128/?format=json","web_url":"https://patchwork.libcamera.org/patch/13128/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20210727110519.11587-4-jacopo@jmondi.org>","date":"2021-07-27T11:05:19","name":"[libcamera-devel,v3,3/3] android: capabilities: Centralize RAW support check","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"0be856030566f9eeb5e07e947c77b4b866396230","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/1.1/people/3/?format=json","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/13128/mbox/","series":[{"id":2282,"url":"https://patchwork.libcamera.org/api/1.1/series/2282/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=2282","date":"2021-07-27T11:05:16","name":"android: Drive-by cleanups","version":3,"mbox":"https://patchwork.libcamera.org/series/2282/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/13128/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/13128/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 43D13C322C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 27 Jul 2021 11:04:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0854F687C7;\n\tTue, 27 Jul 2021 13:04:41 +0200 (CEST)","from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net\n\t[217.70.183.200])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A2B73687CB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 27 Jul 2021 13:04:37 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay7-d.mail.gandi.net (Postfix) with ESMTPSA id DA14B20003;\n\tTue, 27 Jul 2021 11:04:36 +0000 (UTC)"],"From":"Jacopo Mondi <jacopo@jmondi.org>","To":"libcamera-devel@lists.libcamera.org","Date":"Tue, 27 Jul 2021 13:05:19 +0200","Message-Id":"<20210727110519.11587-4-jacopo@jmondi.org>","X-Mailer":"git-send-email 2.32.0","In-Reply-To":"<20210727110519.11587-1-jacopo@jmondi.org>","References":"<20210727110519.11587-1-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH v3 3/3] android: capabilities: Centralize\n\tRAW support check","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":"The validation of RAW stream support is performed in two different\nplaces:\n\n- At initializeStreamConfigurations() time, by verifying that the\n  libcamera format associated with HAL_PIXEL_FORMAT_BLOB is a Raw format\n  and ensuring the Camera successfully validates it\n- As initializeStaticMetadata() time by generating a CameraConfiguration\n  for the Raw stream role and ensuring it is a Raw format with a 16 bit\n  depth\n\nThe first check is used to build the list of supported Raw stream\nresolutions. The latter is used to register the\nANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW capability.\n\nAs building the list of supported Raw streams doesn't serve any\npurpose if the RAW capability is not registered, centralize the Raw\nformat support verification at initializeStreamConfigurations() time by\nensuring the supported format is a Raw one with a 16 bit depth.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n---\n src/android/camera_capabilities.cpp | 37 +++++++++++++++++------------\n src/android/camera_capabilities.h   |  1 +\n 2 files changed, 23 insertions(+), 15 deletions(-)","diff":"diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\nindex 15e54192adff..709bfb2a4a19 100644\n--- a/src/android/camera_capabilities.cpp\n+++ b/src/android/camera_capabilities.cpp\n@@ -122,6 +122,7 @@ int CameraCapabilities::initialize(std::shared_ptr<libcamera::Camera> camera,\n \tcamera_ = camera;\n \torientation_ = orientation;\n \tfacing_ = facing;\n+\trawStreamAvailable_ = false;\n \n \t/* Acquire the camera and initialize available stream configurations. */\n \tint ret = camera_->acquire();\n@@ -324,11 +325,28 @@ int CameraCapabilities::initializeStreamConfigurations()\n \n \t\tstd::vector<Size> resolutions;\n \t\tconst PixelFormatInfo &info = PixelFormatInfo::info(mappedFormat);\n-\t\tif (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW)\n+\t\tswitch (info.colourEncoding) {\n+\t\tcase PixelFormatInfo::ColourEncodingRAW:\n+\t\t\tif (info.bitsPerPixel != 16)\n+\t\t\t\tcontinue;\n+\n+\t\t\trawStreamAvailable_ = true;\n \t\t\tresolutions = initializeRawResolutions(mappedFormat);\n-\t\telse\n+\t\t\tbreak;\n+\n+\t\tcase PixelFormatInfo::ColourEncodingYUV:\n+\t\tcase PixelFormatInfo::ColourEncodingRGB:\n+\t\t\t/*\n+\t\t\t * We support enumerating RGB streams here to allow\n+\t\t\t * mapping IMPLEMENTATION_DEFINED format to RGB.\n+\t\t\t */\n \t\t\tresolutions = initializeYUVResolutions(mappedFormat,\n \t\t\t\t\t\t\t       cameraResolutions);\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\tcontinue;\n+\t\t}\n \n \t\tfor (const Size &res : resolutions) {\n \t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n@@ -866,22 +884,11 @@ int CameraCapabilities::initializeStaticMetadata()\n \t};\n \n \t/* Report if camera supports RAW. */\n-\tbool rawStreamAvailable = false;\n-\tstd::unique_ptr<CameraConfiguration> cameraConfig =\n-\t\tcamera_->generateConfiguration({ StreamRole::Raw });\n-\tif (cameraConfig && !cameraConfig->empty()) {\n-\t\tconst PixelFormatInfo &info =\n-\t\t\tPixelFormatInfo::info(cameraConfig->at(0).pixelFormat);\n-\t\t/* Only advertise RAW support if RAW16 is possible. */\n-\t\tif (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW &&\n-\t\t    info.bitsPerPixel == 16) {\n-\t\t\trawStreamAvailable = true;\n+\tif (rawStreamAvailable_)\n \t\t\tavailableCapabilities.push_back(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW);\n-\t\t}\n-\t}\n \n \t/* Number of { RAW, YUV, JPEG } supported output streams */\n-\tint32_t numOutStreams[] = { rawStreamAvailable, 2, 1 };\n+\tint32_t numOutStreams[] = { rawStreamAvailable_, 2, 1 };\n \tstaticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,\n \t\t\t\t  numOutStreams);\n \ndiff --git a/src/android/camera_capabilities.h b/src/android/camera_capabilities.h\nindex e7aa46c0a689..42a976d3b482 100644\n--- a/src/android/camera_capabilities.h\n+++ b/src/android/camera_capabilities.h\n@@ -55,6 +55,7 @@ private:\n \n \tint facing_;\n \tint orientation_;\n+\tbool rawStreamAvailable_;\n \n \tstd::vector<Camera3StreamConfiguration> streamConfigurations_;\n \tstd::map<int, libcamera::PixelFormat> formatsMap_;\n","prefixes":["libcamera-devel","v3","3/3"]}