mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-21 15:53:54 +03:00
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:
parent
3d42c67aab
commit
585252eae3
4 changed files with 32 additions and 11 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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_;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue