[{"id":23527,"web_url":"https://patchwork.libcamera.org/comment/23527/","msgid":"<165591306346.18145.4530900849029862643@Monstersaurus>","date":"2022-06-22T15:51:03","subject":"Re: [libcamera-devel] [PATCH v2 2/3] qcam: Add a GUI way to use\n\tcapture script","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Utkarsh,\n\nQuoting Utkarsh Tiwari via libcamera-devel (2022-06-22 14:16:37)\n> Implement an Open Capture Script button which would allow the user\n> to open a Capture Script (*.yaml).\n> This button has two states Open and Stop.\n> \n> Open state allows user to load a capture script.\n> When clicked in open state present them with a QFileDialog\n> to allow user to select a single file.\n> \n> Stop state stops the execution of the current capture script.\n> \n> Introduce a queueCount_ to keep track of the requests queued.\n> \n> When stopping the execution no count is reset and the\n> capture continues as it is, this would allow better testing\n> as we can stop in between script and observe.\n\nI think it sounds like the right thing to do, but I'm not sure it makes\na difference to testing. \n\n> \n> Initialize a Script Parser instance when the user selects\n> a valid capture script.\n> \n> At queueRequest() time if script parser has been initialized,\n> then populate the Request::controls() with it at\n> queueRequest time providing the queueCount_.\n> \n> The queueCount_ is incremented after the getting controls from\n> the parser, so the first request is for frame 0.\n\nI think the 'useful' information here is that the request is queued with\nany controls that are defined in the script matching the current\nqueueCount_.\n\n> \n> Signed-off-by: Utkarsh Tiwari <utkarsh02t@gmail.com>\n> ---\n>  src/qcam/assets/feathericons/feathericons.qrc |  2 +\n>  src/qcam/main_window.cpp                      | 61 +++++++++++++++++++\n>  src/qcam/main_window.h                        |  7 +++\n>  src/qcam/meson.build                          |  2 +\n>  4 files changed, 72 insertions(+)\n> \n> diff --git a/src/qcam/assets/feathericons/feathericons.qrc b/src/qcam/assets/feathericons/feathericons.qrc\n> index c5302040..6b08395a 100644\n> --- a/src/qcam/assets/feathericons/feathericons.qrc\n> +++ b/src/qcam/assets/feathericons/feathericons.qrc\n> @@ -3,9 +3,11 @@\n>  <qresource>\n>         <file>aperture.svg</file>\n>         <file>camera-off.svg</file>\n> +       <file>file.svg</file>\n>         <file>play-circle.svg</file>\n>         <file>save.svg</file>\n>         <file>stop-circle.svg</file>\n>         <file>x-circle.svg</file>\n> +       <file>x-square.svg</file>\n>  </qresource>\n>  </RCC>\n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index adeb3181..29da3947 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -20,6 +20,7 @@\n>  #include <QImage>\n>  #include <QImageWriter>\n>  #include <QInputDialog>\n> +#include <QMessageBox>\n>  #include <QMutexLocker>\n>  #include <QStandardPaths>\n>  #include <QStringList>\n> @@ -232,6 +233,13 @@ int MainWindow::createToolbars()\n>         saveRaw_ = action;\n>  #endif\n>  \n> +       /* Open Script... action. */\n> +       action = toolbar_->addAction(QIcon::fromTheme(\"document-open\",\n> +                                                     QIcon(\":file.svg\")),\n> +                                    \"Open Capture Script\");\n> +       connect(action, &QAction::triggered, this, &MainWindow::chooseScript);\n> +       scriptExecAction_ = action;\n> +\n>         return 0;\n>  }\n>  \n> @@ -255,6 +263,53 @@ void MainWindow::updateTitle()\n>         setWindowTitle(title_ + \" : \" + QString::number(fps, 'f', 2) + \" fps\");\n>  }\n>  \n> +/**\n> + * \\brief Load a capture script for handling the capture session.\n> + *\n> + * If already capturing, it would restart the capture.\n> + */\n> +void MainWindow::chooseScript()\n> +{\n> +       if (isScriptExecuting_) {\n\nHow about just checking if (script_) rather than adding a new\nisScriptExecuting flag?\n\nI think it conveys the same state?\n\n> +               /*\n> +                * This is the second valid press of load script button,\n> +                * It indicates stopping, Stop and set button for new script\n> +                */\n> +               script_.reset();\n> +               scriptExecAction_->setIcon(QIcon::fromTheme(\"document-open\",\n> +                                                           QIcon(\":file.svg\")));\n> +               scriptExecAction_->setText(\"Open Capture Script\");\n> +               isScriptExecuting_ = false;\n> +               return;\n> +       }\n> +\n> +       QString scriptFile = QFileDialog::getOpenFileName(this, \"Open Capture Script\", QDir::currentPath(),\n> +                                                         \"Capture Script (*.yaml)\");\n> +       if (scriptFile.isEmpty())\n> +               return;\n\nNew line here I think. It hides the 'return' otherwise.\n\n\n\n\n> +       script_ = std::make_unique<CaptureScript>(camera_, scriptFile.toStdString());\n> +       if (!script_->valid()) {\n> +               script_.reset();\n> +               QMessageBox::critical(this, \"Invalid Script\",\n> +                                             \"Couldn't load the capture script\");\n> +               return;\n> +       }\n> +\n> +       /*\n> +        * Valid script verified\n> +        * Set the button to indicate stopping availibility\n> +        */\n> +       scriptExecAction_->setIcon(QIcon(\":x-square.svg\"));\n> +       scriptExecAction_->setText(\"Stop Script execution\");\n> +       isScriptExecuting_ = true;\n> +\n> +       /* Restart the capture so we can reset every counter */\n> +       if (isCapturing_) {\n> +               toggleCapture(false);\n> +               toggleCapture(true);\n> +       }\n> +}\n> +\n>  /* -----------------------------------------------------------------------------\n>   * Camera Selection\n>   */\n> @@ -510,6 +565,7 @@ int MainWindow::startCapture()\n>         previousFrames_ = 0;\n>         framesCaptured_ = 0;\n>         lastBufferTime_ = 0;\n> +       queueCount_ = 0;\n>  \n>         ret = camera_->start();\n>         if (ret) {\n> @@ -789,5 +845,10 @@ void MainWindow::renderComplete(FrameBuffer *buffer)\n>  \n>  int MainWindow::queueRequest(Request *request)\n>  {\n> +       if (script_)\n> +               request->controls() = script_->frameControls(queueCount_);\n> +\n> +       queueCount_++;\n> +\n>         return camera_->queueRequest(request);\n>  }\n> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> index c3e4b665..58df4e15 100644\n> --- a/src/qcam/main_window.h\n> +++ b/src/qcam/main_window.h\n> @@ -26,6 +26,7 @@\n>  #include <libcamera/request.h>\n>  #include <libcamera/stream.h>\n>  \n> +#include \"../cam/capture_script.h\"\n>  #include \"../cam/stream_options.h\"\n>  #include \"viewfinder.h\"\n>  \n> @@ -86,11 +87,14 @@ private:\n>         void processHotplug(HotplugEvent *e);\n>         void processViewfinder(libcamera::FrameBuffer *buffer);\n>  \n> +       void chooseScript();\n> +\n>         /* UI elements */\n>         QToolBar *toolbar_;\n>         QAction *startStopAction_;\n>         QComboBox *cameraCombo_;\n>         QAction *saveRaw_;\n> +       QAction *scriptExecAction_;\n>         ViewFinder *viewfinder_;\n>  \n>         QIcon iconPlay_;\n> @@ -112,6 +116,7 @@ private:\n>  \n>         /* Capture state, buffers queue and statistics */\n>         bool isCapturing_;\n> +       bool isScriptExecuting_;\n>         bool captureRaw_;\n>         libcamera::Stream *vfStream_;\n>         libcamera::Stream *rawStream_;\n> @@ -124,6 +129,8 @@ private:\n>         QElapsedTimer frameRateInterval_;\n>         uint32_t previousFrames_;\n>         uint32_t framesCaptured_;\n> +       uint32_t queueCount_;\n>  \n>         std::vector<std::unique_ptr<libcamera::Request>> requests_;\n> +       std::unique_ptr<CaptureScript> script_;\n>  };\n> diff --git a/src/qcam/meson.build b/src/qcam/meson.build\n> index c46f4631..67074252 100644\n> --- a/src/qcam/meson.build\n> +++ b/src/qcam/meson.build\n> @@ -15,6 +15,7 @@ endif\n>  qcam_enabled = true\n>  \n>  qcam_sources = files([\n> +    '../cam/capture_script.cpp',\n>      '../cam/image.cpp',\n>      '../cam/options.cpp',\n>      '../cam/stream_options.cpp',\n> @@ -37,6 +38,7 @@ qcam_resources = files([\n>  qcam_deps = [\n>      libatomic,\n>      libcamera_public,\n> +    libyaml,\n>      qt5_dep,\n>  ]\n>  \n> -- \n> 2.25.1\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 CA268BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Jun 2022 15:51:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0F66465635;\n\tWed, 22 Jun 2022 17:51:08 +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 956B461FB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Jun 2022 17:51:06 +0200 (CEST)","from pendragon.ideasonboard.com\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 04081DD;\n\tWed, 22 Jun 2022 17:51:05 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655913068;\n\tbh=YOuvDbKfsrnP+9wTMHXarmx2Jd3+VCBdM5qUGnXxXTI=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=DTUTRTc5smBKSnM1tgXaTGCC4l60lXpamHH5py6ALy95WOremkKJF6zT7QyEiTTRi\n\tg3pMct+gpOJinrUYJP7LrzLWKYgnrsxvx3O0y1DCkWn8/SVMvZTgbIUQ07TaUOYv6T\n\t/5BRXVuTnC2t5Ug7EdPLj0WpJkH0GdPnKhwRZ6Jl+qnKlUT4ltdt4nQOtd8uWSlAeP\n\tJqsbZc2njiGtSy9GfexsTWMiWWj/ScsX6CLANxnODhLUxWktzGZRY0TYMXCTd9Jd1k\n\trbAo858C/yl8kHHmJCy9lhOHYNPSxpMI1VyI1kjNYqonboAHxzPfB+T0mr2UWSqezA\n\tgvGXmrc9GZAzw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1655913066;\n\tbh=YOuvDbKfsrnP+9wTMHXarmx2Jd3+VCBdM5qUGnXxXTI=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=lfcBRwnS0uQYlZedPP8FphyPO5LKhBTzwrtWNO6LWldzmioyDgJ63hOmCYrIz/NgO\n\tzN1E9quSZqPCF70X1X5T5pRyDBSEytpe9rMM2nNtYAQOOq3Jto3Ub/wdVmvHTOpaSi\n\t1bt0+vqMld11xJnuMFbx3vq1irEKw45hDoZnDF24="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"lfcBRwnS\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20220622131638.79122-3-utkarsh02t@gmail.com>","References":"<20220622131638.79122-1-utkarsh02t@gmail.com>\n\t<20220622131638.79122-3-utkarsh02t@gmail.com>","To":"Utkarsh Tiwari <utkarsh02t@gmail.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Wed, 22 Jun 2022 16:51:03 +0100","Message-ID":"<165591306346.18145.4530900849029862643@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2 2/3] qcam: Add a GUI way to use\n\tcapture script","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":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23531,"web_url":"https://patchwork.libcamera.org/comment/23531/","msgid":"<165591523067.18145.16332239839157444624@Monstersaurus>","date":"2022-06-22T16:27:10","subject":"Re: [libcamera-devel] [PATCH v2 2/3] qcam: Add a GUI way to use\n\tcapture script","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Kieran Bingham (2022-06-22 16:51:03)\n> Hi Utkarsh,\n> \n> Quoting Utkarsh Tiwari via libcamera-devel (2022-06-22 14:16:37)\n> > Implement an Open Capture Script button which would allow the user\n> > to open a Capture Script (*.yaml).\n> > This button has two states Open and Stop.\n> > \n> > Open state allows user to load a capture script.\n> > When clicked in open state present them with a QFileDialog\n> > to allow user to select a single file.\n> > \n> > Stop state stops the execution of the current capture script.\n> > \n> > Introduce a queueCount_ to keep track of the requests queued.\n> > \n> > When stopping the execution no count is reset and the\n> > capture continues as it is, this would allow better testing\n> > as we can stop in between script and observe.\n> \n> I think it sounds like the right thing to do, but I'm not sure it makes\n> a difference to testing. \n> \n> > \n> > Initialize a Script Parser instance when the user selects\n> > a valid capture script.\n> > \n> > At queueRequest() time if script parser has been initialized,\n> > then populate the Request::controls() with it at\n> > queueRequest time providing the queueCount_.\n> > \n> > The queueCount_ is incremented after the getting controls from\n> > the parser, so the first request is for frame 0.\n> \n> I think the 'useful' information here is that the request is queued with\n> any controls that are defined in the script matching the current\n> queueCount_.\n> \n> > \n> > Signed-off-by: Utkarsh Tiwari <utkarsh02t@gmail.com>\n> > ---\n> >  src/qcam/assets/feathericons/feathericons.qrc |  2 +\n> >  src/qcam/main_window.cpp                      | 61 +++++++++++++++++++\n> >  src/qcam/main_window.h                        |  7 +++\n> >  src/qcam/meson.build                          |  2 +\n> >  4 files changed, 72 insertions(+)\n> > \n> > diff --git a/src/qcam/assets/feathericons/feathericons.qrc b/src/qcam/assets/feathericons/feathericons.qrc\n> > index c5302040..6b08395a 100644\n> > --- a/src/qcam/assets/feathericons/feathericons.qrc\n> > +++ b/src/qcam/assets/feathericons/feathericons.qrc\n> > @@ -3,9 +3,11 @@\n> >  <qresource>\n> >         <file>aperture.svg</file>\n> >         <file>camera-off.svg</file>\n> > +       <file>file.svg</file>\n> >         <file>play-circle.svg</file>\n> >         <file>save.svg</file>\n> >         <file>stop-circle.svg</file>\n> >         <file>x-circle.svg</file>\n> > +       <file>x-square.svg</file>\n> >  </qresource>\n> >  </RCC>\n> > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> > index adeb3181..29da3947 100644\n> > --- a/src/qcam/main_window.cpp\n> > +++ b/src/qcam/main_window.cpp\n> > @@ -20,6 +20,7 @@\n> >  #include <QImage>\n> >  #include <QImageWriter>\n> >  #include <QInputDialog>\n> > +#include <QMessageBox>\n> >  #include <QMutexLocker>\n> >  #include <QStandardPaths>\n> >  #include <QStringList>\n> > @@ -232,6 +233,13 @@ int MainWindow::createToolbars()\n> >         saveRaw_ = action;\n> >  #endif\n> >  \n> > +       /* Open Script... action. */\n> > +       action = toolbar_->addAction(QIcon::fromTheme(\"document-open\",\n> > +                                                     QIcon(\":file.svg\")),\n> > +                                    \"Open Capture Script\");\n> > +       connect(action, &QAction::triggered, this, &MainWindow::chooseScript);\n> > +       scriptExecAction_ = action;\n> > +\n> >         return 0;\n> >  }\n> >  \n> > @@ -255,6 +263,53 @@ void MainWindow::updateTitle()\n> >         setWindowTitle(title_ + \" : \" + QString::number(fps, 'f', 2) + \" fps\");\n> >  }\n> >  \n> > +/**\n> > + * \\brief Load a capture script for handling the capture session.\n> > + *\n> > + * If already capturing, it would restart the capture.\n> > + */\n> > +void MainWindow::chooseScript()\n> > +{\n> > +       if (isScriptExecuting_) {\n> \n> How about just checking if (script_) rather than adding a new\n> isScriptExecuting flag?\n> \n> I think it conveys the same state?\n> \n> > +               /*\n> > +                * This is the second valid press of load script button,\n> > +                * It indicates stopping, Stop and set button for new script\n> > +                */\n> > +               script_.reset();\n> > +               scriptExecAction_->setIcon(QIcon::fromTheme(\"document-open\",\n> > +                                                           QIcon(\":file.svg\")));\n> > +               scriptExecAction_->setText(\"Open Capture Script\");\n> > +               isScriptExecuting_ = false;\n> > +               return;\n> > +       }\n> > +\n> > +       QString scriptFile = QFileDialog::getOpenFileName(this, \"Open Capture Script\", QDir::currentPath(),\n> > +                                                         \"Capture Script (*.yaml)\");\n> > +       if (scriptFile.isEmpty())\n> > +               return;\n> \n> New line here I think. It hides the 'return' otherwise.\n> \n> \n> \n> \n> > +       script_ = std::make_unique<CaptureScript>(camera_, scriptFile.toStdString());\n> > +       if (!script_->valid()) {\n> > +               script_.reset();\n> > +               QMessageBox::critical(this, \"Invalid Script\",\n> > +                                             \"Couldn't load the capture script\");\n> > +               return;\n> > +       }\n> > +\n> > +       /*\n> > +        * Valid script verified\n> > +        * Set the button to indicate stopping availibility\n> > +        */\n> > +       scriptExecAction_->setIcon(QIcon(\":x-square.svg\"));\n> > +       scriptExecAction_->setText(\"Stop Script execution\");\n> > +       isScriptExecuting_ = true;\n> > +\n> > +       /* Restart the capture so we can reset every counter */\n> > +       if (isCapturing_) {\n> > +               toggleCapture(false);\n> > +               toggleCapture(true);\n> > +       }\n\nHowever if you do use script_ for your state, you still need to make\nsure you're not racing with the queue requests here.\n\nBetter to stop the capture if isCapturing_ is set, then assign script_\nand then restart.\n\nI would still keep the loading of the script where it is though and\nassign it to a local variable to validate, before assigning to script_\nas the last thing before toggleCapture().\n\n\n\n> > +}\n> > +\n> >  /* -----------------------------------------------------------------------------\n> >   * Camera Selection\n> >   */\n> > @@ -510,6 +565,7 @@ int MainWindow::startCapture()\n> >         previousFrames_ = 0;\n> >         framesCaptured_ = 0;\n> >         lastBufferTime_ = 0;\n> > +       queueCount_ = 0;\n> >  \n> >         ret = camera_->start();\n> >         if (ret) {\n> > @@ -789,5 +845,10 @@ void MainWindow::renderComplete(FrameBuffer *buffer)\n> >  \n> >  int MainWindow::queueRequest(Request *request)\n> >  {\n> > +       if (script_)\n> > +               request->controls() = script_->frameControls(queueCount_);\n> > +\n> > +       queueCount_++;\n> > +\n> >         return camera_->queueRequest(request);\n> >  }\n> > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> > index c3e4b665..58df4e15 100644\n> > --- a/src/qcam/main_window.h\n> > +++ b/src/qcam/main_window.h\n> > @@ -26,6 +26,7 @@\n> >  #include <libcamera/request.h>\n> >  #include <libcamera/stream.h>\n> >  \n> > +#include \"../cam/capture_script.h\"\n> >  #include \"../cam/stream_options.h\"\n> >  #include \"viewfinder.h\"\n> >  \n> > @@ -86,11 +87,14 @@ private:\n> >         void processHotplug(HotplugEvent *e);\n> >         void processViewfinder(libcamera::FrameBuffer *buffer);\n> >  \n> > +       void chooseScript();\n> > +\n> >         /* UI elements */\n> >         QToolBar *toolbar_;\n> >         QAction *startStopAction_;\n> >         QComboBox *cameraCombo_;\n> >         QAction *saveRaw_;\n> > +       QAction *scriptExecAction_;\n> >         ViewFinder *viewfinder_;\n> >  \n> >         QIcon iconPlay_;\n> > @@ -112,6 +116,7 @@ private:\n> >  \n> >         /* Capture state, buffers queue and statistics */\n> >         bool isCapturing_;\n> > +       bool isScriptExecuting_;\n> >         bool captureRaw_;\n> >         libcamera::Stream *vfStream_;\n> >         libcamera::Stream *rawStream_;\n> > @@ -124,6 +129,8 @@ private:\n> >         QElapsedTimer frameRateInterval_;\n> >         uint32_t previousFrames_;\n> >         uint32_t framesCaptured_;\n> > +       uint32_t queueCount_;\n> >  \n> >         std::vector<std::unique_ptr<libcamera::Request>> requests_;\n> > +       std::unique_ptr<CaptureScript> script_;\n> >  };\n> > diff --git a/src/qcam/meson.build b/src/qcam/meson.build\n> > index c46f4631..67074252 100644\n> > --- a/src/qcam/meson.build\n> > +++ b/src/qcam/meson.build\n> > @@ -15,6 +15,7 @@ endif\n> >  qcam_enabled = true\n> >  \n> >  qcam_sources = files([\n> > +    '../cam/capture_script.cpp',\n> >      '../cam/image.cpp',\n> >      '../cam/options.cpp',\n> >      '../cam/stream_options.cpp',\n> > @@ -37,6 +38,7 @@ qcam_resources = files([\n> >  qcam_deps = [\n> >      libatomic,\n> >      libcamera_public,\n> > +    libyaml,\n> >      qt5_dep,\n> >  ]\n> >  \n> > -- \n> > 2.25.1\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 52E98BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Jun 2022 16:27:16 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 93D2265635;\n\tWed, 22 Jun 2022 18:27:15 +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 9F67361FB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Jun 2022 18:27:13 +0200 (CEST)","from pendragon.ideasonboard.com\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 1CD7DDD;\n\tWed, 22 Jun 2022 18:27:13 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655915235;\n\tbh=XSgZrbhwWJI4iickIBb/s4G39asve5HCV7aBGJQU66A=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=qrAMrq3PH2l6vFloWz+Tfy45JCmCiEvbQq8sNDTVgwEygv+pkYJyj9zxmtdSBjygB\n\t12u2xIXSt/D78/07oFbv9RO13kDeMDSEpLyBhdK9K8pIHMZ4UFej8CzdgM6duY/gyz\n\t/EwbhVFTEBG+neCU69aaWc/ToceTbGo/eD1K6HXxxV92YnkqFIgn0c5eHHo8m3asu/\n\tNUGaoGrUyPqUGKwEHZfgpTWVEG0/FZjTvf9zLB7m43iJtyZ7/NWfx0BWoyC42UAXSq\n\ta+JCI0Vnrw65IBoWOrf22nCpM6GKKKREBC+bl6QTnrbTNGe8Xp+5BwKDLupBBSZliP\n\tIKQcKYyGByraw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1655915233;\n\tbh=XSgZrbhwWJI4iickIBb/s4G39asve5HCV7aBGJQU66A=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=YP4ZXgnrsT7y/W9nFLuDv1x46xf8nr/+ZHzEQECGPnao0w65UMD81AA33QauZl4uV\n\tooZK20hCqvK7Zgxwm/YCjIdqAmkDRVqMcT6myyu/HpP6ATqSjGbwhAKkVULb9lhUHr\n\tZx9FV9/oXJIUpIxvyixN814LGz5c1TvEzp4HM/2k="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"YP4ZXgnr\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<165591306346.18145.4530900849029862643@Monstersaurus>","References":"<20220622131638.79122-1-utkarsh02t@gmail.com>\n\t<20220622131638.79122-3-utkarsh02t@gmail.com>\n\t<165591306346.18145.4530900849029862643@Monstersaurus>","To":"Utkarsh Tiwari <utkarsh02t@gmail.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Wed, 22 Jun 2022 17:27:10 +0100","Message-ID":"<165591523067.18145.16332239839157444624@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2 2/3] qcam: Add a GUI way to use\n\tcapture script","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":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]