Message ID | 20200502225704.2911-2-laurent.pinchart@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@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@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
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_;
The DNG writer will use the metadata to populate DNG tags. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- 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(-)