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):
|
def __init__(self, fb: libcamera.FrameBuffer):
|
||||||
self.__fb = fb
|
self.__fb = fb
|
||||||
|
self.__planes = ()
|
||||||
|
self.__maps = ()
|
||||||
|
|
||||||
def __enter__(self):
|
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 os
|
||||||
import mmap
|
import mmap
|
||||||
|
|
||||||
|
@ -68,14 +79,23 @@ class MappedFrameBuffer:
|
||||||
|
|
||||||
return self
|
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:
|
for p in self.__planes:
|
||||||
p.release()
|
p.release()
|
||||||
|
|
||||||
for mm in self.__maps:
|
for mm in self.__maps:
|
||||||
mm.close()
|
mm.close()
|
||||||
|
|
||||||
|
self.__planes = ()
|
||||||
|
self.__maps = ()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def planes(self) -> Tuple[memoryview, ...]:
|
def planes(self) -> Tuple[memoryview, ...]:
|
||||||
"""memoryviews for the planes"""
|
"""memoryviews for the planes"""
|
||||||
|
if not self.__planes:
|
||||||
|
raise RuntimeError('MappedFrameBuffer not mmapped')
|
||||||
|
|
||||||
return self.__planes
|
return self.__planes
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue