[{"id":679,"web_url":"https://patchwork.libcamera.org/comment/679/","msgid":"<5592471a-5b37-2d4e-1587-ead11431bdeb@ideasonboard.com>","date":"2019-01-29T10:16:43","subject":"Re: [libcamera-devel] [PATCH v4 6/6] libcamera: camera: extend\n\tcamera object to support configuration of streams","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Niklas,\n\nOn 29/01/2019 02:00, Niklas Söderlund wrote:\n> Extend the camera to support reading and configuring formats for\n> groups of streams. The implementation in the Camera are minimalistic as\n> the heavy lifting are done by the pipeline handler implementations.\n> \n> The most important functionality the camera provides in this context is\n> validation of data structures passed to it from the application and\n> access control to the pipeline handler.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  include/libcamera/camera.h |  4 +++\n>  src/libcamera/camera.cpp   | 61 ++++++++++++++++++++++++++++++++++++++\n>  2 files changed, 65 insertions(+)\n> \n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 3ebb8e96cc63b98a..7a0357f3a2919752 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -7,6 +7,7 @@\n>  #ifndef __LIBCAMERA_CAMERA_H__\n>  #define __LIBCAMERA_CAMERA_H__\n>  \n> +#include <map>\n>  #include <memory>\n>  #include <string>\n>  \n> @@ -16,6 +17,7 @@ namespace libcamera {\n>  \n>  class PipelineHandler;\n>  class Stream;\n> +class StreamConfiguration;\n>  \n>  class Camera final\n>  {\n> @@ -35,6 +37,8 @@ public:\n>  \tvoid release();\n>  \n>  \tstd::vector<Stream *> streams() const;\n> +\tstd::map<Stream*, StreamConfiguration> streamConfiguration(std::vector<Stream*> &streams);\n> +\tint configureStreams(std::map<Stream*, StreamConfiguration> &config);\n>  \n>  private:\n>  \tCamera(PipelineHandler *pipe, const std::string &name);\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index c8604ec8a8e6eaf4..69d28a10f1f73d0d 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -190,4 +190,65 @@ std::vector<Stream *> Camera::streams() const\n>  \treturn streams_;\n>  }\n>  \n> +/**\n> + * \\brief Retrieve a group of stream configurations\n> + * \\param[in] streams A map of stream IDs and configurations to setup\n> + *\n> + * Retrieve the camera's configuration for a specified group of streams. The\n> + * caller can specifies which of the camera's streams to retrieve configuration\n> + * from by populating \\a streams.\n> + *\n> + * The easiest way to populate the array of streams to fetch configuration from\n> + * is to first retrieve the camera's full array of stream by with streams() and\n> + * then potentially trim it down to only contain the streams the caller\n> + * are interested in.\n> + *\n> + * \\return A map of successfully retrieved stream IDs and configurations or an\n> + * empty list on error.\n> + */\n> +std::map<Stream*, StreamConfiguration>\n> +Camera::streamConfiguration(std::vector<Stream*> &streams)\n> +{\n> +\tif (disconnected_ || !streams.size())\n> +\t\tstd::map<unsigned int, StreamConfiguration>{};\n> +\n> +\treturn pipe_->streamConfiguration(this, streams);\n> +}\n> +\n> +/**\n> + * \\brief Configure the camera's streams prior to capture\n> + * \\param[in] config A map of stream IDs and configurations to setup\n> + *\n> + * Prior to starting capture, the camera must be configured to select a\n> + * group of streams to be involved in the capture and their configuration.\n> + * The caller specifies which streams are to be involved and their configuration\n> + * by populating \\a config.\n> + *\n> + * The easiest way to populate the array of config is to fetch an initial\n> + * configuration from the camera with streamConfiguration() and then change the\n> + * parameters to fit the caller's need and once all the streams parameters are\n> + * configured hand that over to configureStreams() to actually setup the camera.\n> + *\n> + * Exclusive access to the camera shall be ensured by a call to acquire() prior\n> + * to calling this function, otherwise an -EACCES error is be returned.\n> + *\n> + * \\return 0 on success or a negative error code on error.\n> + * \\retval -ENODEV The camera is not connected to any hardware\n> + * \\retval -EACCES The user have not acquired exclusive access to the camera\n> + * \\retval -EINVAL The configuration is not valid\n> + */\n> +int Camera::configureStreams(std::map<Stream*, StreamConfiguration> &config)\n> +{\n> +\tif (disconnected_)\n> +\t\treturn -ENODEV;\n> +\n> +\tif (!acquired_)\n> +\t\treturn -EACCES;\n> +\n> +\tif (!config.size())\n> +\t\treturn -EINVAL;\n> +\n\nPerhaps not necessary in this patch - but it looks like perhaps we\nshould wrap the access control into a function.\n\nIt's going to be required for almost every call through the Camera\nobject, and it might need flags to determine what control is allowed.\n\nint CameraAccessAllowed(AccessFlags)\n{\n  if (disconnected_)\n\treturn -ENODEV;\n\n  if ( (AccessFlags & MUST_ACQUIRE) && !acquired )\n\treturn -EACCES;\n\n  /* Other checks / flags here ? */\n\n  return true;\n}\n\nCamera::configureStreams(std::map<Stream*, StreamConfiguration> &config)\n{\n\n  int ret = CameraAccessAllowed(MUST_ACQUIRE | MUST_EXIST)\n  if (ret)\n\treturn ret;\n\n  if (!config.size())\n\treturn -EINVAL;\n  ...\n}\n\nThen this :\n> \\retval -ENODEV The camera is not connected to any hardware\n> \\retval -EACCES The user have not acquired exclusive access to the camera\n> \\retval -EINVAL The configuration is not valid\n\ncan be documented just once, instead of on every API call.\n\n\n> +\treturn pipe_->configureStreams(this, config);\n> +}\n> +\n>  } /* namespace libcamera */\n>","headers":{"Return-Path":"<kieran.bingham@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 5A58660B2D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 29 Jan 2019 11:16:47 +0100 (CET)","from [192.168.0.21]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B220F41;\n\tTue, 29 Jan 2019 11:16:46 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1548757006;\n\tbh=PHkwROHkN2W9u2wcwgdNJNznc1DdtfOB+l4PDjAhp8A=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=MrxMuiyuyGoxHNn02pqZBkhllzeWrEJcOcVD1komlW/a5JngMMZso17hl82oEjHmG\n\t86+UXAhCrWIQ3GS1kC6Fjef2JapgYcP/7DCBNAY6DoTb/FjWxmoVvH1hLf+ndg4O4a\n\tWUwUgPznCQVUKFYsikmX6bCUFlT13ZewsuOn7jDE=","Reply-To":"kieran.bingham@ideasonboard.com","To":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20190129020048.16774-1-niklas.soderlund@ragnatech.se>\n\t<20190129020048.16774-7-niklas.soderlund@ragnatech.se>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Openpgp":"preference=signencrypt","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tsbsRB8KNNvVXBOVNwko86rQqF9drZuw=","Organization":"Ideas on Board","Message-ID":"<5592471a-5b37-2d4e-1587-ead11431bdeb@ideasonboard.com>","Date":"Tue, 29 Jan 2019 10:16:43 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101\n\tThunderbird/60.2.1","MIME-Version":"1.0","In-Reply-To":"<20190129020048.16774-7-niklas.soderlund@ragnatech.se>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH v4 6/6] libcamera: camera: extend\n\tcamera object to support configuration of streams","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Tue, 29 Jan 2019 10:16:47 -0000"}},{"id":684,"web_url":"https://patchwork.libcamera.org/comment/684/","msgid":"<20190129132411.GE19527@bigcity.dyn.berto.se>","date":"2019-01-29T13:24:12","subject":"Re: [libcamera-devel] [PATCH v4 6/6] libcamera: camera: extend\n\tcamera object to support configuration of streams","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Kieran,\n\nThanks for your feedback.\n\nOn 2019-01-29 10:16:43 +0000, Kieran Bingham wrote:\n> Hi Niklas,\n> \n> On 29/01/2019 02:00, Niklas Söderlund wrote:\n> > Extend the camera to support reading and configuring formats for\n> > groups of streams. The implementation in the Camera are minimalistic as\n> > the heavy lifting are done by the pipeline handler implementations.\n> > \n> > The most important functionality the camera provides in this context is\n> > validation of data structures passed to it from the application and\n> > access control to the pipeline handler.\n> > \n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >  include/libcamera/camera.h |  4 +++\n> >  src/libcamera/camera.cpp   | 61 ++++++++++++++++++++++++++++++++++++++\n> >  2 files changed, 65 insertions(+)\n> > \n> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> > index 3ebb8e96cc63b98a..7a0357f3a2919752 100644\n> > --- a/include/libcamera/camera.h\n> > +++ b/include/libcamera/camera.h\n> > @@ -7,6 +7,7 @@\n> >  #ifndef __LIBCAMERA_CAMERA_H__\n> >  #define __LIBCAMERA_CAMERA_H__\n> >  \n> > +#include <map>\n> >  #include <memory>\n> >  #include <string>\n> >  \n> > @@ -16,6 +17,7 @@ namespace libcamera {\n> >  \n> >  class PipelineHandler;\n> >  class Stream;\n> > +class StreamConfiguration;\n> >  \n> >  class Camera final\n> >  {\n> > @@ -35,6 +37,8 @@ public:\n> >  \tvoid release();\n> >  \n> >  \tstd::vector<Stream *> streams() const;\n> > +\tstd::map<Stream*, StreamConfiguration> streamConfiguration(std::vector<Stream*> &streams);\n> > +\tint configureStreams(std::map<Stream*, StreamConfiguration> &config);\n> >  \n> >  private:\n> >  \tCamera(PipelineHandler *pipe, const std::string &name);\n> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > index c8604ec8a8e6eaf4..69d28a10f1f73d0d 100644\n> > --- a/src/libcamera/camera.cpp\n> > +++ b/src/libcamera/camera.cpp\n> > @@ -190,4 +190,65 @@ std::vector<Stream *> Camera::streams() const\n> >  \treturn streams_;\n> >  }\n> >  \n> > +/**\n> > + * \\brief Retrieve a group of stream configurations\n> > + * \\param[in] streams A map of stream IDs and configurations to setup\n> > + *\n> > + * Retrieve the camera's configuration for a specified group of streams. The\n> > + * caller can specifies which of the camera's streams to retrieve configuration\n> > + * from by populating \\a streams.\n> > + *\n> > + * The easiest way to populate the array of streams to fetch configuration from\n> > + * is to first retrieve the camera's full array of stream by with streams() and\n> > + * then potentially trim it down to only contain the streams the caller\n> > + * are interested in.\n> > + *\n> > + * \\return A map of successfully retrieved stream IDs and configurations or an\n> > + * empty list on error.\n> > + */\n> > +std::map<Stream*, StreamConfiguration>\n> > +Camera::streamConfiguration(std::vector<Stream*> &streams)\n> > +{\n> > +\tif (disconnected_ || !streams.size())\n> > +\t\tstd::map<unsigned int, StreamConfiguration>{};\n> > +\n> > +\treturn pipe_->streamConfiguration(this, streams);\n> > +}\n> > +\n> > +/**\n> > + * \\brief Configure the camera's streams prior to capture\n> > + * \\param[in] config A map of stream IDs and configurations to setup\n> > + *\n> > + * Prior to starting capture, the camera must be configured to select a\n> > + * group of streams to be involved in the capture and their configuration.\n> > + * The caller specifies which streams are to be involved and their configuration\n> > + * by populating \\a config.\n> > + *\n> > + * The easiest way to populate the array of config is to fetch an initial\n> > + * configuration from the camera with streamConfiguration() and then change the\n> > + * parameters to fit the caller's need and once all the streams parameters are\n> > + * configured hand that over to configureStreams() to actually setup the camera.\n> > + *\n> > + * Exclusive access to the camera shall be ensured by a call to acquire() prior\n> > + * to calling this function, otherwise an -EACCES error is be returned.\n> > + *\n> > + * \\return 0 on success or a negative error code on error.\n> > + * \\retval -ENODEV The camera is not connected to any hardware\n> > + * \\retval -EACCES The user have not acquired exclusive access to the camera\n> > + * \\retval -EINVAL The configuration is not valid\n> > + */\n> > +int Camera::configureStreams(std::map<Stream*, StreamConfiguration> &config)\n> > +{\n> > +\tif (disconnected_)\n> > +\t\treturn -ENODEV;\n> > +\n> > +\tif (!acquired_)\n> > +\t\treturn -EACCES;\n> > +\n> > +\tif (!config.size())\n> > +\t\treturn -EINVAL;\n> > +\n> \n> Perhaps not necessary in this patch - but it looks like perhaps we\n> should wrap the access control into a function.\n> \n> It's going to be required for almost every call through the Camera\n> object, and it might need flags to determine what control is allowed.\n> \n> int CameraAccessAllowed(AccessFlags)\n> {\n>   if (disconnected_)\n> \treturn -ENODEV;\n> \n>   if ( (AccessFlags & MUST_ACQUIRE) && !acquired )\n> \treturn -EACCES;\n> \n>   /* Other checks / flags here ? */\n> \n>   return true;\n> }\n> \n> Camera::configureStreams(std::map<Stream*, StreamConfiguration> &config)\n> {\n> \n>   int ret = CameraAccessAllowed(MUST_ACQUIRE | MUST_EXIST)\n>   if (ret)\n> \treturn ret;\n> \n>   if (!config.size())\n> \treturn -EINVAL;\n>   ...\n> }\n\nI like this idea but would first like to see some more operations added \nso that we can break this out into the most useful helper. For this \npatch I would like to keep it as is as to not prematurely optimize \nthings.\n\n> \n> Then this :\n> > \\retval -ENODEV The camera is not connected to any hardware\n> > \\retval -EACCES The user have not acquired exclusive access to the camera\n> > \\retval -EINVAL The configuration is not valid\n> \n> can be documented just once, instead of on every API call.\n> \n> \n> > +\treturn pipe_->configureStreams(this, config);\n> > +}\n> > +\n> >  } /* namespace libcamera */\n> > \n> \n> -- \n> Regards\n> --\n> Kieran","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","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 0DD6A60DB6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 29 Jan 2019 14:24:14 +0100 (CET)","by mail-lj1-x241.google.com with SMTP id c19-v6so17456123lja.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 29 Jan 2019 05:24:13 -0800 (PST)","from localhost (89-233-230-99.cust.bredband2.com. [89.233.230.99])\n\tby smtp.gmail.com with ESMTPSA id\n\tx204sm3465837lfa.5.2019.01.29.05.24.12\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tTue, 29 Jan 2019 05:24:12 -0800 (PST)"],"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\t:user-agent; bh=CRtVAat5SSXExAgRPC2TdroW/aGnpZ0cwsLnA3borew=;\n\tb=UOyDXDS6zInq8CslduE6OHawtNZF3Mx1jxf3d/VvGK8gu0VkLavf3xKMyB5vJ/eNJm\n\tZBlGc1oivRsl7PUTDAhQv0vue7EvFoLYmxPk0pdBm/BRZwRUNRbnrH1bK4XM24pGh/2Q\n\t/1thN/fB0GpsApmBtf7ZC1rVXA9qRXTcWTUgjFuEHDXP8sq9yVO3/KGgq/vxjh8eMJcG\n\t4VNO0VXoXijF5vztvkprMKJ3yfQfEJWBPOj5ZmtvDDHnlPbkgoQhA3eB70wsdzNMDwUd\n\tCZ9LmHSAQHt60NluFznqb4PGUq41hRQrajHgnS7aMhV4KqeuMnDJggflnEAh9/BQ3Iy6\n\tpVEw==","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:user-agent;\n\tbh=CRtVAat5SSXExAgRPC2TdroW/aGnpZ0cwsLnA3borew=;\n\tb=Nn1X/NhYnjx60yR+7HZBSd93S9xCew+AT3OBLCywEgcDSH0jzFPff2EWegz7WiDLaq\n\tJ6LgjIZqf5plQ6QQD+7Bd2nbFFmF7shvlagJPbT6MaVPwyOQ4cm/yKjkgIq94thD77Nz\n\t9OygFs5U8nfGd1wx4/0gjgCOvERh+A3fauBknQe4y5DucEuozbvFjQeESx7nk4qBwCuX\n\tlYHcuxCeDYaV0+pjMX75MPC1BJzDl+mreuzhzrrqGBWO026yyBZvnCO8k9bUHRLe40zf\n\tPUF9DBMd44kUPP2kweowIPoQVGvcDl77ARQf62zqCclLbTl/bXHJycE/+0zqxVGpgSsa\n\toVuA==","X-Gm-Message-State":"AJcUukdm/dzpzumh+wcL4oZIA4KotBgVqI14DH6CD5BUcgUXZJ+CokiQ\n\tyNJhrCRx5NN2MDGnTjnhsAF86g==","X-Google-Smtp-Source":"ALg8bN6LAcBuAByJA/dnFynWDFUc7cF1mFjMY3iPVU0HCBcBZNkVSbnV5GrFuxdlTw6O6joJJo7jHQ==","X-Received":"by 2002:a2e:3603:: with SMTP id\n\td3-v6mr20834166lja.46.1548768253205; \n\tTue, 29 Jan 2019 05:24:13 -0800 (PST)","Date":"Tue, 29 Jan 2019 14:24:12 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190129132411.GE19527@bigcity.dyn.berto.se>","References":"<20190129020048.16774-1-niklas.soderlund@ragnatech.se>\n\t<20190129020048.16774-7-niklas.soderlund@ragnatech.se>\n\t<5592471a-5b37-2d4e-1587-ead11431bdeb@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<5592471a-5b37-2d4e-1587-ead11431bdeb@ideasonboard.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v4 6/6] libcamera: camera: extend\n\tcamera object to support configuration of streams","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Tue, 29 Jan 2019 13:24:14 -0000"}}]