From patchwork Mon Jun 19 06:02:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 18748 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id B13EEBD78E for ; Mon, 19 Jun 2023 06:02:53 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D102A628C3; Mon, 19 Jun 2023 08:02:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1687154572; bh=Pkmz7OVFrwG5lK3IaBw8Uz7CF55pwV1j3PT5xkAoF5k=; h=To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=O6BrE7igR7Oy1qmK/G7XDdt+1gXc5uxcVLEWeRxVVIwP1zn6iQWd5mVo5aejTEOtg 9Bu9fzmPHRX6IehSODDYQlsncLhD4gEdSnF5uAitB79C6jxjYwM+FHo3H+qjzabmo6 ZzD3siw5BByGI0Rn1TQE0fN5IJWLrnSiMMi+EWFhJb/oH9vio/qUJ8hW878kAyxgIW TREDa69yQbzxe67h4KRZHZcKi9WYX8TEMYTsk8kBdcx8IsPo73JQDxgv+0lSu8GJvW ZwYzv07558SHyEVqAIcVxbEQwRWx+c+X5rjxFfv43RT+mXeld+n8FGmtdLGQGwlMEz QWzNosWtwotKA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 94B2061E3F for ; Mon, 19 Jun 2023 08:02:50 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="cNbA+sCt"; dkim-atps=neutral Received: from umang.jainideasonboard.com (unknown [103.86.18.208]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DC095800; Mon, 19 Jun 2023 08:02:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1687154536; bh=Pkmz7OVFrwG5lK3IaBw8Uz7CF55pwV1j3PT5xkAoF5k=; h=From:To:Cc:Subject:Date:From; b=cNbA+sCt7wl8ZUGirBusYJ/zsNbGEnfxnojhSMMEcXEGb73GdSvytXncvLsBYoIRs dZAHILtIgwmzgGaPv6bJsSxtmXXjK7H3wTYEZ6SfUsKOpiyb1MLcXH4iIqcpZvsM2h JJrgulyVhWO2ycvOJQDe3FmDis4WMn9ldEbyxbKo= To: libcamera-devel@lists.libcamera.org Date: Mon, 19 Jun 2023 11:32:42 +0530 Message-Id: <20230619060242.37020-1-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.39.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2] ipa: rpi: cam_helper: PDAF support for IMX519 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Umang Jain via libcamera-devel From: Umang Jain Reply-To: Umang Jain Cc: john Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" From: john Adds the PDAF support for IMX519 camera module by Arducam. Signed-off-by: Umang Jain Tested-by: Umang Jain --- Changes in v2: - Add author's Name "john " - Add Tested-by: tag Question: S-o-B by author is still missing on origin commit, should I externally add it? --- src/ipa/rpi/cam_helper/cam_helper_imx519.cpp | 50 ++++++++++++++++++++ src/ipa/rpi/vc4/data/imx519.json | 40 ++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp index c7262aa0..6d032082 100644 --- a/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp +++ b/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp @@ -15,9 +15,13 @@ #include +#include "controller/pdaf_data.h" + #include "cam_helper.h" #include "md_parser.h" +#define ALIGN_UP(x, a) (((x) + (a)-1) & ~(a - 1)) + using namespace RPiController; using namespace libcamera; using libcamera::utils::Duration; @@ -66,8 +70,13 @@ private: /* Largest long exposure scale factor given as a left shift on the frame length. */ static constexpr int longExposureShiftMax = 7; + static constexpr int pdafStatsRows = 12; + static constexpr int pdafStatsCols = 16; + void populateMetadata(const MdParser::RegisterMap ®isters, Metadata &metadata) const override; + static bool parsePdafData(const uint8_t *ptr, size_t len, unsigned bpp, + PdafRegions &pdaf); }; CamHelperImx519::CamHelperImx519() @@ -90,6 +99,11 @@ void CamHelperImx519::prepare(libcamera::Span buffer, Metadata &m MdParser::RegisterMap registers; DeviceStatus deviceStatus; + LOG(IPARPI, Debug) << "Embedded buffer size: " << buffer.size(); + + size_t bytesPerLine = (mode_.width * mode_.bitdepth) >> 3; + bytesPerLine = ALIGN_UP(bytesPerLine, 16); + if (metadata.get("device.status", deviceStatus)) { LOG(IPARPI, Error) << "DeviceStatus not found from DelayedControls"; return; @@ -97,6 +111,14 @@ void CamHelperImx519::prepare(libcamera::Span buffer, Metadata &m parseEmbeddedData(buffer, metadata); + if (buffer.size() > 2 * bytesPerLine) { + PdafRegions pdaf; + parsePdafData(&buffer[2 * bytesPerLine], + buffer.size() - 2 * bytesPerLine, + mode_.bitdepth, pdaf); + metadata.set("pdaf.data", pdaf); + } + /* * The DeviceStatus struct is first populated with values obtained from * DelayedControls. If this reports frame length is > frameLengthMax, @@ -188,6 +210,34 @@ void CamHelperImx519::populateMetadata(const MdParser::RegisterMap ®isters, metadata.set("device.status", deviceStatus); } +bool CamHelperImx519::parsePdafData(const uint8_t *ptr, size_t len, + unsigned bpp, PdafRegions &pdaf) +{ + size_t step = bpp >> 1; /* bytes per PDAF grid entry */ + + if (bpp < 10 || bpp > 12 || len < 194 * step || ptr[0] != 0 || ptr[1] >= 0x40) { + LOG(IPARPI, Error) << "PDAF data in unsupported format"; + return false; + } + + pdaf.init({ pdafStatsCols, pdafStatsRows }); + + ptr += 2 * step; + for (unsigned i = 0; i < pdafStatsRows; ++i) { + for (unsigned j = 0; j < pdafStatsCols; ++j) { + unsigned c = (ptr[0] << 3) | (ptr[1] >> 5); + int p = (((ptr[1] & 0x0F) - (ptr[1] & 0x10)) << 6) | (ptr[2] >> 2); + PdafData pdafData; + pdafData.conf = c; + pdafData.phase = c ? p : 0; + pdaf.set(libcamera::Point(j, i), { pdafData, 1, 0 }); + ptr += step; + } + } + + return true; +} + static CamHelper *create() { return new CamHelperImx519(); diff --git a/src/ipa/rpi/vc4/data/imx519.json b/src/ipa/rpi/vc4/data/imx519.json index 1b0a7747..0733d97e 100644 --- a/src/ipa/rpi/vc4/data/imx519.json +++ b/src/ipa/rpi/vc4/data/imx519.json @@ -350,6 +350,46 @@ ] } }, + { + "rpi.af": + { + "ranges": + { + "normal": + { + "min": 0.0, + "max": 12.0, + "default": 1.0 + }, + "macro": + { + "min": 3.0, + "max": 15.0, + "default": 4.0 + } + }, + "speeds": + { + "normal": + { + "step_coarse": 1.0, + "step_fine": 0.25, + "contrast_ratio": 0.75, + "pdaf_gain": -0.02, + "pdaf_squelch": 0.125, + "max_slew": 2.0, + "pdaf_frames": 20, + "dropout_frames": 6, + "step_frames": 4 + } + }, + "conf_epsilon": 8, + "conf_thresh": 16, + "conf_clip": 512, + "skip_frames": 5, + "map": [ 0.0, 0.0, 15.0, 4095 ] + } + }, { "rpi.ccm": {