@@ -3,6 +3,7 @@
<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>
@@ -20,6 +20,7 @@
#include <QImage>
#include <QImageWriter>
#include <QInputDialog>
+#include <QMessageBox>
#include <QMutexLocker>
#include <QStandardPaths>
#include <QStringList>
@@ -232,6 +233,12 @@ 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);
+
return 0;
}
@@ -255,6 +262,31 @@ 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()
+{
+ QString scriptFile = QFileDialog::getOpenFileName(this, tr("Open Capture Script"), QDir::currentPath(),
+ tr("Capture Script (*.yaml)"));
+ if (scriptFile.isEmpty())
+ return;
+ script_ = std::make_unique<CaptureScript>(camera_, scriptFile.toStdString());
+ if (!script_->valid()) {
+ script_.reset();
+ QMessageBox::critical(this, tr("Invalid Script"), tr("Couldn't execute the capture script"));
+ return;
+ }
+
+ //Restart the capture so we can reset every counter
+ if (isCapturing_) {
+ toggleCapture(false);
+ toggleCapture(true);
+ }
+}
+
/* -----------------------------------------------------------------------------
* Camera Selection
*/
@@ -510,6 +542,7 @@ int MainWindow::startCapture()
previousFrames_ = 0;
framesCaptured_ = 0;
lastBufferTime_ = 0;
+ queueCount_ = 0;
ret = camera_->start();
if (ret) {
@@ -789,5 +822,10 @@ void MainWindow::refillRequest(FrameBuffer *buffer)
int MainWindow::queueRequest(Request *request)
{
+ if (script_)
+ request->controls() = script_->frameControls(queueCount_);
+
+ queueCount_++;
+
return camera_->queueRequest(request);
}
@@ -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,6 +87,8 @@ private:
void processHotplug(HotplugEvent *e);
void processViewfinder(libcamera::FrameBuffer *buffer);
+ void chooseScript();
+
/* UI elements */
QToolBar *toolbar_;
QAction *startStopAction_;
@@ -124,6 +127,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_;
};
@@ -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,
]
Implement an Open Capture Script button which would allow the user to open a Capture Script (*.yaml). When clicked present them with a QFileDialog to allow them to select a single file. Introduce a queueCount_ to keep track of the requests queued. Initialize a Script Parser instance when the user selects a valid capture script. At queueRequest() time if script parser has been initialized, then populate the Request::controls() with it at queueRequest time providing the queueCount_. The queueCount_ is incremented after the getting controls from the parser, so the first request is for frame 0. Signed-off-by: Utkarsh Tiwari <utkarsh02t@gmail.com> --- src/qcam/assets/feathericons/feathericons.qrc | 1 + src/qcam/main_window.cpp | 38 +++++++++++++++++++ src/qcam/main_window.h | 5 +++ src/qcam/meson.build | 2 + 4 files changed, 46 insertions(+)