From patchwork Sat May 2 22:57:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 3672 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 278BA61618 for ; Sun, 3 May 2020 00:57:11 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="I9wiytJo"; dkim-atps=neutral Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B0A1072C for ; Sun, 3 May 2020 00:57:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1588460230; bh=LFpeFFcYuEH8q6W395WuQPrsDgSAIsN2yempIkqWXeU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=I9wiytJoFI1dDayO3CaIABnXNxaPGHFqquEnvvT11f/tuYEcaCYOJ1EM2a1V0mSUw 6H/1mtALgG+2s5MSanknXc7RZAex514qwtPAlu2FKDl9a6QGaTH8sUq+z/+3QaajFY +gzIdt8SxR28aINIyaeVTJt0WJ34cIWinoRaqrks= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sun, 3 May 2020 01:57:00 +0300 Message-Id: <20200502225704.2911-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200502225704.2911-1-laurent.pinchart@ideasonboard.com> References: <20200502225704.2911-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/5] qcam: Pass request metadata to DNG writer 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-List-Received-Date: Sat, 02 May 2020 22:57:11 -0000 The DNG writer will use the metadata to populate DNG tags. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/qcam/dng_writer.cpp | 1 + src/qcam/dng_writer.h | 2 ++ src/qcam/main_window.cpp | 18 +++++++++--------- src/qcam/main_window.h | 22 ++++++++++++++++++++-- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp index 7d51965dc2ea..b1984c6647dd 100644 --- a/src/qcam/dng_writer.cpp +++ b/src/qcam/dng_writer.cpp @@ -101,6 +101,7 @@ static const std::map formatInfo = { int DNGWriter::write(const char *filename, const Camera *camera, const StreamConfiguration &config, + const ControlList &metadata, const FrameBuffer *buffer, const void *data) { const auto it = formatInfo.find(config.pixelFormat); diff --git a/src/qcam/dng_writer.h b/src/qcam/dng_writer.h index 88b218753a1a..d74d73d06a14 100644 --- a/src/qcam/dng_writer.h +++ b/src/qcam/dng_writer.h @@ -12,6 +12,7 @@ #include #include +#include #include using namespace libcamera; @@ -21,6 +22,7 @@ class DNGWriter public: static int write(const char *filename, const Camera *camera, const StreamConfiguration &config, + const ControlList &metadata, const FrameBuffer *buffer, const void *data); }; diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index 8720c6c61f40..7de089571234 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -549,7 +549,7 @@ void MainWindow::captureRaw() captureRaw_ = true; } -void MainWindow::processRaw(FrameBuffer *buffer) +void MainWindow::processRaw(FrameBuffer *buffer, const ControlList &metadata) { #ifdef HAVE_DNG QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); @@ -559,7 +559,7 @@ void MainWindow::processRaw(FrameBuffer *buffer) if (!filename.isEmpty()) { const MappedBuffer &mapped = mappedBuffers_[buffer]; DNGWriter::write(filename.toStdString().c_str(), camera_.get(), - rawStream_->configuration(), buffer, + rawStream_->configuration(), metadata, buffer, mapped.memory); } #endif @@ -586,7 +586,7 @@ void MainWindow::requestComplete(Request *request) */ { QMutexLocker locker(&mutex_); - doneQueue_.enqueue(request->buffers()); + doneQueue_.enqueue({ request->buffers(), request->metadata() }); } QCoreApplication::postEvent(this, new CaptureEvent); @@ -599,22 +599,22 @@ void MainWindow::processCapture() * if stopCapture() has been called while a CaptureEvent was posted but * not processed yet. Return immediately in that case. */ - std::map buffers; + CaptureRequest request; { QMutexLocker locker(&mutex_); if (doneQueue_.isEmpty()) return; - buffers = doneQueue_.dequeue(); + request = doneQueue_.dequeue(); } /* Process buffers. */ - if (buffers.count(vfStream_)) - processViewfinder(buffers[vfStream_]); + if (request.buffers_.count(vfStream_)) + processViewfinder(request.buffers_[vfStream_]); - if (buffers.count(rawStream_)) - processRaw(buffers[rawStream_]); + if (request.buffers_.count(rawStream_)) + processRaw(request.buffers_[rawStream_], request.metadata_); } void MainWindow::processViewfinder(FrameBuffer *buffer) diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index 295ecc537e9d..59fa2d985655 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,23 @@ enum { OptStream = 's', }; +class CaptureRequest +{ +public: + CaptureRequest() + { + } + + CaptureRequest(const std::map &buffers, + const ControlList &metadata) + : buffers_(buffers), metadata_(metadata) + { + } + + std::map buffers_; + ControlList metadata_; +}; + class MainWindow : public QMainWindow { Q_OBJECT @@ -56,7 +74,7 @@ private Q_SLOTS: void saveImageAs(); void captureRaw(); - void processRaw(FrameBuffer *buffer); + void processRaw(FrameBuffer *buffer, const ControlList &metadata); void queueRequest(FrameBuffer *buffer); @@ -103,7 +121,7 @@ private: Stream *vfStream_; Stream *rawStream_; std::map> freeBuffers_; - QQueue> doneQueue_; + QQueue doneQueue_; QMutex mutex_; /* Protects freeBuffers_ and doneQueue_ */ uint64_t lastBufferTime_;