summaryrefslogtreecommitdiff
path: root/src/py
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>2022-05-30 17:27:14 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-06-01 12:09:06 +0300
commit43192f4321c4cf265ec22a2b750ad5291e1f1a1c (patch)
treec37359ecf893d1608db6ac8d5cba19c9caaf0b56 /src/py
parentfbd6c4d1c8bfedf49ed86b32fb7b8c0d0aee67fb (diff)
py: MappedFrameBuffer: Support non-contextmanager use
Implement non-contextmanager use to MappedFrameBuffer so that we can either: with MappedFrameBuffer(fb) as mfb: ... or mfb = MappedFrameBuffer(fb) mfb.mmap() ... mfb.munmap() While at it, improve the error handling a bit. Note that the mmap() returns self. In other words, one can do this: mfb = MappedFrameBuffer(fb).mmap() ... mfb.munmap() 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>
Diffstat (limited to 'src/py')
-rw-r--r--src/py/libcamera/utils/MappedFrameBuffer.py22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/py/libcamera/utils/MappedFrameBuffer.py b/src/py/libcamera/utils/MappedFrameBuffer.py
index a8502d51..c300a6d7 100644
--- a/src/py/libcamera/utils/MappedFrameBuffer.py
+++ b/src/py/libcamera/utils/MappedFrameBuffer.py
@@ -10,8 +10,19 @@ class MappedFrameBuffer:
"""
def __init__(self, fb: libcamera.FrameBuffer):
self.__fb = fb
+ self.__planes = ()
+ self.__maps = ()
def __enter__(self):
+ return self.mmap()
+
+ def __exit__(self, exc_type, exc_value, exc_traceback):
+ self.munmap()
+
+ def mmap(self):
+ if self.__planes:
+ raise RuntimeError('MappedFrameBuffer already mmapped')
+
import os
import mmap
@@ -68,14 +79,23 @@ class MappedFrameBuffer:
return self
- def __exit__(self, exc_type, exc_value, exc_traceback):
+ def munmap(self):
+ if not self.__planes:
+ raise RuntimeError('MappedFrameBuffer not mmapped')
+
for p in self.__planes:
p.release()
for mm in self.__maps:
mm.close()
+ self.__planes = ()
+ self.__maps = ()
+
@property
def planes(self) -> Tuple[memoryview, ...]:
"""memoryviews for the planes"""
+ if not self.__planes:
+ raise RuntimeError('MappedFrameBuffer not mmapped')
+
return self.__planes