From patchwork Mon Aug 26 15:21:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Klug X-Patchwork-Id: 21010 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 31BD9C323E for ; Mon, 26 Aug 2024 15:22:32 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C315D633D9; Mon, 26 Aug 2024 17:22:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="MIg2BlGy"; dkim-atps=neutral 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 AD195633CF for ; Mon, 26 Aug 2024 17:22:29 +0200 (CEST) Received: from ideasonboard.com (unknown [IPv6:2a00:6020:448c:6c00:58b7:f3d:c9d4:defa]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 50859480; Mon, 26 Aug 2024 17:21:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1724685683; bh=PynvSlUYn5POsQFCftRjPz8+t7xPCsIigDANb1f9WOk=; h=From:To:Cc:Subject:Date:From; b=MIg2BlGy+pMlHoF6zeNy9RGkbrb6cVZ6AybbhvZ3OlYxc1jE7GNZqweewz2LtbZKQ u4Ce3GGJOLMfl1Ws8mkdXfaXukJdsEXdextIZCNlja8TrvBY8sHYC0852qeLcNVOu5 wJW3fDbw4Vn4pBVxbO3W1zLq5C88gd44iWzbpzzw= From: Stefan Klug To: libcamera-devel@lists.libcamera.org Cc: Stefan Klug Subject: [RFC/PATCH v1 0/8] Implement polynomial lsc loader Date: Mon, 26 Aug 2024 17:21:58 +0200 Message-ID: <20240826152224.362773-1-stefan.klug@ideasonboard.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Hi all, This series is not yet completely polished, as I'd like to get some feedback on the overall direction first. It is based on my colour temperature series [1]. Polynomial functions allow a relatively precise representation of the lensshading. The formula used here is from the DNG specification [2] page 110. Initial implementations in libtuning show that the overall error is quite low, but it is not yet clear if the ability to model the lens shading is sufficient for all cases. The huge benefit of polynomials is that they can be easily resampled for arbitrary crop rectangles. In case of the rkisp1 the hardware is configured using a 17x17 grid of gains. Resampling these for a arbitrary crop rectangle on the sensor leads to a degradation in quality. This can either be mitigated using a higher resolution grid as basis or by describing the lens shading using polynomials. This series implements the latter. Patches 1-3 replace the matrix interpolator with a generic interpolator class. This is only refactoring without functional changes. Patch 4 Uses the new interpolator for the current lsc algorithm. Patch 5-8 Implement a loader for polynomial lens shading coefficients. Sampling for the current sensor crop rectangle is done at load time. Questions I have in mind: - libipa/polynomial.h is only used inside the loader. Is that worth a own file, or should it be defined in lsc.cpp? - lsc.cpp now contains several helper classes on the top. Are these fine there, or should they be moved into another file? I'm happy for any feedback. Best regards, Stefan [1] https://patchwork.libcamera.org/project/libcamera/list/?series=4514 [1] https://helpx.adobe.com/content/dam/help/en/photoshop/pdf/DNG_Spec_1_7_1_0.pdf Stefan Klug (8): ipa: libipa: Add generic Interpolator class ipa: rkisp1: Use generic Interpolator class ipa: rkisp1: Remove MatrixInterpolator ipa: rkisp1: Use interpolator in lsc ipa: rkisp1: Move loader functions into helper class ipa: libipa: Add lsc polynomial class ipa: rkisp1: Add sensor info to context ipa: rkisp1: Add polynomial LSC loader src/ipa/libipa/interpolator.cpp | 139 +++++++++ src/ipa/libipa/interpolator.h | 139 +++++++++ src/ipa/libipa/matrix_interpolator.cpp | 110 ------- src/ipa/libipa/matrix_interpolator.h | 122 -------- src/ipa/libipa/meson.build | 6 +- src/ipa/libipa/polynomial.cpp | 23 ++ src/ipa/libipa/polynomial.h | 107 +++++++ src/ipa/rkisp1/algorithms/awb.cpp | 4 +- src/ipa/rkisp1/algorithms/awb.h | 5 +- src/ipa/rkisp1/algorithms/ccm.cpp | 18 +- src/ipa/rkisp1/algorithms/ccm.h | 6 +- src/ipa/rkisp1/algorithms/lsc.cpp | 405 +++++++++++++++---------- src/ipa/rkisp1/algorithms/lsc.h | 13 +- src/ipa/rkisp1/ipa_context.h | 2 + src/ipa/rkisp1/rkisp1.cpp | 4 +- 15 files changed, 684 insertions(+), 419 deletions(-) create mode 100644 src/ipa/libipa/interpolator.cpp create mode 100644 src/ipa/libipa/interpolator.h delete mode 100644 src/ipa/libipa/matrix_interpolator.cpp delete mode 100644 src/ipa/libipa/matrix_interpolator.h create mode 100644 src/ipa/libipa/polynomial.cpp create mode 100644 src/ipa/libipa/polynomial.h