[{"id":31879,"web_url":"https://patchwork.libcamera.org/comment/31879/","msgid":"<172959488826.3022735.3594623485238336168@ping.linuxembedded.co.uk>","date":"2024-10-22T11:01:28","subject":"Re: [PATCH v3] qcam: Automatically select the camera if only one is\n\tavailable","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Stanislaw Gruszka (2024-10-22 11:24:48)\n> When only a single camera is available, showing the camera selection\n> dialog is unnecessary. It's better to automatically select the available\n> camera without prompting the user for input.\n> \n> Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>\n> ---\n> v2:\n> - Avoid cm_->cameras().size() vs cm_->cameras()[0] race condition\n>   using custom loop.\n> - Update in code comment\n> v3: \n> - Avoid TOCTOU race using shared_ptr vector copy\n> - Use Laurent comment wording\n> \n>  src/apps/qcam/main_window.cpp | 16 +++++++++++-----\n>  1 file changed, 11 insertions(+), 5 deletions(-)\n> \n> diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp\n> index 5144c6b3..de487672 100644\n> --- a/src/apps/qcam/main_window.cpp\n> +++ b/src/apps/qcam/main_window.cpp\n> @@ -298,13 +298,19 @@ int MainWindow::openCamera()\n>         std::string cameraName;\n>  \n>         /*\n> -        * Use the camera specified on the command line, if any, or display the\n> -        * camera selection dialog box otherwise.\n> +        * If a camera is specified on the command line, get it. Otherwise, if\n> +        * only one camera is available, pick it automatically, else, display\n> +        * the selector dialog box.\n>          */\n> -       if (options_.isSet(OptCamera))\n> +       if (options_.isSet(OptCamera)) {\n>                 cameraName = static_cast<std::string>(options_[OptCamera]);\n> -       else\n> -               cameraName = chooseCamera();\n> +       } else {\n> +               std::vector<std::shared_ptr<Camera>> cameras = cm_->cameras();\n> +               if (cameras.size() == 1)\n> +                       cameraName = cameras[0]->id();\n> +               else\n> +                       cameraName = chooseCamera();\n> +       }\n\nOk, now I see how the toctou is easier to fix like this ;-)\n\nI like this - clean and short and does what it needs.\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>  \n>         if (cameraName == \"\")\n>                 return -EINVAL;\n> -- \n> 2.43.0\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 9151CBD160\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 22 Oct 2024 11:01:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5E90D65391;\n\tTue, 22 Oct 2024 13:01:32 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CAD266053E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 22 Oct 2024 13:01:30 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 280583EA;\n\tTue, 22 Oct 2024 12:59:44 +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=\"QT6xNrb8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1729594784;\n\tbh=gxrcjhowZhNd7A/OyQ7SzVpO5TZwhQ7umNL/1IflbQc=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=QT6xNrb8RZcqbWPI5QH04joYqhrBdgZQB/ua3F9ozPeRz4MzStZPGVt2gW++rwePh\n\tzEOsNGoSSIAkimRXC+DHxueOChIu75ZA8YtF6xpR4tX+o5UoZRNVD1s82f9PydTAsl\n\tFhA7zHzVLBfefrUH9n4gAZli1CUd4xLtzurB67QY=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20241022102448.229381-1-stanislaw.gruszka@linux.intel.com>","References":"<20241022102448.229381-1-stanislaw.gruszka@linux.intel.com>","Subject":"Re: [PATCH v3] qcam: Automatically select the camera if only one is\n\tavailable","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 22 Oct 2024 12:01:28 +0100","Message-ID":"<172959488826.3022735.3594623485238336168@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","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":31882,"web_url":"https://patchwork.libcamera.org/comment/31882/","msgid":"<20241022221942.GH9497@pendragon.ideasonboard.com>","date":"2024-10-22T22:19:42","subject":"Re: [PATCH v3] qcam: Automatically select the camera if only one is\n\tavailable","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Tue, Oct 22, 2024 at 12:01:28PM +0100, Kieran Bingham wrote:\n> Quoting Stanislaw Gruszka (2024-10-22 11:24:48)\n> > When only a single camera is available, showing the camera selection\n> > dialog is unnecessary. It's better to automatically select the available\n> > camera without prompting the user for input.\n> > \n> > Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>\n> > ---\n> > v2:\n> > - Avoid cm_->cameras().size() vs cm_->cameras()[0] race condition\n> >   using custom loop.\n> > - Update in code comment\n> > v3: \n> > - Avoid TOCTOU race using shared_ptr vector copy\n> > - Use Laurent comment wording\n> > \n> >  src/apps/qcam/main_window.cpp | 16 +++++++++++-----\n> >  1 file changed, 11 insertions(+), 5 deletions(-)\n> > \n> > diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp\n> > index 5144c6b3..de487672 100644\n> > --- a/src/apps/qcam/main_window.cpp\n> > +++ b/src/apps/qcam/main_window.cpp\n> > @@ -298,13 +298,19 @@ int MainWindow::openCamera()\n> >         std::string cameraName;\n> >  \n> >         /*\n> > -        * Use the camera specified on the command line, if any, or display the\n> > -        * camera selection dialog box otherwise.\n> > +        * If a camera is specified on the command line, get it. Otherwise, if\n> > +        * only one camera is available, pick it automatically, else, display\n> > +        * the selector dialog box.\n> >          */\n> > -       if (options_.isSet(OptCamera))\n> > +       if (options_.isSet(OptCamera)) {\n> >                 cameraName = static_cast<std::string>(options_[OptCamera]);\n> > -       else\n> > -               cameraName = chooseCamera();\n> > +       } else {\n> > +               std::vector<std::shared_ptr<Camera>> cameras = cm_->cameras();\n> > +               if (cameras.size() == 1)\n> > +                       cameraName = cameras[0]->id();\n\nIt's not very efficient to go from camera to name and then back to\ncamera, but I think that's fine for this patch. We can improve things on\ntop.\n\n> > +               else\n> > +                       cameraName = chooseCamera();\n> > +       }\n> \n> Ok, now I see how the toctou is easier to fix like this ;-)\n> \n> I like this - clean and short and does what it needs.\n> \n> \n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> >  \n> >         if (cameraName == \"\")\n> >                 return -EINVAL;","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 F10C0C3274\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 22 Oct 2024 22:19:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CA43765391;\n\tWed, 23 Oct 2024 00:19:50 +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 6199B633C8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Oct 2024 00:19:49 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1EBA173E;\n\tWed, 23 Oct 2024 00:18:02 +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=\"DEeiIn67\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1729635482;\n\tbh=wenL99rs7di3clP/OMecNnKRufZssArri/oPvMXYzko=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=DEeiIn67uxCC3WKnyTmE8mLRL8H/AR0CR5HG+SliRrbQzCPyxmFBARQC1RL/UebeU\n\tfJ1Oeuw5gA8K25qNu2UmBDppf9kI83ZfpON65cGtIqK1ZV8gw80EVWzq2HcziK4UMQ\n\tqWq6WZ4kRZnoOfGB35BHv7lj4TyHsGy6KrmNO660=","Date":"Wed, 23 Oct 2024 01:19:42 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v3] qcam: Automatically select the camera if only one is\n\tavailable","Message-ID":"<20241022221942.GH9497@pendragon.ideasonboard.com>","References":"<20241022102448.229381-1-stanislaw.gruszka@linux.intel.com>\n\t<172959488826.3022735.3594623485238336168@ping.linuxembedded.co.uk>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<172959488826.3022735.3594623485238336168@ping.linuxembedded.co.uk>","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>"}}]