[libcamera-devel] [PATCH v3 26/30] py: cam: cam_qt: mmap the fbs only once

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon May 30 11:26:27 CEST 2022


Hi Tomi,

Thank you for the patch.

On Fri, May 27, 2022 at 05:44:43PM +0300, Tomi Valkeinen wrote:
> 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>

Reviewed-by: Laurent Pinchart <laurent.pinchart 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}'

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list