[libcamera-devel] [PATCH v3 26/30] py: cam: cam_qt: mmap the fbs only once
Tomi Valkeinen
tomi.valkeinen at ideasonboard.com
Fri May 27 16:44:43 CEST 2022
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 at ideasonboard.com>
---
src/py/cam/cam_qt.py | 39 +++++++++++++++++++++++++--------------
1 file 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}'
--
2.34.1
More information about the libcamera-devel
mailing list