[libcamera-devel] [PATCH v5 3/3] qcam: Add --script to load capture script
Utkarsh Tiwari
utkarsh02t at gmail.com
Thu Jul 28 15:58:59 CEST 2022
Hi Laurent, thanks for the review
On Wed, Jul 27, 2022 at 01:23:43AM +0300, Laurent Pinchart wrote:
> Hi Utkarsh,
>
> Thank you for the patch.
>
> On Wed, Jul 27, 2022 at 01:11:23AM +0530, Utkarsh Tiwari via libcamera-devel wrote:
> > Add --script as an individual option to load capture scripts.
> > Load the capture script before starting the capture.
> >
> > If an invalid capture script has been given, display a QMessageBox and
> > print it on the console informing that the script is invalid. Do not
> > start the capture.
> >
> > Signed-off-by: Utkarsh Tiwari <utkarsh02t at gmail.com>
> > Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > ---
> > Changes from v4
> > - Now when we have an invalid script we quit and don't start the
> > capture.
> > src/qcam/main.cpp | 3 +++
> > src/qcam/main_window.cpp | 20 ++++++++++++++++++++
> > src/qcam/main_window.h | 1 +
> > 3 files changed, 24 insertions(+)
> >
> > diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
> > index d3f01a85..91166be5 100644
> > --- a/src/qcam/main.cpp
> > +++ b/src/qcam/main.cpp
> > @@ -43,6 +43,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[])
> > "Set configuration of a camera stream", "stream", true);
> > parser.addOption(OptVerbose, OptionNone,
> > "Print verbose log messages", "verbose");
> > + parser.addOption(OptCaptureScript, OptionString,
> > + "Load a capture session configuration script from a file",
> > + "script", ArgumentRequired, "script");
> >
> > OptionsParser::Options options = parser.parse(argc, argv);
> > if (options.isSet(OptHelp))
> > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> > index 9dc96fbb..7b2bc84b 100644
> > --- a/src/qcam/main_window.cpp
> > +++ b/src/qcam/main_window.cpp
> > @@ -152,6 +152,26 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
>
> The comment a few lines above should be changed to
>
> /* Open the camera. */
>
> > return;
> > }
> >
>
> And here,
>
> /* Open and load the capture script if specified on the command line. */
>
Noted.
> > + if (options_.isSet(OptCaptureScript)) {
> > + std::string scriptName = options_[OptCaptureScript].toString();
> > + script_ = std::make_unique<CaptureScript>(camera_, scriptName);
>
> There's one issue here. You create the capture script for the currently
> selected camera, which is fine, but only until a different camera is
> selected. Then the capture script won't match anymore. We could then
> reset the capture script, but what should we do if the user select the
> previous camera again ? The behaviour seems confusing to me. I wonder if
> a better user experience could be achieved, maybe by redesigning the
> camera selection UI to tie it with capture script selection.
>
> Good UI design is difficult :-S
Ah, the camera switch case slipped my mind. I'm currently working on a camera
selection UI, which would replace the current combobox on the toolbar with a
button. This button would open us a dialog which contains the camera selection
combobox and few other things like the model and the location of the camera.
I think this is the pefect place to place the Capture script and also avoid
the whole icon mess.
>
> > + if (!script_->valid()) {
> > + QMessageBox::critical(this, "Invalid Script",
> > + "Couldn't load the capture script");
>
> I'd skip the message box. If the command line argument is wrong, a
> message on the console should be enough.
I think the behaviour of selecting invalid scripts should be the same
across methods to access the CaptureScript.
>
> > + qInfo() << "Invalid Capture Script";
>
> You can make that a qError().
Noted.
>
> > +
> > + script_.reset();
>
> That's probably not needed given that you quit() right after.
Noted.
>
> > +
> > + /* Do not start capture if invalid script. */
> > + quit();
> > + return;
> > + }
> > +
> > + /* Show stopping availability. */
> > + scriptExecAction_->setIcon(QIcon(":x-square.svg"));
> > + scriptExecAction_->setText("Stop Script execution");
>
> It would be nice if we could centralize the logic that handles the
> button state (and possible the construction of the CaptureScript
> object). I'm not sure if there's an easy way to do so that will result
> in more readable code.
I have a patch on the mailing list which centralizes the button states, and
also the script resetting. I think I would merge it with this patch series.
>
> > + }
> > +
>
> Finally,
>
> /* Start the camera. */
>
Noted.
> > startStopAction_->setChecked(true);
> > }
> >
> > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> > index eb398c1d..59e50b5e 100644
> > --- a/src/qcam/main_window.h
> > +++ b/src/qcam/main_window.h
> > @@ -43,6 +43,7 @@ enum {
> > OptRenderer = 'r',
> > OptStream = 's',
> > OptVerbose = 'v',
> > + OptCaptureScript = 256,
> > };
> >
> > class MainWindow : public QMainWindow
>
> --
> Regards,
>
> Laurent Pinchart
More information about the libcamera-devel
mailing list