[{"id":4822,"web_url":"https://patchwork.libcamera.org/comment/4822/","msgid":"<20200514144032.GD5955@pendragon.ideasonboard.com>","date":"2020-05-14T14:40:32","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush,\n\nAnd on this too :-)\n\nOn Tue, May 12, 2020 at 03:39:03AM +0300, Laurent Pinchart wrote:\n> The StaggeredCtrl class, part of the Raspberry Pi pipeline handler, is\n> part of libcamera. Move it to the libcamera namespace to simplify usage\n> of libcamera APIs.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      |  2 +-\n>  .../pipeline/raspberrypi/staggered_ctrl.cpp   | 25 ++++++++++---------\n>  .../pipeline/raspberrypi/staggered_ctrl.h     | 13 ++++++----\n>  3 files changed, 22 insertions(+), 18 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 21a1d7f7cca3..41d1a522fa71 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -330,7 +330,7 @@ public:\n>  \tstd::vector<IPABuffer> ipaBuffers_;\n>  \n>  \t/* VCSM allocation helper. */\n> -\tRPi::Vcsm vcsm_;\n> +\t::RPi::Vcsm vcsm_;\n>  \tvoid *lsTable_;\n>  \n>  \tRPi::StaggeredCtrl staggeredCtrl_;\n> diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> index fbd87d3e791e..d431887ea137 100644\n> --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> @@ -9,20 +9,19 @@\n>  \n>  #include <algorithm>\n>  \n> +#include <libcamera/controls.h>\n> +\n>  #include \"log.h\"\n>  #include \"utils.h\"\n> +#include \"v4l2_videodevice.h\"\n>  \n> -/* For logging... */\n> -using libcamera::LogCategory;\n> -using libcamera::LogDebug;\n> -using libcamera::LogInfo;\n> -using libcamera::utils::hex;\n> +namespace libcamera {\n>  \n>  LOG_DEFINE_CATEGORY(RPI_S_W);\n>  \n>  namespace RPi {\n>  \n> -void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> +void StaggeredCtrl::init(V4L2VideoDevice *dev,\n>  \t  std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList)\n>  {\n>  \tstd::lock_guard<std::mutex> lock(lock_);\n> @@ -35,7 +34,7 @@ void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n>  \tmaxDelay_ = 0;\n>  \tfor (auto const &p : delay_) {\n>  \t\tLOG(RPI_S_W, Info) << \"Init ctrl \"\n> -\t\t\t\t   << hex(p.first) << \" with delay \"\n> +\t\t\t\t   << utils::hex(p.first) << \" with delay \"\n>  \t\t\t\t   << static_cast<int>(p.second);\n>  \t\tmaxDelay_ = std::max(maxDelay_, p.second);\n>  \t}\n> @@ -92,7 +91,7 @@ bool StaggeredCtrl::set(std::initializer_list<std::pair<const uint32_t, int32_t>\n>  \treturn true;\n>  }\n>  \n> -bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> +bool StaggeredCtrl::set(ControlList &controls)\n>  {\n>  \tstd::lock_guard<std::mutex> lock(lock_);\n>  \n> @@ -103,7 +102,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n>  \n>  \t\tctrl_[p.first][setCount_] = CtrlInfo(p.second.get<int32_t>());\n>  \t\tLOG(RPI_S_W, Debug) << \"Setting ctrl \"\n> -\t\t\t\t    << hex(p.first) << \" to \"\n> +\t\t\t\t    << utils::hex(p.first) << \" to \"\n>  \t\t\t\t    << ctrl_[p.first][setCount_].value\n>  \t\t\t\t    << \" at index \"\n>  \t\t\t\t    << setCount_;\n> @@ -115,7 +114,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n>  int StaggeredCtrl::write()\n>  {\n>  \tstd::lock_guard<std::mutex> lock(lock_);\n> -\tlibcamera::ControlList controls(dev_->controls());\n> +\tControlList controls(dev_->controls());\n>  \n>  \tfor (auto &p : ctrl_) {\n>  \t\tint delayDiff = maxDelay_ - delay_[p.first];\n> @@ -126,7 +125,7 @@ int StaggeredCtrl::write()\n>  \t\t\tcontrols.set(p.first, p.second[index].value);\n>  \t\t\tp.second[index].updated = false;\n>  \t\t\tLOG(RPI_S_W, Debug) << \"Writing ctrl \"\n> -\t\t\t\t\t    << hex(p.first) << \" to \"\n> +\t\t\t\t\t    << utils::hex(p.first) << \" to \"\n>  \t\t\t\t\t    << p.second[index].value\n>  \t\t\t\t\t    << \" at index \"\n>  \t\t\t\t\t    << index;\n> @@ -149,7 +148,7 @@ void StaggeredCtrl::get(std::unordered_map<uint32_t, int32_t> &ctrl, uint8_t off\n>  \t\tint index = std::max<int>(0, getCount_ - maxDelay_);\n>  \t\tctrl[p.first] = p.second[index].value;\n>  \t\tLOG(RPI_S_W, Debug) << \"Getting ctrl \"\n> -\t\t\t\t    << hex(p.first) << \" to \"\n> +\t\t\t\t    << utils::hex(p.first) << \" to \"\n>  \t\t\t\t    << p.second[index].value\n>  \t\t\t\t    << \" at index \"\n>  \t\t\t\t    << index;\n> @@ -171,3 +170,5 @@ void StaggeredCtrl::nextFrame()\n>  }\n>  \n>  } /* namespace RPi */\n> +\n> +} /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> index c8f000a0b43c..eef16eaac235 100644\n> --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> @@ -12,9 +12,10 @@\n>  #include <unordered_map>\n>  #include <utility>\n>  \n> -#include <libcamera/controls.h>\n> +namespace libcamera {\n>  \n> -#include \"v4l2_videodevice.h\"\n> +class ControlList;\n> +class V4L2VideoDevice;\n>  \n>  namespace RPi {\n>  \n> @@ -31,7 +32,7 @@ public:\n>  \t\treturn init_;\n>  \t}\n>  \n> -\tvoid init(libcamera::V4L2VideoDevice *dev,\n> +\tvoid init(V4L2VideoDevice *dev,\n>  \t\t  std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList);\n>  \tvoid reset();\n>  \n> @@ -39,7 +40,7 @@ public:\n>  \n>  \tbool set(uint32_t ctrl, int32_t value);\n>  \tbool set(std::initializer_list<std::pair<const uint32_t, int32_t>> ctrlList);\n> -\tbool set(libcamera::ControlList &controls);\n> +\tbool set(ControlList &controls);\n>  \n>  \tint write();\n>  \n> @@ -81,10 +82,12 @@ private:\n>  \tuint32_t setCount_;\n>  \tuint32_t getCount_;\n>  \tuint8_t maxDelay_;\n> -\tlibcamera::V4L2VideoDevice *dev_;\n> +\tV4L2VideoDevice *dev_;\n>  \tstd::unordered_map<uint32_t, uint8_t> delay_;\n>  \tstd::unordered_map<uint32_t, CircularArray> ctrl_;\n>  \tstd::mutex lock_;\n>  };\n>  \n>  } /* namespace RPi */\n> +\n> +} /* namespace libcamera */","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 CFCCB60DF2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 14 May 2020 16:40:41 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CBEAA259;\n\tThu, 14 May 2020 16:40:40 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"PeFjzaNe\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1589467241;\n\tbh=BjJn5Lk7kBqygVhYqaEXx1hTlRx5pmfDQCDRAmVBaQo=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=PeFjzaNejizkC9KdFEQpUM3nF2Gbmbgw/R7pa4xnlQz+YleBYD7jg8sJR8kv8VA8n\n\t0eCH9aZ7afsMZE7fIySjhA+N/oyLuJQ91aHJcs2Wo9PMpkqBKXq8rRMoxX52CobFK4\n\tirKkGRDSV4Fq0NGRN6FCcwcVbNXouIlKNEupzHXM=","Date":"Thu, 14 May 2020 17:40:32 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200514144032.GD5955@pendragon.ideasonboard.com>","References":"<20200512003903.20986-1-laurent.pinchart@ideasonboard.com>\n\t<20200512003903.20986-2-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200512003903.20986-2-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","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>","X-List-Received-Date":"Thu, 14 May 2020 14:40:42 -0000"}},{"id":4824,"web_url":"https://patchwork.libcamera.org/comment/4824/","msgid":"<CAEmqJPpzP=Lws_CpT4Z76Qr5WTEu6SRjjD9nHE-qifPTuBq11g@mail.gmail.com>","date":"2020-05-14T14:58:14","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Laurent,\n\nOn Tue, 12 May 2020 at 01:39, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> The StaggeredCtrl class, part of the Raspberry Pi pipeline handler, is\n> part of libcamera. Move it to the libcamera namespace to simplify usage\n> of libcamera APIs.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      |  2 +-\n>  .../pipeline/raspberrypi/staggered_ctrl.cpp   | 25 ++++++++++---------\n>  .../pipeline/raspberrypi/staggered_ctrl.h     | 13 ++++++----\n>  3 files changed, 22 insertions(+), 18 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 21a1d7f7cca3..41d1a522fa71 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -330,7 +330,7 @@ public:\n>         std::vector<IPABuffer> ipaBuffers_;\n>\n>         /* VCSM allocation helper. */\n> -       RPi::Vcsm vcsm_;\n> +       ::RPi::Vcsm vcsm_;\n\nI haven't tried it myself, but is this change of scope necessary?\n\nNaush\n\n\n>         void *lsTable_;\n>\n>         RPi::StaggeredCtrl staggeredCtrl_;\n> diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> index fbd87d3e791e..d431887ea137 100644\n> --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> @@ -9,20 +9,19 @@\n>\n>  #include <algorithm>\n>\n> +#include <libcamera/controls.h>\n> +\n>  #include \"log.h\"\n>  #include \"utils.h\"\n> +#include \"v4l2_videodevice.h\"\n>\n> -/* For logging... */\n> -using libcamera::LogCategory;\n> -using libcamera::LogDebug;\n> -using libcamera::LogInfo;\n> -using libcamera::utils::hex;\n> +namespace libcamera {\n>\n>  LOG_DEFINE_CATEGORY(RPI_S_W);\n>\n>  namespace RPi {\n>\n> -void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> +void StaggeredCtrl::init(V4L2VideoDevice *dev,\n>           std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList)\n>  {\n>         std::lock_guard<std::mutex> lock(lock_);\n> @@ -35,7 +34,7 @@ void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n>         maxDelay_ = 0;\n>         for (auto const &p : delay_) {\n>                 LOG(RPI_S_W, Info) << \"Init ctrl \"\n> -                                  << hex(p.first) << \" with delay \"\n> +                                  << utils::hex(p.first) << \" with delay \"\n>                                    << static_cast<int>(p.second);\n>                 maxDelay_ = std::max(maxDelay_, p.second);\n>         }\n> @@ -92,7 +91,7 @@ bool StaggeredCtrl::set(std::initializer_list<std::pair<const uint32_t, int32_t>\n>         return true;\n>  }\n>\n> -bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> +bool StaggeredCtrl::set(ControlList &controls)\n>  {\n>         std::lock_guard<std::mutex> lock(lock_);\n>\n> @@ -103,7 +102,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n>\n>                 ctrl_[p.first][setCount_] = CtrlInfo(p.second.get<int32_t>());\n>                 LOG(RPI_S_W, Debug) << \"Setting ctrl \"\n> -                                   << hex(p.first) << \" to \"\n> +                                   << utils::hex(p.first) << \" to \"\n>                                     << ctrl_[p.first][setCount_].value\n>                                     << \" at index \"\n>                                     << setCount_;\n> @@ -115,7 +114,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n>  int StaggeredCtrl::write()\n>  {\n>         std::lock_guard<std::mutex> lock(lock_);\n> -       libcamera::ControlList controls(dev_->controls());\n> +       ControlList controls(dev_->controls());\n>\n>         for (auto &p : ctrl_) {\n>                 int delayDiff = maxDelay_ - delay_[p.first];\n> @@ -126,7 +125,7 @@ int StaggeredCtrl::write()\n>                         controls.set(p.first, p.second[index].value);\n>                         p.second[index].updated = false;\n>                         LOG(RPI_S_W, Debug) << \"Writing ctrl \"\n> -                                           << hex(p.first) << \" to \"\n> +                                           << utils::hex(p.first) << \" to \"\n>                                             << p.second[index].value\n>                                             << \" at index \"\n>                                             << index;\n> @@ -149,7 +148,7 @@ void StaggeredCtrl::get(std::unordered_map<uint32_t, int32_t> &ctrl, uint8_t off\n>                 int index = std::max<int>(0, getCount_ - maxDelay_);\n>                 ctrl[p.first] = p.second[index].value;\n>                 LOG(RPI_S_W, Debug) << \"Getting ctrl \"\n> -                                   << hex(p.first) << \" to \"\n> +                                   << utils::hex(p.first) << \" to \"\n>                                     << p.second[index].value\n>                                     << \" at index \"\n>                                     << index;\n> @@ -171,3 +170,5 @@ void StaggeredCtrl::nextFrame()\n>  }\n>\n>  } /* namespace RPi */\n> +\n> +} /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> index c8f000a0b43c..eef16eaac235 100644\n> --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> @@ -12,9 +12,10 @@\n>  #include <unordered_map>\n>  #include <utility>\n>\n> -#include <libcamera/controls.h>\n> +namespace libcamera {\n>\n> -#include \"v4l2_videodevice.h\"\n> +class ControlList;\n> +class V4L2VideoDevice;\n>\n>  namespace RPi {\n>\n> @@ -31,7 +32,7 @@ public:\n>                 return init_;\n>         }\n>\n> -       void init(libcamera::V4L2VideoDevice *dev,\n> +       void init(V4L2VideoDevice *dev,\n>                   std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList);\n>         void reset();\n>\n> @@ -39,7 +40,7 @@ public:\n>\n>         bool set(uint32_t ctrl, int32_t value);\n>         bool set(std::initializer_list<std::pair<const uint32_t, int32_t>> ctrlList);\n> -       bool set(libcamera::ControlList &controls);\n> +       bool set(ControlList &controls);\n>\n>         int write();\n>\n> @@ -81,10 +82,12 @@ private:\n>         uint32_t setCount_;\n>         uint32_t getCount_;\n>         uint8_t maxDelay_;\n> -       libcamera::V4L2VideoDevice *dev_;\n> +       V4L2VideoDevice *dev_;\n>         std::unordered_map<uint32_t, uint8_t> delay_;\n>         std::unordered_map<uint32_t, CircularArray> ctrl_;\n>         std::mutex lock_;\n>  };\n>\n>  } /* namespace RPi */\n> +\n> +} /* namespace libcamera */\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<naush@raspberrypi.com>","Received":["from mail-lj1-x241.google.com (mail-lj1-x241.google.com\n\t[IPv6:2a00:1450:4864:20::241])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 45FE360DF2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 14 May 2020 16:58:32 +0200 (CEST)","by mail-lj1-x241.google.com with SMTP id g4so3885162ljl.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 14 May 2020 07:58:32 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"Y7co8kQe\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=Mx/2wcH5MUBsoIhhma+m18W/ETgASvjC7RxxwctHklA=;\n\tb=Y7co8kQe1vFGOHyzuwC9x795winJ3lChv79LvE+cNsYiZm8bsS2P51Htyom98TFYps\n\tSREmEmPHJ5tAvMHjpNQkEWdc9N/0YRsz+vFzmpinDtQFy9jNu+IW93WSIb72etDj2nkn\n\t85dwbnpfU8TaCODZitjRID25w3AbIM2OQJe+ZVi+y4GpsP6lhraQpDEUHrVF1FNGr7fN\n\t9LAq9UlSTBr47C3zXKOcv2LMl1SMC8JAiII6qa8Kxp+gi4E25wTeNeEp7FCz603nwn49\n\tJd27d3GNLwZhqnk2+knpfsltb8+Lp1o2G8Sb1J56UReSLxvT9PZtISa5YEw39ytfEj+v\n\tyD5A==","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;\n\tbh=Mx/2wcH5MUBsoIhhma+m18W/ETgASvjC7RxxwctHklA=;\n\tb=fJnJPajey6eqUHry0K83BO9b9sI6cbbuvvdmopAZQis3eOKEm05QbV//Cvcn8JS4cw\n\ti3TkkeiKBsEKvyS1/I3MAhIq2E0CbEldZ8zE6aduDFGyIxh3aFYyDFzJyCJlcEMdLMZV\n\tueSPq1x6ujXhYD9dkLy1ebcRL0Q2NgFonYgw/jUf6L2RF6TivwK53A/Z75Pa/nEoMsbG\n\tBgxpQ8W5u2+Rlx7rJAmXNzPUeRN4h4+2pjDNl9pErk8i+i19ve4rFA1xvJ9jSOQptDJF\n\topCLchpnASjKfCiQLCAZ05R6qjuObaLTtCGFx46M21zj4seWELLLh+tCDrbvQk4TbSEz\n\tRo8Q==","X-Gm-Message-State":"AOAM531QnxrbXI/vcRuA4OcNc1a4QtAiZspcCiVDPN5Ryz/YdrlMzmzy\n\tXKbzWkbBYLzS74GbZ0d3ptEfz3ami5dgEKL0LlVOfA==","X-Google-Smtp-Source":"ABdhPJwFofflTyrxyAgkTtEvq5j9DVeemRTZOc8882oNq+a+Qyg6DeXxmRsYhQqSbmG8qG+z0Ed+GiyWptC3HkcaOfc=","X-Received":"by 2002:a2e:8752:: with SMTP id q18mr3042487ljj.72.1589468310645;\n\tThu, 14 May 2020 07:58:30 -0700 (PDT)","MIME-Version":"1.0","References":"<20200512003903.20986-1-laurent.pinchart@ideasonboard.com>\n\t<20200512003903.20986-2-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20200512003903.20986-2-laurent.pinchart@ideasonboard.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Thu, 14 May 2020 15:58:14 +0100","Message-ID":"<CAEmqJPpzP=Lws_CpT4Z76Qr5WTEu6SRjjD9nHE-qifPTuBq11g@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","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>","X-List-Received-Date":"Thu, 14 May 2020 14:58:32 -0000"}},{"id":4825,"web_url":"https://patchwork.libcamera.org/comment/4825/","msgid":"<20200514150109.GE5955@pendragon.ideasonboard.com>","date":"2020-05-14T15:01:09","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush,\n\nOn Thu, May 14, 2020 at 03:58:14PM +0100, Naushir Patuck wrote:\n> On Tue, 12 May 2020 at 01:39, Laurent Pinchart wrote:\n> >\n> > The StaggeredCtrl class, part of the Raspberry Pi pipeline handler, is\n> > part of libcamera. Move it to the libcamera namespace to simplify usage\n> > of libcamera APIs.\n> >\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      |  2 +-\n> >  .../pipeline/raspberrypi/staggered_ctrl.cpp   | 25 ++++++++++---------\n> >  .../pipeline/raspberrypi/staggered_ctrl.h     | 13 ++++++----\n> >  3 files changed, 22 insertions(+), 18 deletions(-)\n> >\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index 21a1d7f7cca3..41d1a522fa71 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -330,7 +330,7 @@ public:\n> >         std::vector<IPABuffer> ipaBuffers_;\n> >\n> >         /* VCSM allocation helper. */\n> > -       RPi::Vcsm vcsm_;\n> > +       ::RPi::Vcsm vcsm_;\n> \n> I haven't tried it myself, but is this change of scope necessary?\n\nI would have asked the same had I received such a patch :-) It is\nnecessary, as the compiler complains otherwise, but I haven't\ninvestigated why. I was considering moving RPi::Vcsm to the libcamera\nnamespace too, but given that the goal is to replace Vcsm with dmabuf, I\nended up taking the easy path.\n\n> >         void *lsTable_;\n> >\n> >         RPi::StaggeredCtrl staggeredCtrl_;\n> > diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > index fbd87d3e791e..d431887ea137 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > @@ -9,20 +9,19 @@\n> >\n> >  #include <algorithm>\n> >\n> > +#include <libcamera/controls.h>\n> > +\n> >  #include \"log.h\"\n> >  #include \"utils.h\"\n> > +#include \"v4l2_videodevice.h\"\n> >\n> > -/* For logging... */\n> > -using libcamera::LogCategory;\n> > -using libcamera::LogDebug;\n> > -using libcamera::LogInfo;\n> > -using libcamera::utils::hex;\n> > +namespace libcamera {\n> >\n> >  LOG_DEFINE_CATEGORY(RPI_S_W);\n> >\n> >  namespace RPi {\n> >\n> > -void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> > +void StaggeredCtrl::init(V4L2VideoDevice *dev,\n> >           std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList)\n> >  {\n> >         std::lock_guard<std::mutex> lock(lock_);\n> > @@ -35,7 +34,7 @@ void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> >         maxDelay_ = 0;\n> >         for (auto const &p : delay_) {\n> >                 LOG(RPI_S_W, Info) << \"Init ctrl \"\n> > -                                  << hex(p.first) << \" with delay \"\n> > +                                  << utils::hex(p.first) << \" with delay \"\n> >                                    << static_cast<int>(p.second);\n> >                 maxDelay_ = std::max(maxDelay_, p.second);\n> >         }\n> > @@ -92,7 +91,7 @@ bool StaggeredCtrl::set(std::initializer_list<std::pair<const uint32_t, int32_t>\n> >         return true;\n> >  }\n> >\n> > -bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> > +bool StaggeredCtrl::set(ControlList &controls)\n> >  {\n> >         std::lock_guard<std::mutex> lock(lock_);\n> >\n> > @@ -103,7 +102,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> >\n> >                 ctrl_[p.first][setCount_] = CtrlInfo(p.second.get<int32_t>());\n> >                 LOG(RPI_S_W, Debug) << \"Setting ctrl \"\n> > -                                   << hex(p.first) << \" to \"\n> > +                                   << utils::hex(p.first) << \" to \"\n> >                                     << ctrl_[p.first][setCount_].value\n> >                                     << \" at index \"\n> >                                     << setCount_;\n> > @@ -115,7 +114,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> >  int StaggeredCtrl::write()\n> >  {\n> >         std::lock_guard<std::mutex> lock(lock_);\n> > -       libcamera::ControlList controls(dev_->controls());\n> > +       ControlList controls(dev_->controls());\n> >\n> >         for (auto &p : ctrl_) {\n> >                 int delayDiff = maxDelay_ - delay_[p.first];\n> > @@ -126,7 +125,7 @@ int StaggeredCtrl::write()\n> >                         controls.set(p.first, p.second[index].value);\n> >                         p.second[index].updated = false;\n> >                         LOG(RPI_S_W, Debug) << \"Writing ctrl \"\n> > -                                           << hex(p.first) << \" to \"\n> > +                                           << utils::hex(p.first) << \" to \"\n> >                                             << p.second[index].value\n> >                                             << \" at index \"\n> >                                             << index;\n> > @@ -149,7 +148,7 @@ void StaggeredCtrl::get(std::unordered_map<uint32_t, int32_t> &ctrl, uint8_t off\n> >                 int index = std::max<int>(0, getCount_ - maxDelay_);\n> >                 ctrl[p.first] = p.second[index].value;\n> >                 LOG(RPI_S_W, Debug) << \"Getting ctrl \"\n> > -                                   << hex(p.first) << \" to \"\n> > +                                   << utils::hex(p.first) << \" to \"\n> >                                     << p.second[index].value\n> >                                     << \" at index \"\n> >                                     << index;\n> > @@ -171,3 +170,5 @@ void StaggeredCtrl::nextFrame()\n> >  }\n> >\n> >  } /* namespace RPi */\n> > +\n> > +} /* namespace libcamera */\n> > diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > index c8f000a0b43c..eef16eaac235 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > @@ -12,9 +12,10 @@\n> >  #include <unordered_map>\n> >  #include <utility>\n> >\n> > -#include <libcamera/controls.h>\n> > +namespace libcamera {\n> >\n> > -#include \"v4l2_videodevice.h\"\n> > +class ControlList;\n> > +class V4L2VideoDevice;\n> >\n> >  namespace RPi {\n> >\n> > @@ -31,7 +32,7 @@ public:\n> >                 return init_;\n> >         }\n> >\n> > -       void init(libcamera::V4L2VideoDevice *dev,\n> > +       void init(V4L2VideoDevice *dev,\n> >                   std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList);\n> >         void reset();\n> >\n> > @@ -39,7 +40,7 @@ public:\n> >\n> >         bool set(uint32_t ctrl, int32_t value);\n> >         bool set(std::initializer_list<std::pair<const uint32_t, int32_t>> ctrlList);\n> > -       bool set(libcamera::ControlList &controls);\n> > +       bool set(ControlList &controls);\n> >\n> >         int write();\n> >\n> > @@ -81,10 +82,12 @@ private:\n> >         uint32_t setCount_;\n> >         uint32_t getCount_;\n> >         uint8_t maxDelay_;\n> > -       libcamera::V4L2VideoDevice *dev_;\n> > +       V4L2VideoDevice *dev_;\n> >         std::unordered_map<uint32_t, uint8_t> delay_;\n> >         std::unordered_map<uint32_t, CircularArray> ctrl_;\n> >         std::mutex lock_;\n> >  };\n> >\n> >  } /* namespace RPi */\n> > +\n> > +} /* namespace libcamera */","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7DE8160DF2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 14 May 2020 17:01:17 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B379F259;\n\tThu, 14 May 2020 17:01:16 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Ijbv7pcI\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1589468477;\n\tbh=QNADb2qQQlUSxO0uxwUB837nXKiZTYqnkcuuRwE2Ub4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Ijbv7pcI/TOkjAvsltiCYQoMcC2V3w3ff91Kc2GRzFGJnRwXdRrF/wa+/DN32fkiI\n\t0P29f/fsZhpmfVMFuv9M5i/3j4TB728t41ajKCo8gYg71Fcxb1TAIP22A1GfVLotQo\n\t8gBv0Y1PZcwWu2UnPtd/CrVgjBRKmgMHuCylsld4=","Date":"Thu, 14 May 2020 18:01:09 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200514150109.GE5955@pendragon.ideasonboard.com>","References":"<20200512003903.20986-1-laurent.pinchart@ideasonboard.com>\n\t<20200512003903.20986-2-laurent.pinchart@ideasonboard.com>\n\t<CAEmqJPpzP=Lws_CpT4Z76Qr5WTEu6SRjjD9nHE-qifPTuBq11g@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAEmqJPpzP=Lws_CpT4Z76Qr5WTEu6SRjjD9nHE-qifPTuBq11g@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","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>","X-List-Received-Date":"Thu, 14 May 2020 15:01:17 -0000"}},{"id":4826,"web_url":"https://patchwork.libcamera.org/comment/4826/","msgid":"<20200515014323.GR5955@pendragon.ideasonboard.com>","date":"2020-05-15T01:43:23","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush,\n\nOn Thu, May 14, 2020 at 06:01:11PM +0300, Laurent Pinchart wrote:\n> On Thu, May 14, 2020 at 03:58:14PM +0100, Naushir Patuck wrote:\n> > On Tue, 12 May 2020 at 01:39, Laurent Pinchart wrote:\n> > >\n> > > The StaggeredCtrl class, part of the Raspberry Pi pipeline handler, is\n> > > part of libcamera. Move it to the libcamera namespace to simplify usage\n> > > of libcamera APIs.\n> > >\n> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > > ---\n> > >  .../pipeline/raspberrypi/raspberrypi.cpp      |  2 +-\n> > >  .../pipeline/raspberrypi/staggered_ctrl.cpp   | 25 ++++++++++---------\n> > >  .../pipeline/raspberrypi/staggered_ctrl.h     | 13 ++++++----\n> > >  3 files changed, 22 insertions(+), 18 deletions(-)\n> > >\n> > > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > index 21a1d7f7cca3..41d1a522fa71 100644\n> > > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > @@ -330,7 +330,7 @@ public:\n> > >         std::vector<IPABuffer> ipaBuffers_;\n> > >\n> > >         /* VCSM allocation helper. */\n> > > -       RPi::Vcsm vcsm_;\n> > > +       ::RPi::Vcsm vcsm_;\n> > \n> > I haven't tried it myself, but is this change of scope necessary?\n> \n> I would have asked the same had I received such a patch :-) It is\n> necessary, as the compiler complains otherwise, but I haven't\n> investigated why. I was considering moving RPi::Vcsm to the libcamera\n> namespace too, but given that the goal is to replace Vcsm with dmabuf, I\n> ended up taking the easy path.\n\nFor reference:\n\n[4/70] Compiling C++ object 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o'.\nFAILED: src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o\nclang++-8 -Isrc/libcamera/4ab8042@@camera@sha -Isrc/libcamera -I../../src/libcamera -Iinclude -I../../include -Isrc/libcamera/include -I../../src/libcamera/include -I../../include/android/hardware/libhardware/include/ -I../../include/android/metadata/ -I../../include/android/system/core/include -Iinclude/libcamera -Xclang -fcolor-diagnostics -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -Wextra -Werror -std=c++14 -g -stdlib=libc++ -Wno-unused-parameter -include config.h -fPIC -pthread -MD -MQ 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o' -MF 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o.d' -o 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o' -c ../../src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n../../src/libcamera/pipeline/raspberrypi/raspberrypi.cpp:333:2: error: no type named 'Vcsm' in namespace 'libcamera::RPi'; did you mean '::RPi::Vcsm'?\n        RPi::Vcsm vcsm_;\n        ^~~~~~~~~\n        ::RPi::Vcsm\n../../src/libcamera/pipeline/raspberrypi/vcsm.h:22:7: note: '::RPi::Vcsm' declared here\nclass Vcsm\n      ^\n1 error generated.\nninja: build stopped: subcommand failed.\n\nThere's a similar error with gcc 8.3.0.\n\nIs the patch otherwise OK ?\n\n> > >         void *lsTable_;\n> > >\n> > >         RPi::StaggeredCtrl staggeredCtrl_;\n> > > diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > > index fbd87d3e791e..d431887ea137 100644\n> > > --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > > +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > > @@ -9,20 +9,19 @@\n> > >\n> > >  #include <algorithm>\n> > >\n> > > +#include <libcamera/controls.h>\n> > > +\n> > >  #include \"log.h\"\n> > >  #include \"utils.h\"\n> > > +#include \"v4l2_videodevice.h\"\n> > >\n> > > -/* For logging... */\n> > > -using libcamera::LogCategory;\n> > > -using libcamera::LogDebug;\n> > > -using libcamera::LogInfo;\n> > > -using libcamera::utils::hex;\n> > > +namespace libcamera {\n> > >\n> > >  LOG_DEFINE_CATEGORY(RPI_S_W);\n> > >\n> > >  namespace RPi {\n> > >\n> > > -void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> > > +void StaggeredCtrl::init(V4L2VideoDevice *dev,\n> > >           std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList)\n> > >  {\n> > >         std::lock_guard<std::mutex> lock(lock_);\n> > > @@ -35,7 +34,7 @@ void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> > >         maxDelay_ = 0;\n> > >         for (auto const &p : delay_) {\n> > >                 LOG(RPI_S_W, Info) << \"Init ctrl \"\n> > > -                                  << hex(p.first) << \" with delay \"\n> > > +                                  << utils::hex(p.first) << \" with delay \"\n> > >                                    << static_cast<int>(p.second);\n> > >                 maxDelay_ = std::max(maxDelay_, p.second);\n> > >         }\n> > > @@ -92,7 +91,7 @@ bool StaggeredCtrl::set(std::initializer_list<std::pair<const uint32_t, int32_t>\n> > >         return true;\n> > >  }\n> > >\n> > > -bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> > > +bool StaggeredCtrl::set(ControlList &controls)\n> > >  {\n> > >         std::lock_guard<std::mutex> lock(lock_);\n> > >\n> > > @@ -103,7 +102,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> > >\n> > >                 ctrl_[p.first][setCount_] = CtrlInfo(p.second.get<int32_t>());\n> > >                 LOG(RPI_S_W, Debug) << \"Setting ctrl \"\n> > > -                                   << hex(p.first) << \" to \"\n> > > +                                   << utils::hex(p.first) << \" to \"\n> > >                                     << ctrl_[p.first][setCount_].value\n> > >                                     << \" at index \"\n> > >                                     << setCount_;\n> > > @@ -115,7 +114,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> > >  int StaggeredCtrl::write()\n> > >  {\n> > >         std::lock_guard<std::mutex> lock(lock_);\n> > > -       libcamera::ControlList controls(dev_->controls());\n> > > +       ControlList controls(dev_->controls());\n> > >\n> > >         for (auto &p : ctrl_) {\n> > >                 int delayDiff = maxDelay_ - delay_[p.first];\n> > > @@ -126,7 +125,7 @@ int StaggeredCtrl::write()\n> > >                         controls.set(p.first, p.second[index].value);\n> > >                         p.second[index].updated = false;\n> > >                         LOG(RPI_S_W, Debug) << \"Writing ctrl \"\n> > > -                                           << hex(p.first) << \" to \"\n> > > +                                           << utils::hex(p.first) << \" to \"\n> > >                                             << p.second[index].value\n> > >                                             << \" at index \"\n> > >                                             << index;\n> > > @@ -149,7 +148,7 @@ void StaggeredCtrl::get(std::unordered_map<uint32_t, int32_t> &ctrl, uint8_t off\n> > >                 int index = std::max<int>(0, getCount_ - maxDelay_);\n> > >                 ctrl[p.first] = p.second[index].value;\n> > >                 LOG(RPI_S_W, Debug) << \"Getting ctrl \"\n> > > -                                   << hex(p.first) << \" to \"\n> > > +                                   << utils::hex(p.first) << \" to \"\n> > >                                     << p.second[index].value\n> > >                                     << \" at index \"\n> > >                                     << index;\n> > > @@ -171,3 +170,5 @@ void StaggeredCtrl::nextFrame()\n> > >  }\n> > >\n> > >  } /* namespace RPi */\n> > > +\n> > > +} /* namespace libcamera */\n> > > diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > > index c8f000a0b43c..eef16eaac235 100644\n> > > --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > > +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > > @@ -12,9 +12,10 @@\n> > >  #include <unordered_map>\n> > >  #include <utility>\n> > >\n> > > -#include <libcamera/controls.h>\n> > > +namespace libcamera {\n> > >\n> > > -#include \"v4l2_videodevice.h\"\n> > > +class ControlList;\n> > > +class V4L2VideoDevice;\n> > >\n> > >  namespace RPi {\n> > >\n> > > @@ -31,7 +32,7 @@ public:\n> > >                 return init_;\n> > >         }\n> > >\n> > > -       void init(libcamera::V4L2VideoDevice *dev,\n> > > +       void init(V4L2VideoDevice *dev,\n> > >                   std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList);\n> > >         void reset();\n> > >\n> > > @@ -39,7 +40,7 @@ public:\n> > >\n> > >         bool set(uint32_t ctrl, int32_t value);\n> > >         bool set(std::initializer_list<std::pair<const uint32_t, int32_t>> ctrlList);\n> > > -       bool set(libcamera::ControlList &controls);\n> > > +       bool set(ControlList &controls);\n> > >\n> > >         int write();\n> > >\n> > > @@ -81,10 +82,12 @@ private:\n> > >         uint32_t setCount_;\n> > >         uint32_t getCount_;\n> > >         uint8_t maxDelay_;\n> > > -       libcamera::V4L2VideoDevice *dev_;\n> > > +       V4L2VideoDevice *dev_;\n> > >         std::unordered_map<uint32_t, uint8_t> delay_;\n> > >         std::unordered_map<uint32_t, CircularArray> ctrl_;\n> > >         std::mutex lock_;\n> > >  };\n> > >\n> > >  } /* namespace RPi */\n> > > +\n> > > +} /* namespace libcamera */","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D08CB603DA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 15 May 2020 03:43:31 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 473B626A;\n\tFri, 15 May 2020 03:43:31 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"LZ3oPyDg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1589507011;\n\tbh=ouwzpp37VER+Pq3nJGAXZdOnDftPhLA427aPxjtDPRQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=LZ3oPyDgbo7kNfQYj8Qlok1TgCPHbZ3TlwvaOQAzi16WuIIdMrOkPxW8h2MsE9KtC\n\tyqtKs9hiqoqkrsJk5shyXyZC42fMehkB3EDR6HzxhcnQ0DlNPCmQ/GdPjSORKOsLRg\n\twJW3ryrx8Kbrk2pqFl5i6lfJ7bZiEAVd1+vxh5rQ=","Date":"Fri, 15 May 2020 04:43:23 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200515014323.GR5955@pendragon.ideasonboard.com>","References":"<20200512003903.20986-1-laurent.pinchart@ideasonboard.com>\n\t<20200512003903.20986-2-laurent.pinchart@ideasonboard.com>\n\t<CAEmqJPpzP=Lws_CpT4Z76Qr5WTEu6SRjjD9nHE-qifPTuBq11g@mail.gmail.com>\n\t<20200514150109.GE5955@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200514150109.GE5955@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","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>","X-List-Received-Date":"Fri, 15 May 2020 01:43:32 -0000"}},{"id":4827,"web_url":"https://patchwork.libcamera.org/comment/4827/","msgid":"<CAEmqJPrKHQ090UvAJVKzw9oev46-LcwKAqn_wctybGet4w11Pw@mail.gmail.com>","date":"2020-05-15T07:07:09","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Laurent,\n\nOn Fri, 15 May 2020 at 02:43, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hi Naush,\n>\n> On Thu, May 14, 2020 at 06:01:11PM +0300, Laurent Pinchart wrote:\n> > On Thu, May 14, 2020 at 03:58:14PM +0100, Naushir Patuck wrote:\n> > > On Tue, 12 May 2020 at 01:39, Laurent Pinchart wrote:\n> > > >\n> > > > The StaggeredCtrl class, part of the Raspberry Pi pipeline handler, is\n> > > > part of libcamera. Move it to the libcamera namespace to simplify usage\n> > > > of libcamera APIs.\n> > > >\n> > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > > > ---\n> > > >  .../pipeline/raspberrypi/raspberrypi.cpp      |  2 +-\n> > > >  .../pipeline/raspberrypi/staggered_ctrl.cpp   | 25 ++++++++++---------\n> > > >  .../pipeline/raspberrypi/staggered_ctrl.h     | 13 ++++++----\n> > > >  3 files changed, 22 insertions(+), 18 deletions(-)\n> > > >\n> > > > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > index 21a1d7f7cca3..41d1a522fa71 100644\n> > > > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > @@ -330,7 +330,7 @@ public:\n> > > >         std::vector<IPABuffer> ipaBuffers_;\n> > > >\n> > > >         /* VCSM allocation helper. */\n> > > > -       RPi::Vcsm vcsm_;\n> > > > +       ::RPi::Vcsm vcsm_;\n> > >\n> > > I haven't tried it myself, but is this change of scope necessary?\n> >\n> > I would have asked the same had I received such a patch :-) It is\n> > necessary, as the compiler complains otherwise, but I haven't\n> > investigated why. I was considering moving RPi::Vcsm to the libcamera\n> > namespace too, but given that the goal is to replace Vcsm with dmabuf, I\n> > ended up taking the easy path.\n>\n> For reference:\n>\n> [4/70] Compiling C++ object 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o'.\n> FAILED: src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o\n> clang++-8 -Isrc/libcamera/4ab8042@@camera@sha -Isrc/libcamera -I../../src/libcamera -Iinclude -I../../include -Isrc/libcamera/include -I../../src/libcamera/include -I../../include/android/hardware/libhardware/include/ -I../../include/android/metadata/ -I../../include/android/system/core/include -Iinclude/libcamera -Xclang -fcolor-diagnostics -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -Wextra -Werror -std=c++14 -g -stdlib=libc++ -Wno-unused-parameter -include config.h -fPIC -pthread -MD -MQ 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o' -MF 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o.d' -o 'src/libcamera/4ab8042@@camera@sha/pipeline_raspberrypi_raspberrypi.cpp.o' -c ../../src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> ../../src/libcamera/pipeline/raspberrypi/raspberrypi.cpp:333:2: error: no type named 'Vcsm' in namespace 'libcamera::RPi'; did you mean '::RPi::Vcsm'?\n>         RPi::Vcsm vcsm_;\n>         ^~~~~~~~~\n>         ::RPi::Vcsm\n> ../../src/libcamera/pipeline/raspberrypi/vcsm.h:22:7: note: '::RPi::Vcsm' declared here\n> class Vcsm\n>       ^\n> 1 error generated.\n> ninja: build stopped: subcommand failed.\n>\n> There's a similar error with gcc 8.3.0.\n>\n> Is the patch otherwise OK ?\n>\n\nYes, looks to be correct - but I have no idea what change could have\ntriggered this error now :)\nWith the dmabuf change, we can probably enclose the class in namespace\nlibcamera  and namespace RPi to avoid this problem.\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n> > > >         void *lsTable_;\n> > > >\n> > > >         RPi::StaggeredCtrl staggeredCtrl_;\n> > > > diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > > > index fbd87d3e791e..d431887ea137 100644\n> > > > --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > > > +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.cpp\n> > > > @@ -9,20 +9,19 @@\n> > > >\n> > > >  #include <algorithm>\n> > > >\n> > > > +#include <libcamera/controls.h>\n> > > > +\n> > > >  #include \"log.h\"\n> > > >  #include \"utils.h\"\n> > > > +#include \"v4l2_videodevice.h\"\n> > > >\n> > > > -/* For logging... */\n> > > > -using libcamera::LogCategory;\n> > > > -using libcamera::LogDebug;\n> > > > -using libcamera::LogInfo;\n> > > > -using libcamera::utils::hex;\n> > > > +namespace libcamera {\n> > > >\n> > > >  LOG_DEFINE_CATEGORY(RPI_S_W);\n> > > >\n> > > >  namespace RPi {\n> > > >\n> > > > -void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> > > > +void StaggeredCtrl::init(V4L2VideoDevice *dev,\n> > > >           std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList)\n> > > >  {\n> > > >         std::lock_guard<std::mutex> lock(lock_);\n> > > > @@ -35,7 +34,7 @@ void StaggeredCtrl::init(libcamera::V4L2VideoDevice *dev,\n> > > >         maxDelay_ = 0;\n> > > >         for (auto const &p : delay_) {\n> > > >                 LOG(RPI_S_W, Info) << \"Init ctrl \"\n> > > > -                                  << hex(p.first) << \" with delay \"\n> > > > +                                  << utils::hex(p.first) << \" with delay \"\n> > > >                                    << static_cast<int>(p.second);\n> > > >                 maxDelay_ = std::max(maxDelay_, p.second);\n> > > >         }\n> > > > @@ -92,7 +91,7 @@ bool StaggeredCtrl::set(std::initializer_list<std::pair<const uint32_t, int32_t>\n> > > >         return true;\n> > > >  }\n> > > >\n> > > > -bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> > > > +bool StaggeredCtrl::set(ControlList &controls)\n> > > >  {\n> > > >         std::lock_guard<std::mutex> lock(lock_);\n> > > >\n> > > > @@ -103,7 +102,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> > > >\n> > > >                 ctrl_[p.first][setCount_] = CtrlInfo(p.second.get<int32_t>());\n> > > >                 LOG(RPI_S_W, Debug) << \"Setting ctrl \"\n> > > > -                                   << hex(p.first) << \" to \"\n> > > > +                                   << utils::hex(p.first) << \" to \"\n> > > >                                     << ctrl_[p.first][setCount_].value\n> > > >                                     << \" at index \"\n> > > >                                     << setCount_;\n> > > > @@ -115,7 +114,7 @@ bool StaggeredCtrl::set(libcamera::ControlList &controls)\n> > > >  int StaggeredCtrl::write()\n> > > >  {\n> > > >         std::lock_guard<std::mutex> lock(lock_);\n> > > > -       libcamera::ControlList controls(dev_->controls());\n> > > > +       ControlList controls(dev_->controls());\n> > > >\n> > > >         for (auto &p : ctrl_) {\n> > > >                 int delayDiff = maxDelay_ - delay_[p.first];\n> > > > @@ -126,7 +125,7 @@ int StaggeredCtrl::write()\n> > > >                         controls.set(p.first, p.second[index].value);\n> > > >                         p.second[index].updated = false;\n> > > >                         LOG(RPI_S_W, Debug) << \"Writing ctrl \"\n> > > > -                                           << hex(p.first) << \" to \"\n> > > > +                                           << utils::hex(p.first) << \" to \"\n> > > >                                             << p.second[index].value\n> > > >                                             << \" at index \"\n> > > >                                             << index;\n> > > > @@ -149,7 +148,7 @@ void StaggeredCtrl::get(std::unordered_map<uint32_t, int32_t> &ctrl, uint8_t off\n> > > >                 int index = std::max<int>(0, getCount_ - maxDelay_);\n> > > >                 ctrl[p.first] = p.second[index].value;\n> > > >                 LOG(RPI_S_W, Debug) << \"Getting ctrl \"\n> > > > -                                   << hex(p.first) << \" to \"\n> > > > +                                   << utils::hex(p.first) << \" to \"\n> > > >                                     << p.second[index].value\n> > > >                                     << \" at index \"\n> > > >                                     << index;\n> > > > @@ -171,3 +170,5 @@ void StaggeredCtrl::nextFrame()\n> > > >  }\n> > > >\n> > > >  } /* namespace RPi */\n> > > > +\n> > > > +} /* namespace libcamera */\n> > > > diff --git a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > > > index c8f000a0b43c..eef16eaac235 100644\n> > > > --- a/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > > > +++ b/src/libcamera/pipeline/raspberrypi/staggered_ctrl.h\n> > > > @@ -12,9 +12,10 @@\n> > > >  #include <unordered_map>\n> > > >  #include <utility>\n> > > >\n> > > > -#include <libcamera/controls.h>\n> > > > +namespace libcamera {\n> > > >\n> > > > -#include \"v4l2_videodevice.h\"\n> > > > +class ControlList;\n> > > > +class V4L2VideoDevice;\n> > > >\n> > > >  namespace RPi {\n> > > >\n> > > > @@ -31,7 +32,7 @@ public:\n> > > >                 return init_;\n> > > >         }\n> > > >\n> > > > -       void init(libcamera::V4L2VideoDevice *dev,\n> > > > +       void init(V4L2VideoDevice *dev,\n> > > >                   std::initializer_list<std::pair<const uint32_t, uint8_t>> delayList);\n> > > >         void reset();\n> > > >\n> > > > @@ -39,7 +40,7 @@ public:\n> > > >\n> > > >         bool set(uint32_t ctrl, int32_t value);\n> > > >         bool set(std::initializer_list<std::pair<const uint32_t, int32_t>> ctrlList);\n> > > > -       bool set(libcamera::ControlList &controls);\n> > > > +       bool set(ControlList &controls);\n> > > >\n> > > >         int write();\n> > > >\n> > > > @@ -81,10 +82,12 @@ private:\n> > > >         uint32_t setCount_;\n> > > >         uint32_t getCount_;\n> > > >         uint8_t maxDelay_;\n> > > > -       libcamera::V4L2VideoDevice *dev_;\n> > > > +       V4L2VideoDevice *dev_;\n> > > >         std::unordered_map<uint32_t, uint8_t> delay_;\n> > > >         std::unordered_map<uint32_t, CircularArray> ctrl_;\n> > > >         std::mutex lock_;\n> > > >  };\n> > > >\n> > > >  } /* namespace RPi */\n> > > > +\n> > > > +} /* namespace libcamera */\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","headers":{"Return-Path":"<naush@raspberrypi.com>","Received":["from mail-lf1-x141.google.com (mail-lf1-x141.google.com\n\t[IPv6:2a00:1450:4864:20::141])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CB01F603DC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 15 May 2020 09:07:26 +0200 (CEST)","by mail-lf1-x141.google.com with SMTP id h188so909630lfd.7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 15 May 2020 00:07:26 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"gWWVkEhq\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc:content-transfer-encoding;\n\tbh=mTfrwLl04KP3HbLu7X7kkrgsJb2jAcmFk+CBmbsTMlQ=;\n\tb=gWWVkEhqhIpGrGVTZBrFMtjOpTD8uIhtVyuje/dft9kspRaoCFcdbG2xt8rJSKLstJ\n\tKK5lsjusQol3a5o35UfYoKN+e9GisjsOgM73u/YdQplzsI6cCMlWGABieu5G+7RNOase\n\tMNhF9yErp/iRlSVCn9rV+tR/80AuNDGRH4sBssrCnZvIErY+NwoKbcodDoxDAqjN38FL\n\tOIvp3AM+xqQwSk5x6qtA3rmzb/O1U1Cj1soDLZ87dlNZWP2uycVQcpoGbR/G+3IcxtX3\n\tGWddoaCbD5jOQRoXYanYyqgzKHSYrgU5YIhPLk7Bisw3g9O5cyF7Fn1JbDcCMR4JSXVr\n\t5Rgg==","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=mTfrwLl04KP3HbLu7X7kkrgsJb2jAcmFk+CBmbsTMlQ=;\n\tb=I1nuL0jnqkMOakDuPIGMklcZjKmTI1RjHjD4XmHFoj9FgudttnE8dFkh+UoNBajiMg\n\tZpqrNu6qCL3JA30xO4/9q2xN59/AVMo0Zlw9iWvvP/70rTdt1AGqML2A9J7pat2tQKm9\n\twvSsllI6DYOG1VY2nrVOlvz+kJf3fWnjBdT1pz8TH+ggjCChXRbaCgBshwoJkSJ1U/85\n\tRqhzbkIuCpB9Phy7RMujUfUqHF3w7Ih7bgrpo/zwkwbau40rFXqmbzVkZvGU2PCuc2r6\n\t6E9VyDShfh+TkyrPRJlc57YKjkNHBFNcf1LUWnyYhb8K+kifjDelCYb2CQmLCDonWDcr\n\t871w==","X-Gm-Message-State":"AOAM53314bOhP+3LDAkmY7pOhmHh8XVE4EREwlsNdxT2ksCnZqmJBTlU\n\t9yFqWR9JXTWkE1aeNQeWJVnnefIu7YePQ7udXtm42w==","X-Google-Smtp-Source":"ABdhPJxVZoW+BH7qoDol73Lgxzc4SwUTAioVIn3b1iBbPGcLhmovOC29OgmbBvP/kurH5irIwL7C++Wj/hUblu6GN8U=","X-Received":"by 2002:a19:2286:: with SMTP id\n\ti128mr1350402lfi.109.1589526445634; \n\tFri, 15 May 2020 00:07:25 -0700 (PDT)","MIME-Version":"1.0","References":"<20200512003903.20986-1-laurent.pinchart@ideasonboard.com>\n\t<20200512003903.20986-2-laurent.pinchart@ideasonboard.com>\n\t<CAEmqJPpzP=Lws_CpT4Z76Qr5WTEu6SRjjD9nHE-qifPTuBq11g@mail.gmail.com>\n\t<20200514150109.GE5955@pendragon.ideasonboard.com>\n\t<20200515014323.GR5955@pendragon.ideasonboard.com>","In-Reply-To":"<20200515014323.GR5955@pendragon.ideasonboard.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Fri, 15 May 2020 08:07:09 +0100","Message-ID":"<CAEmqJPrKHQ090UvAJVKzw9oev46-LcwKAqn_wctybGet4w11Pw@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: raspberrypi:\n\tMove StaggeredCtrl to libcamera namespace","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>","X-List-Received-Date":"Fri, 15 May 2020 07:07:27 -0000"}}]