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,
const StreamConfiguration &config,
const ControlList &metadata,
const FrameBuffer *buffer, const void *data)
{
const auto it = formatInfo.find(config.pixelFormat);

View file

@ -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);
};

View file

@ -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)

View file

@ -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_;