[{"id":18131,"web_url":"https://patchwork.libcamera.org/comment/18131/","msgid":"<5d985c5d-ece0-bf93-cbbd-51f072663e92@ideasonboard.com>","date":"2021-07-12T15:43:51","subject":"Re: [libcamera-devel] [PATCH 19/30] cam: Move camera acquire to the\n\tCameraSession class","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 07/07/2021 03:19, Laurent Pinchart wrote:\n> Continue moving towards making the CameraSession class the central point\n> to handle a camera by moving the camera acquire operation. A new\n> CameraSession::camera() function is needed to allow access to the camera\n> from CamApp.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/cam/camera_session.cpp | 29 ++++++++++++++++++++--\n>  src/cam/camera_session.h   |  6 ++++-\n>  src/cam/main.cpp           | 49 +++++++++-----------------------------\n>  3 files changed, 43 insertions(+), 41 deletions(-)\n> \n> diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp\n> index edc7205d6bda..10e66446ee67 100644\n> --- a/src/cam/camera_session.cpp\n> +++ b/src/cam/camera_session.cpp\n> @@ -19,11 +19,30 @@\n>  \n>  using namespace libcamera;\n>  \n> -CameraSession::CameraSession(std::shared_ptr<Camera> camera,\n> +CameraSession::CameraSession(CameraManager *cm,\n>  \t\t\t     const OptionsParser::Options &options)\n> -\t: camera_(camera), last_(0), queueCount_(0), captureCount_(0),\n> +\t: last_(0), queueCount_(0), captureCount_(0),\n>  \t  captureLimit_(0), printMetadata_(false)\n\nWell I certainly like seeing initialiser lists shrink ;-)\n\n\n>  {\n> +\tconst std::string &cameraId = options[OptCamera];\n> +\tchar *endptr;\n> +\tunsigned long index = strtoul(cameraId.c_str(), &endptr, 10);\n> +\tif (*endptr == '\\0' && index > 0 && index <= cm->cameras().size())\n> +\t\tcamera_ = cm->cameras()[index - 1];\n> +\telse\n> +\t\tcamera_ = cm->get(cameraId);\n> +\n> +\tif (!camera_) {\n> +\t\tstd::cerr << \"Camera \" << cameraId << \" not found\" << std::endl;\n> +\t\treturn;\n> +\t}\n> +\n> +\tif (camera_->acquire()) {\n> +\t\tstd::cerr << \"Failed to acquire camera \" << cameraId\n> +\t\t\t  << std::endl;\n> +\t\treturn;\n> +\t}\n> +\n>  \tStreamRoles roles = StreamKeyValueParser::roles(options[OptStream]);\n>  \n>  \tstd::unique_ptr<CameraConfiguration> config =\n> @@ -64,6 +83,12 @@ CameraSession::CameraSession(std::shared_ptr<Camera> camera,\n>  \tconfig_ = std::move(config);\n>  }\n>  \n> +CameraSession::~CameraSession()\n> +{\n> +\tif (camera_)\n> +\t\tcamera_->release();\n\nMakes me wonder if we should we wrap a shared_ptr<camera> with a\nunique_ptr so that it automatically releases ?\n\nAnd I can't quite tell where the sarcasm stops or the ... why we might\nneed that starts.... eeek\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> +}\n> +\n>  int CameraSession::start(const OptionsParser::Options &options)\n>  {\n>  \tint ret;\n> diff --git a/src/cam/camera_session.h b/src/cam/camera_session.h\n> index 39dbbdf37913..88baf9061629 100644\n> --- a/src/cam/camera_session.h\n> +++ b/src/cam/camera_session.h\n> @@ -14,6 +14,7 @@\n>  #include <libcamera/base/signal.h>\n>  \n>  #include <libcamera/camera.h>\n> +#include <libcamera/camera_manager.h>\n>  #include <libcamera/framebuffer.h>\n>  #include <libcamera/framebuffer_allocator.h>\n>  #include <libcamera/request.h>\n> @@ -25,10 +26,13 @@\n>  class CameraSession\n>  {\n>  public:\n> -\tCameraSession(std::shared_ptr<libcamera::Camera> camera,\n> +\tCameraSession(libcamera::CameraManager *cm,\n>  \t\t      const OptionsParser::Options &options);\n> +\t~CameraSession();\n>  \n>  \tbool isValid() const { return config_ != nullptr; }\n> +\n> +\tlibcamera::Camera *camera() { return camera_.get(); }\n>  \tlibcamera::CameraConfiguration *config() { return config_.get(); }\n>  \n>  \tint start(const OptionsParser::Options &options);\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index 082a053efeda..8ed5e841a1e9 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -51,7 +51,6 @@ private:\n>  \tOptionsParser::Options options_;\n>  \tCameraManager *cm_;\n>  \n> -\tstd::shared_ptr<Camera> camera_;\n>  \tstd::unique_ptr<CameraSession> session_;\n>  \n>  \tEventLoop loop_;\n> @@ -60,7 +59,7 @@ private:\n>  CamApp *CamApp::app_ = nullptr;\n>  \n>  CamApp::CamApp()\n> -\t: cm_(nullptr), camera_(nullptr)\n> +\t: cm_(nullptr)\n>  {\n>  \tCamApp::app_ = this;\n>  }\n> @@ -93,37 +92,16 @@ int CamApp::init(int argc, char **argv)\n>  \t}\n>  \n>  \tif (options_.isSet(OptCamera)) {\n> -\t\tconst std::string &cameraId = options_[OptCamera];\n> -\t\tchar *endptr;\n> -\t\tunsigned long index = strtoul(cameraId.c_str(), &endptr, 10);\n> -\t\tif (*endptr == '\\0' && index > 0 && index <= cm_->cameras().size())\n> -\t\t\tcamera_ = cm_->cameras()[index - 1];\n> -\t\telse\n> -\t\t\tcamera_ = cm_->get(cameraId);\n> -\n> -\t\tif (!camera_) {\n> -\t\t\tstd::cout << \"Camera \"\n> -\t\t\t\t  << std::string(options_[OptCamera])\n> -\t\t\t\t  << \" not found\" << std::endl;\n> -\t\t\tcleanup();\n> -\t\t\treturn -ENODEV;\n> -\t\t}\n> -\n> -\t\tif (camera_->acquire()) {\n> -\t\t\tstd::cout << \"Failed to acquire camera\" << std::endl;\n> -\t\t\tcleanup();\n> -\t\t\treturn -EINVAL;\n> -\t\t}\n> -\n> -\t\tstd::cout << \"Using camera \" << camera_->id() << std::endl;\n> -\n> -\t\tsession_ = std::make_unique<CameraSession>(camera_, options_);\n> +\t\tsession_ = std::make_unique<CameraSession>(cm_, options_);\n>  \t\tif (!session_->isValid()) {\n>  \t\t\tstd::cout << \"Failed to create camera session\" << std::endl;\n>  \t\t\tcleanup();\n>  \t\t\treturn -EINVAL;\n>  \t\t}\n>  \n> +\t\tstd::cout << \"Using camera \" << session_->camera()->id()\n> +\t\t\t  << std::endl;\n> +\n>  \t\tsession_->captureDone.connect(this, &CamApp::captureDone);\n>  \t}\n>  \n> @@ -138,11 +116,6 @@ int CamApp::init(int argc, char **argv)\n>  \n>  void CamApp::cleanup()\n>  {\n> -\tif (camera_) {\n> -\t\tcamera_->release();\n> -\t\tcamera_.reset();\n> -\t}\n> -\n>  \tsession_.reset();\n>  \n>  \tcm_->stop();\n> @@ -214,13 +187,13 @@ int CamApp::parseOptions(int argc, char *argv[])\n>  \n>  int CamApp::listControls()\n>  {\n> -\tif (!camera_) {\n> +\tif (!session_) {\n>  \t\tstd::cout << \"Cannot list controls without a camera\"\n>  \t\t\t  << std::endl;\n>  \t\treturn -EINVAL;\n>  \t}\n>  \n> -\tfor (const auto &ctrl : camera_->controls()) {\n> +\tfor (const auto &ctrl : session_->camera()->controls()) {\n>  \t\tconst ControlId *id = ctrl.first;\n>  \t\tconst ControlInfo &info = ctrl.second;\n>  \n> @@ -233,13 +206,13 @@ int CamApp::listControls()\n>  \n>  int CamApp::listProperties()\n>  {\n> -\tif (!camera_) {\n> +\tif (!session_) {\n>  \t\tstd::cout << \"Cannot list properties without a camera\"\n>  \t\t\t  << std::endl;\n>  \t\treturn -EINVAL;\n>  \t}\n>  \n> -\tfor (const auto &prop : camera_->properties()) {\n> +\tfor (const auto &prop : session_->camera()->properties()) {\n>  \t\tconst ControlId *id = properties::properties.at(prop.first);\n>  \t\tconst ControlValue &value = prop.second;\n>  \n> @@ -252,7 +225,7 @@ int CamApp::listProperties()\n>  \n>  int CamApp::infoConfiguration()\n>  {\n> -\tif (!camera_) {\n> +\tif (!session_) {\n>  \t\tstd::cout << \"Cannot print stream information without a camera\"\n>  \t\t\t  << std::endl;\n>  \t\treturn -EINVAL;\n> @@ -328,7 +301,7 @@ int CamApp::run()\n>  \t}\n>  \n>  \tif (options_.isSet(OptCapture)) {\n> -\t\tif (!camera_) {\n> +\t\tif (!session_) {\n>  \t\t\tstd::cout << \"Can't capture without a camera\" << std::endl;\n>  \t\t\treturn -ENODEV;\n>  \t\t}\n>","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 7BA70C3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 12 Jul 2021 15:43:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E4EBA68524;\n\tMon, 12 Jul 2021 17:43:55 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6C4D468513\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 12 Jul 2021 17:43:54 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D8876CC;\n\tMon, 12 Jul 2021 17:43:53 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"BHDfP0k9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1626104634;\n\tbh=5OywIxSlyxeUDLpEgD+dbMsIH39Qr5AeRtQsqsBxykw=;\n\th=To:References:From:Subject:Date:In-Reply-To:From;\n\tb=BHDfP0k99+kyKn7U87/dP7Et0ynbaVzdf0GSh45vm0pT+3Sdxw2BnH76NWx9XDetc\n\tM1sFnUbIfVxVFfgwDqMJRmBILoWvXv47Si2ybwd1oIhrn18vPc+hknRCqCWuF0GdR9\n\tty+WbuPEH+iZ/sPoijkIOS2xhovl50z0LSsMu88g=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20210707021941.20804-1-laurent.pinchart@ideasonboard.com>\n\t<20210707021941.20804-20-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<5d985c5d-ece0-bf93-cbbd-51f072663e92@ideasonboard.com>","Date":"Mon, 12 Jul 2021 16:43:51 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.11.0","MIME-Version":"1.0","In-Reply-To":"<20210707021941.20804-20-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH 19/30] cam: Move camera acquire to the\n\tCameraSession class","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":18148,"web_url":"https://patchwork.libcamera.org/comment/18148/","msgid":"<YOyMh7Kfm5T+71uK@pendragon.ideasonboard.com>","date":"2021-07-12T18:40:07","subject":"Re: [libcamera-devel] [PATCH 19/30] cam: Move camera acquire to the\n\tCameraSession class","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Mon, Jul 12, 2021 at 04:43:51PM +0100, Kieran Bingham wrote:\n> On 07/07/2021 03:19, Laurent Pinchart wrote:\n> > Continue moving towards making the CameraSession class the central point\n> > to handle a camera by moving the camera acquire operation. A new\n> > CameraSession::camera() function is needed to allow access to the camera\n> > from CamApp.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  src/cam/camera_session.cpp | 29 ++++++++++++++++++++--\n> >  src/cam/camera_session.h   |  6 ++++-\n> >  src/cam/main.cpp           | 49 +++++++++-----------------------------\n> >  3 files changed, 43 insertions(+), 41 deletions(-)\n> > \n> > diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp\n> > index edc7205d6bda..10e66446ee67 100644\n> > --- a/src/cam/camera_session.cpp\n> > +++ b/src/cam/camera_session.cpp\n> > @@ -19,11 +19,30 @@\n> >  \n> >  using namespace libcamera;\n> >  \n> > -CameraSession::CameraSession(std::shared_ptr<Camera> camera,\n> > +CameraSession::CameraSession(CameraManager *cm,\n> >  \t\t\t     const OptionsParser::Options &options)\n> > -\t: camera_(camera), last_(0), queueCount_(0), captureCount_(0),\n> > +\t: last_(0), queueCount_(0), captureCount_(0),\n> >  \t  captureLimit_(0), printMetadata_(false)\n> \n> Well I certainly like seeing initialiser lists shrink ;-)\n> \n> >  {\n> > +\tconst std::string &cameraId = options[OptCamera];\n> > +\tchar *endptr;\n> > +\tunsigned long index = strtoul(cameraId.c_str(), &endptr, 10);\n> > +\tif (*endptr == '\\0' && index > 0 && index <= cm->cameras().size())\n> > +\t\tcamera_ = cm->cameras()[index - 1];\n> > +\telse\n> > +\t\tcamera_ = cm->get(cameraId);\n> > +\n> > +\tif (!camera_) {\n> > +\t\tstd::cerr << \"Camera \" << cameraId << \" not found\" << std::endl;\n> > +\t\treturn;\n> > +\t}\n> > +\n> > +\tif (camera_->acquire()) {\n> > +\t\tstd::cerr << \"Failed to acquire camera \" << cameraId\n> > +\t\t\t  << std::endl;\n> > +\t\treturn;\n> > +\t}\n> > +\n> >  \tStreamRoles roles = StreamKeyValueParser::roles(options[OptStream]);\n> >  \n> >  \tstd::unique_ptr<CameraConfiguration> config =\n> > @@ -64,6 +83,12 @@ CameraSession::CameraSession(std::shared_ptr<Camera> camera,\n> >  \tconfig_ = std::move(config);\n> >  }\n> >  \n> > +CameraSession::~CameraSession()\n> > +{\n> > +\tif (camera_)\n> > +\t\tcamera_->release();\n> \n> Makes me wonder if we should we wrap a shared_ptr<camera> with a\n> unique_ptr so that it automatically releases ?\n> \n> And I can't quite tell where the sarcasm stops or the ... why we might\n> need that starts.... eeek\n\n:-)\n\nJokes aside, I've been thinking about replacing the\nstd::shared_ptr<Camera> with an application-allocated\nstd::unique_ptr<Camera>. This Camera would be a facade object that would\nwrap an std::shared_ptr<Camera> internally (we would need two different\nnames for Camera). I'm not sure at this point if it's worth it.\n\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> > +}\n> > +\n> >  int CameraSession::start(const OptionsParser::Options &options)\n> >  {\n> >  \tint ret;\n> > diff --git a/src/cam/camera_session.h b/src/cam/camera_session.h\n> > index 39dbbdf37913..88baf9061629 100644\n> > --- a/src/cam/camera_session.h\n> > +++ b/src/cam/camera_session.h\n> > @@ -14,6 +14,7 @@\n> >  #include <libcamera/base/signal.h>\n> >  \n> >  #include <libcamera/camera.h>\n> > +#include <libcamera/camera_manager.h>\n> >  #include <libcamera/framebuffer.h>\n> >  #include <libcamera/framebuffer_allocator.h>\n> >  #include <libcamera/request.h>\n> > @@ -25,10 +26,13 @@\n> >  class CameraSession\n> >  {\n> >  public:\n> > -\tCameraSession(std::shared_ptr<libcamera::Camera> camera,\n> > +\tCameraSession(libcamera::CameraManager *cm,\n> >  \t\t      const OptionsParser::Options &options);\n> > +\t~CameraSession();\n> >  \n> >  \tbool isValid() const { return config_ != nullptr; }\n> > +\n> > +\tlibcamera::Camera *camera() { return camera_.get(); }\n> >  \tlibcamera::CameraConfiguration *config() { return config_.get(); }\n> >  \n> >  \tint start(const OptionsParser::Options &options);\n> > diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> > index 082a053efeda..8ed5e841a1e9 100644\n> > --- a/src/cam/main.cpp\n> > +++ b/src/cam/main.cpp\n> > @@ -51,7 +51,6 @@ private:\n> >  \tOptionsParser::Options options_;\n> >  \tCameraManager *cm_;\n> >  \n> > -\tstd::shared_ptr<Camera> camera_;\n> >  \tstd::unique_ptr<CameraSession> session_;\n> >  \n> >  \tEventLoop loop_;\n> > @@ -60,7 +59,7 @@ private:\n> >  CamApp *CamApp::app_ = nullptr;\n> >  \n> >  CamApp::CamApp()\n> > -\t: cm_(nullptr), camera_(nullptr)\n> > +\t: cm_(nullptr)\n> >  {\n> >  \tCamApp::app_ = this;\n> >  }\n> > @@ -93,37 +92,16 @@ int CamApp::init(int argc, char **argv)\n> >  \t}\n> >  \n> >  \tif (options_.isSet(OptCamera)) {\n> > -\t\tconst std::string &cameraId = options_[OptCamera];\n> > -\t\tchar *endptr;\n> > -\t\tunsigned long index = strtoul(cameraId.c_str(), &endptr, 10);\n> > -\t\tif (*endptr == '\\0' && index > 0 && index <= cm_->cameras().size())\n> > -\t\t\tcamera_ = cm_->cameras()[index - 1];\n> > -\t\telse\n> > -\t\t\tcamera_ = cm_->get(cameraId);\n> > -\n> > -\t\tif (!camera_) {\n> > -\t\t\tstd::cout << \"Camera \"\n> > -\t\t\t\t  << std::string(options_[OptCamera])\n> > -\t\t\t\t  << \" not found\" << std::endl;\n> > -\t\t\tcleanup();\n> > -\t\t\treturn -ENODEV;\n> > -\t\t}\n> > -\n> > -\t\tif (camera_->acquire()) {\n> > -\t\t\tstd::cout << \"Failed to acquire camera\" << std::endl;\n> > -\t\t\tcleanup();\n> > -\t\t\treturn -EINVAL;\n> > -\t\t}\n> > -\n> > -\t\tstd::cout << \"Using camera \" << camera_->id() << std::endl;\n> > -\n> > -\t\tsession_ = std::make_unique<CameraSession>(camera_, options_);\n> > +\t\tsession_ = std::make_unique<CameraSession>(cm_, options_);\n> >  \t\tif (!session_->isValid()) {\n> >  \t\t\tstd::cout << \"Failed to create camera session\" << std::endl;\n> >  \t\t\tcleanup();\n> >  \t\t\treturn -EINVAL;\n> >  \t\t}\n> >  \n> > +\t\tstd::cout << \"Using camera \" << session_->camera()->id()\n> > +\t\t\t  << std::endl;\n> > +\n> >  \t\tsession_->captureDone.connect(this, &CamApp::captureDone);\n> >  \t}\n> >  \n> > @@ -138,11 +116,6 @@ int CamApp::init(int argc, char **argv)\n> >  \n> >  void CamApp::cleanup()\n> >  {\n> > -\tif (camera_) {\n> > -\t\tcamera_->release();\n> > -\t\tcamera_.reset();\n> > -\t}\n> > -\n> >  \tsession_.reset();\n> >  \n> >  \tcm_->stop();\n> > @@ -214,13 +187,13 @@ int CamApp::parseOptions(int argc, char *argv[])\n> >  \n> >  int CamApp::listControls()\n> >  {\n> > -\tif (!camera_) {\n> > +\tif (!session_) {\n> >  \t\tstd::cout << \"Cannot list controls without a camera\"\n> >  \t\t\t  << std::endl;\n> >  \t\treturn -EINVAL;\n> >  \t}\n> >  \n> > -\tfor (const auto &ctrl : camera_->controls()) {\n> > +\tfor (const auto &ctrl : session_->camera()->controls()) {\n> >  \t\tconst ControlId *id = ctrl.first;\n> >  \t\tconst ControlInfo &info = ctrl.second;\n> >  \n> > @@ -233,13 +206,13 @@ int CamApp::listControls()\n> >  \n> >  int CamApp::listProperties()\n> >  {\n> > -\tif (!camera_) {\n> > +\tif (!session_) {\n> >  \t\tstd::cout << \"Cannot list properties without a camera\"\n> >  \t\t\t  << std::endl;\n> >  \t\treturn -EINVAL;\n> >  \t}\n> >  \n> > -\tfor (const auto &prop : camera_->properties()) {\n> > +\tfor (const auto &prop : session_->camera()->properties()) {\n> >  \t\tconst ControlId *id = properties::properties.at(prop.first);\n> >  \t\tconst ControlValue &value = prop.second;\n> >  \n> > @@ -252,7 +225,7 @@ int CamApp::listProperties()\n> >  \n> >  int CamApp::infoConfiguration()\n> >  {\n> > -\tif (!camera_) {\n> > +\tif (!session_) {\n> >  \t\tstd::cout << \"Cannot print stream information without a camera\"\n> >  \t\t\t  << std::endl;\n> >  \t\treturn -EINVAL;\n> > @@ -328,7 +301,7 @@ int CamApp::run()\n> >  \t}\n> >  \n> >  \tif (options_.isSet(OptCapture)) {\n> > -\t\tif (!camera_) {\n> > +\t\tif (!session_) {\n> >  \t\t\tstd::cout << \"Can't capture without a camera\" << std::endl;\n> >  \t\t\treturn -ENODEV;\n> >  \t\t}","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 6866BC3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 12 Jul 2021 18:40:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CE61D68524;\n\tMon, 12 Jul 2021 20:40:55 +0200 (CEST)","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 3800C68513\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 12 Jul 2021 20:40:54 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AED4ACC;\n\tMon, 12 Jul 2021 20:40:53 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"VUJHeWJP\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1626115253;\n\tbh=ki6+l5+dD0cZ7btvRlb/unqH+pCGOIbA2Mt78XQ61Ho=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=VUJHeWJPpFaXfePtF4NhJYT29jx3P6g5v5gWolWkW+TKtF2d5OIHmCXZMrWQf0vFd\n\t2yBQdCSiSkhanW4h0djt58G2ZqPm53zV0f4KkRsZ1t9FfX7BjP6RkOfZ5JsCDXuC7H\n\tVWYAZFmk7bLIWVYLeArWx4l/c4pNiEktMRYgj6uA=","Date":"Mon, 12 Jul 2021 21:40:07 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<YOyMh7Kfm5T+71uK@pendragon.ideasonboard.com>","References":"<20210707021941.20804-1-laurent.pinchart@ideasonboard.com>\n\t<20210707021941.20804-20-laurent.pinchart@ideasonboard.com>\n\t<5d985c5d-ece0-bf93-cbbd-51f072663e92@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<5d985c5d-ece0-bf93-cbbd-51f072663e92@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 19/30] cam: Move camera acquire to the\n\tCameraSession class","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]