From patchwork Tue Jul 26 19:41:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Utkarsh Tiwari X-Patchwork-Id: 16810 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 B17BEC3275 for ; Tue, 26 Jul 2022 19:41:49 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6953463315; Tue, 26 Jul 2022 21:41:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1658864509; bh=B/wjX/CiabQtTbA2lH4jK0Q9SRy7gRPZ7b6EznReXrk=; 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=xd8v+ujh9TM6yU0PtHUMXuGRTOEYJZOB441uHRtqkkbiHfgothWjOKdNx1/+EeTJe TAb23YTAKgX7asvD/rG8MohjGb6wIWgSt+OcNgrxWYZr/sYAayPtAQhINpuV6cmGko C8WPFDpnK1MeB4EXAcxmqghAtVpCNpf78ydbN4zKY4ZhtRh7+051yEuhm2VDFa0hbj pLx/xqZMZfTop+h0qEZHYWE7VxUBuc+N+A+Ml5x1pPfAZqzt8K3w8KJuAkG4K2vazz vLZqYvljetUin2JJGmUV1YohURiyu4Z4HTrHlreVizxRr0nI33HPNbHZOd9uvSCd4Q aRLFkgf6ZgVcA== Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 46FB160487 for ; Tue, 26 Jul 2022 21:41:48 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="kqMS5IfU"; dkim-atps=neutral Received: by mail-pj1-x102f.google.com with SMTP id b10so14349302pjq.5 for ; Tue, 26 Jul 2022 12:41:48 -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=3ngs0oX40Iiqxk9DsOXNqG4eDRWgWD07yRSe0zd2ziA=; b=kqMS5IfUiQb5QQfvojsH1gkpqQ7529LNBbfH/8Zi8+twwTIqmkGMBPdAQS3qFC0aaI CQvTOwu+al9xeXV6ibqZAerKJ8kbm/02ctOhYSYqKCwXErxG/PZP0nIWuKSlzdVp9XDv 579dLGvNORPhndz/i8fD+Ilgrz89VtHVYBnVMjt71Ou1p4XdYDsB6tQw1L+VENk6z2z2 c85n3Kr80ToWEi+IBFitHdMGYUlEfg73YJbwRWVEa4kFdwYhYH+MKTuB5uCveHsrcHEt o034jhwWrkWcEQ0yyMylkcnf1m2p34wAVeV1OAKfI9lr+0igmJ8DKfku6fWIfrK6XwGf CKcw== 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=3ngs0oX40Iiqxk9DsOXNqG4eDRWgWD07yRSe0zd2ziA=; b=5F0LemjGtS+HfgO9C2z+2TriwEXq5K9bWCkUKUAwiWoBbBdLddQDxkPZg5LVcVpa5S brPBAgtauZdp/n36Xmy5vpuuQG0HtfCO4VCY3yr4j9zAYtsv4dpHvuNiwFnfTt4mU/S6 qeDDR2NvoydeSK1t7skB0e6xFVdwmMMv9oTfV/Tu0dRAlw6s4VGrMGGC39Iqkg7y5sa/ vIOWrOVjRjGKDNgxgcAmzoislhsLlkKQqsi4edEkwWcWEjxzV+k3KKdMlrBevEWB75V+ tceFOusoZADkdcJF9rl5vyHn+AxeZTpjBZMF233uXA7szcwO2nbCkoTSWd8PUy1+Ra3c Kvvw== X-Gm-Message-State: AJIora+Br/PRwSPjlAWkgIuKarRJ0yc6HxlacuB5B02zjJdUwIPBhw6t VSZBPXChQkVop1j5NLo0jL6WE1F0AZI= X-Google-Smtp-Source: AGRyM1vHOkfj+GCNuOneR0RTk3WTYZME4YN5rbG6aXfVEYm3dT1rfEXO/mqMDMaJfKtdU14Td20eKw== X-Received: by 2002:a17:903:32c6:b0:16d:328f:898d with SMTP id i6-20020a17090332c600b0016d328f898dmr17828612plr.143.1658864506585; Tue, 26 Jul 2022 12:41:46 -0700 (PDT) Received: from localhost.localdomain ([2404:bd00:3:d6bf:24ea:3f52:4c78:7bd8]) by smtp.gmail.com with ESMTPSA id a5-20020aa794a5000000b0052ac1af926fsm12017782pfl.20.2022.07.26.12.41.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 12:41:46 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Wed, 27 Jul 2022 01:11:22 +0530 Message-Id: <20220726194123.170208-2-utkarsh02t@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220726194123.170208-1-utkarsh02t@gmail.com> References: <20220726194123.170208-1-utkarsh02t@gmail.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v5 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 Capture Script - Stop the execution of current capture script When being clicked in open state, present them with a QFileDialog to allow user to select a single file. Introduce a queueCount_ to keep track of the requests queued. When stopping the execution of the capture script the queueCount_ is not reseted and the capture is continues as it is (i.e it is not stopped or restarted). Requests are queued with any controls the script matching the current queueCount_. Signed-off-by: Utkarsh Tiwari Reviewed-by: Kieran Bingham --- Changes from v4 - Reworded the commit message to clarify button states and queueCount_ reseting. 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 @@ 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 4e773c31..9dc96fbb 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -233,6 +234,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; } @@ -256,6 +264,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(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 */ @@ -511,6 +573,7 @@ int MainWindow::startCapture() previousFrames_ = 0; framesCaptured_ = 0; lastBufferTime_ = 0; + queueCount_ = 0; ret = camera_->start(); if (ret) { @@ -790,5 +853,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 bc844711..eb398c1d 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" @@ -87,11 +88,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_; @@ -125,6 +129,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, ]