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>
This commit is contained in:
Tomi Valkeinen 2022-05-30 17:27:14 +03:00 committed by Laurent Pinchart
parent fbd6c4d1c8
commit 43192f4321

View file

@ -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