[{"id":12405,"web_url":"https://patchwork.libcamera.org/comment/12405/","msgid":"<20200910103835.GF4095624@oden.dyn.berto.se>","date":"2020-09-10T10:38:35","subject":"Re: [libcamera-devel] [PATCH v3 04/11] android: camera_device:\n\tBreak out size calculation","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Jacopo,\n\nThanks for your work.\n\nOn 2020-09-08 15:41:35 +0200, Jacopo Mondi wrote:\n> As the RAW stream sizes needs to be calculated differently from the\n> processed one, break out the procedure to calculate the processed\n> (RGB/YUV) resolutions from initializeStreamConfigurations() in order to\n> prepare for RAW sizes calculation.\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  src/android/camera_device.cpp | 51 +++++++++++++++++++++++------------\n>  src/android/camera_device.h   |  5 ++++\n>  2 files changed, 39 insertions(+), 17 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 17b5fd5f59eb..9d460906ab08 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -283,6 +283,36 @@ int CameraDevice::initialize()\n>  \treturn ret;\n>  }\n>  \n> +std::vector<Size> CameraDevice::filterYUVResolutions(CameraConfiguration *cameraConfig,\n> +\t\t\t\t\t\t     const PixelFormat &pixelFormat,\n> +\t\t\t\t\t\t     const std::vector<Size> &resolutions)\n> +{\n> +\tstd::vector<Size> supportedResolutions;\n> +\n> +\tStreamConfiguration &cfg = cameraConfig->at(0);\n> +\tfor (const Size &res : resolutions) {\n> +\t\tcfg.pixelFormat = pixelFormat;\n> +\t\tcfg.size = res;\n> +\n> +\t\tstd::stringstream ss;\n> +\t\tss << \"Testing \" << cfg.toString();\n> +\n> +\t\tCameraConfiguration::Status status = cameraConfig->validate();\n> +\t\tif (status != CameraConfiguration::Valid) {\n> +\t\t\tss << \" not supported\";\n> +\t\t\tLOG(HAL, Debug) << ss.str();\n> +\t\t\tcontinue;\n> +\t\t}\n> +\n> +\t\tss << \" supported\";\n> +\t\tLOG(HAL, Debug) << ss.str();\n> +\n> +\t\tsupportedResolutions.push_back(res);\n> +\t}\n> +\n> +\treturn supportedResolutions;\n> +}\n> +\n>  /*\n>   * Initialize the format conversion map to translate from Android format\n>   * identifier to libcamera pixel formats and fill in the list of supported\n> @@ -427,23 +457,10 @@ int CameraDevice::initializeStreamConfigurations()\n>  \t\t\t\t<< camera3Format.name << \" to \"\n>  \t\t\t\t<< mappedFormat.toString();\n>  \n> -\t\tfor (const Size &res : cameraResolutions) {\n> -\t\t\tcfg.pixelFormat = mappedFormat;\n> -\t\t\tcfg.size = res;\n> -\n> -\t\t\tstd::stringstream ss;\n> -\t\t\tss << \"Testing \" << cfg.toString();\n> -\n> -\t\t\tCameraConfiguration::Status status = cameraConfig->validate();\n> -\t\t\tif (status != CameraConfiguration::Valid) {\n> -\t\t\t\tss << \" not supported\";\n> -\t\t\t\tLOG(HAL, Debug) << ss.str();\n> -\t\t\t\tcontinue;\n> -\t\t\t}\n> -\n> -\t\t\tss << \" supported\";\n> -\t\t\tLOG(HAL, Debug) << ss.str();\n> -\n> +\t\tstd::vector<Size> resolutions = filterYUVResolutions(cameraConfig.get(),\n> +\t\t\t\t\t\t\t\t     mappedFormat,\n> +\t\t\t\t\t\t\t\t     cameraResolutions);\n> +\t\tfor (const Size &res : resolutions) {\n>  \t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n>  \n>  \t\t\t/*\n> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> index 3934f194f1b5..359a163ebab9 100644\n> --- a/src/android/camera_device.h\n> +++ b/src/android/camera_device.h\n> @@ -93,6 +93,11 @@ private:\n>  \t};\n>  \n>  \tint initializeStreamConfigurations();\n> +\tstd::vector<libcamera::Size>\n> +\tfilterYUVResolutions(libcamera::CameraConfiguration *cameraConfig,\n> +\t\t\t     const libcamera::PixelFormat &pixelFormat,\n> +\t\t\t     const std::vector<libcamera::Size> &resolutions);\n> +\n>  \tstd::tuple<uint32_t, uint32_t> calculateStaticMetadataSize();\n>  \tlibcamera::FrameBuffer *createFrameBuffer(const buffer_handle_t camera3buffer);\n>  \tvoid notifyShutter(uint32_t frameNumber, uint64_t timestamp);\n> -- \n> 2.28.0\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 AB38BBDB1D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 10 Sep 2020 10:38:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2B18462D27;\n\tThu, 10 Sep 2020 12:38:39 +0200 (CEST)","from mail-lf1-x142.google.com (mail-lf1-x142.google.com\n\t[IPv6:2a00:1450:4864:20::142])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3E7E362C43\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 10 Sep 2020 12:38:37 +0200 (CEST)","by mail-lf1-x142.google.com with SMTP id y11so3316121lfl.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 10 Sep 2020 03:38:37 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tr7sm1251489lfn.84.2020.09.10.03.38.35\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 10 Sep 2020 03:38:36 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"gY8ja3Lv\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=HME6V0aLP48ggNkHW2o6XwcFmOxerqHk+URD1ieFYjw=;\n\tb=gY8ja3LvWn0dAjOhiSvMAgpIAEDqBurLJxq8VzrEhh5rSoceWM6We7j3eVhMnyuMBC\n\t+190osUbNlmZ0I7i++V3ut9dURlg6i3wugeINGnLL8fejQrgtRTqFWdHVF5M8qNRprxI\n\tZnbUo+OmxaUu/Dm9V9N7HJaSCYcQB170y84VhikZIbSA0G02fYq55XtsrdfNg4w2SF6y\n\tFptccKEJ/0Pkflk+aiazfMlxp4wcVAQgBUClOQQzoVu/g6PdRy6ZIiM8DUsaPhSovLiK\n\tKR0OIJY4QFMqd12EBOTD2cQl+hoTdqSQ9hRjfwvMSLhhPu+FeauuywTUH+Auw4741Wb1\n\tYfQg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=HME6V0aLP48ggNkHW2o6XwcFmOxerqHk+URD1ieFYjw=;\n\tb=QQiD4dQ3hHJp7ptXK9WmYxlxG9QO0Jd+kSEE2k0XQzZ8yPb2opNroZGqUV6imB97BG\n\tEblFXlGuR8hGehjXuzMlPxMqM5d4M93GA3Rue+iTUNiByqxFUzW6+64Zz9Hrf3aEyv8t\n\t9o4gYhyTbDSjOaowYInasWiZ4gOxFQm7UBrTbxQ29tM87PtPibf8Sl3dN8hwNpAUv9dD\n\tyWZZfwi8IRAbwKWWOlnxxvTyPKxd4pZCyW55TZ1LFDoOZ0UPmbPYAZ65BbePxhXY9PbN\n\ty8GwRFBpip/RyHmILCaPX6i1n8i0S75+Tg1C8/R4AXEmYFNRphH/YJtWo0vEjAQd/r72\n\tO09A==","X-Gm-Message-State":"AOAM530n/ur7zdktBhiOa2QCyQ48A04hftDDfarkM8PRUkExuWGSkwUr\n\tAgtU/FtAlW8PLICb1eckXlJvcA==","X-Google-Smtp-Source":"ABdhPJw7dMKtzIYeFrwtWdxk6zJyyBdgSV5FpBVs2zqOAD1JkYw3B856aZmOtEFGG7yAtBYDIDv1pQ==","X-Received":"by 2002:ac2:5de8:: with SMTP id z8mr3936223lfq.204.1599734316656;\n\tThu, 10 Sep 2020 03:38:36 -0700 (PDT)","Date":"Thu, 10 Sep 2020 12:38:35 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20200910103835.GF4095624@oden.dyn.berto.se>","References":"<20200908134142.27470-1-jacopo@jmondi.org>\n\t<20200908134142.27470-5-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200908134142.27470-5-jacopo@jmondi.org>","Subject":"Re: [libcamera-devel] [PATCH v3 04/11] android: camera_device:\n\tBreak out size calculation","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>","Cc":"hanlinchen@chromium.org, libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":12433,"web_url":"https://patchwork.libcamera.org/comment/12433/","msgid":"<CAO5uPHNYC7FhzoOa3UGBQhKaKKEw5W-+3afFQRo1EixSYLDFDQ@mail.gmail.com>","date":"2020-09-11T02:12:43","subject":"Re: [libcamera-devel] [PATCH v3 04/11] android: camera_device:\n\tBreak out size calculation","submitter":{"id":63,"url":"https://patchwork.libcamera.org/api/people/63/","name":"Hirokazu Honda","email":"hiroh@chromium.org"},"content":"On Thu, Sep 10, 2020 at 7:38 PM Niklas Söderlund\n<niklas.soderlund@ragnatech.se> wrote:\n>\n> Hi Jacopo,\n>\n> Thanks for your work.\n>\n> On 2020-09-08 15:41:35 +0200, Jacopo Mondi wrote:\n> > As the RAW stream sizes needs to be calculated differently from the\n> > processed one, break out the procedure to calculate the processed\n> > (RGB/YUV) resolutions from initializeStreamConfigurations() in order to\n> > prepare for RAW sizes calculation.\n> >\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n>\n> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n>\n> > ---\n> >  src/android/camera_device.cpp | 51 +++++++++++++++++++++++------------\n> >  src/android/camera_device.h   |  5 ++++\n> >  2 files changed, 39 insertions(+), 17 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index 17b5fd5f59eb..9d460906ab08 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -283,6 +283,36 @@ int CameraDevice::initialize()\n> >       return ret;\n> >  }\n> >\n> > +std::vector<Size> CameraDevice::filterYUVResolutions(CameraConfiguration *cameraConfig,\n> > +                                                  const PixelFormat &pixelFormat,\n> > +                                                  const std::vector<Size> &resolutions)\n> > +{\n> > +     std::vector<Size> supportedResolutions;\n> > +\n> > +     StreamConfiguration &cfg = cameraConfig->at(0);\n> > +     for (const Size &res : resolutions) {\n> > +             cfg.pixelFormat = pixelFormat;\n> > +             cfg.size = res;\n> > +\n> > +             std::stringstream ss;\n> > +             ss << \"Testing \" << cfg.toString();\n> > +\n> > +             CameraConfiguration::Status status = cameraConfig->validate();\n> > +             if (status != CameraConfiguration::Valid) {\n> > +                     ss << \" not supported\";\n> > +                     LOG(HAL, Debug) << ss.str();\n> > +                     continue;\n> > +             }\n> > +\n> > +             ss << \" supported\";\n> > +             LOG(HAL, Debug) << ss.str();\n> > +\n\nnit: You may want to apply the same Nioklas's comment as Patch 03/12 here.\n\nReviewed-by: Hirokazu Honda <hiroh@chromium.org>\n\n> > +             supportedResolutions.push_back(res);\n> > +     }\n> > +\n> > +     return supportedResolutions;\n> > +}\n> > +\n> >  /*\n> >   * Initialize the format conversion map to translate from Android format\n> >   * identifier to libcamera pixel formats and fill in the list of supported\n> > @@ -427,23 +457,10 @@ int CameraDevice::initializeStreamConfigurations()\n> >                               << camera3Format.name << \" to \"\n> >                               << mappedFormat.toString();\n> >\n> > -             for (const Size &res : cameraResolutions) {\n> > -                     cfg.pixelFormat = mappedFormat;\n> > -                     cfg.size = res;\n> > -\n> > -                     std::stringstream ss;\n> > -                     ss << \"Testing \" << cfg.toString();\n> > -\n> > -                     CameraConfiguration::Status status = cameraConfig->validate();\n> > -                     if (status != CameraConfiguration::Valid) {\n> > -                             ss << \" not supported\";\n> > -                             LOG(HAL, Debug) << ss.str();\n> > -                             continue;\n> > -                     }\n> > -\n> > -                     ss << \" supported\";\n> > -                     LOG(HAL, Debug) << ss.str();\n> > -\n> > +             std::vector<Size> resolutions = filterYUVResolutions(cameraConfig.get(),\n> > +                                                                  mappedFormat,\n> > +                                                                  cameraResolutions);\n> > +             for (const Size &res : resolutions) {\n> >                       streamConfigurations_.push_back({ res, androidFormat });\n> >\n> >                       /*\n> > diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> > index 3934f194f1b5..359a163ebab9 100644\n> > --- a/src/android/camera_device.h\n> > +++ b/src/android/camera_device.h\n> > @@ -93,6 +93,11 @@ private:\n> >       };\n> >\n> >       int initializeStreamConfigurations();\n> > +     std::vector<libcamera::Size>\n> > +     filterYUVResolutions(libcamera::CameraConfiguration *cameraConfig,\n> > +                          const libcamera::PixelFormat &pixelFormat,\n> > +                          const std::vector<libcamera::Size> &resolutions);\n> > +\n> >       std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize();\n> >       libcamera::FrameBuffer *createFrameBuffer(const buffer_handle_t camera3buffer);\n> >       void notifyShutter(uint32_t frameNumber, uint64_t timestamp);\n> > --\n> > 2.28.0\n> >\n> > _______________________________________________\n> > libcamera-devel mailing list\n> > libcamera-devel@lists.libcamera.org\n> > https://lists.libcamera.org/listinfo/libcamera-devel\n>\n> --\n> Regards,\n> Niklas Söderlund\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 6FA30BDB1D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 11 Sep 2020 02:12:57 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 042696037B;\n\tFri, 11 Sep 2020 04:12:57 +0200 (CEST)","from mail-ed1-x531.google.com (mail-ed1-x531.google.com\n\t[IPv6:2a00:1450:4864:20::531])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 080DE6037B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 11 Sep 2020 04:12:55 +0200 (CEST)","by mail-ed1-x531.google.com with SMTP id t16so8381515edw.7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 10 Sep 2020 19:12:54 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"Mh9oEd2X\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc:content-transfer-encoding;\n\tbh=ehurKpd+dy9CxaaPM5Amxy7zQByPCJpZTZSKQmR+Pj8=;\n\tb=Mh9oEd2XkcdJReBvFl/ld2E8LUz7KAaVjqEvJ4yrtq2qccRMZnk7HxnXFxogsZ3rdf\n\ttnpmcvJmR4TOEJ6HBjWl8oyedyFclr6aZhbtm577XK6mJJE9T5rxj7sqSbxh3J6bX8L7\n\thXOgUvMAFTPLbG8Gnqesu7Q2EMQO///RL4/e0=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc:content-transfer-encoding;\n\tbh=ehurKpd+dy9CxaaPM5Amxy7zQByPCJpZTZSKQmR+Pj8=;\n\tb=oH7bI8wIlvx4VXQ4GLFOHE2E6QzcnhdWzFLbYfnB5nUCvsM/KnFBN6EFs8hk+ONVHw\n\tiwwPLHOzOSW+iOyONltOAc5gomUGZy0tcghdNnDJur9QqfNH1UKKXo3zqd0tK7lGngKO\n\tTz7zdZeI6tpNhPPbPyeqZEQALsDpw/f7x/hz9EiAu11CxhM0U0u9stc7WurxZamETGiE\n\tQis/2PaLDWy9X3zuPFpNyFSkgxieMILhA9CvZAHaT+UCnYC48IC1dWgxVPlxcMznXUiz\n\t9j4gEq/MMsI4STzBuMPHn81uU/W28EDksd62ipqKHvF/QE9HBLJoTabREBDe/m2Twsd+\n\t2YPw==","X-Gm-Message-State":"AOAM530lBFR4faE/LHfb+wiluhgxnaA/9Hk3ldEC02Of5dvrLuQplF2H\n\tBbhyvzfQ+ryzojzVmB2jRQalOuLn+6++D7hzRkVD7w==","X-Google-Smtp-Source":"ABdhPJyORLFIZmUd3soeCntxF4DOFxT1Spe/puBTtXUEo/3+aFjG+7zICmzaWUHSUVQSEaTsIXAcuK4sDj173SYjEgw=","X-Received":"by 2002:a05:6402:70f:: with SMTP id\n\tw15mr12742367edx.202.1599790374596; \n\tThu, 10 Sep 2020 19:12:54 -0700 (PDT)","MIME-Version":"1.0","References":"<20200908134142.27470-1-jacopo@jmondi.org>\n\t<20200908134142.27470-5-jacopo@jmondi.org>\n\t<20200910103835.GF4095624@oden.dyn.berto.se>","In-Reply-To":"<20200910103835.GF4095624@oden.dyn.berto.se>","From":"Hirokazu Honda <hiroh@chromium.org>","Date":"Fri, 11 Sep 2020 11:12:43 +0900","Message-ID":"<CAO5uPHNYC7FhzoOa3UGBQhKaKKEw5W-+3afFQRo1EixSYLDFDQ@mail.gmail.com>","To":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Subject":"Re: [libcamera-devel] [PATCH v3 04/11] android: camera_device:\n\tBreak out size calculation","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>","Cc":"Hanlin Chen <hanlinchen@chromium.org>,\n\tlibcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]