summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>2022-05-30 17:27:16 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-06-01 12:09:10 +0300
commitdfcf638a0a6d26dbfab5348e646e5cb3c45ec51e (patch)
tree48c8cf3bc670bc3126a16c1045ce1f96da5cef38
parent958d9187aaac2cc0df95adabb7bac81ccd5107ff (diff)
py: cam: cam_qt: mmap the fbs only once
Instead of doing an mmap and munmap every time a Request is complete, mmap all the buffers once at the start of the program. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/py/cam/cam_qt.py39
1 files changed, 25 insertions, 14 deletions
diff --git a/src/py/cam/cam_qt.py b/src/py/cam/cam_qt.py
index b6412bdf..c1723b44 100644
--- a/src/py/cam/cam_qt.py
+++ b/src/py/cam/cam_qt.py
@@ -52,6 +52,16 @@ class QtRenderer:
self.windows = windows
+ buf_mmap_map = {}
+
+ for ctx in self.contexts:
+ for stream in ctx.streams:
+ for buf in ctx.allocator.buffers(stream):
+ mfb = libcamera.utils.MappedFrameBuffer(buf).mmap()
+ buf_mmap_map[buf] = mfb
+
+ self.buf_mmap_map = buf_mmap_map
+
def run(self):
camnotif = QtCore.QSocketNotifier(self.cm.event_fd, QtCore.QSocketNotifier.Read)
camnotif.activated.connect(lambda _: self.readcam())
@@ -81,7 +91,9 @@ class QtRenderer:
for stream, fb in buffers.items():
wnd = next(wnd for wnd in self.windows if wnd.stream == stream)
- wnd.handle_request(stream, fb)
+ mfb = self.buf_mmap_map[fb]
+
+ wnd.handle_request(stream, mfb)
self.state.request_processed(ctx, req)
@@ -145,26 +157,25 @@ class MainWindow(QtWidgets.QWidget):
controlsLayout.addStretch()
- def buf_to_qpixmap(self, stream, fb):
- with libcamera.utils.MappedFrameBuffer(fb) as mfb:
- cfg = stream.configuration
+ def buf_to_qpixmap(self, stream, mfb):
+ cfg = stream.configuration
- if cfg.pixel_format == libcam.formats.MJPEG:
- pix = QtGui.QPixmap(cfg.size.width, cfg.size.height)
- pix.loadFromData(mfb.planes[0])
- else:
- rgb = mfb_to_rgb(mfb, cfg)
- if rgb is None:
- raise Exception('Format not supported: ' + cfg.pixel_format)
+ if cfg.pixel_format == libcam.formats.MJPEG:
+ pix = QtGui.QPixmap(cfg.size.width, cfg.size.height)
+ pix.loadFromData(mfb.planes[0])
+ else:
+ rgb = mfb_to_rgb(mfb, cfg)
+ if rgb is None:
+ raise Exception('Format not supported: ' + cfg.pixel_format)
- pix = rgb_to_pix(rgb)
+ pix = rgb_to_pix(rgb)
return pix
- def handle_request(self, stream, fb):
+ def handle_request(self, stream, mfb):
ctx = self.ctx
- pix = self.buf_to_qpixmap(stream, fb)
+ pix = self.buf_to_qpixmap(stream, mfb)
self.label.setPixmap(pix)
self.frameLabel.setText('Queued: {}\nDone: {}\nFps: {:.2f}'