From patchwork Mon Jun 27 03:01:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Utkarsh Tiwari X-Patchwork-Id: 16373 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id DFE38BD808 for ; Mon, 27 Jun 2022 03:02:16 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A01F26563B; Mon, 27 Jun 2022 05:02:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1656298936; bh=kchz076yAq7g5k6a5eerV9zYjh5cFKK+MXG5bltsbew=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=UuaY2fWL0D7eXWwJ5MK3DqsJOozLhiILt/i3fTQupzxKyriVrj9vQKmSfq6pk0d84 4MzqmrwpJQ7UxO78r36PenU/JU+GLxYPf8e+DltuE3rpDIfWIc+PgJp1nKQf8B4erX XSHeA7PovUZPTlEAiEHiJc5gug9pVIJdYsPf0q68JYuJsxrH4rXAkXlJ3CWbzXN4EZ CqU1hzJz+S2GsoVBRl1weSZ1t8Wza/fEuUHn89ukAOmT7l7ARAbCCvJ+zotNBQQxIY jl+pn/G4dbmIEF1+VAY6HjXSiUFPJ9mzV8otLu13f7FP1ikRMtcb/PJRla68SgMMRX deAtyVHamogsQ== Received: from mail-pf1-x434.google.com (mail-pf1-x434.google.com [IPv6:2607:f8b0:4864:20::434]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AFD3B65633 for ; Mon, 27 Jun 2022 05:02:14 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="CsFcpyPb"; dkim-atps=neutral Received: by mail-pf1-x434.google.com with SMTP id w6so7720528pfw.5 for ; Sun, 26 Jun 2022 20:02:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GNK6U/WvuXK4SXU0wPhP4gevq0vBN26GKYSlu4X1K6s=; b=CsFcpyPbM1eHK7r5RZr32Tpc58+2NMzXrMc3WD7g6q2Rd3EuG9FmFBJZhGN4ZuAW28 78joMi3eZi63n0uo1IJUMPTuX4xL6DOy9Xwp4swuKABrH/ajF43Jd5svceru784Aszv5 NubpSxOSW7IHNMkfV88rZ9k4OeFJ4CpmOjlhVhFyIKaYy2YJP2jgCEl5lpGdqHMqmQgP pgiA/cEOSH1IIhziQ4UCb31QdPccAieTrAWgTIUZ2v/HWjaMjE6ir0edNLPUg6u0KjOt KyO1SWyvuL97sRwn9Hee4z/7ziZcj80S0XwYWCUHR+NjK6X3YycncjzTjY51BCX3Rnhs FJ5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GNK6U/WvuXK4SXU0wPhP4gevq0vBN26GKYSlu4X1K6s=; b=zh2MjFjqgpOn+opgJCkkjyj11Tee9SwaDWVKcVzLG6POF6Xuabtx36oKYsAFF0105Y UAjW9c9yvBievrGYzAD7ATIWXDGuIJXKHaxpjaUxWd+YVqUns77rIgWKj6V6+y716Meu tkXRAdLFsmO4UaoPIi/tvQDx28RKYXxZzvDmWesAoODazrLTtI0D7XkYltJs70TK6p3i tiMc5yKtkMAm5Wopt7tpr0b2muhN4pVnONEVdUzdJZC2x518f9rKvtvRbBca0vxfPhAp I2IIWHPLLQOu87+4j7HmJV9T8vSXa14QfH6k1olf9ddZiZU1hyfljU0C+FxFcEvrKjbG KGbQ== X-Gm-Message-State: AJIora+7KmxMxo4wufsqI+DrGhzC3XJ+eGSPfI1nYpUYEHKjZBeGCNoU 3ZBf5mrLNMLv2QjbonbKHjjVkZIU8bbsHA== X-Google-Smtp-Source: AGRyM1sHQNuYCrNGpUTVljd67vJymso+VPaR4J0FHDQ8FbLTWDBsdByxz3rjVx8ljRq2ZKX8OZbJZA== X-Received: by 2002:a05:6a00:ad2:b0:4f1:2734:a3d9 with SMTP id c18-20020a056a000ad200b004f12734a3d9mr12259241pfl.61.1656298932972; Sun, 26 Jun 2022 20:02:12 -0700 (PDT) Received: from localhost.localdomain ([2406:3003:2005:1c27:cf57:31af:7925:f9e6]) by smtp.gmail.com with ESMTPSA id s7-20020aa78d47000000b0051bba89c2bcsm5899378pfe.58.2022.06.26.20.02.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Jun 2022 20:02:11 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Mon, 27 Jun 2022 11:01:58 +0800 Message-Id: <20220627030159.30730-3-utkarsh02t@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220627030159.30730-1-utkarsh02t@gmail.com> References: <20220627030159.30730-1-utkarsh02t@gmail.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 2/3] qcam: Add a GUI way to use capture script X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Utkarsh Tiwari via libcamera-devel From: Utkarsh Tiwari Reply-To: Utkarsh Tiwari Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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. Requests are queued with any controls the script matching the current queueCount_ Signed-off-by: Utkarsh Tiwari Reviewed-by: Kieran Bingham --- src/qcam/assets/feathericons/feathericons.qrc | 2 + src/qcam/main_window.cpp | 66 +++++++++++++++++++ src/qcam/main_window.h | 6 ++ src/qcam/meson.build | 2 + 4 files changed, 76 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 @@ aperture.svg camera-off.svg + file.svg play-circle.svg save.svg stop-circle.svg x-circle.svg + x-square.svg diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index adeb3181..e133b618 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -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,58 @@ 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(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 +570,7 @@ int MainWindow::startCapture() previousFrames_ = 0; framesCaptured_ = 0; lastBufferTime_ = 0; + queueCount_ = 0; ret = camera_->start(); if (ret) { @@ -789,5 +850,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 #include +#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> requests_; + std::unique_ptr 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, ]