qcam: Pass request metadata to DNG writer

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>
This commit is contained in:
Laurent Pinchart 2020-05-02 21:45:21 +03:00
parent 3d42c67aab
commit 585252eae3
4 changed files with 32 additions and 11 deletions

View file

@ -101,6 +101,7 @@ static const std::map<PixelFormat, FormatInfo> formatInfo = {
int DNGWriter::write(const char *filename, const Camera *camera, int DNGWriter::write(const char *filename, const Camera *camera,
const StreamConfiguration &config, const StreamConfiguration &config,
const ControlList &metadata,
const FrameBuffer *buffer, const void *data) const FrameBuffer *buffer, const void *data)
{ {
const auto it = formatInfo.find(config.pixelFormat); const auto it = formatInfo.find(config.pixelFormat);

View file

@ -12,6 +12,7 @@
#include <libcamera/buffer.h> #include <libcamera/buffer.h>
#include <libcamera/camera.h> #include <libcamera/camera.h>
#include <libcamera/controls.h>
#include <libcamera/stream.h> #include <libcamera/stream.h>
using namespace libcamera; using namespace libcamera;
@ -21,6 +22,7 @@ class DNGWriter
public: public:
static int write(const char *filename, const Camera *camera, static int write(const char *filename, const Camera *camera,
const StreamConfiguration &config, const StreamConfiguration &config,
const ControlList &metadata,
const FrameBuffer *buffer, const void *data); const FrameBuffer *buffer, const void *data);
}; };

View file

@ -549,7 +549,7 @@ void MainWindow::captureRaw()
captureRaw_ = true; captureRaw_ = true;
} }
void MainWindow::processRaw(FrameBuffer *buffer) void MainWindow::processRaw(FrameBuffer *buffer, const ControlList &metadata)
{ {
#ifdef HAVE_DNG #ifdef HAVE_DNG
QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
@ -559,7 +559,7 @@ void MainWindow::processRaw(FrameBuffer *buffer)
if (!filename.isEmpty()) { if (!filename.isEmpty()) {
const MappedBuffer &mapped = mappedBuffers_[buffer]; const MappedBuffer &mapped = mappedBuffers_[buffer];
DNGWriter::write(filename.toStdString().c_str(), camera_.get(), DNGWriter::write(filename.toStdString().c_str(), camera_.get(),
rawStream_->configuration(), buffer, rawStream_->configuration(), metadata, buffer,
mapped.memory); mapped.memory);
} }
#endif #endif
@ -586,7 +586,7 @@ void MainWindow::requestComplete(Request *request)
*/ */
{ {
QMutexLocker locker(&mutex_); QMutexLocker locker(&mutex_);
doneQueue_.enqueue(request->buffers()); doneQueue_.enqueue({ request->buffers(), request->metadata() });
} }
QCoreApplication::postEvent(this, new CaptureEvent); QCoreApplication::postEvent(this, new CaptureEvent);
@ -599,22 +599,22 @@ void MainWindow::processCapture()
* if stopCapture() has been called while a CaptureEvent was posted but * if stopCapture() has been called while a CaptureEvent was posted but
* not processed yet. Return immediately in that case. * not processed yet. Return immediately in that case.
*/ */
std::map<Stream *, FrameBuffer *> buffers; CaptureRequest request;
{ {
QMutexLocker locker(&mutex_); QMutexLocker locker(&mutex_);
if (doneQueue_.isEmpty()) if (doneQueue_.isEmpty())
return; return;
buffers = doneQueue_.dequeue(); request = doneQueue_.dequeue();
} }
/* Process buffers. */ /* Process buffers. */
if (buffers.count(vfStream_)) if (request.buffers_.count(vfStream_))
processViewfinder(buffers[vfStream_]); processViewfinder(request.buffers_[vfStream_]);
if (buffers.count(rawStream_)) if (request.buffers_.count(rawStream_))
processRaw(buffers[rawStream_]); processRaw(request.buffers_[rawStream_], request.metadata_);
} }
void MainWindow::processViewfinder(FrameBuffer *buffer) void MainWindow::processViewfinder(FrameBuffer *buffer)

View file

@ -20,6 +20,7 @@
#include <libcamera/buffer.h> #include <libcamera/buffer.h>
#include <libcamera/camera.h> #include <libcamera/camera.h>
#include <libcamera/camera_manager.h> #include <libcamera/camera_manager.h>
#include <libcamera/controls.h>
#include <libcamera/framebuffer_allocator.h> #include <libcamera/framebuffer_allocator.h>
#include <libcamera/stream.h> #include <libcamera/stream.h>
@ -37,6 +38,23 @@ enum {
OptStream = 's', 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 class MainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
@ -56,7 +74,7 @@ private Q_SLOTS:
void saveImageAs(); void saveImageAs();
void captureRaw(); void captureRaw();
void processRaw(FrameBuffer *buffer); void processRaw(FrameBuffer *buffer, const ControlList &metadata);
void queueRequest(FrameBuffer *buffer); void queueRequest(FrameBuffer *buffer);
@ -103,7 +121,7 @@ private:
Stream *vfStream_; Stream *vfStream_;
Stream *rawStream_; Stream *rawStream_;
std::map<Stream *, QQueue<FrameBuffer *>> freeBuffers_; std::map<Stream *, QQueue<FrameBuffer *>> freeBuffers_;
QQueue<std::map<Stream *, FrameBuffer *>> doneQueue_; QQueue<CaptureRequest> doneQueue_;
QMutex mutex_; /* Protects freeBuffers_ and doneQueue_ */ QMutex mutex_; /* Protects freeBuffers_ and doneQueue_ */
uint64_t lastBufferTime_; uint64_t lastBufferTime_;