summaryrefslogtreecommitdiff
path: root/src/qcam
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-03-23 01:25:20 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-03-24 10:34:02 +0200
commit275fd5bd33107a10b1e47a0d36d834b390831af0 (patch)
tree3fff6cc018c1cdc2068f6465cb422b755e2b0a60 /src/qcam
parent494da4467ddf091d457863cd363067979552d67e (diff)
qcam: viewfinder: Add MappedBuffer to store memory mapping information
The new MappedBuffer structure replaces the std::pair<> used in the mapped buffers map, and allows passing data to the ViewFinder::display() function in a more structured way. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/qcam')
-rw-r--r--src/qcam/main_window.cpp20
-rw-r--r--src/qcam/main_window.h4
-rw-r--r--src/qcam/viewfinder.cpp6
-rw-r--r--src/qcam/viewfinder.h10
4 files changed, 21 insertions, 19 deletions
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index cb8f769e..d10c542c 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -27,8 +27,6 @@
#include <libcamera/camera_manager.h>
#include <libcamera/version.h>
-#include "viewfinder.h"
-
using namespace libcamera;
/**
@@ -354,8 +352,7 @@ int MainWindow::startCapture()
const FrameBuffer::Plane &plane = buffer->planes().front();
void *memory = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
plane.fd.fd(), 0);
- mappedBuffers_[plane.fd.fd()] =
- std::make_pair(memory, plane.length);
+ mappedBuffers_[buffer.get()] = { memory, plane.length };
}
/* Start the title timer and the camera. */
@@ -395,9 +392,8 @@ error:
delete request;
for (auto &iter : mappedBuffers_) {
- void *memory = iter.second.first;
- unsigned int length = iter.second.second;
- munmap(memory, length);
+ const MappedBuffer &buffer = iter.second;
+ munmap(buffer.memory, buffer.size);
}
mappedBuffers_.clear();
@@ -425,9 +421,8 @@ void MainWindow::stopCapture()
camera_->requestCompleted.disconnect(this, &MainWindow::requestComplete);
for (auto &iter : mappedBuffers_) {
- void *memory = iter.second.first;
- unsigned int length = iter.second.second;
- munmap(memory, length);
+ const MappedBuffer &buffer = iter.second;
+ munmap(buffer.memory, buffer.size);
}
mappedBuffers_.clear();
@@ -534,10 +529,7 @@ int MainWindow::display(FrameBuffer *buffer)
if (buffer->planes().size() != 1)
return -EINVAL;
- const FrameBuffer::Plane &plane = buffer->planes().front();
- void *memory = mappedBuffers_[plane.fd.fd()].first;
- unsigned char *raw = static_cast<unsigned char *>(memory);
- viewfinder_->display(raw, buffer->metadata().planes[0].bytesused);
+ viewfinder_->display(buffer, &mappedBuffers_[buffer]);
return 0;
}
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index c662a2ef..71206bc9 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -24,11 +24,11 @@
#include <libcamera/stream.h>
#include "../cam/options.h"
+#include "viewfinder.h"
using namespace libcamera;
class QAction;
-class ViewFinder;
enum {
OptCamera = 'c',
@@ -89,7 +89,7 @@ private:
FrameBufferAllocator *allocator_;
std::unique_ptr<CameraConfiguration> config_;
- std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
+ std::map<FrameBuffer *, MappedBuffer> mappedBuffers_;
/* Capture state, buffers queue and statistics */
bool isCapturing_;
diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder.cpp
index 066ac605..d00edc33 100644
--- a/src/qcam/viewfinder.cpp
+++ b/src/qcam/viewfinder.cpp
@@ -24,7 +24,8 @@ ViewFinder::~ViewFinder()
delete image_;
}
-void ViewFinder::display(const unsigned char *raw, size_t size)
+void ViewFinder::display(const libcamera::FrameBuffer *buffer,
+ MappedBuffer *map)
{
QMutexLocker locker(&mutex_);
@@ -34,7 +35,8 @@ void ViewFinder::display(const unsigned char *raw, size_t size)
* impacting performances.
*/
- converter_.convert(raw, size, image_);
+ converter_.convert(static_cast<unsigned char *>(map->memory),
+ buffer->metadata().planes[0].bytesused, image_);
update();
}
diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h
index a019c3a4..735a6b67 100644
--- a/src/qcam/viewfinder.h
+++ b/src/qcam/viewfinder.h
@@ -7,16 +7,24 @@
#ifndef __QCAM_VIEWFINDER_H__
#define __QCAM_VIEWFINDER_H__
+#include <stddef.h>
+
#include <QMutex>
#include <QSize>
#include <QWidget>
+#include <libcamera/buffer.h>
#include <libcamera/pixelformats.h>
#include "format_converter.h"
class QImage;
+struct MappedBuffer {
+ void *memory;
+ size_t size;
+};
+
class ViewFinder : public QWidget
{
public:
@@ -24,7 +32,7 @@ public:
~ViewFinder();
int setFormat(const libcamera::PixelFormat &format, const QSize &size);
- void display(const unsigned char *rgb, size_t size);
+ void display(const libcamera::FrameBuffer *buffer, MappedBuffer *map);
QImage getCurrentImage();