[libcamera-devel] [PATCH 1/5] qcam: Pass request metadata to DNG writer
Niklas Söderlund
niklas.soderlund at ragnatech.se
Sun May 3 02:50:07 CEST 2020
Hi Laurent,
Thanks for your work.
On 2020-05-03 01:57:00 +0300, Laurent Pinchart wrote:
> The DNG writer will use the metadata to populate DNG tags.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> 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<PixelFormat, FormatInfo> 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 <libcamera/buffer.h>
> #include <libcamera/camera.h>
> +#include <libcamera/controls.h>
> #include <libcamera/stream.h>
>
> 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<Stream *, FrameBuffer *> 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 <libcamera/buffer.h>
> #include <libcamera/camera.h>
> #include <libcamera/camera_manager.h>
> +#include <libcamera/controls.h>
> #include <libcamera/framebuffer_allocator.h>
> #include <libcamera/stream.h>
>
> @@ -37,6 +38,23 @@ enum {
> OptStream = 's',
> };
>
> +class CaptureRequest
> +{
> +public:
> + CaptureRequest()
> + {
> + }
> +
> + CaptureRequest(const std::map<Stream *, FrameBuffer *> &buffers,
> + const ControlList &metadata)
> + : buffers_(buffers), metadata_(metadata)
> + {
> + }
> +
> + std::map<Stream *, FrameBuffer *> 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<Stream *, QQueue<FrameBuffer *>> freeBuffers_;
> - QQueue<std::map<Stream *, FrameBuffer *>> doneQueue_;
> + QQueue<CaptureRequest> doneQueue_;
> QMutex mutex_; /* Protects freeBuffers_ and doneQueue_ */
>
> uint64_t lastBufferTime_;
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list