[{"id":25744,"web_url":"https://patchwork.libcamera.org/comment/25744/","msgid":"<Y2rkykm4iC4ME8ZP@pendragon.ideasonboard.com>","date":"2022-11-08T23:22:50","subject":"Re: [libcamera-devel] [PATCH v2 04/11] utils: libtuning: modules:\n\talsc: Add rkisp1 ALSC module","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Sat, Oct 22, 2022 at 03:23:03PM +0900, Paul Elder via libcamera-devel wrote:\n> Add an ALSC module for RkISP1.\n\ns/ALSC/LSC/\n\nSame through the code and in the commit message.\n\n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> \n> ---\n> New in v2\n> ---\n>  .../tuning/libtuning/modules/alsc/__init__.py |   1 +\n>  utils/tuning/libtuning/modules/alsc/rkisp1.py | 112 ++++++++++++++++++\n>  2 files changed, 113 insertions(+)\n>  create mode 100644 utils/tuning/libtuning/modules/alsc/rkisp1.py\n> \n> diff --git a/utils/tuning/libtuning/modules/alsc/__init__.py b/utils/tuning/libtuning/modules/alsc/__init__.py\n> index ef6300c2..932ce38e 100644\n> --- a/utils/tuning/libtuning/modules/alsc/__init__.py\n> +++ b/utils/tuning/libtuning/modules/alsc/__init__.py\n> @@ -4,3 +4,4 @@\n>  \n>  from libtuning.modules.alsc.alsc import ALSC\n>  from libtuning.modules.alsc.raspberrypi import ALSCRaspberryPi\n> +from libtuning.modules.alsc.rkisp1 import ALSCRkISP1\n> diff --git a/utils/tuning/libtuning/modules/alsc/rkisp1.py b/utils/tuning/libtuning/modules/alsc/rkisp1.py\n> new file mode 100644\n> index 00000000..d8f253e6\n> --- /dev/null\n> +++ b/utils/tuning/libtuning/modules/alsc/rkisp1.py\n> @@ -0,0 +1,112 @@\n> +# SPDX-License-Identifier: BSD-2-Clause\n> +#\n> +# Copyright (C) 2019, Raspberry Pi Ltd\n> +# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>\n> +\n> +from .alsc import ALSC\n> +\n> +import libtuning as lt\n> +import libtuning.utils as utils\n> +\n> +from numbers import Number\n> +import numpy as np\n> +\n> +\n> +class ALSCRkISP1(ALSC):\n> +    hr_name = 'ALSC (RkISP1)'\n> +    out_name = 'LensShadingCorrection'\n> +    # todo Not sure if this is useful. Probably will remove later.\n\ns/todo/\\todo/\n\nI'll stop repeating this, please address it in all patches.\n\n> +    compatible = ['rkisp1']\n> +\n> +    def __init__(self, *args, **kwargs):\n> +        super().__init__(**kwargs)\n> +\n> +    # We don't actually need anything from the config file\n> +    def _validate_config(self, config: dict) -> bool:\n> +        return True\n> +\n> +    # @return Image color temperature, flattened array of red calibration table\n> +    #         (containing {sector size} elements), flattened array of blue\n> +    #         calibration table, flattened array of (red's) green calibration\n> +    #         table, flattened array of (blue's) green calibration table\n> +\n> +    def _do_single_alsc(self, image: lt.Image):\n> +        cgr, gr = self._lsc_single_channel(image.channels[lt.Color.GR], image)\n> +        cgb, gb = self._lsc_single_channel(image.channels[lt.Color.GB], image)\n> +\n> +        # Should these ratio against the average of both greens or just each\n> +        # green like we've done here?\n> +        cr, _ = self._lsc_single_channel(image.channels[lt.Color.R], image, gr)\n> +        cb, _ = self._lsc_single_channel(image.channels[lt.Color.B], image, gb)\n> +\n> +        return image.color, cr.flatten(), cb.flatten(), cgr.flatten(), cgb.flatten()\n> +\n> +    # @return List of dictionaries of color temperature, red table, red's green\n> +    #         table, blue's green table, and blue table\n> +\n> +    def _do_all_alsc(self, images: list) -> list:\n> +        output_list = []\n> +        output_map_func = lt.gradient.Linear().map\n\nIsn't this meant to come from the gradient passed to the constructor ?\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +        output_map_domain = (1, 3.999)\n> +        output_map_range = (1024, 4095)\n> +\n> +        # List of colour temperatures\n> +        list_col = []\n> +        # Associated calibration tables\n> +        list_cr = []\n> +        list_cb = []\n> +        list_cgr = []\n> +        list_cgb = []\n> +        for image in self._enumerate_alsc_images(images):\n> +            col, cr, cb, cgr, cgb = self._do_single_alsc(image)\n> +            list_col.append(col)\n> +            list_cr.append(cr)\n> +            list_cb.append(cb)\n> +            list_cgr.append(cgr)\n> +            list_cgb.append(cgb)\n> +\n> +        # Convert to numpy array for data manipulation\n> +        list_col = np.array(list_col)\n> +        list_cr = np.array(list_cr)\n> +        list_cb = np.array(list_cb)\n> +        list_cgr = np.array(list_cgr)\n> +        list_cgb = np.array(list_cgb)\n> +\n> +        for color_temperature in sorted(set(list_col)):\n> +            # Average tables for the same colour temperature\n> +            indices = np.where(list_col == color_temperature)\n> +            color_temperature = int(color_temperature)\n> +\n> +            tables = []\n> +            for lis in [list_cr, list_cgr, list_cgb, list_cb]:\n> +                table = np.mean(lis[indices], axis=0)\n> +                table = output_map_func(output_map_domain, output_map_range, table)\n> +                table = np.round(table).astype('int32').tolist()\n> +                tables.append(table)\n> +\n> +            entry = {\n> +                'ct': color_temperature,\n> +                'r': tables[0],\n> +                'gr': tables[1],\n> +                'gb': tables[2],\n> +                'b': tables[3],\n> +            }\n> +\n> +            output_list.append(entry)\n> +\n> +        return output_list\n> +\n> +    def _process(self, args, config: dict, images: list, outputs: dict) -> dict:\n> +        output = {}\n> +\n> +        # todo This should actually come from self.sector_{x,y}_gradient\n> +        size_gradient = lt.gradient.Linear(lt.Remainder.Float)\n> +        output['x-size'] = size_gradient.distribute(0.5, 8)\n> +        output['y-size'] = size_gradient.distribute(0.5, 8)\n> +\n> +        output['sets'] = self._do_all_alsc(images)\n> +\n> +        # todo Validate images from greyscale camera and force grescale mode\n> +        # todo Debug functionality\n> +\n> +        return output","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 DF727BE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  8 Nov 2022 23:23:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 46DC363083;\n\tWed,  9 Nov 2022 00:23:13 +0100 (CET)","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 7BAEC63077\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  9 Nov 2022 00:23:12 +0100 (CET)","from pendragon.ideasonboard.com (85-76-73-85-nat.elisa-mobile.fi\n\t[85.76.73.85])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 65955283;\n\tWed,  9 Nov 2022 00:23:11 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1667949793;\n\tbh=w0JDk4lGepSK+7h4dqlkWLroa7/ee4c9jL1qJeE/xUA=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=nrvAWmCmMV1GmxcXWLKAds/ibuV6Sxj6yEbHSveTwS4WBMf1W6OqvBcwSzz8SR8sY\n\t8ifZP3epflNvON2uWtN4pqG603H3jtihwJR1ocFM0hlqtSjilI5qQYkPaH2LJ4Cx+J\n\txWsHYuYQ2zUKMfB6Us/kat8OzntWoWDcX1B/vY2VAUVb+WJp0QsgeR8GXzKirB3COY\n\tN0YnAMi0aMROwvfZdcoC1dWu3X7CEMglN53Z5VN0w58roKFl/yLRvrNtJ7BEXoUX5R\n\tIFKZ0xiwTq6AXiKK44d3YDdkwxvyLsXmckqUGDR1WBszqmFoHhDZAl5/H22Xa+7jcy\n\tIG4c/m9j65uMg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1667949792;\n\tbh=w0JDk4lGepSK+7h4dqlkWLroa7/ee4c9jL1qJeE/xUA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=m2kNJz6cazgUADYLy51FYINr0flqjLCCTbbSymzwedHaWNwkz4T7nYZSnWPJd2LBC\n\tDdbBPaUgJiIFzuOA0Nzl9ltjAZQ5F6Wdxso2SHKOI2ozqwbJvtpXfN8DtGmdJqFQHV\n\trM7g/Un1jgnoSzgZpAtz9g50lUpni6B2oAVlXnkk="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"m2kNJz6c\"; dkim-atps=neutral","Date":"Wed, 9 Nov 2022 01:22:50 +0200","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<Y2rkykm4iC4ME8ZP@pendragon.ideasonboard.com>","References":"<20221022062310.2545463-1-paul.elder@ideasonboard.com>\n\t<20221022062310.2545463-5-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221022062310.2545463-5-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 04/11] utils: libtuning: modules:\n\talsc: Add rkisp1 ALSC module","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":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25763,"web_url":"https://patchwork.libcamera.org/comment/25763/","msgid":"<Y2yjd/c45AXoOX6q@pyrite.rasen.tech>","date":"2022-11-10T07:08:39","subject":"Re: [libcamera-devel] [PATCH v2 04/11] utils: libtuning: modules:\n\talsc: Add rkisp1 ALSC module","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"On Wed, Nov 09, 2022 at 01:22:50AM +0200, Laurent Pinchart wrote:\n> Hi Paul,\n> \n> Thank you for the patch.\n> \n> On Sat, Oct 22, 2022 at 03:23:03PM +0900, Paul Elder via libcamera-devel wrote:\n> > Add an ALSC module for RkISP1.\n> \n> s/ALSC/LSC/\n> \n> Same through the code and in the commit message.\n> \n> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> > \n> > ---\n> > New in v2\n> > ---\n> >  .../tuning/libtuning/modules/alsc/__init__.py |   1 +\n> >  utils/tuning/libtuning/modules/alsc/rkisp1.py | 112 ++++++++++++++++++\n> >  2 files changed, 113 insertions(+)\n> >  create mode 100644 utils/tuning/libtuning/modules/alsc/rkisp1.py\n> > \n> > diff --git a/utils/tuning/libtuning/modules/alsc/__init__.py b/utils/tuning/libtuning/modules/alsc/__init__.py\n> > index ef6300c2..932ce38e 100644\n> > --- a/utils/tuning/libtuning/modules/alsc/__init__.py\n> > +++ b/utils/tuning/libtuning/modules/alsc/__init__.py\n> > @@ -4,3 +4,4 @@\n> >  \n> >  from libtuning.modules.alsc.alsc import ALSC\n> >  from libtuning.modules.alsc.raspberrypi import ALSCRaspberryPi\n> > +from libtuning.modules.alsc.rkisp1 import ALSCRkISP1\n> > diff --git a/utils/tuning/libtuning/modules/alsc/rkisp1.py b/utils/tuning/libtuning/modules/alsc/rkisp1.py\n> > new file mode 100644\n> > index 00000000..d8f253e6\n> > --- /dev/null\n> > +++ b/utils/tuning/libtuning/modules/alsc/rkisp1.py\n> > @@ -0,0 +1,112 @@\n> > +# SPDX-License-Identifier: BSD-2-Clause\n> > +#\n> > +# Copyright (C) 2019, Raspberry Pi Ltd\n> > +# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>\n> > +\n> > +from .alsc import ALSC\n> > +\n> > +import libtuning as lt\n> > +import libtuning.utils as utils\n> > +\n> > +from numbers import Number\n> > +import numpy as np\n> > +\n> > +\n> > +class ALSCRkISP1(ALSC):\n> > +    hr_name = 'ALSC (RkISP1)'\n> > +    out_name = 'LensShadingCorrection'\n> > +    # todo Not sure if this is useful. Probably will remove later.\n> \n> s/todo/\\todo/\n> \n> I'll stop repeating this, please address it in all patches.\n> \n> > +    compatible = ['rkisp1']\n> > +\n> > +    def __init__(self, *args, **kwargs):\n> > +        super().__init__(**kwargs)\n> > +\n> > +    # We don't actually need anything from the config file\n> > +    def _validate_config(self, config: dict) -> bool:\n> > +        return True\n> > +\n> > +    # @return Image color temperature, flattened array of red calibration table\n> > +    #         (containing {sector size} elements), flattened array of blue\n> > +    #         calibration table, flattened array of (red's) green calibration\n> > +    #         table, flattened array of (blue's) green calibration table\n> > +\n> > +    def _do_single_alsc(self, image: lt.Image):\n> > +        cgr, gr = self._lsc_single_channel(image.channels[lt.Color.GR], image)\n> > +        cgb, gb = self._lsc_single_channel(image.channels[lt.Color.GB], image)\n> > +\n> > +        # Should these ratio against the average of both greens or just each\n> > +        # green like we've done here?\n> > +        cr, _ = self._lsc_single_channel(image.channels[lt.Color.R], image, gr)\n> > +        cb, _ = self._lsc_single_channel(image.channels[lt.Color.B], image, gb)\n> > +\n> > +        return image.color, cr.flatten(), cb.flatten(), cgr.flatten(), cgb.flatten()\n> > +\n> > +    # @return List of dictionaries of color temperature, red table, red's green\n> > +    #         table, blue's green table, and blue table\n> > +\n> > +    def _do_all_alsc(self, images: list) -> list:\n> > +        output_list = []\n> > +        output_map_func = lt.gradient.Linear().map\n> \n> Isn't this meant to come from the gradient passed to the constructor ?\n\nNo, this is a different linear function for mapping the output of lsc [1,\n3.999] to the values that the rkisp1's lsc registers want [1024, 4095].\n\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n\nThanks,\n\nPaul\n\n> \n> > +        output_map_domain = (1, 3.999)\n> > +        output_map_range = (1024, 4095)\n> > +\n> > +        # List of colour temperatures\n> > +        list_col = []\n> > +        # Associated calibration tables\n> > +        list_cr = []\n> > +        list_cb = []\n> > +        list_cgr = []\n> > +        list_cgb = []\n> > +        for image in self._enumerate_alsc_images(images):\n> > +            col, cr, cb, cgr, cgb = self._do_single_alsc(image)\n> > +            list_col.append(col)\n> > +            list_cr.append(cr)\n> > +            list_cb.append(cb)\n> > +            list_cgr.append(cgr)\n> > +            list_cgb.append(cgb)\n> > +\n> > +        # Convert to numpy array for data manipulation\n> > +        list_col = np.array(list_col)\n> > +        list_cr = np.array(list_cr)\n> > +        list_cb = np.array(list_cb)\n> > +        list_cgr = np.array(list_cgr)\n> > +        list_cgb = np.array(list_cgb)\n> > +\n> > +        for color_temperature in sorted(set(list_col)):\n> > +            # Average tables for the same colour temperature\n> > +            indices = np.where(list_col == color_temperature)\n> > +            color_temperature = int(color_temperature)\n> > +\n> > +            tables = []\n> > +            for lis in [list_cr, list_cgr, list_cgb, list_cb]:\n> > +                table = np.mean(lis[indices], axis=0)\n> > +                table = output_map_func(output_map_domain, output_map_range, table)\n> > +                table = np.round(table).astype('int32').tolist()\n> > +                tables.append(table)\n> > +\n> > +            entry = {\n> > +                'ct': color_temperature,\n> > +                'r': tables[0],\n> > +                'gr': tables[1],\n> > +                'gb': tables[2],\n> > +                'b': tables[3],\n> > +            }\n> > +\n> > +            output_list.append(entry)\n> > +\n> > +        return output_list\n> > +\n> > +    def _process(self, args, config: dict, images: list, outputs: dict) -> dict:\n> > +        output = {}\n> > +\n> > +        # todo This should actually come from self.sector_{x,y}_gradient\n> > +        size_gradient = lt.gradient.Linear(lt.Remainder.Float)\n> > +        output['x-size'] = size_gradient.distribute(0.5, 8)\n> > +        output['y-size'] = size_gradient.distribute(0.5, 8)\n> > +\n> > +        output['sets'] = self._do_all_alsc(images)\n> > +\n> > +        # todo Validate images from greyscale camera and force grescale mode\n> > +        # todo Debug functionality\n> > +\n> > +        return output","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 8AC01BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 10 Nov 2022 07:08:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EBDDD63083;\n\tThu, 10 Nov 2022 08:08:46 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DC2F761F38\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 10 Nov 2022 08:08:45 +0100 (CET)","from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp\n\t[175.177.42.159])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 883F693;\n\tThu, 10 Nov 2022 08:08:44 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1668064127;\n\tbh=HDQqMeFVeYS3pkLgm+AvmMV8qnDMtQsO66yX/mFaf8c=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=NwBSr4SCtVFYYuSfXV2tMnRyfaRTlT8C+UXm5Bg+Fzg5kCqeQWR+oGo8ATsY3p3RL\n\tmwTrL+Wymf6c95HC3E33NsAaUiXYHfabutq9QXQ5t8VlvjzXdvH2etxVaGyF1BrouM\n\tUOg+OhtuQLYmQu5os4bcYbcbCH98xZ7ipUovQduOh2Vvusg56ZlHVZmNfqHVqAT17U\n\tjQzuUIIpvv/j9ciA9vViDVcKB5mSkv8tm5reuIEX/r3rXXB7x3ei5lHrRocXb0hh3M\n\tyktMk6bAgG9zxADbj9jtKAPn3UN2KB/THwxUasJUZI0f17Sgka11w3j8Jng54SIFA4\n\t8wYGvChbUCZGw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1668064125;\n\tbh=HDQqMeFVeYS3pkLgm+AvmMV8qnDMtQsO66yX/mFaf8c=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=v8f8CXkFSX3twwbacRSKD20dTlbwCBZoq9FiWtfg+R7OsFMdA5C0plZEYjztIJyVU\n\tMXnBqzb+SsaDPMm3oDI7JS+byVNUt5ITLSUUeQa14vaSkU7NaCLviv4yLq6rtM04Bo\n\tqKv64v6oT7bO9KmaMTce0afyTcngYATd3pyvn8xE="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"v8f8CXkF\"; dkim-atps=neutral","Date":"Thu, 10 Nov 2022 16:08:39 +0900","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<Y2yjd/c45AXoOX6q@pyrite.rasen.tech>","References":"<20221022062310.2545463-1-paul.elder@ideasonboard.com>\n\t<20221022062310.2545463-5-paul.elder@ideasonboard.com>\n\t<Y2rkykm4iC4ME8ZP@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<Y2rkykm4iC4ME8ZP@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 04/11] utils: libtuning: modules:\n\talsc: Add rkisp1 ALSC module","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":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]