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:
parent
fbd6c4d1c8
commit
43192f4321
1 changed files with 21 additions and 1 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue