[{"id":27076,"web_url":"https://patchwork.libcamera.org/comment/27076/","msgid":"<20230509071356.GD6748@pendragon.ideasonboard.com>","date":"2023-05-09T07:13:56","subject":"Re: [libcamera-devel] [RFC PATCH v2 1/2] libcamera: camera: Take\n\tspan of StreamRole instead of vector","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Barnabás,\n\nThank you for the patch.\n\nOn Wed, May 03, 2023 at 12:47:28PM +0000, Barnabás Pőcze via libcamera-devel wrote:\n> Change the parameter type of `generateConfiguration()` from\n> `const std::vector&` to `libcamera::Span`. A span is almost\n> always preferable to a const vector ref because it does not\n> force dynamic allocation when none are needed, and it allows\n> any contiguous container to be used.\n\nThere's no need to wrap at 60 columns, you can use the normal 72 columns\nwrapping for commit messages.\n\n> A new overload is added that accepts an initializer list so that\n> \n>   cam->generateConfiguration({ ... })\n> \n> keeps working.\n> \n> There is no API break since a span can be constructed from a vector\n> and the initializer list overload takes care of the initializer lists,\n> but this change causes an ABI break.\n> \n> Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>\n> ---\n>  Documentation/guides/pipeline-handler.rst          |  4 ++--\n>  include/libcamera/camera.h                         | 12 +++++++++++-\n>  include/libcamera/internal/pipeline_handler.h      |  2 +-\n>  src/libcamera/camera.cpp                           |  2 +-\n>  src/libcamera/pipeline/imx8-isi/imx8-isi.cpp       |  4 ++--\n>  src/libcamera/pipeline/ipu3/ipu3.cpp               |  4 ++--\n>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  4 ++--\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp           |  4 ++--\n>  src/libcamera/pipeline/simple/simple.cpp           |  4 ++--\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp       |  4 ++--\n>  src/libcamera/pipeline/vimc/vimc.cpp               |  4 ++--\n>  src/py/libcamera/py_main.cpp                       |  5 ++++-\n>  12 files changed, 33 insertions(+), 20 deletions(-)\n> \n> diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\n> index 1acd1812..e08bb72f 100644\n> --- a/Documentation/guides/pipeline-handler.rst\n> +++ b/Documentation/guides/pipeline-handler.rst\n> @@ -203,7 +203,7 @@ implementations for the overridden class members.\n>            PipelineHandlerVivid(CameraManager *manager);\n> \n>            CameraConfiguration *generateConfiguration(Camera *camera,\n> -          const StreamRoles &roles) override;\n> +          Span<const StreamRole> roles) override;\n>            int configure(Camera *camera, CameraConfiguration *config) override;\n> \n>            int exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -223,7 +223,7 @@ implementations for the overridden class members.\n>     }\n> \n>     CameraConfiguration *PipelineHandlerVivid::generateConfiguration(Camera *camera,\n> -                                                                    const StreamRoles &roles)\n> +                                                                    Span<const StreamRole> roles)\n>     {\n>            return nullptr;\n>     }\n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 5bb06584..425fe51b 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -7,6 +7,7 @@\n> \n>  #pragma once\n> \n> +#include <initializer_list>\n>  #include <memory>\n>  #include <set>\n>  #include <stdint.h>\n> @@ -105,7 +106,16 @@ public:\n>  \tconst ControlList &properties() const;\n> \n>  \tconst std::set<Stream *> &streams() const;\n> -\tstd::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles = {});\n> +\tstd::unique_ptr<CameraConfiguration> generateConfiguration(Span<const StreamRole> roles = {});\n> +\n> +\t/**\n> +\t * \\overload\n> +\t */\n\nDocumentation belongs to the .cpp file.\n\n> +\tstd::unique_ptr<CameraConfiguration> generateConfiguration(std::initializer_list<StreamRole> roles)\n\nI'd wrap this to\n\n\tstd::unique_ptr<CameraConfiguration>\n\tgenerateConfiguration(std::initializer_list<StreamRole> roles)\n\nas it's getting long. Maybe above as well.\n\n> +\t{\n> +\t\treturn generateConfiguration(Span(roles.begin(), roles.end()));\n> +\t}\n> +\n>  \tint configure(CameraConfiguration *config);\n> \n>  \tstd::unique_ptr<Request> createRequest(uint64_t cookie = 0);\n> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\n> index 4c4dfe62..aaeb3a9e 100644\n> --- a/include/libcamera/internal/pipeline_handler.h\n> +++ b/include/libcamera/internal/pipeline_handler.h\n> @@ -49,7 +49,7 @@ public:\n>  \tvoid release(Camera *camera);\n> \n>  \tvirtual std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,\n> -\t\tconst StreamRoles &roles) = 0;\n> +\t\tSpan<const StreamRole> roles) = 0;\n>  \tvirtual int configure(Camera *camera, CameraConfiguration *config) = 0;\n> \n>  \tvirtual int exportFrameBuffers(Camera *camera, Stream *stream,\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 99683e49..f53fcdfd 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -938,7 +938,7 @@ const std::set<Stream *> &Camera::streams() const\n>   * \\return A CameraConfiguration if the requested roles can be satisfied, or a\n>   * null pointer otherwise.\n>   */\n> -std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(const StreamRoles &roles)\n> +std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(Span<const StreamRole> roles)\n>  {\n>  \tPrivate *const d = _d();\n> \n> diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> index 449d9012..9bdfff0b 100644\n> --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> @@ -104,7 +104,7 @@ public:\n>  \tbool match(DeviceEnumerator *enumerator) override;\n> \n>  \tstd::unique_ptr<CameraConfiguration>\n> -\tgenerateConfiguration(Camera *camera, const StreamRoles &roles) override;\n> +\tgenerateConfiguration(Camera *camera, Span<const StreamRole> roles) override;\n>  \tint configure(Camera *camera, CameraConfiguration *config) override;\n> \n>  \tint exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -739,7 +739,7 @@ StreamConfiguration PipelineHandlerISI::generateRawConfiguration(Camera *camera)\n> \n>  std::unique_ptr<CameraConfiguration>\n>  PipelineHandlerISI::generateConfiguration(Camera *camera,\n> -\t\t\t\t\t  const StreamRoles &roles)\n> +\t\t\t\t\t  Span<const StreamRole> roles)\n>  {\n>  \tISICameraData *data = cameraData(camera);\n>  \tstd::unique_ptr<ISICameraConfiguration> config =\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 355cb0cb..ada8c272 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -135,7 +135,7 @@ public:\n>  \tPipelineHandlerIPU3(CameraManager *manager);\n> \n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,\n> -\t\tconst StreamRoles &roles) override;\n> +\t\tSpan<const StreamRole> roles) override;\n>  \tint configure(Camera *camera, CameraConfiguration *config) override;\n> \n>  \tint exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -390,7 +390,7 @@ PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)\n>  }\n> \n>  std::unique_ptr<CameraConfiguration>\n> -PipelineHandlerIPU3::generateConfiguration(Camera *camera, const StreamRoles &roles)\n> +PipelineHandlerIPU3::generateConfiguration(Camera *camera, Span<const StreamRole> roles)\n>  {\n>  \tIPU3CameraData *data = cameraData(camera);\n>  \tstd::unique_ptr<IPU3CameraConfiguration> config =\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 00600441..6421eda5 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -367,7 +367,7 @@ public:\n>  \tPipelineHandlerRPi(CameraManager *manager);\n> \n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,\n> -\t\tconst StreamRoles &roles) override;\n> +\t\tSpan<const StreamRole> roles) override;\n>  \tint configure(Camera *camera, CameraConfiguration *config) override;\n> \n>  \tint exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -667,7 +667,7 @@ PipelineHandlerRPi::PipelineHandlerRPi(CameraManager *manager)\n>  }\n> \n>  std::unique_ptr<CameraConfiguration>\n> -PipelineHandlerRPi::generateConfiguration(Camera *camera, const StreamRoles &roles)\n> +PipelineHandlerRPi::generateConfiguration(Camera *camera, Span<const StreamRole> roles)\n>  {\n>  \tRPiCameraData *data = cameraData(camera);\n>  \tstd::unique_ptr<CameraConfiguration> config =\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 8a30fe06..1fdfde7b 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -148,7 +148,7 @@ public:\n>  \tPipelineHandlerRkISP1(CameraManager *manager);\n> \n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,\n> -\t\tconst StreamRoles &roles) override;\n> +\t\tSpan<const StreamRole> roles) override;\n>  \tint configure(Camera *camera, CameraConfiguration *config) override;\n> \n>  \tint exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -609,7 +609,7 @@ PipelineHandlerRkISP1::PipelineHandlerRkISP1(CameraManager *manager)\n> \n>  std::unique_ptr<CameraConfiguration>\n>  PipelineHandlerRkISP1::generateConfiguration(Camera *camera,\n> -\tconst StreamRoles &roles)\n> +\tSpan<const StreamRole> roles)\n>  {\n>  \tRkISP1CameraData *data = cameraData(camera);\n> \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index e1f8b989..d6e0758e 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -315,7 +315,7 @@ public:\n>  \tSimplePipelineHandler(CameraManager *manager);\n> \n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,\n> -\t\tconst StreamRoles &roles) override;\n> +\t\tSpan<const StreamRole> roles) override;\n>  \tint configure(Camera *camera, CameraConfiguration *config) override;\n> \n>  \tint exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -1043,7 +1043,7 @@ SimplePipelineHandler::SimplePipelineHandler(CameraManager *manager)\n>  }\n> \n>  std::unique_ptr<CameraConfiguration>\n> -SimplePipelineHandler::generateConfiguration(Camera *camera, const StreamRoles &roles)\n> +SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRole> roles)\n>  {\n>  \tSimpleCameraData *data = cameraData(camera);\n>  \tstd::unique_ptr<CameraConfiguration> config =\n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index 277465b7..03935876 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -75,7 +75,7 @@ public:\n>  \tPipelineHandlerUVC(CameraManager *manager);\n> \n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,\n> -\t\tconst StreamRoles &roles) override;\n> +\t\tSpan<const StreamRole> roles) override;\n>  \tint configure(Camera *camera, CameraConfiguration *config) override;\n> \n>  \tint exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -180,7 +180,7 @@ PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager)\n> \n>  std::unique_ptr<CameraConfiguration>\n>  PipelineHandlerUVC::generateConfiguration(Camera *camera,\n> -\tconst StreamRoles &roles)\n> +\tSpan<const StreamRole> roles)\n>  {\n>  \tUVCCameraData *data = cameraData(camera);\n>  \tstd::unique_ptr<CameraConfiguration> config =\n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index 204f5ad7..49ee949f 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -85,7 +85,7 @@ public:\n>  \tPipelineHandlerVimc(CameraManager *manager);\n> \n>  \tstd::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,\n> -\t\tconst StreamRoles &roles) override;\n> +\t\tSpan<const StreamRole> roles) override;\n>  \tint configure(Camera *camera, CameraConfiguration *config) override;\n> \n>  \tint exportFrameBuffers(Camera *camera, Stream *stream,\n> @@ -191,7 +191,7 @@ PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager)\n> \n>  std::unique_ptr<CameraConfiguration>\n>  PipelineHandlerVimc::generateConfiguration(Camera *camera,\n> -\tconst StreamRoles &roles)\n> +\tSpan<const StreamRole> roles)\n>  {\n>  \tVimcCameraData *data = cameraData(camera);\n>  \tstd::unique_ptr<CameraConfiguration> config =\n> diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp\n> index d14e18e2..3f04871f 100644\n> --- a/src/py/libcamera/py_main.cpp\n> +++ b/src/py/libcamera/py_main.cpp\n> @@ -156,7 +156,10 @@ PYBIND11_MODULE(_libcamera, m)\n>  \t\t})\n> \n>  \t\t/* Keep the camera alive, as StreamConfiguration contains a Stream* */\n> -\t\t.def(\"generate_configuration\", &Camera::generateConfiguration, py::keep_alive<0, 1>())\n> +\t\t.def(\"generate_configuration\", [](Camera &self, const std::vector<StreamRole> &roles) {\n> +\t\t\treturn self.generateConfiguration(roles);\n> +\t\t}, py::keep_alive<0, 1>())\n> +\n>  \t\t.def(\"configure\", &Camera::configure)\n> \n>  \t\t.def(\"create_request\", &Camera::createRequest, py::arg(\"cookie\") = 0)","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 C503ABE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  9 May 2023 07:13:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 06EF6633B4;\n\tTue,  9 May 2023 09:13:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0E23260548\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  9 May 2023 09:13:45 +0200 (CEST)","from pendragon.ideasonboard.com (softbank126090219015.bbtec.net\n\t[126.90.219.15])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 883377CE;\n\tTue,  9 May 2023 09:13:37 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1683616426;\n\tbh=ZZzK3f5ww/8qFiCrdjwP/k1BL/w5yacGwSRtRhFKMow=;\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=iXKpkoswvMM29sekZunoAN2GmfTUnpdPytPiJBJsC0R3ljfBGM2q47tWPE1l95Af2\n\t2/x6ifdrmlSoiuWMJjKspMqEqRf/cDNzGi3UJZ+N+Ly1jcYTAkdPaKD1I4seA9SFqo\n\tWXRv3p7G085nYe11z3McjppnwGtvzza0/BX3VyJ4FjBbip5BXjrKMvPeLOUFk/rx2R\n\tDVNZzaoQFIxfz9SSRwrts5XJ+/dtek2i702Wt+7kZhnK1KmfOpUIs66CSIrVvtXWMW\n\tuk+q5po7f8F/l/wVtroVlBZr3S0Inu+TWN8GVdYOhpm+PRGpqLmgQ4XNNsf1xMBAIw\n\t7tEhDWN30SHzA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1683616418;\n\tbh=ZZzK3f5ww/8qFiCrdjwP/k1BL/w5yacGwSRtRhFKMow=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Wsz0AyerM83k8z6+BKkXAJhyKSS5CIs07dWlV0WmXOwo6tJ/jI4Snlh6gD3qfdhyQ\n\tr6xd9kIk+6ZoEp2m/hgL07PFHXRXrL7QGSbf28HdF/Cedt28cjI07QuugHo1DVGO/E\n\t7nY6IZ44jRdNnyXffP9IO/mp7WvRndNXN0Bintx4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Wsz0Ayer\"; dkim-atps=neutral","Date":"Tue, 9 May 2023 10:13:56 +0300","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Message-ID":"<20230509071356.GD6748@pendragon.ideasonboard.com>","References":"<20230503124725.200550-1-pobrn@protonmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20230503124725.200550-1-pobrn@protonmail.com>","Subject":"Re: [libcamera-devel] [RFC PATCH v2 1/2] libcamera: camera: Take\n\tspan of StreamRole instead of vector","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":27078,"web_url":"https://patchwork.libcamera.org/comment/27078/","msgid":"<MHATnM5WJ7DI9xfZXaNDH_yaUugYuvEZIcrI5youD4WvE2NwhcZCJufH6UO15I-IJqCLLBc6EUZVDP4yR8vol5WdN562030pGfqI4lVUCcY=@protonmail.com>","date":"2023-05-09T22:15:03","subject":"Re: [libcamera-devel] [RFC PATCH v2 1/2] libcamera: camera: Take\n\tspan of StreamRole instead of vector","submitter":{"id":133,"url":"https://patchwork.libcamera.org/api/people/133/","name":"Pőcze Barnabás","email":"pobrn@protonmail.com"},"content":"Hi\n\n\n2023. május 9., kedd 9:13 keltezéssel, Laurent Pinchart <laurent.pinchart@ideasonboard.com> írta:\n\n> Hi Barnabás,\n>\n> Thank you for the patch.\n>\n> On Wed, May 03, 2023 at 12:47:28PM +0000, Barnabás Pőcze via libcamera-devel wrote:\n> > Change the parameter type of `generateConfiguration()` from\n> > `const std::vector&` to `libcamera::Span`. A span is almost\n> > always preferable to a const vector ref because it does not\n> > force dynamic allocation when none are needed, and it allows\n> > any contiguous container to be used.\n>\n> There's no need to wrap at 60 columns, you can use the normal 72 columns\n> wrapping for commit messages.\n\nI did not want to break \"const std::vector&\" and not breaking before\nthat makes the line ~80 chars long. I will send a new version with that.\n\n\n>\n> > A new overload is added that accepts an initializer list so that\n> >\n> >   cam->generateConfiguration({ ... })\n> >\n> > keeps working.\n> >\n> > There is no API break since a span can be constructed from a vector\n> > and the initializer list overload takes care of the initializer lists,\n> > but this change causes an ABI break.\n> >\n> > Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>\n> > ---\n> >  Documentation/guides/pipeline-handler.rst          |  4 ++--\n> >  include/libcamera/camera.h                         | 12 +++++++++++-\n> >  include/libcamera/internal/pipeline_handler.h      |  2 +-\n> >  src/libcamera/camera.cpp                           |  2 +-\n> >  src/libcamera/pipeline/imx8-isi/imx8-isi.cpp       |  4 ++--\n> >  src/libcamera/pipeline/ipu3/ipu3.cpp               |  4 ++--\n> >  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  4 ++--\n> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp           |  4 ++--\n> >  src/libcamera/pipeline/simple/simple.cpp           |  4 ++--\n> >  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp       |  4 ++--\n> >  src/libcamera/pipeline/vimc/vimc.cpp               |  4 ++--\n> >  src/py/libcamera/py_main.cpp                       |  5 ++++-\n> >  12 files changed, 33 insertions(+), 20 deletions(-)\n> >\n> > diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\n> > index 1acd1812..e08bb72f 100644\n> > --- a/Documentation/guides/pipeline-handler.rst\n> > +++ b/Documentation/guides/pipeline-handler.rst\n> > @@ -203,7 +203,7 @@ implementations for the overridden class members.\n> >            PipelineHandlerVivid(CameraManager *manager);\n> >\n> >            CameraConfiguration *generateConfiguration(Camera *camera,\n> > -          const StreamRoles &roles) override;\n> > +          Span<const StreamRole> roles) override;\n> >            int configure(Camera *camera, CameraConfiguration *config) override;\n> >\n> >            int exportFrameBuffers(Camera *camera, Stream *stream,\n> > @@ -223,7 +223,7 @@ implementations for the overridden class members.\n> >     }\n> >\n> >     CameraConfiguration *PipelineHandlerVivid::generateConfiguration(Camera *camera,\n> > -                                                                    const StreamRoles &roles)\n> > +                                                                    Span<const StreamRole> roles)\n> >     {\n> >            return nullptr;\n> >     }\n> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> > index 5bb06584..425fe51b 100644\n> > --- a/include/libcamera/camera.h\n> > +++ b/include/libcamera/camera.h\n> > @@ -7,6 +7,7 @@\n> >\n> >  #pragma once\n> >\n> > +#include <initializer_list>\n> >  #include <memory>\n> >  #include <set>\n> >  #include <stdint.h>\n> > @@ -105,7 +106,16 @@ public:\n> >  \tconst ControlList &properties() const;\n> >\n> >  \tconst std::set<Stream *> &streams() const;\n> > -\tstd::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles = {});\n> > +\tstd::unique_ptr<CameraConfiguration> generateConfiguration(Span<const StreamRole> roles = {});\n> > +\n> > +\t/**\n> > +\t * \\overload\n> > +\t */\n>\n> Documentation belongs to the .cpp file.\n\nACK\n\n\n>\n> > +\tstd::unique_ptr<CameraConfiguration> generateConfiguration(std::initializer_list<StreamRole> roles)\n>\n> I'd wrap this to\n>\n> \tstd::unique_ptr<CameraConfiguration>\n> \tgenerateConfiguration(std::initializer_list<StreamRole> roles)\n>\n> as it's getting long. Maybe above as well.\n\n\nACK\n\n>\n> > +\t{\n> > +\t\treturn generateConfiguration(Span(roles.begin(), roles.end()));\n> > +\t}\n> > +\n> >  \tint configure(CameraConfiguration *config);\n> >\n> >  \tstd::unique_ptr<Request> createRequest(uint64_t cookie = 0);\n> [...]\n\n\nRegards,\nBarnabás Pőcze","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 698A9BE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  9 May 2023 22:15:18 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BAB0A633B4;\n\tWed, 10 May 2023 00:15:17 +0200 (CEST)","from mail-4322.protonmail.ch (mail-4322.protonmail.ch\n\t[185.70.43.22])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 582736053A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 10 May 2023 00:15:15 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1683670517;\n\tbh=EWSQBa8P5q3M8m7DobcfP5totnI3gKxtb+8w4RamY2E=;\n\th=Date:To:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=wRWETQ51U1jutVJh/EISmG2lDH0uZLHpO+xdByEobrNcmvktLIlptqzSkfFIPqltm\n\tUk18VSbTPQJ9iPDy5NucnxJfUfiDiSyw2vpNTABLxheceakosJU25SQ+a3Eoy+L76c\n\toCBu7bM/0WktiiF0L2aevUAzW3yg+9H65KQESKAZmnGgDC6333i+BrGFS3U/rm7ny0\n\tPktVq8WGc1pae1/8Qgo91vRpaspFfHbohsPubUcvYbIPcM8yw57l+TGvrtxJzqD5vl\n\twQ1nJIqWo/sXaBTEocaI7cOqIDCRpnAWbOKySYm4Bvvi6KD/SfeuH6u50flyf2unQU\n\t4cIxbg3eA2snw==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com;\n\ts=protonmail3; t=1683670514; x=1683929714;\n\tbh=TfO+Fb1WH6VB5oS4sBcbivlNHdzjF40IS4YBLeBfBtI=;\n\th=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector;\n\tb=yb6CdfPMP3nYDzwZdwMQVvHSLsRS+I2zWfI1xB0W9w3dw6Sznv4dnE2J/MQOj1oO8\n\tjIXg2OPAPrimZkcrUhZ+n3PtJDdDIx3x4XslYx+nVvA/dyeclvwBfP/oLOB7c3ZDWx\n\tmMUEGKqMFckEFPb1k5n+1C0wwqhb/j1iiOFRzNbbHCRu63fF3LPYmp+BhL3oNvYJjQ\n\tzAZIGSr2MaF6lacaCLuOgkEqtdzKl8bqBS16o/JDtBB8KM0KxWbu7wbnNiFN3DxN7k\n\thMZb0BRKABZESfIN+vFcf+9C6kl1IDNKgzta3IyEPmU4T4dPVHLWURxSc4cQOlCBZ5\n\ty79L5uxl7UxCQ=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=protonmail.com\n\theader.i=@protonmail.com\n\theader.b=\"yb6CdfPM\"; dkim-atps=neutral","Date":"Tue, 09 May 2023 22:15:03 +0000","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<MHATnM5WJ7DI9xfZXaNDH_yaUugYuvEZIcrI5youD4WvE2NwhcZCJufH6UO15I-IJqCLLBc6EUZVDP4yR8vol5WdN562030pGfqI4lVUCcY=@protonmail.com>","In-Reply-To":"<20230509071356.GD6748@pendragon.ideasonboard.com>","References":"<20230503124725.200550-1-pobrn@protonmail.com>\n\t<20230509071356.GD6748@pendragon.ideasonboard.com>","Feedback-ID":"20568564:user:proton","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","Subject":"Re: [libcamera-devel] [RFC PATCH v2 1/2] libcamera: camera: Take\n\tspan of StreamRole instead of vector","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":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze_via_libcamera-devel?=\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]