[libcamera-devel] [PATCH v4 2/3] qcam: Add a GUI way to use capture script

Utkarsh Tiwari utkarsh02t at gmail.com
Tue Jul 26 04:20:14 CEST 2022


On Tue, 26 Jul, 2022, 00:14 Umang Jain, <umang.jain at ideasonboard.com> wrote:

> Hi Utkarsh,
>
> On 7/3/22 10:07, Utkarsh Tiwari via libcamera-devel wrote:
> > Implement an Open Capture Script button which would allow the user
> > to open a Capture Script (*.yaml).
> > This button has two states Open and Stop.
> >
> > Open state allows user to load a capture script.
> > When clicked in open state present them with a QFileDialog
> > to allow user to select a single file.
> >
> > Stop state stops the execution of the current capture script.
> >
> > Introduce a queueCount_ to keep track of the requests queued.
> >
> > When stopping the execution no count is reset and the
> > capture continues as it is.
>
>
> So there are two states of stop(s) ? One would stop the capture script
> and other one would stop the camera? Is my understanding correct?
>

No, the two states of the button are
- Open Capture Script
- Stop the current capture script

The  open state allows the user to select a capture script to execute.

The stop state is visible when the user has loaded a capture script either
through cmdline  or through the button. This state allows to stop the
current script.

Should reword the commit message ?

>
>
> >
> > Requests are queued with any controls the script matching
> > the current queueCount_
> >
> > Signed-off-by: Utkarsh Tiwari <utkarsh02t at gmail.com>
> > Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > ---
> >   src/qcam/assets/feathericons/feathericons.qrc |  2 +
> >   src/qcam/main_window.cpp                      | 68 +++++++++++++++++++
> >   src/qcam/main_window.h                        |  6 ++
> >   src/qcam/meson.build                          |  2 +
> >   4 files changed, 78 insertions(+)
> >
> > diff --git a/src/qcam/assets/feathericons/feathericons.qrc
> b/src/qcam/assets/feathericons/feathericons.qrc
> > index c5302040..6b08395a 100644
> > --- a/src/qcam/assets/feathericons/feathericons.qrc
> > +++ b/src/qcam/assets/feathericons/feathericons.qrc
> > @@ -3,9 +3,11 @@
> >   <qresource>
> >       <file>aperture.svg</file>
> >       <file>camera-off.svg</file>
> > +     <file>file.svg</file>
> >       <file>play-circle.svg</file>
> >       <file>save.svg</file>
> >       <file>stop-circle.svg</file>
> >       <file>x-circle.svg</file>
> > +     <file>x-square.svg</file>
> >   </qresource>
> >   </RCC>
> > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> > index adeb3181..4fbaeccc 100644
> > --- a/src/qcam/main_window.cpp
> > +++ b/src/qcam/main_window.cpp
> > @@ -20,6 +20,7 @@
> >   #include <QImage>
> >   #include <QImageWriter>
> >   #include <QInputDialog>
> > +#include <QMessageBox>
> >   #include <QMutexLocker>
> >   #include <QStandardPaths>
> >   #include <QStringList>
> > @@ -232,6 +233,13 @@ int MainWindow::createToolbars()
> >       saveRaw_ = action;
> >   #endif
> >
> > +     /* Open Script... action. */
> > +     action = toolbar_->addAction(QIcon::fromTheme("document-open",
> > +                                                   QIcon(":file.svg")),
> > +                                  "Open Capture Script");
> > +     connect(action, &QAction::triggered, this,
> &MainWindow::chooseScript);
> > +     scriptExecAction_ = action;
> > +
> >       return 0;
> >   }
> >
> > @@ -255,6 +263,60 @@ void MainWindow::updateTitle()
> >       setWindowTitle(title_ + " : " + QString::number(fps, 'f', 2) + "
> fps");
> >   }
> >
> > +/**
> > + * \brief Load a capture script for handling the capture session.
> > + *
> > + * If already capturing, it would restart the capture.
> > + */
> > +void MainWindow::chooseScript()
> > +{
> > +     if (script_) {
> > +             /*
> > +              * This is the second valid press of load script button,
> > +              * It indicates stopping, Stop and set button for new
> script.
> > +              */
> > +             script_.reset();
> > +
>  scriptExecAction_->setIcon(QIcon::fromTheme("document-open",
> > +
>  QIcon(":file.svg")));
> > +             scriptExecAction_->setText("Open Capture Script");
> > +             return;
> > +     }
> > +
> > +     QString scriptFile = QFileDialog::getOpenFileName(this, "Open
> Capture Script", QDir::currentPath(),
> > +                                                       "Capture Script
> (*.yaml)");
> > +     if (scriptFile.isEmpty())
> > +             return;
> > +
> > +     /*
> > +      * If we are already capturing,
> > +      * stop so we don't have stuck image in viewfinder.
> > +      */
> > +     bool wasCapturing = isCapturing_;
> > +     if (isCapturing_)
> > +             toggleCapture(false);
> > +
> > +     script_ = std::make_unique<CaptureScript>(camera_,
> scriptFile.toStdString());
> > +     if (!script_->valid()) {
> > +             script_.reset();
> > +             QMessageBox::critical(this, "Invalid Script",
> > +                                           "Couldn't load the capture
> script");
> > +             if (wasCapturing)
> > +                     toggleCapture(true);
> > +             return;
> > +     }
> > +
> > +     /*
> > +      * Valid script verified
> > +      * Set the button to indicate stopping availibility.
> > +      */
> > +     scriptExecAction_->setIcon(QIcon(":x-square.svg"));
> > +     scriptExecAction_->setText("Stop Script execution");
> > +
> > +     /* Start capture again if we were capturing before. */
> > +     if (wasCapturing)
> > +             toggleCapture(true);
> > +}
> > +
> >   /*
> -----------------------------------------------------------------------------
> >    * Camera Selection
> >    */
> > @@ -510,6 +572,7 @@ int MainWindow::startCapture()
> >       previousFrames_ = 0;
> >       framesCaptured_ = 0;
> >       lastBufferTime_ = 0;
> > +     queueCount_ = 0;
> >
> >       ret = camera_->start();
> >       if (ret) {
> > @@ -789,5 +852,10 @@ void MainWindow::renderComplete(FrameBuffer *buffer)
> >
> >   int MainWindow::queueRequest(Request *request)
> >   {
> > +     if (script_)
> > +             request->controls() = script_->frameControls(queueCount_);
> > +
> > +     queueCount_++;
> > +
> >       return camera_->queueRequest(request);
> >   }
> > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> > index c3e4b665..2cdf7169 100644
> > --- a/src/qcam/main_window.h
> > +++ b/src/qcam/main_window.h
> > @@ -26,6 +26,7 @@
> >   #include <libcamera/request.h>
> >   #include <libcamera/stream.h>
> >
> > +#include "../cam/capture_script.h"
> >   #include "../cam/stream_options.h"
> >   #include "viewfinder.h"
> >
> > @@ -86,11 +87,14 @@ private:
> >       void processHotplug(HotplugEvent *e);
> >       void processViewfinder(libcamera::FrameBuffer *buffer);
> >
> > +     void chooseScript();
> > +
> >       /* UI elements */
> >       QToolBar *toolbar_;
> >       QAction *startStopAction_;
> >       QComboBox *cameraCombo_;
> >       QAction *saveRaw_;
> > +     QAction *scriptExecAction_;
> >       ViewFinder *viewfinder_;
> >
> >       QIcon iconPlay_;
> > @@ -124,6 +128,8 @@ private:
> >       QElapsedTimer frameRateInterval_;
> >       uint32_t previousFrames_;
> >       uint32_t framesCaptured_;
> > +     uint32_t queueCount_;
> >
> >       std::vector<std::unique_ptr<libcamera::Request>> requests_;
> > +     std::unique_ptr<CaptureScript> script_;
> >   };
> > diff --git a/src/qcam/meson.build b/src/qcam/meson.build
> > index c46f4631..67074252 100644
> > --- a/src/qcam/meson.build
> > +++ b/src/qcam/meson.build
> > @@ -15,6 +15,7 @@ endif
> >   qcam_enabled = true
> >
> >   qcam_sources = files([
> > +    '../cam/capture_script.cpp',
> >       '../cam/image.cpp',
> >       '../cam/options.cpp',
> >       '../cam/stream_options.cpp',
> > @@ -37,6 +38,7 @@ qcam_resources = files([
> >   qcam_deps = [
> >       libatomic,
> >       libcamera_public,
> > +    libyaml,
> >       qt5_dep,
> >   ]
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20220726/02d3fd72/attachment.htm>


More information about the libcamera-devel mailing list